From b55f376892598b6b6eb360981ab672365f5f581c Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 19 May 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-05-19 --- pc/devhard.c | 1 + pc/vga.c | 37 ++++++++++--------- port/devbit.c | 6 ++- port/devscc.c | 1 - port/proc.c | 6 +++ power/devduart.c | 95 +++++++++++++++++------------------------------- 6 files changed, 64 insertions(+), 82 deletions(-) diff --git a/pc/devhard.c b/pc/devhard.c index 55482f8ff2ba68cc2d0ef5c5f75437c4c140db1e..02aab770f677b4796e3230108fd263a7cef1732a 100644 --- a/pc/devhard.c +++ b/pc/devhard.c @@ -259,6 +259,7 @@ hardattach(char *spec) print(" cyl=%d h=%d sec=%d\n", dp->id.lcyls, dp->id.lheads, dp->id.ls2t); } + case 0x427a: /* for now: a list of those that work */ dp->cyl = dp->id.lcyls; dp->heads = dp->id.lheads; dp->sectors = dp->id.ls2t; diff --git a/pc/vga.c b/pc/vga.c index 7c5f415c8d4fdc6ce6d41c1d702c6a692f3fcb52..fa1172f5e2f3a1ac605df90cca49b117cf562fef 100644 --- a/pc/vga.c +++ b/pc/vga.c @@ -100,14 +100,14 @@ VGAmode mode12 = VGAmode mode6a = { /* general */ - 0xe3, 0x00, /* 0x70, 0x04, these are read-only */ + 0x2f, 0x00, /* 0x70, 0x04, these are read-only */ /* sequence */ 0x03, 0x01, 0x0f, 0x00, 0x06, /* crt */ - 0x7f, 0x63, 0x64, 0x02, 0x6a, 0x1d, 0x77, 0xf0, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, - 0x5d, 0x8f, 0x57, 0x32, 0x00, 0x5b, 0x74, 0xc3, - 0xff, + 0x7a, 0x63, 0x65, 0x9d, 0x67, 0x92, 0x39, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x33, 0x82, 0x2b, 0x32, 0x0f, 0x33, 0x36, 0xe7, + 0xff, /* graphics */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff, @@ -208,7 +208,6 @@ setmode(VGAmode *v) arout(i, v->attribute[i]); } -#ifdef VGATROUBLE void getmode(VGAmode *v) { int i; @@ -236,27 +235,27 @@ getmode(VGAmode *v) { void printmode(VGAmode *v) { int i; - print("general registers: %02x %02x\n", + print("g %2.2x %2x\n", v->general[0], v->general[1]); - print("sequence registers: "); + print("s "); for(i = 0; i < sizeof(v->sequencer); i++) { - print(" %02x", v->sequencer[i]); + print(" %2.2x", v->sequencer[i]); } - print("\nCRT registers: "); + print("\nc "); for(i = 0; i < sizeof(v->crt); i++) { - print(" %02x", v->crt[i]); + print(" %2.2x", v->crt[i]); } - print("\nGraphics registers: "); + print("\ng "); for(i = 0; i < sizeof(v->graphics); i++) { - print(" %02x", v->graphics[i]); + print(" %2.2x", v->graphics[i]); } - print("\nAttribute registers: "); + print("\na "); for(i = 0; i < sizeof(v->attribute); i++) { - print(" %02x", v->attribute[i]); + print(" %2.2x", v->attribute[i]); } print("\n"); } @@ -302,9 +301,10 @@ screeninit(void) int i, j, k; int c; ulong *l; - VGAmode v; + VGAmode testmode; - setmode(&mode12); + setmode(&mode6a); + getmode(&testmode); /* * swizzle the font longs. @@ -320,6 +320,9 @@ screeninit(void) out.pos.x = MINX; out.pos.y = 0; out.bwid = defont0.info[' '].width; +delay(50000); + setmode(&mode12); + printmode(&testmode); } void diff --git a/port/devbit.c b/port/devbit.c index bdf4a9bc7a578e6477f0bdb09782a84bb1fd5ca8..b3eead658418a33341052916cf432cd0ceffddb6 100644 --- a/port/devbit.c +++ b/port/devbit.c @@ -1244,8 +1244,10 @@ bitalloc(Rectangle rect, int ld) if(bit.free == 0) error(Enobitmap); ws = 1<<(5-ld); /* pixels per word */ - if(rect.min.x >= 0) - l = (rect.max.x+ws-1)/ws - rect.min.x/ws; + if(rect.min.x >= 0) { + l = (rect.max.x+ws-1)/ws; + l -= rect.min.x/ws; + } else{ /* make positive before divide */ t = (-rect.min.x)+ws-1; t = (t/ws)*ws; diff --git a/port/devscc.c b/port/devscc.c index 9ef67bbf59f085ac91bde6d9479ee13dddb20396..0d6f56cf850688b03f948db773d980ca46ab6dfe 100644 --- a/port/devscc.c +++ b/port/devscc.c @@ -451,7 +451,6 @@ sccspecial(int port, IOQ *oq, IOQ *iq, int baud) } } -static int sccputc(IOQ *, int); static void sccstopen(Queue*, Stream*); static void sccstclose(Queue*); static void sccoput(Queue*, Block*); diff --git a/port/proc.c b/port/proc.c index dbf179f3215697cb39953af4ca20b952b8614ea0..91af24719757aa2408e1ce0ef6ff24e6c52c8611 100644 --- a/port/proc.c +++ b/port/proc.c @@ -297,6 +297,7 @@ void sleep(Rendez *r, int (*f)(void*), void *arg) { Proc *p; + int s; p = u->p; sleep1(r, f, arg); @@ -304,10 +305,12 @@ sleep(Rendez *r, int (*f)(void*), void *arg) sched(); /* notepending may go true while asleep */ if(p->notepending){ p->notepending = 0; + s = splhi(); lock(r); if(r->p == p) r->p = 0; unlock(r); + splx(s); error(Eintr); } } @@ -317,6 +320,7 @@ tsleep(Rendez *r, int (*f)(void*), void *arg, int ms) { Alarm *a; Proc *p; + int s; p = u->p; sleep1(r, f, arg); @@ -327,10 +331,12 @@ tsleep(Rendez *r, int (*f)(void*), void *arg, int ms) } if(p->notepending){ p->notepending = 0; + s = splhi(); lock(r); if(r->p == p) r->p = 0; unlock(r); + splx(s); error(Eintr); } } diff --git a/power/devduart.c b/power/devduart.c index b7bf12dc8e70080343f05b46b7d6c7ecd252ac0c..11bd0cd8418a1c7b2eb555e6c9b91b86d12b588f 100644 --- a/power/devduart.c +++ b/power/devduart.c @@ -137,10 +137,7 @@ struct Duartport /* stream interface */ Queue *wq; /* write queue */ Rendez r; /* kproc waiting for input */ - Alarm *a; /* alarm for waking the kernel process */ - int delay; /* between character input and waking kproc */ int kstarted; /* kproc started */ - uchar delim[256/8]; /* characters that act as delimiters */ }; Duartport duartport[Maxport]; /* max possible */ @@ -207,7 +204,7 @@ duartenable0(void) void duartbaud(Duartport *dp, int b) { - int x = 0; + int x; switch(b){ case 38400: @@ -235,9 +232,10 @@ duartbaud(Duartport *dp, int b) return; } if(x & 0x0100) - dp->duart->ipc_acr = duartacr |= 0x80; + duartacr |= 0x80; else - dp->duart->ipc_acr = duartacr &= ~0x80; + duartacr &= ~0x80; + dp->duart->ipc_acr = duartacr; dp->duart->sr_csr = x; } @@ -257,11 +255,13 @@ duartbreak(Duartport *dp, int val) duart = dp->duart; if (val){ - duart->is_imr = duartimr &= ~IM_XRDYB; + duartimr &= ~IM_XRDYB; + duart->is_imr = duartimr; duart->cmnd = STRT_BRK|ENB_TX; } else { duart->cmnd = STOP_BRK|ENB_TX; - duart->is_imr = duartimr |= IM_XRDYB; + duartimr |= IM_XRDYB; + duart->is_imr = duartimr; } } @@ -273,10 +273,10 @@ duartslave0(Duartport *dp) { switch(dp->op){ case Ddtr: - duartbaud(dp, dp->val); + duartdtr(dp, dp->val); break; case Dbaud: - duartdtr(dp, dp->val); + duartbaud(dp, dp->val); break; case Dbreak: duartbreak(dp, dp->val); @@ -298,16 +298,24 @@ duartslave0(Duartport *dp) void duartslave(void) { + IOQ *cq; Duartport *dp; dp = &duartport[2*m->machno]; + cq = dp->iq; + if(dp->wq && cangetc(cq)) + wakeup(&cq->r); if(dp->op != Dnone) duartslave0(dp); dp++; + cq = dp->iq; + if(dp->wq && cangetc(cq)) + wakeup(&cq->r); if(dp->op != Dnone) duartslave0(dp); } +void duartrintr(Duartport *dp) { Duart *duart; @@ -324,13 +332,11 @@ duartrintr(Duartport *dp) cq = dp->iq; if(cq->putc) (*cq->putc)(cq, ch); - else { + else putc(cq, ch); - if(dp->delim[ch/8] & (1<<(ch&7)) ) - wakeup(&cq->r); - } } +void duartxintr(Duartport *dp) { Duart *duart; @@ -490,7 +496,6 @@ duartspecial(int port, IOQ *oq, IOQ *iq, int baud) duartbaud(dp, baud); } -static void duarttimer(Alarm*); static int duartputc(IOQ *, int); static void duartstopen(Queue*, Stream*); static void duartstclose(Queue*); @@ -505,36 +510,12 @@ Qinfo duartinfo = "duart" }; -/* - * wakeup the helper process to do input - */ -static void -duarttimer(Alarm *a) -{ - Duartport *dp = a->arg; - - cancel(a); - dp->a = 0; - wakeup(&dp->iq->r); -} - static int -duartputc(IOQ *cq, int ch) +opdone(void *x) { - Duartport *dp = cq->ptr; int r; - - r = putc(cq, ch); + Duartport *dp = x; - /* - * pass upstream within dp->delay milliseconds - */ - if(dp->a==0){ - if(dp->delay == 0) - wakeup(&cq->r); - else - dp->a = alarm(dp->delay, duarttimer, dp); - } - return r; + return dp->op == Dnone; } static void @@ -549,18 +530,17 @@ duartstopen(Queue *q, Stream *s) dp->wq = WR(q); WR(q)->ptr = dp; RD(q)->ptr = dp; - dp->delay = 64; - dp->iq->putc = duartputc; qunlock(dp); - /* start with all characters as delimiters */ - memset(dp->delim, 1, sizeof(dp->delim)); - if(dp->kstarted == 0){ dp->kstarted = 1; sprint(name, "duart%d", s->id); kproc(name, duartkproc, dp); } + + /* enable the port */ + dp->op = Dena; + sleep(&dp->opr, opdone, dp); } static void @@ -576,13 +556,6 @@ duartstclose(Queue *q) qunlock(dp); } -static int -opdone(void *x) -{ - Duartport *dp = x; - - return dp->op == Dnone; -} static void duartoput(Queue *q, Block *bp) { @@ -631,11 +604,6 @@ duartoput(Queue *q, Block *bp) case 'r': /* can't control? */ break; - case 'W': - case 'w': - if(n>=0 && n<1000) - dp->delay = n; - break; } qunlock(dp); }else while((m = BLEN(bp)) > 0){ @@ -699,8 +667,10 @@ duartreset(void) for(i = 0; i < nduartport; i++){ sprint(duartdir[2*i].name, "eia%d", i); sprint(duartdir[2*i+1].name, "eia%dctl", i); - duartdir[2*i].length = duartdir[2*i+1].length = 0; - duartdir[2*i].perm = duartdir[2*i+1].perm = 0666; + duartdir[2*i].length = 0; + duartdir[2*i+1].length = 0; + duartdir[2*i].perm = 0666; + duartdir[2*i+1].perm = 0666; duartdir[2*i].qid.path = STREAMQID(i, Sdataqid); duartdir[2*i+1].qid.path = STREAMQID(i, Sctlqid); } @@ -746,7 +716,7 @@ duartstat(Chan *c, char *dp) { switch(STREAMTYPE(c->qid.path)){ case Sdataqid: - streamstat(c, dp, "eia0"); + streamstat(c, dp, duartdir[2*STREAMID(c->qid.path)].name); break; default: devstat(c, dp, duartdir, 2*nduartport, devgen); @@ -815,6 +785,7 @@ duartread(Chan *c, void *buf, long n, ulong offset) } error(Egreg); + return 0; /* not reached */ } long