From bbd817e55da38e75d55b2a5f5bc3660e724a61b7 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 5 Jan 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-01-05 --- pc/devfloppy.c | 2 +- pc/fns.h | 4 +++- pc/kbd.c | 2 +- pc/mem.h | 1 + pc/trap.c | 11 +++++------ port/devproc.c | 10 ++++++---- port/proc.c | 21 +++++++++++++-------- port/sysproc.c | 1 - 8 files changed, 30 insertions(+), 22 deletions(-) diff --git a/pc/devfloppy.c b/pc/devfloppy.c index 6a0fb5a9ac34ce59fd105404c26be2d787fd9d4f..8d6d04bc3acf61c6e022357b1b0a253c7f634a1b 100644 --- a/pc/devfloppy.c +++ b/pc/devfloppy.c @@ -13,7 +13,7 @@ typedef struct Drive Drive; typedef struct Controller Controller; typedef struct Type Type; -#define DPRINT if(floppydebug)kprint +#define DPRINT if(floppydebug)print int floppydebug; /* bits in the registers */ diff --git a/pc/fns.h b/pc/fns.h index 32aaa0784c976360dd722b2ecb9214b1718fc54f..2e313d2c26e58d238d5f7b041ac807aacb5db497 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -97,7 +97,7 @@ int xchgw(ushort*, int); #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) #define kmapperm(x) kmap(x) -#define getcallerpc(x) (*(ulong*)(x)) +#define getcallerpc(x) (((ulong*)(&x))[-1]) #define KADDR(a) ((void*)((ulong)(a)|KZERO)) #define PADDR(a) ((ulong)(a)&~KZERO) @@ -123,3 +123,5 @@ Block* iallocb(int); void* ifroute(ulong); ulong ifunroute(ulong); void parseip(char*, char*); + +#define dcflush(a, b) diff --git a/pc/kbd.c b/pc/kbd.c index 9454459e2bedef02ab696c4144c55840644e82b2..04e80b7ba6393844b5e58d31e1fd10f24611c76d 100644 --- a/pc/kbd.c +++ b/pc/kbd.c @@ -188,7 +188,7 @@ mousecmd(int cmd) c = inb(Data); } while(c == 0xFE || c == 0); if(c != 0xFA){ - kprint("mouse returns %2.2ux to the %2.2ux command\n", c, cmd); + print("mouse returns %2.2ux to the %2.2ux command\n", c, cmd); return -1; } return 0; diff --git a/pc/mem.h b/pc/mem.h index 8ed461e45563f910eadfad0dea23494ff0f56eb0..202b27a2692bfd8cc0eaa431fa40ae1c18ce7703 100644 --- a/pc/mem.h +++ b/pc/mem.h @@ -119,5 +119,6 @@ * flag register bits that we care about */ #define IFLAG 0x200 +#define IE 0x200 #define getpgcolor(a) 0 diff --git a/pc/trap.c b/pc/trap.c index 6e70f7b2bb7bc11a9fa22af2d3e8bccc5779068e..a540217af7aa1f58fdfc47d86b5de2a9a331e5b8 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -466,9 +466,9 @@ syscall(Ureg *ur, void *arg) */ ur->ax = ret; - splhi(); if(up->scallnr == NOTED) noted(ur, *(ulong*)(sp+BY2WD)); + splhi(); if(up->scallnr!=RFORK && (up->procctl || up->nnote)) notify(ur); @@ -556,7 +556,7 @@ noted(Ureg *ur, ulong arg0) if(!up->notified) { qunlock(&up->debug); pprint("call to noted() when not notified\n"); - return; + pexit("Suicide", 0); } up->notified = 0; @@ -571,15 +571,15 @@ noted(Ureg *ur, ulong arg0) nur->flags = (up->svflags&0xffffff00) | (nur->flags&0xff); memmove(ur, nur, sizeof(Ureg)); + qunlock(&up->debug); + switch(arg0){ case NCONT: if(!okaddr(nur->pc, 1, 0) || !okaddr(nur->usp, BY2WD, 0)){ pprint("suicide: trap in noted\n"); - qunlock(&up->debug); pexit("Suicide", 0); } - qunlock(&up->debug); - return; + break; default: pprint("unknown noted arg 0x%lux\n", arg0); @@ -589,7 +589,6 @@ noted(Ureg *ur, ulong arg0) case NDFLT: if(up->lastnote.flag == NDebug) pprint("suicide: %s\n", up->lastnote.msg); - qunlock(&up->debug); pexit(up->lastnote.msg, up->lastnote.flag!=NDebug); } } diff --git a/port/devproc.c b/port/devproc.c index 8699e989996c7e9beb97248e80dfc372dfc993b4..79a74c9d72659d164447666be83dde925ef4f1c2 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -812,11 +812,13 @@ procctlmemio(Proc *p, ulong offset, int n, void *va, int read) k = kmap(pg); b = (char*)VA(k); + b += offset&(BY2PG-1); if(read == 1) - memmove(a, b+(offset&(BY2PG-1)), n); - else - memmove(b+(offset&(BY2PG-1)), a, n); - + memmove(a, b, n); + else { + memmove(b, a, n); + dcflush(b, n); + } kunmap(k); /* Ensure the process sees text page changes */ diff --git a/port/proc.c b/port/proc.c index 6561f77cfee306f193bcce0c2676736311e686ca..8527082377ea55425a85bec5f9154c29490c7fc5 100644 --- a/port/proc.c +++ b/port/proc.c @@ -29,7 +29,6 @@ typedef struct int n; } Schedq; -int nrdy; Schedq runq; int priconst[NiceMax]; @@ -107,14 +106,21 @@ sched(void) int anyready(void) { - return nrdy; + return runq.n; } int anyhigher(void) { + Proc *p; + int pri; - return nrdy; + pri = up->pri; + for(p=runq.head; p; p=p->rnext) + if(p->pri < pri) + if(p->wired == 0 || p->wired == m) + return runq.n; + return 0; } void @@ -132,7 +138,6 @@ ready(Proc *p) runq.head = p; runq.tail = p; runq.n++; - nrdy++; p->state = Ready; unlock(&runq); splx(s); @@ -200,7 +205,6 @@ found: bp->rnext = 0; runq.n--; - nrdy--; if(bp->state != Ready) print("runproc %s %d %s\n", bp->text, bp->pid, statename[bp->state]); @@ -769,7 +773,7 @@ procdump(void) print(" %d(%d)", p->pid, p->pri); print("\n"); } - print("nrdy %d\n", nrdy); + print("nrdy %d\n", runq.n); } void @@ -849,15 +853,16 @@ procctl(Proc *p) state = p->psstate; p->psstate = "Stopped"; /* free a waiting debugger */ + spllo(); qlock(&p->debug); if(p->pdbg) { wakeup(&p->pdbg->sleep); p->pdbg = 0; } qunlock(&p->debug); + splhi(); p->state = Stopped; sched(); /* sched returns spllo() */ - splhi(); p->psstate = state; return; } @@ -964,7 +969,7 @@ accounttime(void) pri = nrun; nrun = 0; - pri = (nrdy+pri)*1000; + pri = (runq.n+pri)*1000; m->load = (m->load*19+pri)/20; /* diff --git a/port/sysproc.c b/port/sysproc.c index 324683f63cce89c38a4d4a93885aa5781d84c031..51ba8dfb7b28ba8e0bf3960271088ccb3131b7a5 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -397,7 +397,6 @@ sysexec(ulong *arg) /* * '/' processes are higher priority (hack to make /ip more responsive). */ - up->nice = NiceNormal; if(devchar[tc->type] == L'/') { up->nice = NiceRoot; up->pri = 0;