M carrera/l.s => carrera/l.s +5 -6
@@ 368,9 368,10 @@ TEXT exception(SB), $-4
wasuser:
MOVW SP, R27
- CONST (MACHADDR, SP) /* R27 = m-> */
- MOVW 8(SP), SP /* R26 = m->proc */
- MOVW 8(SP), SP /* R27 = m->proc->kstack */
+ CONST (MACHADDR, SP) /* m-> */
+ MOVW 8(SP), SP /* m->proc */
+ MOVW 8(SP), SP /* m->proc->kstack */
+ MOVW M(STATUS), R26 /* redundant test */
ADDU $(KSTACK-UREGSIZE), SP
MOVV R31, (Ureg_r31-4)(SP)
@@ 381,8 382,7 @@ wasuser:
MOVV R(USER), (Ureg_r24-4)(SP)
MOVW $setR30(SB), R30
- CONST (MACHADDR, R1)
- MOVW R1, R(MACH) /* R(MACH) = m-> */
+ CONST (MACHADDR, R(MACH)) /* R(MACH) = m-> */
MOVW 8(R(MACH)), R(USER) /* up = m->proc */
AND $(EXCMASK<<2), R26, R1
@@ 564,7 564,6 @@ TEXT rfnote(SB), $0
SUBU $(BY2WD), R26, SP /* pc hole */
JMP restore
-
TEXT clrfpintr(SB), $0
MOVW M(STATUS), R3
WAIT
M pc/clock.c => pc/clock.c +1 -16
@@ 37,7 37,6 @@ clock(Ureg *ur, void *arg)
{
Proc *p;
int nrun = 0;
- int islow = 0;
USED(arg);
@@ 65,25 64,11 @@ clock(Ureg *ur, void *arg)
sched();
/* user profiling clock */
- if((ur->cs&0xffff) == UESEL){
- islow = 1;
- spllo(); /* in case we fault */
+ if((ur->cs&0xffff) == UESEL)
(*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1);
- }
- }
-
- /*
- * anything from here down can be running spllo()
- */
- if(!islow){
- islow = 1;
- spllo();
}
mouseclock();
-
- if(islow)
- splhi();
}
/*
M pc/devvga.c => pc/devvga.c +2 -1
@@ 21,11 21,12 @@ extern Subfont defont0;
/* exported */
Bitmap gscreen;
+Lock palettelock; /* access to DAC registers */
+Cursor curcursor; /* current cursor */
/* vga screen */
static Lock screenlock;
static ulong colormap[256][3];
-Lock palettelock;
/* cga screen */
static int cga = 1; /* true if in cga mode */
M pc/ether8003.c => pc/ether8003.c +1 -1
@@ 94,7 94,7 @@ reset(Ether *ether)
*/
port = ether->port;
sum = 0;
- for(i = 0; i < sizeof(ether->ea); i++){
+ for(i = 0; i < sizeof(ea); i++){
ea[i] = inb(port+Lar+i);
sum += ea[i];
ic[i] = inb(port+i);
M pc/vgas3.c => pc/vgas3.c +4 -4
@@ 17,9 17,9 @@
static Lock s3pagelock;
static ulong storage;
static Point hotpoint;
-static Cursor loaded;
extern Bitmap gscreen;
+extern Cursor curcursor;
static void
sets3page(int page)
@@ 123,13 123,13 @@ load(Cursor *c)
* just make sure it's enabled.
*/
lock(&s3pagelock);
- if(memcmp(c, &loaded, sizeof(Cursor)) == 0){
+ if(memcmp(c, &curcursor, sizeof(Cursor)) == 0){
vsyncactive();
vgaxo(Crtx, 0x45, 0x01);
unlock(&s3pagelock);
return;
}
- memmove(&loaded, c, sizeof(Cursor));
+ memmove(&curcursor, c, sizeof(Cursor));
/*
* Disable the cursor.
@@ 189,7 189,7 @@ move(Point p)
int x, xo, y, yo;
if(canlock(&s3pagelock) == 0)
- return -1;
+ return 1;
/*
* Mustn't position the cursor offscreen even partially,
M pc/vgatvp3020.c => pc/vgatvp3020.c +14 -0
@@ 9,6 9,8 @@
#include "screen.h"
#include "vga.h"
+extern Cursor curcursor;
+
/*
* TVP3020 Viewpoint Video Interface Pallette.
* Assumes hooked up to an S3 86C928.
@@ 59,7 61,19 @@ load(Cursor *c)
uchar p, p0, p1;
int x, y;
+ /*
+ * Lock the DAC registers so we can update the
+ * cursor bitmap if necessary.
+ * If it's the same as the last cursor we loaded,
+ * just make sure it's enabled.
+ */
lock(&palettelock);
+ if(memcmp(c, &curcursor, sizeof(Cursor)) == 0){
+ tvp3020xo(0x06, 0x40|0x10); /* Cursor Control Register */
+ unlock(&palettelock);
+ return;
+ }
+ memmove(&curcursor, c, sizeof(Cursor));
/*
* Make sure cursor is off by initialising the cursor
M port/portdat.h => port/portdat.h +1 -0
@@ 580,6 580,7 @@ struct Proc
ulong priority; /* priority level */
ulong basepri; /* base priority level */
ulong movetime; /* last time process switched processors */
+ ulong readyticks; /* time process went ready */
void *ureg; /* User registers for notes */
void *dbgreg; /* User registers for devproc */
M port/proc.c => port/proc.c +2 -1
@@ 141,6 141,7 @@ ready(Proc *p)
rq->tail = p;
rq->n++;
nrdy++;
+ p->readyticks = m->ticks;
p->state = Ready;
unlock(runq);
splx(s);
@@ 737,7 738,7 @@ procdump(void)
for(rq = runq; rq < &runq[Nrq]; rq++){
print("rq%d:", rq-runq);
for(p = rq->head; p; p = p->rnext)
- print(" %d", p->pid);
+ print(" %d(%d)", p->pid, m->ticks - p->readyticks);
print("\n");
}
print("nrdy %d\n", nrdy);