From aa1d61a2dcc0e99b518fccd594990faceac1d762 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 29 Dec 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-12-29 --- carrera/dat.h | 1 + carrera/faultmips.c | 2 ++ carrera/trap.c | 9 +++++++++ pc/devvga.c | 2 +- pc/l.s | 31 +++++++++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/carrera/dat.h b/carrera/dat.h index 3bde0df8612eaaf282456d7bb4b312fc82f36cc3..cdcefaf6af2264c64f2bbeb24fbb286225d1160a 100644 --- a/carrera/dat.h +++ b/carrera/dat.h @@ -102,6 +102,7 @@ struct Mach Label sched; /* scheduler wakeup */ int lastpid; /* last pid allocated on this machine */ Proc* pidproc[NTLBPID]; /* proc that owns tlbpid on this mach */ + ulong vaddrtst; /* address probe by tstbadvaddr */ Ureg* ur; KMap* kactive; /* active on this machine */ int knext; diff --git a/carrera/faultmips.c b/carrera/faultmips.c index 3b83a962d958c35cc979c220fad2c42827b12284..7e4e85f784adf61d7017b19832352d887fc5882d 100644 --- a/carrera/faultmips.c +++ b/carrera/faultmips.c @@ -26,7 +26,9 @@ tstbadvaddr(Ureg *ur, int read) if(seg(up, iw, 0) == 0) return 0; + m->vaddrtst = iw; iw = *(ulong*)iw; + m->vaddrtst = 0; /* print("iw: %lux\n", iw); /**/ diff --git a/carrera/trap.c b/carrera/trap.c index cdadf9c6c3b80900b36bf5df589b4812a0a803f2..6de4c7ab0164b6f5a94439dd4dca8f88fd004b0f 100644 --- a/carrera/trap.c +++ b/carrera/trap.c @@ -172,6 +172,15 @@ trap(Ureg *ur) int user, cop, x, fpchk; char buf[2*ERRLEN], buf1[ERRLEN], *fpexcep; + /* + * Retry failed probes of legal addresses from tstbadvaddr + * workaround for the R4400 >2.3 + */ + if(m->vaddrtst) { + m->vaddrtst = 0; + return; + } + ecode = (ur->cause>>2)&EXCMASK; user = ur->status&KUSER; diff --git a/pc/devvga.c b/pc/devvga.c index 86f45cf4aee34734960ed2cb698ef18b2b0e3db9..1e2c61c9cdd17db9939a9dd8de20e0e5d3621749 100644 --- a/pc/devvga.c +++ b/pc/devvga.c @@ -608,7 +608,7 @@ screenupdate(void) switch(gscreen.ldepth){ case 0: r.min.x &= ~15; /* 16 pixel alignment for l0update() */ - f = memmove; + f = l0update; len = (r.max.x + 7)/8 - r.min.x/8; if(len & 1) len++; /* 16 bit alignment for l0update() */ diff --git a/pc/l.s b/pc/l.s index 7c079a0ccfcdd878c34550c900837573234437d9..c0c53ffa83bff5feda3b8589ec758d658b88e096 100644 --- a/pc/l.s +++ b/pc/l.s @@ -617,6 +617,37 @@ TEXT config(SB),$0 #define SR 0x3C5 /* sequence registers */ #define Smmask 0x02 /* map mask */ +/* + * invert the ldepth 0 bitmap + */ +TEXT l0update(SB),$0 + MOVL from+4(FP),SI + MOVL to+0(FP),DI + MOVL len+8(FP),BX + + MOVL BX,CX + SHRL $2,CX + JZ l01 +l00: + MOVL -4(SI)(CX*4),AX + NOTL AX + MOVL AX,-4(DI)(CX*4) + LOOP l00 +l01: + MOVL BX,CX + ANDL $(~3),BX + ANDL $3,CX + JZ l03 + ADDL BX,SI + ADDL BX,DI +l02: + MOVB -1(SI)(CX*1),AL + NOTL AX + MOVB AL,-1(DI)(CX*1) + LOOP l02 +l03: + RET + /* * separate ldepth 1 bitmap into 2 bit planes */