M carrera/trap.c => carrera/trap.c +20 -4
@@ 466,20 466,30 @@ kernfault(Ureg *ur, int code)
up, ur->status, ur->pc, ur->r31, ur->sp);
dumpregs(ur);
- splhi();
- for(;;);
panic("kfault");
}
+note rsc_wrote_this_but_has_not_checked_it yet;
void
-dumpstack(void)
+getpcsp(ulong *pc, ulong *sp)
+{
+ *pc = getcallerpc(&pc);
+ sp = (ulong)&pc-4;
+}
+
+static void
+_dumpstack(ulong dummy)
{
- ulong l, v, top, i;
+ ulong pc, sp, link, l, v, top, i;
extern ulong etext;
if(up == 0)
return;
+ getpcsp(&pc, &sp);
+ link = getcallerpc(&dummy);
+
+ print("ktrace /kernel/path %.8lux %.8lux %.8lux\n", pc, sp, r31);
top = (ulong)up->kstack + KSTACK;
i = 0;
for(l=(ulong)&l; l < top; l += BY2WD) {
@@ 495,6 505,12 @@ dumpstack(void)
print("\n");
}
+void
+dumpstack(void)
+{
+ _dumpstack(0);
+}
+
ulong
R(Ureg *ur, int i)
{
M pc/trap.c => pc/trap.c +14 -2
@@ 315,15 315,25 @@ dumpregs(Ureg* ureg)
}
void
+getpcsp(ulong *pc, ulong *sp)
+{
+ *pc = getcallerpc(&pc);
+ *sp = (ulong)&pc;
+}
+
+void
dumpstack(void)
{
ulong l, v, i;
+ ulong sp, pc;
uchar *p;
extern ulong etext;
if(up == 0)
return;
+ getpcsp(&pc, &sp);
+ print("ktrace /kernel/path %.8lux %.8lux\n", pc, sp);
i = 0;
for(l=(ulong)&l; l<(ulong)(up->kstack+KSTACK); l+=4){
v = *(ulong*)l;
@@ 335,15 345,17 @@ dumpstack(void)
p = (uchar*)v;
if(*(p-5) == 0xE8
|| (*(p-2) == 0xFF && *(p-1) == 0xD0)){
- print("%p ", p-5);
+ print("%.8lux=%.8lux ", l, v);
i++;
}
}
- if(i == 8){
+ if(i == 4){
i = 0;
print("\n");
}
}
+ if(i)
+ print("\n");
}
static void
M port/devcons.c => port/devcons.c +2 -0
@@ 771,6 771,8 @@ conswrite(Chan *c, void *va, long n, vlong off)
print("conswrite: reboot\n");
exit(0);
}
+ if(strncmp(a, "panic", 5) == 0)
+ panic("/dev/reboot");
break;
case Qsysstat: