M carrera/l.s => carrera/l.s +78 -53
@@ 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
M pc/devvga.c => pc/devvga.c +9 -9
@@ 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;
}
M pc/vga.h => pc/vga.h +1 -1
@@ 46,4 46,4 @@ typedef struct Hwgc {
void (*disable)(void);
} Hwgc;
-extern Lock pallettelock;
+extern Lock palettelock;
M pc/vgabt485.c => pc/vgabt485.c +8 -8
@@ 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);
M pc/vgatvp3020.c => pc/vgatvp3020.c +8 -8
@@ 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);
M port/portdat.h => port/portdat.h +2 -1
@@ 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 */
M port/proc.c => port/proc.c +22 -24
@@ 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);