plan 9 kernel history: overview | file list | diff list

2001/0728/alphapc/trap.c (diff list | history)

2001/0727/sys/src/9/alphapc/trap.c:245,2512001/0728/sys/src/9/alphapc/trap.c:245,251 (short | long | prev | next)
2000/0401    
	} 
	else{ 
		dumpregs(ur); 
		panic("unknown intr: %d\n", vno); /* */ 
2001/0728    
		print("unknown intr: %d\n", vno); /* */ 
2000/0401    
	} 
} 
 
2001/0727/sys/src/9/alphapc/trap.c:375,3822001/0728/sys/src/9/alphapc/trap.c:375,425
1999/0415    
} 
 
void 
dumpstack(void) 
2001/0728    
dumpregs(Ureg *ur) 
1999/0415    
{ 
2001/0728    
	int i, col; 
	uvlong *l; 
 
	if(up) 
		print("registers for %s %ld\n", up->text, up->pid); 
	else 
		print("registers for kernel\n"); 
 
	l = &ur->type; 
	col = 0; 
	for (i = 0; i < sizeof regname/sizeof(char*); i++, l++) { 
		print("%-7s%.16llux%s", regname[i], *l, col == 2 ? "\n" : "     "); 
		if (col++ == 2) 
			col = 0; 
	} 
	print("\n"); 
} 
 
 
/* 
 * Fill in enough of Ureg to get a stack trace, and call a function. 
 * Used by debugging interface rdb. 
 */ 
static void 
getpcsp(ulong *pc, ulong *sp) 
{ 
	*pc = getcallerpc(&pc); 
	*sp = (ulong)&pc-8; 
} 
 
void 
callwithureg(void (*fn)(Ureg*)) 
{ 
	Ureg ureg; 
 
	getpcsp((ulong*)&ureg.pc, (ulong*)&ureg.sp); 
	ureg.r26 = getcallerpc(&fn); 
	fn(&ureg); 
} 
 
void 
_dumpstack(Ureg *ureg) 
{ 
1999/0415    
	ulong l, sl, el, v, i, instr, op; 
	extern ulong etext; 
 
2001/0727/sys/src/9/alphapc/trap.c:392,4062001/0728/sys/src/9/alphapc/trap.c:435,446
1999/0415    
		el = sl + KSTACK; 
	} 
	if(l > el || l < sl){ 
2000/0125    
		iprint("dumpstack: l %lux sl %lux el %lux m %lux up %lux\n", 
			l, sl, el, m, up); 
1999/0415    
		el = (ulong)m+BY2PG; 
		sl = el-KSTACK; 
	} 
	iprint("dumpstack: l %lux sl %lux el %lux m %lux\n", l, sl, el, m); 
	if(l > el || l < sl){ 
2001/0728    
	if(l > el || l < sl) 
1999/0415    
		return; 
	} 
2001/0728    
	print("ktrace /kernel/path %.8lux %.8lux %.8lux\n", (ulong)ureg->pc, (ulong)ureg->sp, (ulong)ureg->r26); 
1999/0415    
 
	i = 0; 
	for(; l<el; l+=8){ 
2001/0727/sys/src/9/alphapc/trap.c:412,4592001/0728/sys/src/9/alphapc/trap.c:452,474
1999/0415    
			instr = *(ulong*)v; 
			op = (instr>>26); 
			if(op == 26 || op == 52){ 
				iprint("%lux ", v); 
2001/0728    
				print("%lux=%lux ", l, v); 
1999/0415    
				i++; 
			} 
		} 
		if(i == 8){ 
2001/0728    
		if(i == 4){ 
1999/0415    
			i = 0; 
			iprint("\n"); 
2001/0728    
			print("\n"); 
1999/0415    
		} 
	} 
2001/0728    
	if(i) 
		print("\n"); 
1999/0415    
} 
 
void 
2000/0108    
callwithureg(void (*fn)(Ureg*)) 
2001/0728    
dumpstack(void) 
2000/0108    
{ 
	Ureg ureg; 
	ureg.pc = getcallerpc(&fn); 
	ureg.sp = (ulong)&fn; 
	fn(&ureg); 
} 
                 
void 
1999/0415    
dumpregs(Ureg *ur) 
{ 
	int i, col; 
	uvlong *l; 
                 
	spllo(); 
	prflush();  
	if(up) 
		iprint("registers for %s %d\n", up->text, up->pid); 
	else 
		iprint("registers for kernel\n"); 
                 
	l = &ur->type; 
	col = 0; 
	for (i = 0; i < sizeof regname/sizeof(char*); i++, l++) { 
		iprint("%-7s%.16llux%s", regname[i], *l, col == 2 ? "\n" : "     "); 
		if (col++ == 2) 
			col = 0; 
	} 
	iprint("\n"); 
//	prflush(); 
2001/0728    
	callwithureg(_dumpstack); 
1999/0415    
} 
 
int 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)