From 258490940e27149fb21b5b62191f0656bccf865e Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 21 Aug 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-08-21 --- gnot/lock.c | 15 +++------------ gnot/mem.h | 1 + gnot/mmu.c | 20 +++++++++----------- gnot/trap.c | 2 +- pc/devhard.c | 40 ++++++++++++++++++++-------------------- pc/kbd.c | 1 + pc/l.s | 2 ++ pc/main.c | 2 +- pc/mmu.c | 14 ++++++++------ ss/clock.c | 8 ++++++-- 10 files changed, 52 insertions(+), 53 deletions(-) diff --git a/gnot/lock.c b/gnot/lock.c index 5e9c2fb8f8e21997205c8f3e05e4e5640a003b9b..1865e7be5c978f7bb499bc3f5bb9f270a0b7311e 100644 --- a/gnot/lock.c +++ b/gnot/lock.c @@ -12,24 +12,15 @@ lock(Lock *l) { int i; - /* - * Try the fast grab first - */ - if(tas(&l->key) == 0){ - if(u) - u->p->hasspin = 1; - l->pc = ((ulong*)&l)[PCOFF]; - return; - } - for(i = 0; i < 100000; i++){ - if(u && u->p->state == Running) - sched(); + for(i = 0; i < 1000000; i++){ if (tas(&l->key) == 0){ if(u) u->p->hasspin = 1; l->pc = ((ulong*)&l)[PCOFF]; return; } + if(u && u->p->state == Running) + sched(); } i = l->key; l->key = 0; diff --git a/gnot/mem.h b/gnot/mem.h index 4b55c9af7509f3f00623cfa9a37afa556a9be25e..fef61b8028c16b44d7f2ee90f2c02b379a3a0f3b 100644 --- a/gnot/mem.h +++ b/gnot/mem.h @@ -14,6 +14,7 @@ #define PGSHIFT 13 /* log(BY2PG) */ #define PGROUND(s) (((s)+(BY2PG-1))&~(BY2PG-1)) #define ICACHESIZE 0 +#define MB4 (4*1024*1024) /* Lots of things are 4Mb in size */ #define MAXMACH 1 /* max # cpus system can run */ diff --git a/gnot/mmu.c b/gnot/mmu.c index f94e23c3de2d644c19a60945c742cd384c98ed36..7687323efbc3447318ce1ea17eb0e038aa2e3768 100644 --- a/gnot/mmu.c +++ b/gnot/mmu.c @@ -9,7 +9,7 @@ struct Lock; int init; KMap *free; - KMap arena[4*1024*1024/BY2PG]; /* kernel mmu maps up to 4MB */ + KMap arena[MB4/BY2PG]; /* kernel mmu maps up to 4MB */ }kmapalloc; /* @@ -120,15 +120,18 @@ kmapinit(void) if(kmapalloc.init == 0){ k = &kmapalloc.arena[0]; - k->va = KZERO|(4*1024*1024-256*1024-BY2PG); + k->va = KZERO|(MB4-256*1024-BY2PG); k->next = 0; kmapalloc.free = k; kmapalloc.init = 1; return; } - e = (4*1024*1024 - 256*1024)/BY2PG; /* screen lives at top 256K */ + + e = (MB4 - 256*1024)/BY2PG; /* screen lives at top 256K */ i = PGROUND(((ulong)ialloc(0, 0))&~KZERO)/BY2PG; + print("%lud free map registers\n", e-i); + kmapalloc.free = 0; for(k=&kmapalloc.arena[i]; iva = i*BY2PG|KZERO; @@ -140,12 +143,7 @@ KMap* kmap(Page *pg) { KMap *k; - int s; - if(u && u->p){ - s = u->p->state; - u->p->state = MMUing; - } lock(&kmapalloc); k = kmapalloc.free; if(k == 0){ @@ -154,10 +152,9 @@ kmap(Page *pg) } kmapalloc.free = k->next; unlock(&kmapalloc); + k->pa = pg->pa; putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); - if(u && u->p) - u->p->state = s; return k; } @@ -165,10 +162,11 @@ void kunmap(KMap *k) { k->pa = 0; + putkmmu(k->va, INVALIDPTE); + lock(&kmapalloc); k->next = kmapalloc.free; kmapalloc.free = k; - putkmmu(k->va, INVALIDPTE); unlock(&kmapalloc); } diff --git a/gnot/trap.c b/gnot/trap.c index 03c312f2e6122091b22ddab0fed1cce6ee702b14..ffb6d2d5b190297dc979e31c30afb88bd4b3fedf 100644 --- a/gnot/trap.c +++ b/gnot/trap.c @@ -131,7 +131,7 @@ dumpregs(Ureg *ur) l = &ur->r0; for(i=0; i>3)&0x7) -#define MKQID(d,p) (((d)<<3) | (p)) +#define PART(x) ((x)&0xF) +#define DRIVE(x) (((x)>>4)&0x7) +#define MKQID(d,p) (((d)<<4) | (p)) /* * ident sector from drive @@ -166,15 +166,14 @@ hardgen(Chan *c, Dirtab *tab, long ntab, long s, Dir *dirp) return -1; dp = &hard[drive]; - if(s < dp->npart){ - pp = &dp->p[s]; - sprint(name, "hd%d%s", drive, pp->name); - name[NAMELEN] = 0; - qid.path = MKQID(drive, s); - l = (pp->end - pp->start) * dp->bytes; - } else + if(s >= dp->npart) return 0; + pp = &dp->p[s]; + sprint(name, "hd%d%s", drive, pp->name); + name[NAMELEN] = 0; + qid.path = MKQID(drive, s); + l = (pp->end - pp->start) * dp->bytes; devdir(c, qid, name, l, 0600, dirp); return 1; } @@ -319,13 +318,6 @@ hardread(Chan *c, void *a, long n) i -= skip; if(i > n - rv) i = n - rv; -{int j; - - print("0x%lux(%d) <- ", aa+rv, i); - for(j = 0; j<32; j++) - print("%.2ux ", cp->buf[j+skip]); - print("\n"); -} memmove(aa+rv, cp->buf + skip, i); skip = 0; } @@ -482,7 +474,8 @@ hardxfer(Drive *dp, Partition *pp, int cmd, long start, long len) cp->cmd = cmd; cp->dp = dp; cp->sofar = 0; -print("xfer:\ttcyl %d, tsec %d, thead %d\n", cp->tcyl, cp->tsec, cp->thead); + cp->status = 0; +/*print("xfer:\ttcyl %d, tsec %d, thead %d\n", cp->tcyl, cp->tsec, cp->thead); print("\tnsecs %d, sofar %d\n", cp->nsecs, cp->sofar);/**/ outb(cp->pbase+Pcount, cp->nsecs); outb(cp->pbase+Psector, cp->tsec); @@ -654,6 +647,9 @@ hardintr(Ureg *ur) Controller *cp; Drive *dp; long loop; + int x; + + x = spllo(); /* let in other interrupts */ /* * BUG!! if there is ever more than one controller, we need a way to @@ -662,7 +658,10 @@ hardintr(Ureg *ur) cp = &hardc[0]; dp = cp->dp; - cp->status = inb(cp->pbase+Pstatus); + loop = 0; + while((cp->status = inb(cp->pbase+Pstatus)) & Sbusy) + if(++loop > 10000) + panic("hardintr 0"); switch(cp->cmd){ case Cwrite: if(cp->status & Serr){ @@ -673,6 +672,7 @@ hardintr(Ureg *ur) } cp->sofar++; if(cp->sofar < cp->nsecs){ + loop = 0; while((inb(cp->pbase+Pstatus) & Sdrq) == 0) if(++loop > 10000) panic("hardintr 1"); diff --git a/pc/kbd.c b/pc/kbd.c index f8cd8591d3aa7665cc8493f840e9fabf6eb58e87..ee8e37f3501204698894594d3d01e811eb976645 100644 --- a/pc/kbd.c +++ b/pc/kbd.c @@ -418,6 +418,7 @@ kbdintr0(void) } if(esc1){ +print("\nescape1 %lux\n", c); c = kbtabesc1[c]; esc1 = 0; } else if(esc2){ diff --git a/pc/l.s b/pc/l.s index 777b2956c8fa73b8def64d37a6622daa8a7b3a20..b1aa2dbb587326f89caa8c1e0c8db3815977eba7 100644 --- a/pc/l.s +++ b/pc/l.s @@ -219,6 +219,7 @@ TEXT inss(SB),$0 MOVL p+0(FP),DX MOVL a+4(FP),DI MOVL c+8(FP),CX + CLD REP; OP16; INSL RET @@ -229,6 +230,7 @@ TEXT outss(SB),$0 MOVL p+0(FP),DX MOVL a+4(FP),SI MOVL c+8(FP),CX + CLD REP; OP16; OUTSL RET diff --git a/pc/main.c b/pc/main.c index 24410fda4d9a800355fa3eeb660138f63367ddf1..c2783ce126ff39ec521bb9d3011bb4305506afe5 100644 --- a/pc/main.c +++ b/pc/main.c @@ -175,7 +175,7 @@ confinit(void) /* * the last 128k belongs to the roms */ - conf.npage1 = (i)*1024/4; + conf.npage1 = (i-1)*1024/4; conf.base1 = 1024*1024; conf.npage = conf.npage0 + conf.npage1; diff --git a/pc/mmu.c b/pc/mmu.c index 741d8dccf595900719b238b1b3b115c0bd20d2d9..208fc5212d0e90accb6120a3a7bb7c6a47200d04 100644 --- a/pc/mmu.c +++ b/pc/mmu.c @@ -102,7 +102,7 @@ mmudump(void) void mmuinit(void) { - int i, n, nkpt; + int i, nkpt, npage, nbytes; ulong x; ulong y; @@ -124,13 +124,15 @@ mmuinit(void) */ /* allocate and fill low level page tables for kernel mem */ - nkpt = ROUNDUP(conf.npage, 4*1024); - nkpt = nkpt/(4*1024); - kpt = ialloc(nkpt*BY2PG, 1); - n = ROUNDUP(conf.npage, 1024); - for(i = 0; i < n; i++) + npage = (1024*1024)/BY2PG + conf.npage1; + nbytes = PGROUND(npage*BY2WD); /* words of page map */ + nkpt = nbytes/BY2PG; /* pages of page map */ + kpt = ialloc(nbytes, 1); + for(i = 0; i < npage; i++) kpt[i] = (i< */ upt = ialloc(BY2PG, 1); diff --git a/ss/clock.c b/ss/clock.c index ba59e2baf976a303c250259210e8719d7a1a7f6b..3c4f3d14932280d1d482b91b4fa5f1d42400136c 100644 --- a/ss/clock.c +++ b/ss/clock.c @@ -57,8 +57,12 @@ clock(Ureg *ur) kbdclock(); mouseclock(); if((ur->psr&SPL(0xF))==0 && p && p->state==Running){ - if(anyready()) - sched(); + if(anyready()){ + if(p->hasspin) + p->hasspin = 0; + else + sched(); + } if((ur->psr&PSRPSUPER) == 0){ /* *(ulong*)(USTKTOP-BY2WD) += TK2MS(1); /**/ if(u->nnote)