From e2c4e81b5e375f9c9ca2ee2806ad3adc3dbb1e6c Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 11 Aug 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-08-11 --- pc/kbd.c | 44 +++++++++++++++++++++++++++++++++++--------- port/chan.c | 2 ++ port/devbit.c | 2 +- port/portdat.h | 1 + ss/clock.c | 5 +---- ss/devrtc.c | 1 - ss/fptrap.c | 5 +---- ss/l.s | 8 ++++---- ss/main.c | 28 +++++++++++++++++++++++----- ss/screen.c | 2 +- ss/scsi.c | 3 ++- ss/trap.c | 3 ++- 12 files changed, 73 insertions(+), 31 deletions(-) diff --git a/pc/kbd.c b/pc/kbd.c index 3f0f81fadb0db4d68e2672a41d1344e35d2890f4..b20eb00238a4e25a4d76b27af85b429e8ed9c9a9 100644 --- a/pc/kbd.c +++ b/pc/kbd.c @@ -105,7 +105,7 @@ uchar kbtabesc1[] = KIOQ kbdq; static int mousebuttons; -static int middlebutton; +static int keybuttons; /* * predeclared @@ -212,6 +212,9 @@ kbdinit(void) if(mousecmd(0xEA) < 0 || mousecmd(0xF4) < 0) print("can't initialize mouse\n"); + + /* turn on mouse acceleration */ + mousecmd(0xE7); break; case At: /* enable kbd xfers and interrupts */ @@ -257,7 +260,7 @@ mymouseputc(int c) msg[2] |= 0xFF00; mousebuttons = b[msg[0]&7]; - mouse.newbuttons = mousebuttons | middlebutton; + mouse.newbuttons = mousebuttons | keybuttons; mouse.dx = msg[1]; mouse.dy = -msg[2]; mouse.track = 1; @@ -270,10 +273,21 @@ mymouseputc(int c) * Ctrl key used as middle button pressed */ static void -middle(int newval) +mbon(int val) { - middlebutton = newval; - mouse.newbuttons = mousebuttons | middlebutton; + keybuttons |= val; + mouse.newbuttons = mousebuttons | keybuttons; + mouse.dx = 0; + mouse.dy = 0; + mouse.track = 1; + spllo(); /* mouse tracking kills uart0 */ + mouseclock(); +} +static void +mboff(int val) +{ + keybuttons &= ~val; + mouse.newbuttons = mousebuttons | keybuttons; mouse.dx = 0; mouse.dy = 0; mouse.track = 1; @@ -360,8 +374,14 @@ kbdintr0(void) case Ctrl: ctl = 0; break; - case Middle: - middle(0); + case KF|1: + mboff(4); + break; + case KF|2: + mboff(2); + break; + case KF|3: + mboff(1); break; } return 0; @@ -424,8 +444,14 @@ kbdintr0(void) case Ctrl: ctl = 1; return 0; - case Middle: - middle(2); + case KF|1: + mbon(4); + return 0; + case KF|2: + mbon(2); + return 0; + case KF|3: + mbon(1); return 0; } } diff --git a/port/chan.c b/port/chan.c index 3bc416daf0f4cb9b16f8d32ac10d52358c446745..2cca409615c4258bf06fcc9810738dbe1a0636a8 100644 --- a/port/chan.c +++ b/port/chan.c @@ -544,6 +544,8 @@ namec(char *name, int amode, int omode, ulong perm) c = (*devtab[c->type].open)(c, omode); if(omode & OCEXEC) c->flag |= CCEXEC; + if(omode & ORCLOSE) + c->flag |= CRCLOSE; break; case Amount: diff --git a/port/devbit.c b/port/devbit.c index 2948a08ce351f4197086e229f7d55487b60fe771..29c49ac9a983f453d53fd2d39f10ea1aaa3f5410 100644 --- a/port/devbit.c +++ b/port/devbit.c @@ -616,7 +616,7 @@ bitread(Chan *c, void *va, long n, ulong offset) n = 3; }else if(bit.cacheid >= 0){ /* - * allocate subfont: + * check cache for subfont: * 'J' 1 * subfont id 2 * font info 3*12 diff --git a/port/portdat.h b/port/portdat.h index 6e8b186f4b6002c3373f4cff8b2ffb346a375f7d..643315f23660346de556efbf4628f4501d38c4b0 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -145,6 +145,7 @@ enum #define CCREATE 4 /* permits creation if c->mnt */ #define CCEXEC 8 /* close on exec */ #define CFREE 16 /* not in use */ +#define CRCLOSE 32 /* remove on close */ struct Chan { diff --git a/ss/clock.c b/ss/clock.c index 427b48418e1c64d6aab715cb6e8f9ef94d974558..eee0fad371017cb8dac538a289c321c071b2e539 100644 --- a/ss/clock.c +++ b/ss/clock.c @@ -70,10 +70,7 @@ clock(Ureg *ur) else sched(); } - if((ur->psr&PSRPSUPER) == 0){ - spllo(); /* Low because we may fault */ + if((ur->psr&PSRPSUPER) == 0) *(ulong*)(USTKTOP-BY2WD) += TK2MS(1); - splhi(); /* return hi for restore */ - } } } diff --git a/ss/devrtc.c b/ss/devrtc.c index 8dfb9aeb713b747a4b8c29ad21eadd3b94ff9524..b0c144f39fe18b522b88985184f83fa36c8eff02 100644 --- a/ss/devrtc.c +++ b/ss/devrtc.c @@ -32,7 +32,6 @@ static struct RTCdev *rtc; }nvr; - enum{ Qrtc = 1, Qnvram, diff --git a/ss/fptrap.c b/ss/fptrap.c index 1426fa448ba9e554dbf2b2367c263874792c9adb..ab84adb089f5f4b5b6fc15e976934613c345a714 100644 --- a/ss/fptrap.c +++ b/ss/fptrap.c @@ -216,7 +216,7 @@ fixq(FPsave *f, int n) * traps if you touch it when an exception is pending, and because if you * trap with ET==0 you halt, this routine sets some global flags to enable * the rest of the system to handle the trap that might occur here without - * upsetting the kernel. + * upsetting the kernel. Shouldn't be necessary, but safety first. */ int fpquiet(void) @@ -231,12 +231,9 @@ fpquiet(void) u->p->fpstate = FPinactive; for(;;){ m->fptrap = 0; - spllo(); fsr = getfsr(); - splhi(); if(m->fptrap){ /* trap occurred and u->fpsave contains state */ - spllo(); sprint(buf, "sys: %s", excname(8)); postnote(u->p, 1, buf, NDebug); notrap = 0; diff --git a/ss/l.s b/ss/l.s index 72a134d846bb28d9385cdd18611653767cc13f34..2b51fa8b60c55d692110a2ed1917c8376a4c9865 100644 --- a/ss/l.s +++ b/ss/l.s @@ -1,6 +1,6 @@ #include "mem.h" -#define SYSPSR (SPL(0x0)|PSREF|PSRSUPER|0) +#define SYSPSR (SPL(0x0)|PSREF|PSRET|PSRSUPER|SPL(15)|0) #define NOOP ORN R0, R0; ORN R0, R0; ORN R0, R0 TEXT start(SB), $-4 @@ -90,7 +90,7 @@ TEXT spllo(SB), $0 MOVW PSR, R7 MOVW R7, R10 - OR $PSRET, R10 + ANDN $SPL(15), R10 MOVW R10, PSR NOOP RETURN @@ -100,7 +100,7 @@ TEXT splhi(SB), $0 MOVW R15, 4(R(MACH)) /* save PC in m->splpc */ MOVW PSR, R7 MOVW R7, R10 - AND $~PSRET, R10 /* BUG: book says this is buggy */ + OR $SPL(15), R10 MOVW R10, PSR NOOP RETURN @@ -117,7 +117,7 @@ TEXT spldone(SB), $0 RETURN TEXT touser(SB), $0 - MOVW $(SYSPSR&~PSREF), R8 + MOVW $(SYSPSR&~(PSREF|PSRET|SPL(15))), R8 MOVW R8, PSR NOOP diff --git a/ss/main.c b/ss/main.c index e09c9dec9408fda96a959d31e4f22701ad0ab414..7ce2a7f0dab708e8960fda14869b9413423e1b22 100644 --- a/ss/main.c +++ b/ss/main.c @@ -16,6 +16,9 @@ int cpuserver; ulong romputcxsegm; ulong bank[2]; char mempres[256]; +ulong fbsz; +char fbstr[32]; +char fbcrap[BY2PG]; Label catch; typedef struct Sysparam Sysparam; @@ -135,7 +138,7 @@ init0(void) print("Sun Sparcstation %s\n", sparam->name); print("bank 0: %dM 1: %dM\n", bank[0], bank[1]); - print("frame buffer id %lux\n", conf.monitor); + print("frame buffer id %lux %lux %s\n", conf.monitor, fbsz, fbstr); u->slash = (*devtab[0].attach)(0); u->dot = clone(u->slash, 0); @@ -285,16 +288,31 @@ confinit(void) *(ulong*)va = 0; putw4(va, INVALIDPTE); - /* map frame buffer id */ + /* map frame buffer id; we expect it to be in SBUS slot 3 */ putw4(va, ((FRAMEBUFID>>PGSHIFT)&0xFFFF)|PTEVALID|PTEKERNEL|PTENOCACHE|PTEIO); - i = getpsr(); conf.monitor = 0; /* if frame buffer not present, we will trap, so prepare to catch it */ if(setlabel(&catch) == 0){ - setpsr(i|PSRET|(0xF<<8)); /* enable traps, not interrupts */ conf.monitor = *(ulong*)va; +putw4(va, (((FRAMEBUFID+BY2PG)>>PGSHIFT)&0xFFFF)|PTEVALID|PTEKERNEL|PTENOCACHE|PTEIO); +memmove(fbcrap, (void*)va, BY2PG); + j = *(ulong*)(va+4); + fbsz = j; + j = BY2PG - 8; /* for safety */ + for(i=0; icsr>>28) & 0xF; putenab(getenab()|ENABDMA); /**/ +print("scsi config #%2.2ux\n", dev->config); } void diff --git a/ss/trap.c b/ss/trap.c index a9c7f9b7d33ff7c9bb4437f77f7f81622743ca08..48b21422cdb8651e1433585710f8c30717f59420 100644 --- a/ss/trap.c +++ b/ss/trap.c @@ -108,7 +108,7 @@ trap(Ureg *ur) * Hack to catch bootstrap fault during probe */ if(catch.pc) - longjmp(&catch, 1); + gotolabel(&catch); if(u) u->dbgreg = ur; @@ -245,6 +245,7 @@ trapinit(void) *(ulong*)t = a; /* CALL syscall(SB) */ *(ulong*)(t+4) = 0xa7480000; /* MOVW PSR, R19 */ puttbr(TRAPS); + setpsr(getpsr()|PSRET|SPL(15)); /* enable traps, not interrupts */ } void