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