From ff2bbb664f3cd3e0481e4448bd8ea9b21e7eebd4 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 13 Sep 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-09-13 --- gnot/disk.c | 4 +-- pc/devfloppy.c | 2 -- pc/fns.h | 5 ++- pc/l.s | 4 +++ pc/main.c | 89 ++++++++++++++++++++++++++++++-------------------- pc/trap.c | 6 ++-- port/devcons.c | 2 ++ port/devroot.c | 16 +-------- 8 files changed, 67 insertions(+), 61 deletions(-) diff --git a/gnot/disk.c b/gnot/disk.c index 9f87234e7b65483f6a064e5727033170797ffedb..75872c02bd045a32666fb37c7464d25c0feec82b 100644 --- a/gnot/disk.c +++ b/gnot/disk.c @@ -50,8 +50,6 @@ void streaminit0(void){ newqinfo(&asyncinfo); newqinfo(&fcallinfo); } - /* - * fake cryptfs - */ + long kfslen = 0; ulong kfscode[1]; long cryptfslen = 0; ulong cryptfscode[1]; #include "cfs.h" diff --git a/pc/devfloppy.c b/pc/devfloppy.c index 21a266aa66c17ee21b5df78660c2f549807904e4..753b8de70fef7ff1fab599b288f0fa8a6f5f5a88 100644 --- a/pc/devfloppy.c +++ b/pc/devfloppy.c @@ -420,8 +420,6 @@ floppykproc(void *a) } } disp++; - if(owl(disp&1) < 0) - print("owl failed\n"); tsleep(&floppy.kr, return0, 0, 5*1000); } diff --git a/pc/fns.h b/pc/fns.h index d06a6bb1041dabc30054bcdc0161271435e1c103..174ec34d7171386b873f05ec8e1180830d133de5 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -16,20 +16,19 @@ void fclockinit(void); #define flushvirt(); void fpinit(void); void fpoff(void); -void fpsave(FPsave*); void fprestore(FPsave*); +void fpsave(FPsave*); +ulong fpstatus(void); ulong getcr0(void); ulong getcr2(void); void idle(void); int inb(int); void inss(int, void*, int); void kbdinit(void); -int mail(int); void mathinit(void); void mmuinit(void); void outb(int, int); void outss(int, void*, int); -int owl(int); void prhex(ulong); void procrestore(Proc*, uchar*); void procsave(uchar*, int); diff --git a/pc/l.s b/pc/l.s index b4f4b5d2f276cc4b6f70f00fe79514acc33c3707..62ecfd3c0af82be6dd3a78613a173e09471e6a8c 100644 --- a/pc/l.s +++ b/pc/l.s @@ -322,6 +322,10 @@ TEXT fprestore(SB),$0 /* turn on floating point and restore regs */ WAIT RET +TEXT fpstatus(SB),$0 /* get floating point status */ + FSTSW AX + RET + /* * special traps */ diff --git a/pc/main.c b/pc/main.c index 26b0456f8a6c282624715695c9ab5315f8202ed6..d1c8fa0121d2e982b5a6f6b7445bf5d15f20e4bd 100644 --- a/pc/main.c +++ b/pc/main.c @@ -222,25 +222,44 @@ confinit(void) conf.nhard = 1; } -/* - * math coprocessor error - */ -void -matherror1(Ureg *ur) +char *mathmsg[] = { -print("matherror1\n"); - pexit("Math error", 0); -} + "invalid", + "denormalized", + "div-by-zero", + "overflow", + "underflow", + "precision", + "stack", + "error", +}; /* * math coprocessor error */ void -matherror2(Ureg *ur) +matherror(Ureg *ur) { - outb(0xF0, 0xFF); /* bad craziness */ -print("matherror2\n"); - pexit("Math error", 0); + ulong status; + int i; + char *msg; + char note[ERRLEN]; + + /* + * a write cycle to port 0xF0 clears the interrupt latch attached + * to the error# line from the 387 + */ + outb(0xF0, 0xFF); + + status = fpstatus() & 0xffff; + msg = "unknown"; + for(i = 0; i < 8; i++) + if((1<pc); + postnote(u->p, 1, note, NDebug); } /* @@ -270,15 +289,14 @@ mathemu(Ureg *ur) void mathover(Ureg *ur) { -print("mathover\n"); pexit("Math overrun", 0); } void mathinit(void) { - setvec(Matherr1vec, matherror1); - setvec(Matherr2vec, matherror2); + setvec(Matherr1vec, matherror); + setvec(Matherr2vec, matherror); setvec(Mathemuvec, mathemu); setvec(Mathovervec, mathover); } @@ -319,19 +337,6 @@ firmware(void) panic("firmware"); } -/* - * make noise, blink lights - */ -void -buzz(int f, int d) -{ -} - -void -lights(int val) -{ -} - /* * special stuff for 80c51 power management and headland system controller */ @@ -443,8 +448,8 @@ pmuwrbit(int index, int bit, int pos) } /* - * control power to the serial line - * onoff == 0 means turn power on + * power to serial port + * onoff == 0 means on * onoff == 1 means off */ int @@ -453,14 +458,26 @@ serial(int onoff) return pmuwrbit(1, onoff, 6); } -int -owl(int onoff) +void +buzz(int f, int d) { - return pmuwrbit(0, onoff, 4); + static Rendez br; + static QLock bl; + + qlock(&bl); + pmuwrbit(0, 0, 6); + tsleep(&br, return0, 0, d); + pmuwrbit(0, 1, 6); + qunlock(&bl); } -int -mail(int onoff) +void +lights(int val) { - return pmuwrbit(0, onoff, 1); + static QLock ll; + + qlock(&ll); + pmuwrbit(0, (val&1), 4); /* owl */ + pmuwrbit(0, ((val>>1)&1), 1); /* mail */ + qunlock(&ll); } diff --git a/pc/trap.c b/pc/trap.c index 646c9167593d8a4746f09e0d704e47c262a5c65f..b8876c1a8075a83a34eb8c60fda884760b2b03c6 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -119,7 +119,7 @@ trapinit(void) sethvec(34, intr34, SEGIG, 0); sethvec(35, intr35, SEGIG, 0); sethvec(36, intr36, SEGIG, 0); - sethvec(37, intr37, SEGTG, 0); + sethvec(37, intr37, SEGIG, 0); sethvec(38, intr38, SEGIG, 0); sethvec(39, intr39, SEGIG, 0); @@ -194,9 +194,11 @@ trap(Ureg *ur) uartintr0(ur); } -if(v==16) print("vec thru 16\n"); (*ivec[v])(ur); + /* + * syscall does it's own notifying + */ if(((ur->cs)&0xffff)!=KESEL && u->nnote && v!=Syscallvec) notify(ur); } diff --git a/port/devcons.c b/port/devcons.c index 660bca72c035df2c0be4f30999b6276be1838540..4402bd4170e6b4c4f64c0ca33e63285ab7f86615 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -626,6 +626,8 @@ consread(Chan *c, void *buf, long n, ulong offset) conf.nswap-swapalloc.free, conf.nswap); return readstr(offset, buf, n, xbuf); + case Qlights: + errors("write only"); default: panic("consread %lux\n", c->qid); return 0; diff --git a/port/devroot.c b/port/devroot.c index a1afca21d114ab6351203c854f8afa4ce9aa83b5..93800bb674df30ed86bb004295afc7c4ce7a2fa1 100644 --- a/port/devroot.c +++ b/port/devroot.c @@ -11,7 +11,6 @@ enum{ Qbin, Qboot, Qcfs, - Qcryptfs, Qdev, Qenv, Qkfs, @@ -22,8 +21,6 @@ extern long cfslen; extern ulong cfscode[]; extern long kfslen; extern ulong kfscode[]; -extern long cryptfslen; -extern ulong cryptfscode[]; Dirtab rootdir[]={ "bin", {Qbin|CHDIR}, 0, 0700, @@ -35,7 +32,6 @@ Dirtab rootdir[]={ #define NROOT (sizeof rootdir/sizeof(Dirtab)) Dirtab rootpdir[]={ "cfs", {Qcfs}, 0, 0700, - "cryptfs", {Qcryptfs}, 0, 0700, "kfs", {Qkfs}, 0, 0700, }; Dirtab *rootmap[sizeof rootpdir/sizeof(Dirtab)]; @@ -62,10 +58,8 @@ rootreset(void) i = 0; if(cfslen) rootmap[i++] = &rootpdir[0]; - if(cryptfslen) - rootmap[i++] = &rootpdir[1]; if(kfslen) - rootmap[i++] = &rootpdir[2]; + rootmap[i++] = &rootpdir[1]; nroot = NROOT + i; } @@ -152,14 +146,6 @@ rootread(Chan *c, void *buf, long n, ulong offset) memmove(buf, ((char*)kfscode)+offset, n); return n; - case Qcryptfs: /* cryptfs */ - if(offset >= cryptfslen) - return 0; - if(offset+n > cryptfslen) - n = cryptfslen - offset; - memmove(buf, ((char*)cryptfscode)+offset, n); - return n; - case Qdev: return 0; }