From e30c70c118c598ae21f7b95fe1605d2ec3a0525c Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 16 May 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-05-16 --- gnot/main.c | 6 ++- pc/devhard.c | 21 +++----- pc/main.c | 1 + port/alarm.c | 130 ++++++++++++++++++++++++++++++----------------- port/portdat.h | 4 +- port/portfns.h | 1 + power/devduart.c | 2 +- power/main.c | 1 + ss/main.c | 5 +- 9 files changed, 104 insertions(+), 67 deletions(-) diff --git a/gnot/main.c b/gnot/main.c index cadb405cb621352aa2560859a4dd16e69dab8695..1c691617dce1c10ebe3191ee40069c40e3275cab 100644 --- a/gnot/main.c +++ b/gnot/main.c @@ -135,11 +135,13 @@ init0(void) u->p->state = Running; u->p->mach = m; spllo(); - - chandevinit(); u->slash = (*devtab[0].attach)(0); u->dot = clone(u->slash, 0); + + kproc("alarm", alarmkproc, 0); + chandevinit(); + if(!waserror()){ ksetterm("at&t %s"); ksetenv("cputype", "68020"); diff --git a/pc/devhard.c b/pc/devhard.c index e441b4609c58b7f0888caf9e68714a9faf24cdc2..55482f8ff2ba68cc2d0ef5c5f75437c4c140db1e 100644 --- a/pc/devhard.c +++ b/pc/devhard.c @@ -27,9 +27,7 @@ enum Pstatus= 7, /* status port (read) */ Sbusy= (1<<7), Sready= (1<<6), - Sdwf= (1<<5), Sdrq= (1<<3), - Scorr= (1<<2), Serr= (1<<0), Pcmd= 7, /* cmd port (write) */ @@ -523,16 +521,16 @@ retry: len = pp->end - lblk; cp->nsecs = len; - cp->cmd = cmd; - cp->dp = dp; + cmdreadywait(cp); /* * start the transfer */ + cp->cmd = cmd; + cp->dp = dp; cp->status = 0; - cmdreadywait(cp); - outb(cp->pbase+Pcount, cp->nsecs); + outb(cp->pbase+Pcount, cp->nsecs-cp->sofar); outb(cp->pbase+Psector, sec); outb(cp->pbase+Pdh, 0x20 | head); outb(cp->pbase+Pcyllsb, cyl); @@ -545,7 +543,6 @@ retry: if(++loop > 10000) panic("hardxfer"); outss(cp->pbase+Pdata, cp->buf, dp->bytes/2); - cp->nsecs--; } sleep(&cp->r, cmddone, cp); @@ -776,8 +773,6 @@ hardintr(Ureg *ur) cp->cmd, inb(cp->pbase+Pstatus)); panic("hardintr: wait busy"); } - if(cp->status & (Sdwf|Scorr)) - print("hardintr: cmd=#%lux, status=#%lux\n", cp->cmd, cp->status); switch(cp->cmd){ case Cwrite: if(cp->status & Serr){ @@ -788,7 +783,7 @@ hardintr(Ureg *ur) return; } cp->sofar++; - if(cp->nsecs){ + if(cp->sofar < cp->nsecs){ loop = 0; while((inb(cp->pbase+Pstatus) & Sdrq) == 0) if(++loop > 10000) { @@ -798,8 +793,7 @@ hardintr(Ureg *ur) } outss(cp->pbase+Pdata, &cp->buf[cp->sofar*dp->bytes], dp->bytes/2); - cp->nsecs--; - } else { + } else{ cp->lastcmd = cp->cmd; cp->cmd = 0; wakeup(&cp->r); @@ -831,8 +825,7 @@ hardintr(Ureg *ur) inss(cp->pbase+Pdata, &cp->buf[cp->sofar*dp->bytes], dp->bytes/2); cp->sofar++; - cp->nsecs--; - if(cp->nsecs == 0){ + if(cp->sofar >= cp->nsecs){ cp->lastcmd = cp->cmd; if (cp->cmd == Cread) cp->cmd = 0; diff --git a/pc/main.c b/pc/main.c index c1bfe00fca22a92985dccdd0602e56a8d523aafb..6c981aa2a166b2cda17422bd6f393bdc6c14b68f 100644 --- a/pc/main.c +++ b/pc/main.c @@ -86,6 +86,7 @@ init0(void) u->slash = (*devtab[0].attach)(0); u->dot = clone(u->slash, 0); + kproc("alarm", alarmkproc, 0); chandevinit(); if(!waserror()){ diff --git a/port/alarm.c b/port/alarm.c index 5c4e3735ce477074ad3d21e5908fb6fcaedb6053..833980b7f15210254aca5ba71afab114bb2ab30d 100644 --- a/port/alarm.c +++ b/port/alarm.c @@ -5,34 +5,34 @@ #include "fns.h" #include "io.h" -Alarm *alarmtab; +struct { + QLock; + Alarm *tab; /* table of all alarm structures */ + void *list; /* busy alarms */ + Rendez r; +} alarmalloc; + Alarms alarms; Alarm* alarm(int ms, void (*f)(Alarm*), void *arg) { Alarm *a, *w, *pw; - ulong s; + if(ms < 0) ms = 0; a = newalarm(); - a->dt = MS2TK(ms); + a->when = MACHP(0)->ticks+MS2TK(ms); a->f = f; a->arg = arg; - s = splhi(); - lock(&m->alarmlock); + qlock(&alarmalloc); pw = 0; - for(w=m->alarm; w; pw=w, w=w->next){ - if(w->dt <= a->dt){ - a->dt -= w->dt; - continue; - } - w->dt -= a->dt; - break; + for(w=alarmalloc.list; w; pw=w, w=w->next){ + if(w->when > a->when) + break; } - insert(&m->alarm, pw, a); - unlock(&m->alarmlock); - splx(s); + insert(&alarmalloc.list, pw, a); + qunlock(&alarmalloc); return a; } @@ -48,7 +48,7 @@ newalarm(void) int i; Alarm *a; - for(i=0,a=alarmtab; ibusy==0 && a->f==0 && canlock(a)){ if(a->busy){ unlock(a); @@ -61,6 +61,7 @@ newalarm(void) return a; } panic("newalarm"); + return 0; /* not reached */ } /* allocate locks here since you can't allocate them at interrupt time (on the SGI) */ @@ -69,18 +70,20 @@ alarminit(void) { int i; - alarmtab = ialloc(conf.nalarm*sizeof(Alarm), 0); + alarmalloc.tab = ialloc(conf.nalarm*sizeof(Alarm), 0); for(i=0; ialarmlock)){ - a = m->alarm; + USED(arg); + + for(;;){ + now = MACHP(0)->ticks; + + qlock(&alarmalloc); + a = alarmalloc.list; if(a){ - for(n=0; a && a->dt<=0 && nwhen<=now && nalarm, 0, a); - a = m->alarm; + delete(&alarmalloc.list, 0, a); + a = alarmalloc.list; } - if(a) - a->dt--; - unlock(&m->alarmlock); - - /* execute alarm functions outside the lock */ - for(i = 0; i < n; i++){ - f = alist[i]->f; /* avoid race with cancel */ - if(f) - (*f)(alist[i]); - alist[i]->busy = 0; + qunlock(&alarmalloc); + + /* + * execute alarm functions outside the lock since they + * might call alarm(). + */ + f = 0; + if(waserror()){ + print("alarm func %lux caused error %s\n", f, u->error); + } else { + for(i = 0; i < n; i++){ + f = alist[i]->f; /* avoid race with cancel */ + if(f) + (*f)(alist[i]); + alist[i]->busy = 0; + } + poperror(); } }else - unlock(&m->alarmlock); - } + qunlock(&alarmalloc); - if(m == MACHP(0) && canlock(&alarms)){ - now = MACHP(0)->ticks; + qlock(&alarms); while((rp = alarms.head) && rp->alarm <= now){ if(rp->alarm != 0L){ if(canqlock(&rp->debug)){ - postnote(rp, 0, "alarm", NUser); + if(!waserror()){ + postnote(rp, 0, "alarm", NUser); + poperror(); + } qunlock(&rp->debug); rp->alarm = 0L; }else @@ -125,10 +141,32 @@ checkalarms(void) } alarms.head = rp->palarm; } - unlock(&alarms); + qunlock(&alarms); + + sleep(&alarmalloc.r, return0, 0); } } +/* + * called every clock tick + */ +void +checkalarms(void) +{ + ulong now; + Proc *p; + Alarm *a; + + if(m != MACHP(0)) + return; + a = alarmalloc.list; + p = alarms.head; + now = MACHP(0)->ticks; + + if((a && a->when <= now) || (p && p->alarm <= now)) + wakeup(&alarmalloc.r); +} + ulong procalarm(ulong time) { @@ -143,7 +181,7 @@ procalarm(ulong time) when = MS2TK(time); when += MACHP(0)->ticks; - lock(&alarms); + qlock(&alarms); l = &alarms.head; for(f = *l; f; f = f->palarm){ if(u->p == f){ @@ -170,7 +208,7 @@ procalarm(ulong time) alarms.head = u->p; done: u->p->alarm = when; - unlock(&alarms); + qunlock(&alarms); return old; } diff --git a/port/portdat.h b/port/portdat.h index 070c733129d7eabb9eb1d4520f9ef72935636691..aa4d14963256ac4f8d83812d98b7a1ac2e8e0bee 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -76,14 +76,14 @@ struct Alarm List; Lock; int busy; - long dt; /* may underflow in clock(); must be signed */ + ulong when; /* may underflow in clock(); must be signed */ void (*f)(void*); void *arg; }; struct Alarms { - Lock; + QLock; Proc *head; }; diff --git a/port/portfns.h b/port/portfns.h index 7acfde2cf0d6127a55ed59c0dc9355e93b1806a2..34e8d009e1db9a1f7a4a574a80d5a0bc84dd6e4a 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -1,5 +1,6 @@ Alarm* alarm(int, void (*)(Alarm*), void*); void alarminit(void); +void alarmkproc(void*); Block* allocb(ulong); int anyready(void); void append(List**, List*); diff --git a/power/devduart.c b/power/devduart.c index 3651f798abfdf8c75251f7ecef86bc34460181e0..b7bf12dc8e70080343f05b46b7d6c7ecd252ac0c 100644 --- a/power/devduart.c +++ b/power/devduart.c @@ -232,7 +232,7 @@ duartbaud(Duartport *dp, int b) x = BD300; break; default: - error(Ebadarg); + return; } if(x & 0x0100) dp->duart->ipc_acr = duartacr |= 0x80; diff --git a/power/main.c b/power/main.c index 05a2b5c732a0980774fd02c2c9e1748c0f93607e..00342f7e251e3b330b7c7dd5fb8fd82d19fa123a 100644 --- a/power/main.c +++ b/power/main.c @@ -218,6 +218,7 @@ init0(void) */ u->slash = (*devtab[0].attach)(0); u->dot = clone(u->slash, 0); + kproc("alarm", alarmkproc, 0); chandevinit(); if(!waserror()){ diff --git a/ss/main.c b/ss/main.c index ce2dbd4bbf37dfe7ff56e92c09d556a76b2cf9e2..e9ca1a15266bc8e4a28d204123ad95f5a7e4cb2a 100644 --- a/ss/main.c +++ b/ss/main.c @@ -103,12 +103,13 @@ init0(void) u->p->state = Running; u->p->mach = m; spllo(); - - chandevinit(); u->slash = (*devtab[0].attach)(0); u->dot = clone(u->slash, 0); + kproc("alarm", alarmkproc, 0); + chandevinit(); + if(!waserror()){ ksetterm("sun %s"); ksetenv("cputype", "sparc");