M port/fault.c => port/fault.c +1 -0
@@ 146,6 146,7 @@ fixfault(Segment *s, ulong addr, int read, int doputmmu)
mmuphys = PPN((*pg)->pa) |PTEWRITE|PTEUNCACHED|PTEVALID;
(*pg)->modref = PG_MOD|PG_REF;
+/* print("v %lux p %lux\n", addr, mmuphys); /**/
break;
}
M power/io.h => power/io.h +3 -5
@@ 10,17 10,15 @@
enum
{
LEDtrapmask= 0xf<<0,
+ LED2= 1<<2,
+ LED3= 1<<3,
LEDkfault= 1<<4,
- LEDclock= 1<<5,
+ LED5= 1<<5,
LEDfault= 1<<6,
LEDpulse= 1<<7,
};
-/*
#define LEDON(x) (m->ledval &= ~(x), *LED = m->ledval)
#define LEDOFF(x) (m->ledval |= (x), *LED = m->ledval)
-*/
-#define LEDON(x)
-#define LEDOFF(x)
typedef struct SBCC SBCC;
typedef struct Timer Timer;
M power/segment.h => power/segment.h +1 -1
@@ 2,7 2,7 @@
* Attach segment types
*/
-#define VME16IO3 0x17C10000
+#define VME16IO3 0x17C00000
#define VME32TDFB (0x30000000+128*MB)
Physseg physseg[] =
M power/trap.c => power/trap.c +6 -4
@@ 169,7 169,7 @@ void
intr(Ureg *ur)
{
long v;
- int i, any;
+ int i, any, limit;
ulong cause;
static int bogies;
uchar pend, xxx;
@@ 182,7 182,7 @@ intr(Ureg *ur)
cause &= ~INTR1;
}
- while(cause & INTR5) {
+ for(limit = 50; (cause&INTR5) && limit; limit--) {
any = 0;
if(!(*MPBERR1 & (1<<8))){
print("MP bus error %lux %lux\n", *MPBERR0, *MPBERR1);
@@ 285,11 285,13 @@ intr(Ureg *ur)
if(any == 0)
cause &= ~INTR5;
}
+ if(limit == 0) {
+ print("intr: unable to identify and clear level5\n");
+ cause &= ~INTR5;
+ }
if(cause & (INTR2|INTR4)) {
- LEDON(LEDclock);
clock(ur);
- LEDOFF(LEDclock);
cause &= ~(INTR2|INTR4);
}