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

1992/1128/power/debugger.c (diff list | history)

1992/1125/sys/src/9/power/debugger.c:84,951992/1126/sys/src/9/power/debugger.c:84,93 (short | long)
1992/1125    
		p = s->buf; 
	while(p != end){ 
		c = *p & 0xff; 
		if(c >= ' ' && c <= '~'){ 
			if(c == '\r' || c == '\n') 
				dprintq.puts(&dprintq, "\r\n", 2); 
			else 
				dprintq.puts(&dprintq, p, 1); 
		} 
1992/1126    
		if(c == '\r' || c == '\n') 
			dprintq.puts(&dprintq, "\r\n", 2); 
		else if(c >= ' ' && c <= '~') 
			dprintq.puts(&dprintq, p, 1); 
1992/1125    
		p++; 
		if(p >= &s->buf[sizeof(s->buf)]) 
			p = s->buf; 
1992/1125/sys/src/9/power/debugger.c:107,1131992/1126/sys/src/9/power/debugger.c:105,111
1992/1125    
		dprint("!	h <location> <howmany> - hex display\r\n"); 
		return; 
	} 
	n = strtoul(start, 0, 0); 
1992/1126    
	n = strtoul(start, 0, 16); 
1992/1125    
	if((n & KZERO) == 0) 
		return; 
	p = (ulong *)n; 
1992/1125/sys/src/9/power/debugger.c:120,1271992/1126/sys/src/9/power/debugger.c:118,126
1992/1125    
	while(n > 0){ 
		dprint("%lux/", p); 
		for(i = 0; i < 8 && n > 0; i++, n--) 
			dprint("	%lux", p[i]); 
1992/1126    
			dprint(" %8.8lux", p[i]); 
1992/1125    
		dprint("\r\n"); 
1992/1126    
		p += 8; 
1992/1125    
	} 
} 
 
