From 7e7a0ef4da268453a2fb56c35a8f5a3d83ca0754 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 17 Jun 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-06-17 --- boot/aux.c | 6 ++++-- pc/mmu.c | 34 +++++++++++++++++++++------------- port/devcons.c | 5 +++++ port/devscc.c | 41 +++++++++++++++++++++++++++++++++++++++++ port/portdat.h | 1 + port/proc.c | 12 +++++++++++- 6 files changed, 83 insertions(+), 16 deletions(-) diff --git a/boot/aux.c b/boot/aux.c index 778de67eebbc52d89cd431e702f2b30c5eb9b8ba..c87a0ced74c2ec8002bf8638cd1ed45c16efc10b 100644 --- a/boot/aux.c +++ b/boot/aux.c @@ -129,12 +129,14 @@ outin(char *prompt, char *def, int len) int n; char buf[256]; - alarm(60*1000); + if(cpuflag) + alarm(60*1000); do{ print("%s[%s]: ", prompt, *def ? def : "no default"); n = read(0, buf, len); }while(n==0); - alarm(0); + if(cpuflag) + alarm(0); if(n < 0) fatal("can't read #c/cons or timeout; please reboot"); if(n != 1){ diff --git a/pc/mmu.c b/pc/mmu.c index d4be7e34f642110ddbf552ee6ba4a0c60f1d476b..666a51aa5d9af35b1b69a73e7a5455e69d827583 100644 --- a/pc/mmu.c +++ b/pc/mmu.c @@ -195,24 +195,13 @@ flushmmu(void) { int s; Proc *p; - Page *pg; - ulong *top; if(u == 0) return; - p = u->p; + p->newtlb = 1; s = splhi(); - if(p->mmutop && p->mmuused){ - top = (ulong*)p->mmutop->va; - for(pg = p->mmuused; pg->next; pg = pg->next) - top[pg->daddr] = 0; - top[pg->daddr] = 0; - pg->next = p->mmufree; - p->mmufree = p->mmuused; - p->mmuused = 0; - } - mapstack(u->p); + mapstack(p); splx(s); } @@ -227,10 +216,29 @@ mapstack(Proc *p) ulong tlbphys; int i; Page *pg; + ulong *top; if(p->upage->va != (USERADDR|(p->pid&0xFFFF)) && p->pid != 0) panic("mapstack %d 0x%lux 0x%lux", p->pid, p->upage->pa, p->upage->va); + if(p->newtlb){ + /* + * bin the current second level page tables. newtlb + * set means that they are inconsistent with the segment.c + * data structures. + */ + if(p->mmutop && p->mmuused){ + top = (ulong*)p->mmutop->va; + for(pg = p->mmuused; pg->next; pg = pg->next) + top[pg->daddr] = 0; + top[pg->daddr] = 0; + pg->next = p->mmufree; + p->mmufree = p->mmuused; + p->mmuused = 0; + } + p->newtlb = 0; + } + /* map in u area */ upt[0] = PPN(p->upage->pa) | PTEVALID | PTEKERNEL | PTEWRITE; diff --git a/port/devcons.c b/port/devcons.c index 06d6ddede2bf366b2a9a601a7089dcac1bf2a422..2ecbc27cc2817f236c1d2a0990807baa7329d84a 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -331,6 +331,7 @@ enum{ Qconsctl, Qcputime, Qcrypt, + Qhz, Qkey, Qklog, Qlights, @@ -355,6 +356,7 @@ Dirtab consdir[]={ "consctl", {Qconsctl}, 0, 0220, "cputime", {Qcputime}, 6*NUMSIZE, 0444, "crypt", {Qcrypt}, 0, 0666, + "hz", {Qhz}, NUMSIZE, 0666, "key", {Qkey}, DESKEYLEN, 0622, "klog", {Qklog}, 0, 0444, "lights", {Qlights}, 0, 0220, @@ -647,6 +649,9 @@ consread(Chan *c, void *buf, long n, ulong offset) case Qmsec: return readnum(offset, buf, n, TK2MS(MACHP(0)->ticks), NUMSIZE); + case Qhz: + return readnum(offset, buf, n, HZ, NUMSIZE); + case Qsysstat: j = 0; xbuf[0] = 0; diff --git a/port/devscc.c b/port/devscc.c index c2a3a12ca101dec7522926ba9ade1b8ed90b5e03..55c9b65f90852c7d6dac4e8644a4940f6350ed2d 100644 --- a/port/devscc.c +++ b/port/devscc.c @@ -31,6 +31,7 @@ enum Rx7bits= 1<<6, Rx6bits= 2<<6, Rx8bits= 3<<6, + Rxbitmask= 3<<6, /* wr 4 */ ParEven= 3<<0, @@ -52,6 +53,7 @@ enum Tx7bits= 1<<5, Tx6bits= 2<<5, Tx8bits= 3<<5, + Txbitmask= 3<<5, /* wr 9 */ IntEna= 1<<3, @@ -186,6 +188,40 @@ sccparity(SCC *sp, char type) sccwrreg(sp, 4, 0); } +/* + * set bits/character, default 8 + */ +void +sccbits(SCC *sp, int n) +{ + int val; + int rbits, tbits; + + switch(n){ + case 5: + rbits = Rx5bits; + tbits = Tx5bits; + break; + case 6: + rbits = Rx6bits; + tbits = Tx6bits; + break; + case 7: + rbits = Rx7bits; + tbits = Tx7bits; + break; + case 8: + default: + rbits = Rx8bits; + tbits = Tx8bits; + break; + } + sp->sticky[3] = (sp->sticky[3]&~Rxbitmask) | rbits; + sccwrreg(sp, 3, 0); + sp->sticky[5] = (sp->sticky[5]&~Txbitmask) | tbits; + sccwrreg(sp, 5, 0); +} + /* * toggle DTR */ @@ -530,6 +566,11 @@ sccoput(Queue *q, Block *bp) case 'd': sccdtr(sp, n); break; + case 'L': + case 'l': + sccbits(sp, n); + break; + case 'P': case 'p': sccparity(sp, *(bp->rptr+1)); diff --git a/port/portdat.h b/port/portdat.h index 3285881db57735e54a7f1a334d7764dea8a17a54..41eb669e3ee876c31fea2aa235bd113425ad07d7 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -561,6 +561,7 @@ struct Proc ulong twhen; Rendez *trend; Proc *tlink; + int (*tfn)(void*); /* * machine specific MMU goo diff --git a/port/proc.c b/port/proc.c index 35ec7bb1fa3d4d3e412c32f6cb2f3000f868fe02..71ec0dd10cb3e2ee5f8728e55ac62fe78ff51f13 100644 --- a/port/proc.c +++ b/port/proc.c @@ -313,6 +313,15 @@ sleep(Rendez *r, int (*f)(void*), void *arg) } } +int +tfn(void *arg) +{ + Proc *p; + + p = u->p; + return MACHP(0)->ticks >= p->twhen || (*p->tfn)(arg); +} + void tsleep(Rendez *r, int (*fn)(void*), void *arg, int ms) { @@ -335,10 +344,11 @@ tsleep(Rendez *r, int (*fn)(void*), void *arg, int ms) p->trend = r; p->twhen = when; p->tlink = *i; + p->tfn = fn; *i = p; unlock(&talarm); - sleep(r, fn, arg); + sleep(r, tfn, arg); p->twhen = 0; }