From 51f2d9ca33976fa7f3d06790306bc654b3b6a0df Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 31 Oct 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-10-31 --- bitsy/devflash.c | 17 +++++++++++++ "bitsy/dev\302\265c.c" | 26 ++++++++++++++++---- bitsy/trap.c | 54 +++++++++++++++++++++++++++++++++++------- 3 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 bitsy/devflash.c diff --git a/bitsy/devflash.c b/bitsy/devflash.c new file mode 100644 index 0000000000000000000000000000000000000000..0e915c4c2360d8739c798a36f3573c9c4791e34e --- /dev/null +++ b/bitsy/devflash.c @@ -0,0 +1,17 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "io.h" +#include "../port/error.h" + +/* flash partitions */ +typedef struct FlashPart FlashPart; +struct FlashPart +{ + QLock; + char name[NAMELEN]; + ulong start; /* byte offsets */ + ulong end; +}; diff --git "a/bitsy/dev\302\265c.c" "b/bitsy/dev\302\265c.c" index 5a010a60760c55b9e9f645b5bc52b05d8349d2aa..b2a61260b69db191e7c20e2aca8411717e27b9d5 100644 --- "a/bitsy/dev\302\265c.c" +++ "b/bitsy/dev\302\265c.c" @@ -10,6 +10,7 @@ enum{ Qbacklight = 1, Qbattery, Qbuttons, + Qkbdin, Qled, Qversion, @@ -34,6 +35,7 @@ Dirtab µcdir[]={ "backlight", { Qbacklight, 0 }, 0, 0664, "battery", { Qbattery, 0 }, 0, 0664, "buttons", { Qbuttons, 0 }, 0, 0664, + "kbdin", { Qkbdin, 0 }, 0, 0664, "led", { Qled, 0 }, 0, 0664, "version", { Qversion, 0 }, 0, 0664, }; @@ -71,6 +73,7 @@ int int i, len, b, up; uchar cksum; uchar *p; + static int samseq; if(ctlr.n > sizeof(ctlr.buf)) panic("µcputc"); @@ -130,10 +133,13 @@ int } break; case BLtouch: - if(len == 4) - pentrackxy((p[0]<<8)|p[1], (p[2]<<8)|p[3]); - else + if(len == 4) { + if (samseq++ > 10) + pentrackxy((p[0]<<8)|p[1], (p[2]<<8)|p[3]); + } else { + samseq = 0; pentrackxy(-1, -1); + } break; case BLled: wakeup(&ctlr.r); @@ -302,7 +308,9 @@ static long { Cmdbuf *cmd; uchar data[16]; - int i; + char str[64]; + int i, j; + Rune r; if(off != 0) error(Ebadarg); @@ -314,6 +322,16 @@ static long data[i] = atoi(cmd->f[i]); switch(c->qid.path){ + case Qkbdin: + if(n >= sizeof(str)) + n = sizeof(str)-1; + memmove(str, a, n); + str[n] = 0; + for(i = 0; i < n; i += j){ + j = chartorune(&r, &str[i]); + kbdputc(nil, r); + } + break; case Qled: sendmsgwithack(BLled, data, cmd->nf); break; diff --git a/bitsy/trap.c b/bitsy/trap.c index 4a942c01d7042f9f3801a5898d6a57f24e43619c..0167b9f0f865ef116351fbfb3f0b42775783d9b2 100644 --- a/bitsy/trap.c +++ b/bitsy/trap.c @@ -91,7 +91,7 @@ warnregs(Ureg *ur, char *tag) char *p; p = seprint(buf, e, "%s:\n", tag); - p = seprint(p, e, "type %.8lux psr %.8lux pc %.8lux\n", + p = seprint(p, e, "type 0x%.8lux psr 0x%.8lux pc 0x%.8lux\n", ur->type, ur->psr, ur->pc); p = seprint(p, e, "r0 0x%.8lux r1 0x%.8lux r2 0x%.8lux r3 0x%.8lux\n", ur->r0, ur->r1, ur->r2, ur->r3); @@ -283,10 +283,9 @@ trap(Ureg *ureg) } out: - if(user && (up->procctl || up->nnote)){ - splhi(); + splhi(); + if(user && (up->procctl || up->nnote)) notify(ureg); - } } /* @@ -358,10 +357,9 @@ syscall(Ureg* ureg) if(scallnr == NOTED) noted(ureg, *(ulong*)(sp+BY2WD)); - if(scallnr != RFORK && (up->procctl || up->nnote)){ - splhi(); + splhi(); + if(scallnr != RFORK && (up->procctl || up->nnote)) notify(ureg); - } } /* @@ -617,11 +615,51 @@ execregs(ulong entry, ulong ssize, ulong nargs) } /* - * dump the processor stack for this process + * Fill in enough of Ureg to get a stack trace, and call a function. + * Used by debugging interface rdb. */ +void +callwithureg(void (*fn)(Ureg*)) +{ + Ureg ureg; + ureg.pc = getcallerpc(&fn); + ureg.sp = (ulong)&fn; + fn(&ureg); +} + +static void +_dumpstack(Ureg *ureg) +{ + ulong l, v, i; + ulong *p; + extern ulong etext; + + if(up == 0) + return; + + print("ktrace /kernel/path %.8lux %.8lux\n", ureg->pc, ureg->sp); + i = 0; + for(l=(ulong)&l; l<(ulong)(up->kstack+KSTACK); l+=4){ + v = *(ulong*)l; + if(KTZERO < v && v < (ulong)&etext && (v&3)==0){ + v -= 4; + p = (ulong*)v; + if((*p & 0x0f000000) == 0x0b000000) + print("%.8lux=%.8lux ", l, v); + } + if(i == 4){ + i = 0; + print("\n"); + } + } + if(i) + print("\n"); +} + void dumpstack(void) { + callwithureg(_dumpstack); } /*