M pc/devvga.c => pc/devvga.c +23 -6
@@ 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)
M power/l.s => power/l.s +7 -7
@@ 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
M power/main.c => power/main.c +1 -1
@@ 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;
M power/trap.c => power/trap.c +12 -12
@@ 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;