1992/1125/sys/src/9/power/debugger.c:137,1511992/1126/sys/src/9/power/debugger.c:136,149
1992/1125    
	for(i = 0; i < 4; i++){ 
		if((active.machs&(1<<i)) == 0) 
			continue; 
		mp = (void*)MACHADDR; 
		mp += i; 
1992/1126    
		mp = (void*)(MACHADDR+i*BY2PG); 
1992/1125    
		l = (ulong)(mp->proc); 
		dprint("mach[%d]->proc/	%lux\r\n", i, l); 
		dprint("mach[%d]->splpc/	%lux\r\n", i, mp->splpc); 
		if((l & 0xf0000000) == KZERO){ 
1992/1126    
		if(l & KZERO){ 
1992/1125    
			p = (Proc*)l; 
			l = (ulong)(p->upage); 
			if((l & 0xf0000000) == KZERO){ 
1992/1126    
			if(l & KZERO){ 
1992/1125    
				pg = (Page*)l; 
				l = pg->pa; 
				dprint("mach[%d]->proc->upage->pa/	%lux\r\n", i, l); 
1992/1125/sys/src/9/power/debugger.c:164,1741992/1126/sys/src/9/power/debugger.c:162,167
1992/1125    
	USED(arg); 
 
	/* 
 	 *  grab a port for a console 
	 */ 
	duartspecial(3, &dprintq, &dkbdq, 9600); 
                 
	/* 
	 *  sched() until we are on processor 1 
	 */ 
	for(;;){ 
1992/1125/sys/src/9/power/debugger.c:178,1831992/1126/sys/src/9/power/debugger.c:171,183
1992/1125    
		splx(level); 
		sched(); 
	} 
1992/1126    
 
	/* 
 	 *  grab a port for a console 
	 */ 
	initq(&dprintq); 
	initq(&dkbdq); 
	duartspecial(3, &dprintq, &dkbdq, 9600); 
1992/1125    
 
	/* 
	 *  take processor and process out of active groups 
1992/1126/sys/src/9/power/debugger.c:3,81992/1128/sys/src/9/power/debugger.c:3,9 (short | long)
1992/1125    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
1992/1128    
#include	"io.h" 
1992/1125    
 
IOQ dkbdq; 
IOQ dprintq; 
1992/1126/sys/src/9/power/debugger.c:78,861992/1128/sys/src/9/power/debugger.c:79,89
1992/1125    
		return; 
	s = &syslogbuf[i]; 
 
1992/1128    
	if(s->next < s->buf || s->next >= &s->buf[sizeof(s->buf)]) 
		s->next = s->buf; 
1992/1125    
	end = s->next; 
	p = end + 1; 
	if(p >= &s->buf[sizeof(s->buf)]) 
1992/1128    
	if(p >= &s->buf[sizeof(s->buf)] || p < s->buf) 
1992/1125    
		p = s->buf; 
	while(p != end){ 
		c = *p & 0xff; 
1992/1126/sys/src/9/power/debugger.c:202,2121992/1128/sys/src/9/power/debugger.c:205,219
1992/1125    
		case 'i': 
			printinfo(); 
			break; 
1992/1128    
		case 'q': 
			firmware(cpuserver ? PROM_AUTOBOOT : PROM_REINIT); 
			break; 
1992/1125    
		default: 
			dprint("!commands are:\r\n"); 
			dprint("!	l <cpu#> - print cpu log\r\n"); 
			dprint("!	h <location> <howmany> - hex display\r\n"); 
			dprint("!	i - display some addresses\r\n"); 
1992/1128    
			dprint("!	q - quit/rebooot\r\n"); 
1992/1125    
			break; 
		} 
	} 
1992/1128/sys/src/9/power/debugger.c:143,1481992/1129/sys/src/9/power/debugger.c:143,149 (short | long)
1992/1125    
		l = (ulong)(mp->proc); 
		dprint("mach[%d]->proc/	%lux\r\n", i, l); 
		dprint("mach[%d]->splpc/	%lux\r\n", i, mp->splpc); 
1992/1129    
 
1992/1126    
		if(l & KZERO){ 
1992/1125    
			p = (Proc*)l; 
			l = (ulong)(p->upage); 
1992/1129/sys/src/9/power/debugger.c:4,91992/1202/sys/src/9/power/debugger.c:4,10 (short | long)
1992/1125    
#include	"dat.h" 
#include	"fns.h" 
1992/1128    
#include	"io.h" 
1992/1202    
#include	"ureg.h" 
1992/1125    
 
IOQ dkbdq; 
IOQ dprintq; 
1992/1129/sys/src/9/power/debugger.c:133,1381992/1202/sys/src/9/power/debugger.c:134,140
1992/1125    
	Mach *mp; 
	Proc *p; 
	Page *pg; 
1992/1202    
	Ureg *ur; 
1992/1125    
	ulong l; 
	int i; 
 
1992/1129/sys/src/9/power/debugger.c:141,1481992/1202/sys/src/9/power/debugger.c:143,150
1992/1125    
			continue; 
1992/1126    
		mp = (void*)(MACHADDR+i*BY2PG); 
1992/1125    
		l = (ulong)(mp->proc); 
		dprint("mach[%d]->proc/	%lux\r\n", i, l); 
		dprint("mach[%d]->splpc/	%lux\r\n", i, mp->splpc); 
1992/1202    
		dprint("mach[%d] proc/%lux\r\n", i, l); 
		dprint("mach[%d] splpc/%lux\r\n", i, mp->splpc); 
1992/1129    
 
1992/1126    
		if(l & KZERO){ 
1992/1125    
			p = (Proc*)l; 
1992/1129/sys/src/9/power/debugger.c:150,1581992/1202/sys/src/9/power/debugger.c:152,166
1992/1126    
			if(l & KZERO){ 
1992/1125    
				pg = (Page*)l; 
				l = pg->pa; 
				dprint("mach[%d]->proc->upage->pa/	%lux\r\n", i, l); 
1992/1202    
				dprint("mach[%d] proc->upage->pa/%lux\r\n", i, l); 
1992/1125    
			} 
		} 
1992/1202    
		l = (ulong)(mp->ur); 
		dprint("mach[%d] ur/%lux", i, l); 
		ur = (Ureg*)l; 
		dprint(" &status/%lux &cause/%lux &sp/%lux &pc/%lux", 
				&ur->status, &ur->cause, &ur->sp, &ur->pc); 
		dprint("\r\n"); 
1992/1125    
	} 
} 
 
1992/1202/sys/src/9/power/debugger.c:1,2491993/0806/sys/src/9/power/debugger.c:0 (short | long)
Deleted.
rsc Mon Mar 7 10:32:49 2005
1992/1125    
#include	"u.h" 
#include	"../port/lib.h" 
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
1992/1128    
#include	"io.h" 
1992/1202    
#include	"ureg.h" 
1992/1125    
                 
IOQ dkbdq; 
IOQ dprintq; 
                 
typedef struct Syslogbuf	Syslogbuf; 
struct Syslogbuf 
{ 
	char	*next; 
	char	buf[4*1024]; 
}; 
                 
Syslogbuf syslogbuf[4]; 
                 
static int 
dprint(char *fmt, ...) 
{ 
	char buf[PRINTSIZE]; 
	int n; 
                 
	n = doprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf; 
	dprintq.puts(&dprintq, buf, n); 
	return n; 
} 
                 
static int 
dgetline(char *p, int n) 
{ 
	int c; 
	char *end, *start; 
	char buf[1]; 
                 
	start = p; 
	end = p + n - 1; 
	for(;;){ 
		c = getc(&dkbdq); 
		if(c <= 0) 
			continue; 
                 
		/* echo */ 
		buf[0] = c; 
		if(c == '\r' || c == '\n') 
			dprintq.puts(&dprintq, "\r\n", 2); 
		else 
			dprintq.puts(&dprintq, buf, 1); 
                 
		if(c == '\b'){ 
			if(p != start) 
				p--; 
			continue; 
		} 
		if(c == '\r' || c == '\n') 
			break; 
		if(p >= end) 
			continue; 
		*p++ = c; 
	} 
	*p = 0; 
	return p - start; 
} 
                 
static void 
printlog(char *cpu) 
{ 
	int i, c; 
	char *p, *end; 
	Syslogbuf *s; 
                 
	if(cpu == 0) 
		i = 0; 
	else 
		i = atoi(cpu); 
	if(i < 0 || i > 3) 
		return; 
	s = &syslogbuf[i]; 
                 
1992/1128    
	if(s->next < s->buf || s->next >= &s->buf[sizeof(s->buf)]) 
		s->next = s->buf; 
1992/1125    
	end = s->next; 
	p = end + 1; 
1992/1128    
	if(p >= &s->buf[sizeof(s->buf)] || p < s->buf) 
1992/1125    
		p = s->buf; 
	while(p != end){ 
		c = *p & 0xff; 
1992/1126    
		if(c == '\r' || c == '\n') 
			dprintq.puts(&dprintq, "\r\n", 2); 
		else if(c >= ' ' && c <= '~') 
			dprintq.puts(&dprintq, p, 1); 
1992/1125    
		p++; 
		if(p >= &s->buf[sizeof(s->buf)]) 
			p = s->buf; 
	} 
} 
                 
static void 
printhex(char *start, char *len) 
{ 
	int i; 
	ulong n; 
	ulong *p; 
                 
	if(start == 0){ 
		dprint("!	h <location> <howmany> - hex display\r\n"); 
		return; 
	} 
1992/1126    
	n = strtoul(start, 0, 16); 
1992/1125    
	if((n & KZERO) == 0) 
		return; 
	p = (ulong *)n; 
                 
	if(len) 
		n = strtoul(len, 0, 0); 
	else 
		n = 1; 
                 
	while(n > 0){ 
		dprint("%lux/", p); 
		for(i = 0; i < 8 && n > 0; i++, n--) 
1992/1126    
			dprint(" %8.8lux", p[i]); 
1992/1125    
		dprint("\r\n"); 
1992/1126    
		p += 8; 
1992/1125    
	} 
} 
                 
static void 
printinfo(void) 
{ 
	Mach *mp; 
	Proc *p; 
	Page *pg; 
1992/1202    
	Ureg *ur; 
1992/1125    
	ulong l; 
	int i; 
                 
	for(i = 0; i < 4; i++){ 
		if((active.machs&(1<<i)) == 0) 
			continue; 
1992/1126    
		mp = (void*)(MACHADDR+i*BY2PG); 
1992/1125    
		l = (ulong)(mp->proc); 
1992/1202    
		dprint("mach[%d] proc/%lux\r\n", i, l); 
		dprint("mach[%d] splpc/%lux\r\n", i, mp->splpc); 
1992/1129    
                 
1992/1126    
		if(l & KZERO){ 
1992/1125    
			p = (Proc*)l; 
			l = (ulong)(p->upage); 
1992/1126    
			if(l & KZERO){ 
1992/1125    
				pg = (Page*)l; 
				l = pg->pa; 
1992/1202    
				dprint("mach[%d] proc->upage->pa/%lux\r\n", i, l); 
1992/1125    
			} 
		} 
1992/1202    
		l = (ulong)(mp->ur); 
		dprint("mach[%d] ur/%lux", i, l); 
		ur = (Ureg*)l; 
		dprint(" &status/%lux &cause/%lux &sp/%lux &pc/%lux", 
				&ur->status, &ur->cause, &ur->sp, &ur->pc); 
		dprint("\r\n"); 
1992/1125    
	} 
} 
                 
void 
debugger(void *arg) 
{ 
	int n, level; 
	char buf[256]; 
	char *field[3]; 
                 
	USED(arg); 
                 
	/* 
	 *  sched() until we are on processor 1 
	 */ 
	for(;;){ 
		level = splhi(); 
		if(m->machno == 1) 
			break; 
		splx(level); 
		sched(); 
	} 
1992/1126    
                 
	/* 
 	 *  grab a port for a console 
	 */ 
	initq(&dprintq); 
	initq(&dkbdq); 
	duartspecial(3, &dprintq, &dkbdq, 9600); 
1992/1125    
                 
	/* 
	 *  take processor and process out of active groups 
	 */ 
	active.machs &= ~(1<<1); 
	splx(level); 
                 
	for(;;){ 
		dprint("kdb> "); 
		dgetline(buf, sizeof(buf)); 
		memset(field, 0, sizeof(field)); 
		n = getfields(buf, field, 3, ' '); 
		if(n == 0) 
			continue; 
		switch(*field[0]){ 
		case 'l': 
			printlog(field[1]); 
			break; 
		case 'h': 
			printhex(field[1], field[2]); 
			break; 
		case 'i': 
			printinfo(); 
			break; 
1992/1128    
		case 'q': 
			firmware(cpuserver ? PROM_AUTOBOOT : PROM_REINIT); 
			break; 
1992/1125    
		default: 
			dprint("!commands are:\r\n"); 
			dprint("!	l <cpu#> - print cpu log\r\n"); 
			dprint("!	h <location> <howmany> - hex display\r\n"); 
			dprint("!	i - display some addresses\r\n"); 
1992/1128    
			dprint("!	q - quit/rebooot\r\n"); 
1992/1125    
			break; 
		} 
	} 
} 
                 
void 
syslog(char *str, int n) 
{ 
	Syslogbuf *s; 
	int level; 
                 
	level = splhi(); 
	s = &syslogbuf[m->machno]; 
	if(s->next < s->buf || s->next >= &s->buf[sizeof(s->buf)]) 
		s->next = s->buf; 
	while(n-- > 0){ 
		*s->next = *str++; 
		if(s->next >= &s->buf[sizeof(s->buf)-1]) 
			s->next = s->buf; 
		else 
			s->next++; 
	} 
	splx(level); 
} 


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