From 6787a016e6733a6a09b712222ec0c9bf477c1413 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 25 Nov 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-11-25 --- power/clock.c | 2 + power/debugger.c | 233 ++++++++++++++++++++++++++++++++++++++++++++++ power/faultmips.c | 6 +- power/fns.h | 3 +- power/main.c | 2 +- 5 files changed, 239 insertions(+), 7 deletions(-) create mode 100644 power/debugger.c diff --git a/power/clock.c b/power/clock.c index af95cf84e46c834603655cbede38870d172e4486..9801620ebebf7264ea2bd90d0f75b6b39a09d63f 100644 --- a/power/clock.c +++ b/power/clock.c @@ -108,6 +108,8 @@ clock(Ureg *ur) m->load = (m->load*19+nrun)/20; } duartslave(); + if((active.machs&(1<machno)) == 0) + return; if(active.exiting && active.machs&(1<machno)){ print("someone's exiting\n"); exit(0); diff --git a/power/debugger.c b/power/debugger.c new file mode 100644 index 0000000000000000000000000000000000000000..923dcd836fe57d47bdd64d9c0b04062d31ea76c2 --- /dev/null +++ b/power/debugger.c @@ -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 - 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<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 - print cpu log\r\n"); + dprint("! h - 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); +} diff --git a/power/faultmips.c b/power/faultmips.c index 11a9c4ce2c0cea8f8f1cf48aff87cddb5a92eb00..49327ba4d89b6fdc3673623db714446bed53b5ea 100644 --- a/power/faultmips.c +++ b/power/faultmips.c @@ -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); diff --git a/power/fns.h b/power/fns.h index bc7a1f36350698ed1ae2bd3c8dfcf222c7647aa2..7627e6859965a5eaeb2542fabcf8afb8aa6756e3 100644 --- a/power/fns.h +++ b/power/fns.h @@ -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*); diff --git a/power/main.c b/power/main.c index 94dbb07a1b73e8fd6dd8a5832a4daa6428be70e7..2e6de2ff4c3019cfef36d0c4d4c56d1d9cd158df 100644 --- a/power/main.c +++ b/power/main.c @@ -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; } -