~kris/9p

9hist

c31dff689b53ba518ff7e25f31505660ac3ef735 — David du Colombier 27 years ago 4828615
Plan 9 from Bell Labs 1999-07-21
4 files changed, 39 insertions(+), 21 deletions(-)

M carrera/trap.c
M pc/devastar.c
M pc/trap.c
M port/portfns.h
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*);