From 4fa8390216a31b5fd8cfcaf1c51fb62ef5a35c5e Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 6 Jan 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-01-06 --- pc/devvga.c | 29 +++++++++++++++++++++++------ power/l.s | 14 +++++++------- power/main.c | 2 +- power/trap.c | 24 ++++++++++++------------ 4 files changed, 43 insertions(+), 26 deletions(-) diff --git a/pc/devvga.c b/pc/devvga.c index 1685f989657ec161e27656abb5dbe13fe3d3ecb2..75726f5d3b1344db03b3ebde107b6bda7d146e5d 100644 --- a/pc/devvga.c +++ b/pc/devvga.c @@ -103,6 +103,7 @@ VGAmode mode13 = static Rectangle mbb; static Rectangle NULLMBB = {10000, 10000, -10000, -10000}; static void nopage(int), tsengpage(int), tridentpage(int), parapage(int); +static void atipage(int); static void vgaupdate(void); /* @@ -124,9 +125,9 @@ enum Generic, }; -Vgacard vgacards[] = +Vgacard vgachips[] = { -[Ati] { "ati", nopage, }, +[Ati] { "ati", atipage, }, [Pvga1a] { "pvga1a", parapage, }, [Trident] { "trident", tridentpage, }, [Tseng] { "tseng", tsengpage, }, @@ -145,7 +146,7 @@ enum Qvgasize= 1, Qvgatype= 2, Qvgaport= 3, - Nvga= 4, + Nvga= 3, }; Dirtab vgadir[]={ "vgasize", {Qvgasize}, 0, 0666, @@ -156,7 +157,7 @@ Dirtab vgadir[]={ void vgareset(void) { - vgacard = &vgacards[Generic]; + vgacard = &vgachips[Generic]; } void @@ -253,7 +254,7 @@ vgawrite(Chan *c, void *buf, long n, ulong offset) cbuf[n] = 0; if(cp = strchr(cbuf, '\n')) *cp = 0; - for(vp = vgacards; vp->name; vp++) + for(vp = vgachips; vp->name; vp++) if(strcmp(cbuf, vp->name) == 0){ vgacard = vp; return n; @@ -629,10 +630,26 @@ nopage(int page) { USED(page); } +/* + * The following code is unproven: we haven't got the + * ATI stuff to work yet. + */ +static void +atipage(int page) +{ + /* the ext register is in the ATI ROM at a fixed address */ + ushort extreg = *((ushort *)0x800C0010); + uchar v; + + outb(extreg, 0xb2); + v = (inb(extreg+1) & 0xe1) | (page<<1); + outb(extreg, 0xb2); + outb(extreg+1, v); +} static void tridentpage(int page) { - srout(0x0e, page^0x02); /* yes, the page bit needs to be toggled! */ + srout(0x0e, page^0x02); } static void tsengpage(int page) diff --git a/power/l.s b/power/l.s index d4e2b298232bc73efcbd6e887e80b1b896f71f00..f00def7d7f6cd0798aaa20760ef5dc0a2037a2d1 100644 --- a/power/l.s +++ b/power/l.s @@ -493,19 +493,18 @@ TEXT clrfpintr(SB), $0 OR $CU1, R3 MOVW R3, M(STATUS) WAIT - - MOVW FCR31, R1 - MOVW R1, R2 - AND $~(0x3F<<12), R2 - MOVW R2, FCR31 - + MOVW FCR31, R1 /* Read it to stall the fpu */ + WAIT + MOVW R0, FCR31 + WAIT AND $~CU1, R3 MOVW R3, M(STATUS) RET TEXT savefpregs(SB), $0 MOVW M(STATUS), R3 - MOVW FCR31, R2 + MOVW FCR31, R2 /* Read stalls the fpu until inst. complete. */ + WAIT MOVD F0, 0x00(R1) MOVD F2, 0x08(R1) @@ -523,6 +522,7 @@ TEXT savefpregs(SB), $0 MOVD F26, 0x68(R1) MOVD F28, 0x70(R1) MOVD F30, 0x78(R1) + WAIT MOVW R2, 0x80(R1) AND $~CU1, R3 diff --git a/power/main.c b/power/main.c index 315aa0c6e1a4c8e2fba220a6c38442c9d706e67d..1feb5b9e3296b9688479c06b54e56d9cf0d1d5ce 100644 --- a/power/main.c +++ b/power/main.c @@ -537,7 +537,7 @@ confinit(void) /* * set minimal default values */ - conf.nmach = 1; + conf.nmach = 2; conf.nproc = 100; conf.nswap = 262144; conf.nimage = 200; diff --git a/power/trap.c b/power/trap.c index 6e01ced2fbcbf8f8db245bd6900732c8ba81929b..374546d0331dfdb847956e71bcaa091864527df2 100644 --- a/power/trap.c +++ b/power/trap.c @@ -76,18 +76,18 @@ m->ur = ur; ecode = (ur->cause>>2)&0xf; user = ur->status&KUP; - if(user) - u->dbgreg = ur; - fpchk = 0; - if(u && u->p->fpstate == FPactive) { - if((ur->status&CU1) == 0) /* Paranoid */ - panic("FPactive but no CU1"); - u->p->fpstate = FPinactive; - ur->status &= ~CU1; - savefpregs(&u->fpsave); - fptrap(ur); - fpchk = 1; + if(user) { + u->dbgreg = ur; + if(u->p->fpstate == FPactive) { + if((ur->status&CU1) == 0) /* Paranoid */ + panic("FPactive but no CU1"); + u->p->fpstate = FPinactive; + ur->status &= ~CU1; + savefpregs(&u->fpsave); + fptrap(ur); + fpchk = 1; + } } switch(ecode){ @@ -115,7 +115,7 @@ m->ur = ur; case CCPU: cop = (ur->cause>>28)&3; - if(user && u && cop == 1) { + if(user && cop == 1) { if(u->p->fpstate == FPinit) { u->p->fpstate = FPinactive; fcr31 = u->fpsave.fpstatus;