~kris/9p

9hist

6787a016e6733a6a09b712222ec0c9bf477c1413 — David du Colombier 33 years ago 6323985
Plan 9 from Bell Labs 1992-11-25
5 files changed, 239 insertions(+), 7 deletions(-)

M power/clock.c
A power/debugger.c
M power/faultmips.c
M power/fns.h
M power/main.c
M power/clock.c => power/clock.c +2 -0
@@ 108,6 108,8 @@ clock(Ureg *ur)
			m->load = (m->load*19+nrun)/20;
		}
		duartslave();
		if((active.machs&(1<<m->machno)) == 0)
			return;
		if(active.exiting && active.machs&(1<<m->machno)){
			print("someone's exiting\n");
			exit(0);

A power/debugger.c => power/debugger.c +233 -0
@@ 0,0 1,233 @@
#include	"u.h"
#include	"../port/lib.h"
#include	"mem.h"
#include	"dat.h"
#include	"fns.h"

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];

	end = s->next;
	p = end + 1;
	if(p >= &s->buf[sizeof(s->buf)])
		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);
		}
		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;
	}
	n = strtoul(start, 0, 0);
	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--)
			dprint("	%lux", p[i]);
		dprint("\r\n");
	}
}

static void
printinfo(void)
{
	Mach *mp;
	Proc *p;
	Page *pg;
	ulong l;
	int i;

	for(i = 0; i < 4; i++){
		if((active.machs&(1<<i)) == 0)
			continue;
		mp = (void*)MACHADDR;
		mp += i;
		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){
			p = (Proc*)l;
			l = (ulong)(p->upage);
			if((l & 0xf0000000) == KZERO){
				pg = (Page*)l;
				l = pg->pa;
				dprint("mach[%d]->proc->upage->pa/	%lux\r\n", i, l);
			}
		}
	}
}

void
debugger(void *arg)
{
	int n, level;
	char buf[256];
	char *field[3];

	USED(arg);

	/*
 	 *  grab a port for a console
	 */
	duartspecial(3, &dprintq, &dkbdq, 9600);

	/*
	 *  sched() until we are on processor 1
	 */
	for(;;){
		level = splhi();
		if(m->machno == 1)
			break;
		splx(level);
		sched();
	}

	/*
	 *  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;
		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");
			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);
}

M power/faultmips.c => power/faultmips.c +1 -5
@@ 21,12 21,8 @@ faultmips(Ureg *ur, int user, int code)

	LEDON(LEDfault);
	addr = ur->badvaddr;
	if(addr & KZERO){
	if(addr & KZERO)
		LEDON(LEDkfault);
		print("KZERO %s badvaddr=0x%lux r31=0x%lux\n", excname[code],
			ur->badvaddr, ur->r31);
		print("status=0x%lux pc=0x%lux sp=0x%lux\n", ur->status, ur->pc, ur->sp);
	}
	addr &= ~(BY2PG-1);
	read = !(code==CTLBM || code==CTLBS);


M power/fns.h => power/fns.h +2 -1
@@ 9,6 9,7 @@ void	confprint(void);
void	confset(char*);
int	conschar(void);
void	dcflush(void*, ulong);
void	debugger(void*);
int	duartactive(void);
void	duartenable0(void);
void	duartinit(void);


@@ 56,7 57,7 @@ void	puttlb(ulong, ulong);
void	puttlbx(int, ulong, ulong);
int	readlog(ulong, char*, ulong);
void	restfpregs(FPsave*, ulong);
#define	screenputs
#define	screenputs syslog
void	setvmevec(int, void (*)(int));
void	sinit(void);
uchar*	smap(int, uchar*);

M power/main.c => power/main.c +1 -1
@@ 198,6 198,7 @@ init0(void)
		poperror();
	}

	kproc("kdebug", debugger, 0);
	kproc("alarm", alarmkproc, 0);
	touser((uchar*)(USTKTOP - sizeof(argbuf)));
}


@@ 743,4 744,3 @@ mouseputc(IOQ *q, int c)
	USED(c);
	return 0;
}