M pc/vgas3.c => pc/vgas3.c +8 -0
@@ 18,6 18,8 @@ enum {
SAVAGE3D = 0x8A20, /* PCI DID */
SAVAGE3DMV = 0x8A21,
SAVAGE4 = 0x8A22,
+ PROSAVAGEP = 0x8A25,
+ PROSAVAGEK = 0x8A26,
SAVAGEMXMV = 0x8C10,
SAVAGEMX = 0x8C11,
SAVAGEIXMV = 0x8C12,
@@ 127,6 129,8 @@ s3linear(VGAscr* scr, int* size, int* align)
id = (vgaxi(Crtx, 0x2D)<<8)|vgaxi(Crtx, 0x2E);
switch(id){ /* find mmio */
case SAVAGE4:
+ case PROSAVAGEP:
+ case PROSAVAGEK:
case SUPERSAVAGEIXC16:
/*
* We could assume that the MMIO registers
@@ 227,6 231,8 @@ s3load(VGAscr* scr, Cursor* curs)
case SAVAGEMXMV:
case SAVAGEIXMV:
case SAVAGE4:
+ case PROSAVAGEP:
+ case PROSAVAGEK:
case SUPERSAVAGEIXC16:
dolock = 0;
p += scr->storage;
@@ 577,6 583,8 @@ s3drawinit(VGAscr *scr)
break;
case SUPERSAVAGEIXC16:
case SAVAGE4:
+ case PROSAVAGEP:
+ case PROSAVAGEK:
/* scr->mmio is set by s3linear */
savageinit(scr);
break;
M pc/vgasavage.c => pc/vgasavage.c +6 -3
@@ 18,7 18,8 @@ enum {
SAVAGE3D = 0x8A20, /* PCI DID */
SAVAGE3DMV = 0x8A21,
SAVAGE4 = 0x8A22,
- SAVAGE4A = 0x8A26,
+ PROSAVAGEP = 0x8A25,
+ PROSAVAGEK = 0x8A26,
SAVAGEMXMV = 0x8C10,
SAVAGEMX = 0x8C11,
SAVAGEIXMV = 0x8C12,
@@ 363,7 364,8 @@ savagewaitidle(VGAscr *scr)
switch(scr->id){
case SAVAGE4:
- case SAVAGE4A:
+ case PROSAVAGEP:
+ case PROSAVAGEK:
/* wait for engine idle and FIFO empty */
statw = (ulong*)((uchar*)scr->mmio+AltStatus0);
mask = CBEMask | Ge2Idle;
@@ 492,7 494,8 @@ savageinit(VGAscr *scr)
/* if you add chip IDs here be sure to update savagewaitidle */
switch(scr->id){
case SAVAGE4:
- case SAVAGE4A:
+ case PROSAVAGEP:
+ case PROSAVAGEK:
case SAVAGEIXMV:
case SUPERSAVAGEIXC16:
case SAVAGEMXMV:
M port/devproc.c => port/devproc.c +0 -10
@@ 1197,16 1197,6 @@ procctlreq(Proc *p, char *va, int n)
case CMwired:
procwired(p, atoi(cb->f[1]));
break;
- case CMfair:
- if(!iseve())
- error(Eperm);
- unfair = 0;
- break;
- case CMunfair:
- if(!iseve())
- error(Eperm);
- unfair = 1;
- break;
}
poperror();
M port/portclock.c => port/portclock.c +16 -2
@@ 95,6 95,8 @@ timerdel(Timer *dt)
void
hzclock(Ureg *ur)
{
+ int callsched;
+
m->ticks++;
if(m->proc)
m->proc->pc = ur->pc;
@@ 124,8 126,20 @@ hzclock(Ureg *ur)
if(up == 0 || up->state != Running)
return;
- /* i.e. don't deschedule an EDF process here! */
- if(anyready() && !edf->isedf(up)){
+ if(up->fixedpri){
+ /* fixed priority processes are only preempted by
+ * higher piority processes.
+ */
+ if(anyhigher())
+ callsched = 1;
+ } else {
+ /* floating priority processes are are preempted
+ * by all sorts of things.
+ */
+ if(anyready() && !edf->isedf(up))
+ callsched = 1;
+ }
+ if(callsched){
sched();
splhi();
}
M port/proc.c => port/proc.c +1 -2
@@ 9,7 9,6 @@ int nrdy;
Ref noteidalloc;
long delayedscheds; /* statistics */
-int unfair; /* unfair scheduling */
static Ref pidalloc;
@@ 229,7 228,7 @@ loop:
*/
spllo();
for(;;){
- if(!unfair && (++(m->fairness) & 0x3) == 0){
+ if((++(m->fairness) & 0x3) == 0){
/*
* once in a while, run process that's been waiting longest
* regardless of movetime