From 48286150c6ce452ee576e761e80dabbf94a5eadf Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 20 Jul 1999 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1999-07-20 --- carrera/trap.c | 24 ++++++++++++++++++++---- pc/trap.c | 16 ++++++++++++++-- port/devcons.c | 2 ++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/carrera/trap.c b/carrera/trap.c index 752ea0f3b9897e3703c999482171c27b6d08b3cc..5d37e2a709fbed70b706c56f89932f1d73d75119 100644 --- a/carrera/trap.c +++ b/carrera/trap.c @@ -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) { diff --git a/pc/trap.c b/pc/trap.c index 8fce934ca978d1eec3c15230332a0d27714b4e9f..9389a3bb3bc7c4f6c0c83dc0e654d5d25f1bd0be 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -314,16 +314,26 @@ dumpregs(Ureg* ureg) print("\n ur %lux up %lux\n", ureg, up); } +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 diff --git a/port/devcons.c b/port/devcons.c index 5226ac92d8d77bdaf013076e7792d153369a2d36..2d8b9ee7ada5e0b6144019c90184d5a6e305db01 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -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: