From aa5253a5392cf1be5815441ab6274c7f9caca9d2 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 19 Mar 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-03-19 --- pc/devrtc.c | 142 +++++++++++++++++++++++++++++++++---------------- power/fptrap.c | 2 +- ss/fptrap.c | 2 +- 3 files changed, 97 insertions(+), 49 deletions(-) diff --git a/pc/devrtc.c b/pc/devrtc.c index f13ffcb85bebb2763dec2df36af586a30e899df7..ccb1c8a5bafd884fab3a13f8370e3537e05c0174 100644 --- a/pc/devrtc.c +++ b/pc/devrtc.c @@ -22,6 +22,9 @@ enum { Year= 0x09, Status= 0x0A, + Nvoff= 128, /* where usable nvram lives */ + Nvsize= 128, + Nbcd= 6, }; @@ -43,8 +46,9 @@ enum{ Qnvram, }; -#define NRTC 1 +#define NRTC 2 Dirtab rtcdir[]={ + "nvram", {Qnvram, 0}, Nvsize, 0666, "rtc", {Qrtc, 0}, 0, 0666, }; @@ -96,7 +100,7 @@ rtcopen(Chan *c, int omode) error(Eperm); break; case Qnvram: - if(strcmp(u->p->user, eve)!=0 || !cpuserver) + if(strcmp(u->p->user, eve)!=0) error(Eperm); } return devopen(c, omode, rtcdir, NRTC, devgen); @@ -160,20 +164,41 @@ long rtcread(Chan *c, void *buf, long n, ulong offset) { ulong t, ot; + char *a; if(c->qid.path & CHDIR) return devdirread(c, buf, n, rtcdir, NRTC, devgen); - qlock(&rtclock); - t = rtctime(); - do{ - ot = t; - t = rtctime(); /* make sure there's no skew */ - }while(t != ot); - qunlock(&rtclock); - n = readnum(offset, buf, n, t, 12); - return n; - + switch(c->qid.path){ + case Qrtc: + qlock(&rtclock); + t = rtctime(); + do{ + ot = t; + t = rtctime(); /* make sure there's no skew */ + }while(t != ot); + qunlock(&rtclock); + n = readnum(offset, buf, n, t, 12); + return n; + case Qnvram: + a = buf; + if(waserror()){ + qunlock(&rtclock); + nexterror(); + } + qlock(&rtclock); + for(t = offset; t < offset + n; t++){ + if(t >= Nvsize) + break; + outb(Paddr, Nvoff+t); + *a++ = inb(Pdata); + } + qunlock(&rtclock); + poperror(); + return t - offset; + } + error(Ebadarg); + return 0; } #define PUTBCD(n,o) bcdclock[o] = (n % 10) | (((n / 10) % 10)<<4) @@ -181,6 +206,8 @@ rtcread(Chan *c, void *buf, long n, ulong offset) long rtcwrite(Chan *c, void *buf, long n, ulong offset) { + int t; + char *a; Rtc rtc; ulong secs; uchar bcdclock[Nbcd]; @@ -190,42 +217,63 @@ rtcwrite(Chan *c, void *buf, long n, ulong offset) if(offset!=0) error(Ebadarg); - /* - * read the time - */ - cp = ep = buf; - ep += n; - while(cp < ep){ - if(*cp>='0' && *cp<='9') - break; - cp++; - } - secs = strtoul(cp, 0, 0); - /* - * convert to bcd - */ - sec2rtc(secs, &rtc); - PUTBCD(rtc.sec, 0); - PUTBCD(rtc.min, 1); - PUTBCD(rtc.hour, 2); - PUTBCD(rtc.mday, 3); - PUTBCD(rtc.mon, 4); - PUTBCD(rtc.year, 5); - - /* - * write the clock - */ - qlock(&rtclock); - outb(Paddr, Seconds); outb(Pdata, bcdclock[0]); - outb(Paddr, Minutes); outb(Pdata, bcdclock[1]); - outb(Paddr, Hours); outb(Pdata, bcdclock[2]); - outb(Paddr, Mday); outb(Pdata, bcdclock[3]); - outb(Paddr, Month); outb(Pdata, bcdclock[4]); - outb(Paddr, Year); outb(Pdata, bcdclock[5]); - qunlock(&rtclock); - - return n; + switch(c->qid.path){ + case Qrtc: + /* + * read the time + */ + cp = ep = buf; + ep += n; + while(cp < ep){ + if(*cp>='0' && *cp<='9') + break; + cp++; + } + secs = strtoul(cp, 0, 0); + + /* + * convert to bcd + */ + sec2rtc(secs, &rtc); + PUTBCD(rtc.sec, 0); + PUTBCD(rtc.min, 1); + PUTBCD(rtc.hour, 2); + PUTBCD(rtc.mday, 3); + PUTBCD(rtc.mon, 4); + PUTBCD(rtc.year, 5); + + /* + * write the clock + */ + qlock(&rtclock); + outb(Paddr, Seconds); outb(Pdata, bcdclock[0]); + outb(Paddr, Minutes); outb(Pdata, bcdclock[1]); + outb(Paddr, Hours); outb(Pdata, bcdclock[2]); + outb(Paddr, Mday); outb(Pdata, bcdclock[3]); + outb(Paddr, Month); outb(Pdata, bcdclock[4]); + outb(Paddr, Year); outb(Pdata, bcdclock[5]); + qunlock(&rtclock); + return n; + case Qnvram: + a = buf; + if(waserror()){ + qunlock(&rtclock); + nexterror(); + } + qlock(&rtclock); + for(t = offset; t < offset + n; t++){ + if(t >= Nvsize) + break; + outb(Paddr, Nvoff+t); + outb(Pdata, *a++); + } + qunlock(&rtclock); + poperror(); + return t - offset; + } + error(Ebadarg); + return 0; } void diff --git a/power/fptrap.c b/power/fptrap.c index f776ec47de99f7174118c67b7630591287c16c1d..e7715c167205479381ab6b630661acf6eaf7af84 100644 --- a/power/fptrap.c +++ b/power/fptrap.c @@ -165,7 +165,7 @@ fpunimp(ulong iw) default: /* probably a compare */ return 0; } - if(ed <= -(maxe-4)){ /* guess: underflow */ + if(ed <= -(maxe-5)){ /* guess: underflow */ zeroreg(&u->fpsave, fmt, fd, sd); /* Set underflow exception and sticky */ u->fpsave.fpstatus |= (1<<3)|(1<<13); diff --git a/ss/fptrap.c b/ss/fptrap.c index ab84adb089f5f4b5b6fc15e976934613c345a714..96803056935ebffa0eb844fbcca7f8e22fc5216d 100644 --- a/ss/fptrap.c +++ b/ss/fptrap.c @@ -167,7 +167,7 @@ unfinished(FPsave *f) default: goto bad; } - if(ed <= -(maxe-4)){ /* guess: underflow */ + if(ed <= -(maxe-5)){ /* guess: underflow */ zeroreg(f, size, rd, sd); return 1; }