From 8c30c69934ace2597115ac4e988a9ecfb0031020 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 19 Jan 2002 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2002-01-19 --- "bitsy/dev\302\265c.c" | 7 +++--- mtx/main.c | 2 +- mtx/trap.c | 53 ++++++++++++++++++++++++------------------ 3 files changed, 36 insertions(+), 26 deletions(-) diff --git "a/bitsy/dev\302\265c.c" "b/bitsy/dev\302\265c.c" index b340de95826600d4968c865067ad8064766e61d0..88aa62f0c9e31b8398be2bf1adfdfabd96819419 100644 --- "a/bitsy/dev\302\265c.c" +++ "b/bitsy/dev\302\265c.c" @@ -83,9 +83,10 @@ static struct µcontroller } ctlr; /* button map */ -Rune bmap[4] = +Rune bmap[2][4] = { - Kup, Kright, Kleft, Kdown + {Kup, Kright, Kleft, Kdown}, /* portrait mode */ + {Kright, Kdown, Kup, Kleft}, /* landscape mode */ }; extern int landscape; @@ -150,7 +151,7 @@ int if(b > 5) { /* rocker panel acts like arrow keys */ if(b < 10 && !up) - kbdputc(kbdq, bmap[b-6]); + kbdputc(kbdq, bmap[landscape][b-6]); } else { /* the rest like mouse buttons */ if(--b == 0) diff --git a/mtx/main.c b/mtx/main.c index 366b49d56cb544cc38c70426f495892424771b60..d209f6a65167cdbb9871b5781658ebc6e4d78b85 100644 --- a/mtx/main.c +++ b/mtx/main.c @@ -262,7 +262,7 @@ procsave(Proc *p) if(p->fpstate == FPactive){ if(p->state != Moribund) fpsave(&up->fpsave); - fpoff(p); +// fpoff(p); p->fpstate = FPinactive; } } diff --git a/mtx/trap.c b/mtx/trap.c index ced86d1530e00accb1c1a0d1b4e607ae9e05f2a9..30f11b4702ee9e2f1d210a60c931bfa42a6f46ce 100644 --- a/mtx/trap.c +++ b/mtx/trap.c @@ -207,34 +207,36 @@ char *regname[]={ }; void -trap(Ureg *ur) +trap(Ureg *ureg) { ulong dsisr; - int ecode,user; + int ecode, user; char buf[ERRMAX], *s; m->intrts = fastticks(nil); - ecode = (ur->cause >> 8) & 0xff; - user = (ur->srr1 & MSR_PR) != 0; + ecode = (ureg->cause >> 8) & 0xff; + user = (ureg->srr1 & MSR_PR) != 0; + if(user) + up->dbgreg = ureg; - if(ur->status & MSR_RI == 0) + if(ureg->status & MSR_RI == 0) print("double fault?: ecode = %d\n", ecode); switch(ecode) { case CEI: - intr(ur); + intr(ureg); break; case CDEC: - clockintr(ur); + clockintr(ureg); break; case CSYSCALL: if(!user) - panic("syscall in kernel: srr1 0x%4.4luX\n", ur->srr1); - syscall(ur); + panic("syscall in kernel: srr1 0x%4.4luX\n", ureg->srr1); + syscall(ureg); return; /* syscall() calls notify itself, don't do it again */ case CFPU: if(!user || up == nil) { - dumpregs(ur); + dumpregs(ureg); panic("floating point in kernel"); } switch(up->fpstate){ @@ -249,24 +251,24 @@ trap(Ureg *ur) default: panic("fpstate"); } - ur->srr1 |= MSR_FP; + ureg->srr1 |= MSR_FP; break; case CISI: - faultpower(ur, ur->pc, 1); + faultpower(ureg, ureg->pc, 1); break; case CDSI: dsisr = getdsisr(); if(dsisr & BIT(6)) - faultpower(ur, getdar(), 0); + faultpower(ureg, getdar(), 0); else - faultpower(ur, getdar(), 1); + faultpower(ureg, getdar(), 1); break; case CPROG: - if(ur->status & (1<<19)) + if(ureg->status & (1<<19)) s = "floating point exception"; - else if(ur->status & (1<<18)) + else if(ureg->status & (1<<18)) s = "illegal instruction"; - else if(ur->status & (1<<17)) + else if(ureg->status & (1<<17)) s = "privileged instruction"; else s = "undefined program exception"; @@ -276,7 +278,7 @@ trap(Ureg *ur) postnote(up, 1, buf, NDebug); break; } - dumpregs(ur); + dumpregs(ureg); panic(s); break; default: @@ -286,7 +288,7 @@ trap(Ureg *ur) postnote(up, 1, buf, NDebug); break; } - dumpregs(ur); + dumpregs(ureg); if(ecode < nelem(excname)) panic("%s", excname[ecode]); panic("unknown trap/intr: %d\n", ecode); @@ -294,8 +296,11 @@ trap(Ureg *ur) /* restoreureg must execute at high IPL */ splhi(); - if(user) - notify(ur); + if(user) { + notify(ureg); + if(up->fpstate == FPinactive) + ureg->srr1 &= ~MSR_FP; + } } void @@ -427,7 +432,8 @@ fpoff(Proc *p) Ureg *ur; ur = p->dbgreg; - ur->srr1 &= ~MSR_FP; + if(ur != nil) + ur->srr1 &= ~MSR_FP; } /* @@ -675,6 +681,8 @@ syscall(Ureg* ureg) splhi(); if(scallnr!=RFORK) notify(ureg); + if(up->fpstate == FPinactive) + ureg->srr1 &= ~MSR_FP; } /* @@ -765,6 +773,7 @@ noted(Ureg* ureg, ulong arg0) Ureg *nureg; ulong oureg, sp; +print("noted %d\n", arg0); qlock(&up->debug); if(arg0!=NRSTR && !up->notified) { qunlock(&up->debug);