From 1b3952ecd1ca160fa66f55e43b7be629cb9c02f8 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 29 Jul 1994 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1994-07-29 --- carrera/l.s | 131 ++++++++++++++++++++++++++++-------------------- pc/devvga.c | 18 +++---- pc/vga.h | 2 +- pc/vgabt485.c | 16 +++--- pc/vgatvp3020.c | 16 +++--- port/portdat.h | 3 +- port/proc.c | 46 ++++++++--------- 7 files changed, 128 insertions(+), 104 deletions(-) diff --git a/carrera/l.s b/carrera/l.s index 9eee59763a6b0fcffaf2ddb6c366a02c9f489667..761efb1e5c645c2ce35a71a5f1cb9420ab39189f 100644 --- a/carrera/l.s +++ b/carrera/l.s @@ -363,36 +363,38 @@ TEXT vector180(SB), $-4 TEXT exception(SB), $-4 MOVW M(STATUS), R26 WAIT - AND $KUSER, R26 - BEQ R26, waskernel -wasuser: - CONST (MACHADDR, R27) /* R27 = m-> */ - MOVW 8(R27), R26 /* R26 = m->proc */ - MOVW 8(R26), R27 /* R27 = m->proc->kstack */ - MOVW SP, R26 /* save user sp */ - ADDU $(KSTACK-UREGSIZE), R27, SP + AND $KUSER, R26, R27 + BEQ R27, waskernel - MOVW R26, Ureg_sp(SP) /* user SP */ +wasuser: + MOVW SP, R27 + CONST (MACHADDR, SP) /* R27 = m-> */ + MOVW 8(SP), SP /* R26 = m->proc */ + MOVW 8(SP), SP /* R27 = m->proc->kstack */ + ADDU $(KSTACK-UREGSIZE), SP MOVV R31, (Ureg_r31-4)(SP) + + JAL savereg1(SB) + MOVV R30, (Ureg_r30-4)(SP) - MOVW M(CAUSE), R26 MOVV R(MACH), (Ureg_r25-4)(SP) MOVV R(USER), (Ureg_r24-4)(SP) - AND $(EXCMASK<<2), R26 - SUBU $(CSYS<<2), R26 - - JAL saveregs(SB) MOVW $setR30(SB), R30 CONST (MACHADDR, R1) MOVW R1, R(MACH) /* R(MACH) = m-> */ MOVW 8(R(MACH)), R(USER) /* up = m->proc */ - MOVW 4(SP), R1 /* first arg for syscall/trap */ - BNE R26, notsys + AND $(EXCMASK<<2), R26, R1 + SUBU $(CSYS<<2), R1 + BNE R1, notsys + + ADDU $Uoffset, SP, R1 /* first arg for syscall */ JAL syscall(SB) sysrestore: + JAL restreg1(SB) + MOVV (Ureg_r31-4)(SP), R31 MOVW Ureg_status(SP), R26 MOVV (Ureg_r30-4)(SP), R30 @@ -404,11 +406,17 @@ sysrestore: ERET notsys: + JAL savereg2(SB) + + ADDU $Uoffset, SP, R1 /* first arg for trap */ JAL trap(SB) + restore: - JAL restregs(SB) - MOVV (Ureg_r31-4)(SP), R31 + JAL restreg1(SB) + JAL restreg2(SB) + MOVV (Ureg_r30-4)(SP), R30 + MOVV (Ureg_r31-4)(SP), R31 MOVV (Ureg_r25-4)(SP), R(MACH) MOVV (Ureg_r24-4)(SP), R(USER) MOVW Ureg_sp(SP), SP @@ -416,17 +424,21 @@ restore: ERET waskernel: - MOVW SP, R26 + MOVW SP, R27 SUBU $UREGSIZE, SP OR $7, SP XOR $7, SP - MOVW R26, Ureg_sp(SP) MOVV R31, (Ureg_r31-4)(SP) - MOVW $1, R26 /* not syscall */ - JAL saveregs(SB) - MOVW 4(SP), R1 /* first arg for trap */ + + JAL savereg1(SB) + JAL savereg2(SB) + + ADDU $Uoffset, SP, R1 /* first arg for trap */ JAL trap(SB) - JAL restregs(SB) + + JAL restreg1(SB) + JAL restreg2(SB) + MOVV (Ureg_r31-4)(SP), R31 MOVW Ureg_sp(SP), SP MOVW R26, M(EPC) @@ -436,31 +448,43 @@ TEXT forkret(SB), $0 MOVW R0, R1 /* Fake out system call return */ JMP sysrestore -TEXT saveregs(SB), $-4 +/* + * save manditory registers. + * called with old M(STATUS) in R26. + * called with old SP in R27 + * returns with M(CAUSE) in R26 + */ +TEXT savereg1(SB), $-4 MOVV R1, (Ureg_r1-4)(SP) - MOVV R2, (Ureg_r2-4)(SP) - MOVV R6, (Ureg_r6-4)(SP) - MOVV R5, (Ureg_r5-4)(SP) + MOVW $(~KMODEMASK),R1 /* don't use R28 */ + AND R26, R1 + MOVW R1, M(STATUS) - ADDU $Uoffset, SP, R1 - MOVW R1, 4(SP) /* arg to base of regs */ - MOVW M(STATUS), R1 - MOVW M(EPC), R2 - WAIT - MOVW R1, Ureg_status(SP) - MOVW R2, Ureg_pc(SP) + MOVW R26, Ureg_status(SP) /* status */ + MOVW R27, Ureg_sp(SP) /* user SP */ - MOVW $(~KMODEMASK),R2 /* don't let him use R28 */ - AND R2, R1 - MOVW R1, M(STATUS) - WAIT - BEQ R26, return /* sys call, don't save */ + MOVW M(EPC), R1 + MOVW M(CAUSE), R26 + + MOVV R23, (Ureg_r23-4)(SP) + MOVV R22, (Ureg_r22-4)(SP) + MOVV R21, (Ureg_r21-4)(SP) + MOVV R20, (Ureg_r20-4)(SP) + MOVV R19, (Ureg_r19-4)(SP) + MOVW R1, Ureg_pc(SP) + RET + +/* + * all other registers. + * called with M(CAUSE) in R26 + */ +TEXT savereg2(SB), $-4 + MOVV R2, (Ureg_r2-4)(SP) - MOVW M(CAUSE), R1 MOVW M(BADVADDR), R2 NOOP - MOVW R1, Ureg_cause(SP) + MOVW R26, Ureg_cause(SP) MOVW M(TLBVIRT), R1 NOOP MOVW R2, Ureg_badvaddr(SP) @@ -473,11 +497,7 @@ TEXT saveregs(SB), $-4 MOVV R28, (Ureg_r28-4)(SP) /* R27, R26 not saved */ /* R25, R24 missing */ - MOVV R23, (Ureg_r23-4)(SP) - MOVV R22, (Ureg_r22-4)(SP) - MOVV R21, (Ureg_r21-4)(SP) - MOVV R20, (Ureg_r20-4)(SP) - MOVV R19, (Ureg_r19-4)(SP) + /* R23- R19 saved in save1 */ MOVV R18, (Ureg_r18-4)(SP) MOVV R17, (Ureg_r17-4)(SP) MOVV R16, (Ureg_r16-4)(SP) @@ -490,21 +510,26 @@ TEXT saveregs(SB), $-4 MOVV R9, (Ureg_r9-4)(SP) MOVV R8, (Ureg_r8-4)(SP) MOVV R7, (Ureg_r7-4)(SP) + MOVV R6, (Ureg_r6-4)(SP) + MOVV R5, (Ureg_r5-4)(SP) MOVV R4, (Ureg_r4-4)(SP) MOVV R3, (Ureg_r3-4)(SP) -return: RET -TEXT restregs(SB), $-4 - /* LINK,SB,SP missing */ - MOVV (Ureg_r28-4)(SP), R28 - /* R27, R26 not saved */ - /* R25, R24 missing */ +TEXT restreg1(SB), $-4 MOVV (Ureg_r23-4)(SP), R23 MOVV (Ureg_r22-4)(SP), R22 MOVV (Ureg_r21-4)(SP), R21 MOVV (Ureg_r20-4)(SP), R20 MOVV (Ureg_r19-4)(SP), R19 + RET + +TEXT restreg2(SB), $-4 + /* LINK,SB,SP missing */ + MOVV (Ureg_r28-4)(SP), R28 + /* R27, R26 not saved */ + /* R25, R24 missing */ + /* R19- R23 restored in rest1 */ MOVV (Ureg_r18-4)(SP), R18 MOVV (Ureg_r17-4)(SP), R17 MOVV (Ureg_r16-4)(SP), R16 diff --git a/pc/devvga.c b/pc/devvga.c index fe5c940d69376f2bdb2eb6bf4381b74208719fa2..695c5c4946283a9a796332ad9d7e91ed843c857b 100644 --- a/pc/devvga.c +++ b/pc/devvga.c @@ -25,7 +25,7 @@ Bitmap gscreen; /* vga screen */ static Lock screenlock; static ulong colormap[256][3]; -Lock pallettelock; +Lock palettelock; /* cga screen */ static int cga = 1; /* true if in cga mode */ @@ -757,7 +757,7 @@ screenload(Rectangle r, uchar *data, int tl, int l, int dolock) if(dolock && hwgc == 0) cursorlock(r); - lock(&pallettelock); + lock(&palettelock); q = byteaddr(&gscreen, r.min); mx = 7>>gscreen.ldepth; @@ -837,7 +837,7 @@ screenload(Rectangle r, uchar *data, int tl, int l, int dolock) data += l; } - unlock(&pallettelock); + unlock(&palettelock); if(dolock && hwgc == 0) cursorunlock(); } @@ -913,7 +913,7 @@ screenunload(Rectangle r, uchar *data, int tl, int l, int dolock) if(dolock && hwgc == 0) cursorlock(r); - lock(&pallettelock); + lock(&palettelock); q = byteaddr(&gscreen, r.min); mx = 7>>gscreen.ldepth; @@ -993,7 +993,7 @@ screenunload(Rectangle r, uchar *data, int tl, int l, int dolock) data += l; } - unlock(&pallettelock); + unlock(&palettelock); if(dolock && hwgc == 0) cursorunlock(); } @@ -1279,11 +1279,11 @@ getcolor(ulong p, ulong *pr, ulong *pg, ulong *pb) } p &= x; p ^= x; - lock(&pallettelock); + lock(&palettelock); *pr = colormap[p][0]; *pg = colormap[p][1]; *pb = colormap[p][2]; - unlock(&pallettelock); + unlock(&palettelock); } int @@ -1301,7 +1301,7 @@ setcolor(ulong p, ulong r, ulong g, ulong b) } p &= x; p ^= x; - lock(&pallettelock); + lock(&palettelock); colormap[p][0] = r; colormap[p][1] = g; colormap[p][2] = b; @@ -1309,7 +1309,7 @@ setcolor(ulong p, ulong r, ulong g, ulong b) vgao(DACData, r>>(32-6)); vgao(DACData, g>>(32-6)); vgao(DACData, b>>(32-6)); - unlock(&pallettelock); + unlock(&palettelock); return ~0; } diff --git a/pc/vga.h b/pc/vga.h index 748c0f31894ae4d2e4f8f1078cb861e8dca9f18d..6f9e972806d666db6315bcb2af2f7cba817b65b5 100644 --- a/pc/vga.h +++ b/pc/vga.h @@ -46,4 +46,4 @@ typedef struct Hwgc { void (*disable)(void); } Hwgc; -extern Lock pallettelock; +extern Lock palettelock; diff --git a/pc/vgabt485.c b/pc/vgabt485.c index 56499e87a4aeadd9fbb26cde0ab0486a5ad50405..da7f27cbb41c223551d277e8bde3dd2a1d17cfa0 100644 --- a/pc/vgabt485.c +++ b/pc/vgabt485.c @@ -112,7 +112,7 @@ load(Cursor *c) int x, y; - lock(&pallettelock); + lock(&palettelock); /* * Turn cursor off; @@ -161,7 +161,7 @@ load(Cursor *c) r = (bt485i(Cmd2) & 0xFC)|0x01; bt485o(Cmd2, r); - unlock(&pallettelock); + unlock(&palettelock); } static void @@ -169,7 +169,7 @@ enable(void) { uchar r; - lock(&pallettelock); + lock(&palettelock); /* * Turn cursor off. @@ -190,7 +190,7 @@ enable(void) bt485o(Color, 0x00); bt485o(Color, 0x00); bt485o(Color, 0x00); bt485o(Color, 0x00); bt485o(Color, 0x00); bt485o(Color, 0x00); - unlock(&pallettelock); + unlock(&palettelock); /* * Finally, enable @@ -212,7 +212,7 @@ move(Point p) { int x, y; - if(canlock(&pallettelock) == 0) + if(canlock(&palettelock) == 0) return 1; x = p.x+hotpoint.x; @@ -223,7 +223,7 @@ move(Point p) bt485o(Cylr, y & 0xFF); bt485o(Cyhr, (y>>8) & 0x0F); - unlock(&pallettelock); + unlock(&palettelock); return 0; } @@ -238,10 +238,10 @@ disable(void) * cursor control enable for Bt485 DAC; * the hardware cursor external operation mode. */ - lock(&pallettelock); + lock(&palettelock); r = bt485i(Cmd2) & ~0x03; bt485o(Cmd2, r); - unlock(&pallettelock); + unlock(&palettelock); r = vgaxi(Crtx, 0x45) & ~0x20; vgaxo(Crtx, 0x45, r); diff --git a/pc/vgatvp3020.c b/pc/vgatvp3020.c index af52a4ebd3a62ddb1c913da3a5964bc7b86d77c9..da2e59ba6927294bf4bb3158d5343f9914fd8b20 100644 --- a/pc/vgatvp3020.c +++ b/pc/vgatvp3020.c @@ -59,7 +59,7 @@ load(Cursor *c) uchar p, p0, p1; int x, y; - lock(&pallettelock); + lock(&palettelock); /* * Make sure cursor is off by initialising the cursor @@ -147,7 +147,7 @@ load(Cursor *c) tvp3020xo(0x06, 0x40|0x10); /* Cursor Control Register */ - unlock(&pallettelock); + unlock(&palettelock); } static void @@ -155,7 +155,7 @@ enable(void) { uchar r; - lock(&pallettelock); + lock(&palettelock); /* * Make sure cursor is off by initialising the cursor @@ -172,7 +172,7 @@ enable(void) tvp3020xo(0x23, 0xFF); tvp3020xo(0x24, 0xFF); tvp3020xo(0x25, 0xFF); tvp3020xo(0x26, 0x00); tvp3020xo(0x27, 0x00); tvp3020xo(0x28, 0x00); - unlock(&pallettelock); + unlock(&palettelock); /* * Finally, enable @@ -189,7 +189,7 @@ enable(void) static int move(Point p) { - if(canlock(&pallettelock) == 0) + if(canlock(&palettelock) == 0) return 1; tvp3020xo(0x00, p.x & 0xFF); /* Cursor Position X LSB */ @@ -197,7 +197,7 @@ move(Point p) tvp3020xo(0x02, p.y & 0xFF); /* Cursor Position Y LSB */ tvp3020xo(0x03, (p.y>>8) & 0x0F); /* Cursor Position Y MSB */ - unlock(&pallettelock); + unlock(&palettelock); return 0; } @@ -212,9 +212,9 @@ disable(void) * cursor control enable for Bt485 DAC (!); * the hardware cursor external operation mode. */ - lock(&pallettelock); + lock(&palettelock); tvp3020xo(0x06, 0x10); /* Cursor Control Register */ - unlock(&pallettelock); + unlock(&palettelock); r = vgaxi(Crtx, 0x45) & ~0x20; vgaxo(Crtx, 0x45, r); diff --git a/port/portdat.h b/port/portdat.h index cc12d92595f03a80ea308e86300c9147dc1c55c7..d321e7e967e10fbdc64b5d300ddf86109ab843fa 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -577,7 +577,8 @@ struct Proc int (*notify)(void*, char*); Mach *mp; /* machine this process last ran on */ - ulong priority; + ulong priority; /* priority level 0 is highest */ + ulong movetime; /* last time process switched processors */ void *ureg; /* User registers for notes */ void *dbgreg; /* User registers for devproc */ diff --git a/port/proc.c b/port/proc.c index d7bef4bdaa07cacc5515a755a2eef7e2afd6ead9..eea6b08f78b43aedb9f19a9105520e29fca8ce1b 100644 --- a/port/proc.c +++ b/port/proc.c @@ -108,13 +108,7 @@ sched(void) int anyready(void) { - Schedq *rq; - - for(rq = runq; rq < &runq[Nrq]; rq++) - if(rq->head) - return 1; - - return 0; + return nrdy; } void @@ -132,7 +126,6 @@ ready(Proc *p) } else p->priority = 1; } -if(p->priority < 0 || p->priority >= Nrq) panic("ready"); rq = &runq[p->priority]; lock(runq); @@ -158,32 +151,34 @@ runproc(void) loop: /* - * find highest priority queue with runnable process + * find a process at level 0 (programs from '/' file system), + * one that last ran on this processor (affinity), + * or one that hasn't moved in a while (load balancing). */ spllo(); - for(rq = runq; rq < &runq[Nrq]; rq++) - if(rq->head) - break; - if(rq == &runq[Nrq]) - goto loop; - splhi(); + for(;;){ + for(rq = runq; rq < &runq[Nrq]; rq++){ + if(rq->head == 0) + continue; + for(p = rq->head; p; p = p->rnext){ + if(rq == runq || p->mp == m || + m->ticks - p->movetime > HZ/2) + goto found; + } + } + } + +found: + splhi(); lock(runq); - /* - * affinity: look for a process last run on this processor, - * otherwise, take first in list. - */ l = 0; for(p = rq->head; p; p = p->rnext){ - if(p->mp == m) + if(rq == runq || p->mp == m || m->ticks - p->movetime > HZ/2) break; l = p; } - if(p == 0){ - l = 0; - p = rq->head; - } /* * p->mach==0 only when process state is saved @@ -205,6 +200,8 @@ loop: unlock(runq); p->state = Scheding; + if(p->mp != m) + p->movetime = m->ticks; p->mp = m; return p; } @@ -261,6 +258,7 @@ newproc(void) p->procctl = 0; p->notepending = 0; p->mp = 0; + p->movetime = 0; memset(p->seg, 0, sizeof p->seg); p->pid = incref(&pidalloc); p->noteid = incref(¬eidalloc);