|
|
1.1 ! root 1: /* ! 2: * Routines that deal closely with VAX-specific traps: ! 3: * machine checks, memory errors, and the like ! 4: */ ! 5: #include "sys/param.h" ! 6: #include "sys/systm.h" ! 7: #include "sys/user.h" ! 8: #include "sys/mtpr.h" ! 9: #include "sys/psl.h" ! 10: #include "sys/qbio.h" ! 11: ! 12: extern char *iospace; ! 13: ! 14: /* ! 15: * interesting bits in mser ! 16: */ ! 17: ! 18: #define DMAQPE 020 ! 19: #define CPUQPE 040 ! 20: #define CPULPE 0100 ! 21: #define CPUNXM 0200 ! 22: #define MEMCD0 0400 ! 23: #define MEMCD1 01000 ! 24: #define MEMCD (MEMCD0|MEMCD1) ! 25: ! 26: /* ! 27: * Machine check error recovery code. ! 28: * Print the machine check frame and reset things. ! 29: * Never recoverable in Mayflower. ! 30: * If in user mode, send a signal; ! 31: * if not and in kernel mode, panic. ! 32: */ ! 33: ! 34: machinecheck(ps, f) ! 35: long ps; ! 36: caddr_t f; ! 37: { ! 38: int ok; ! 39: ! 40: mckrec(f); ! 41: machreset(); ! 42: if (USERMODE(ps)) { ! 43: /* ! 44: * code stolen from setrun ! 45: */ ! 46: runrun++; ! 47: aston(); ! 48: psignal(u.u_procp, SIGBUS); ! 49: return; ! 50: } ! 51: panic("mchk"); ! 52: } ! 53: ! 54: struct mc630frame { ! 55: long count; ! 56: long code; ! 57: long va; ! 58: long state; ! 59: long pc; ! 60: long psl; ! 61: }; ! 62: ! 63: mckrec(f) ! 64: register struct mc630frame *f; ! 65: { ! 66: register char *pr; ! 67: register struct cpuregs *c; ! 68: register long m; ! 69: ! 70: printf("machine check type0x%x va0x%x st0x%x pc0x%x ps0x%x\n", ! 71: f->code, f->va, f->state, f->pc, f->psl); ! 72: switch (f->code) { ! 73: case 0x80: ! 74: case 0x81: ! 75: pr = "read"; ! 76: break; ! 77: ! 78: case 0x82: ! 79: case 0x83: ! 80: pr = "write"; ! 81: break; ! 82: ! 83: default: ! 84: return; ! 85: } ! 86: /* ! 87: * read or write error: what kind? ! 88: */ ! 89: c = &((struct iomflow *)iospace)->c; ! 90: m = c->mser; ! 91: printf("%s err, mser0x%x\n", pr, m); ! 92: if (m & DMAQPE) ! 93: printf("qbus dma par, dear0x%x\n", c->dear); ! 94: if (m & CPUQPE) ! 95: printf("qbus cpu par, cear0x%x\n", c->cear); ! 96: if (m & CPULPE) ! 97: printf("local mem par, cear0x%x\n", c->cear); ! 98: if (m & CPUNXM) ! 99: printf("nxm\n"); ! 100: if (m & (CPULPE|CPUQPE)) { ! 101: switch (m & MEMCD) { ! 102: case 0: ! 103: pr = "Q22"; ! 104: break; ! 105: ! 106: case MEMCD0: ! 107: pr = "onboard mem"; ! 108: break; ! 109: ! 110: default: ! 111: pr = "exp mem"; ! 112: break; ! 113: } ! 114: printf("from %s\n", pr); ! 115: } ! 116: } ! 117: ! 118: /* ! 119: * reset processor error registers ! 120: */ ! 121: ! 122: machreset() ! 123: { ! 124: register struct cpuregs *c; ! 125: ! 126: if (iospace == 0) ! 127: return; ! 128: c = &((struct iomflow *)iospace)->c; ! 129: c->mser = c->mser; ! 130: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.