From c31dff689b53ba518ff7e25f31505660ac3ef735 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 21 Jul 1999 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1999-07-21 --- carrera/trap.c | 28 +++++++++++++++++----------- pc/devastar.c | 4 ++-- pc/trap.c | 27 +++++++++++++++++++-------- port/portfns.h | 1 + 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/carrera/trap.c b/carrera/trap.c index 5d37e2a709fbed70b706c56f89932f1d73d75119..4cd1354cbbb9526169ce944aa82fc76419c40f72 100644 --- a/carrera/trap.c +++ b/carrera/trap.c @@ -469,30 +469,36 @@ kernfault(Ureg *ur, int code) panic("kfault"); } -note rsc_wrote_this_but_has_not_checked_it yet; -void +static void getpcsp(ulong *pc, ulong *sp) { *pc = getcallerpc(&pc); - sp = (ulong)&pc-4; + *sp = (ulong)&pc-4; +} + +void +callwithureg(void (*fn)(Ureg*)) +{ + Ureg ureg; + + getpcsp((ulong*)&ureg.pc, (ulong*)&ureg.sp); + ureg.r31 = getcallerpc(&fn); + fn(&ureg); } static void -_dumpstack(ulong dummy) +_dumpstack(Ureg *ureg) { - ulong pc, sp, link, l, v, top, i; + ulong 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); + print("ktrace /kernel/path %.8lux %.8lux %.8lux\n", ureg->pc, ureg->sp, ureg->r31); top = (ulong)up->kstack + KSTACK; i = 0; - for(l=(ulong)&l; l < top; l += BY2WD) { + for(l=ureg->sp; l < top; l += BY2WD) { v = *(ulong*)l; if(KTZERO < v && v < (ulong)&etext) { print("%.8lux=%.8lux ", l, v); @@ -508,7 +514,7 @@ _dumpstack(ulong dummy) void dumpstack(void) { - _dumpstack(0); + callwithureg(_dumpstack); } ulong diff --git a/pc/devastar.c b/pc/devastar.c index 8193180f755e28682e175ff089d8a8a4fd851cff..f403f87761629ae9a5c0c02d5fbdf207cc4143ca 100644 --- a/pc/devastar.c +++ b/pc/devastar.c @@ -458,8 +458,8 @@ astarreset(void) a->gcb = (GCB*)(a->mem+0x10000); sprint(name, "astar%d", i); - if(ioalloc(a->port, p->mem[2].size, 0, name) < 0){ - print("#G%d: port 0x%lux in use", a->id, a->port); + if(ioalloc(a->port, p->mem[1].size, 0, name) < 0){ + print("#G%d: port 0x%lux in use\n", a->id, a->port); xfree(a); astar[nastar] = 0; continue; diff --git a/pc/trap.c b/pc/trap.c index 9389a3bb3bc7c4f6c0c83dc0e654d5d25f1bd0be..dfb1e5b44e69bf5526389dcdbc6b045cb6ecfb1e 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -314,26 +314,31 @@ dumpregs(Ureg* ureg) print("\n ur %lux up %lux\n", ureg, up); } + +/* + * Fill in enough of Ureg to get a stack trace, and call a function. + * Used by debugging interface rdb. + */ void -getpcsp(ulong *pc, ulong *sp) +callwithureg(void (*fn)(Ureg*)) { - *pc = getcallerpc(&pc); - *sp = (ulong)&pc; + Ureg ureg; + ureg.pc = getcallerpc(&fn); + ureg.sp = (ulong)&fn; + fn(&ureg); } -void -dumpstack(void) +static void +_dumpstack(Ureg *ureg) { 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); + print("ktrace /kernel/path %.8lux %.8lux\n", ureg->pc, ureg->sp); i = 0; for(l=(ulong)&l; l<(ulong)(up->kstack+KSTACK); l+=4){ v = *(ulong*)l; @@ -358,6 +363,12 @@ dumpstack(void) print("\n"); } +void +dumpstack(void) +{ + callwithureg(_dumpstack); +} + static void debugbpt(Ureg* ureg, void*) { diff --git a/port/portfns.h b/port/portfns.h index bb419b2f679222b16a39c5e27db7a4a6d53ebce6..f9873ccf434a27305807b8d323bd7b938602c3be 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -22,6 +22,7 @@ Page* auxpage(void); int blocklen(Block*); void cachedel(Image*, ulong); void cachepage(Page*, Image*); +void callwithureg(void(*)(Ureg*)); int cangetc(void*); int canlock(Lock*); int canpage(Proc*);