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