M carrera/trap.c => carrera/trap.c +17 -11
@@ 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
M pc/devastar.c => pc/devastar.c +2 -2
@@ 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;
M pc/trap.c => pc/trap.c +19 -8
@@ 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*)
{
M port/portfns.h => port/portfns.h +1 -0
@@ 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*);