|
|
1.1 root 1: /*
2: * Routines that deal closely with VAX-specific traps:
3: * machine checks, memory errors, and the like
4: * MicroVAX III version
5: */
6: #include "sys/param.h"
7: #include "sys/systm.h"
8: #include "sys/user.h"
9: #include "sys/mtpr.h"
10: #include "sys/psl.h"
11: #include "sys/qbio.h"
12:
13: extern char *iospace;
14:
15: /*
16: * Machine check error recovery code.
17: * Print the machine check frame and reset things.
18: * If in user mode, send a signal;
19: * if not and in kernel mode, panic.
20: */
21:
22: struct mc650frame {
23: long count;
24: long code;
25: long va;
26: long state1;
27: long state2;
28: long pc;
29: long psl;
30: };
31:
32: #define CANTRST 0x8000 /* state2: instruction can't restart */
33:
34: #define MCTMAX 0xa
35: #define MCTBUS 0x80
36: #define MCTBUSMAX 0x83
37:
38: static char *mctype[] = {
39: "",
40: "fpa proto", "fpa resins", "fpa sts", "fpa sts",
41: "mmu", "mmu", "mmu", "mmu",
42: "intr bad ipl", "movc"
43: };
44:
45: static char *mcbus[] = {
46: "read", "read", "write", "write"
47: };
48:
49: machinecheck(ps, f)
50: long ps;
51: register struct mc650frame *f;
52: {
53: int ok;
54: char *name;
55:
56: ok = mckrec(f);
57: if (f->code <= MCTMAX)
58: name = mctype[f->code];
59: else if (f->code >= MCTBUS && f->code <= MCTBUSMAX)
60: name = mcbus[f->code - MCTBUS];
61: else
62: name = "";
63: printf("machine check type0x%x %s va0x%x st0x%x 0x%x pc0x%x ps0x%x\n",
64: f->code, name, f->va, f->state1, f->state2, f->pc, f->psl);
65: if (ok)
66: return; /* recovered */
67: if (USERMODE(ps)) {
68: /*
69: * code stolen from setrun
70: */
71: runrun++;
72: aston();
73: psignal(u.u_procp, SIGBUS);
74: return;
75: }
76: panic("mchk");
77: }
78:
79: /*
80: * sniff at the machine check,
81: * and decide if it's ok to recover
82: * -- memerr calls machreset; it's not worthwhile for other errors
83: * -- the hardware disables the cache if necessary
84: */
85:
86: mckrec(f)
87: register struct mc650frame *f;
88: {
89:
90: switch (f->code) {
91: case 0x1: case 0x2: case 0x3: case 0x4: /* fpa errors */
92: break;
93:
94: case 0x5: case 0x6: case 0x7: case 0x8: /* mmu errors; can't recover */
95: printf("p0br %x lr %x p1br %x lr %x sbr %x lr %x\n",
96: mfpr(P0BR), mfpr(P0LR), mfpr(P1BR), mfpr(P1LR),
97: mfpr(SBR), mfpr(SLR));
98: return (0);
99:
100: case 0x9: /* interrupt at illegal ipl */
101: case 0xa: /* microcode error in movc */
102: return (0);
103:
104: case 0x80: case 0x81: /* bus error on read */
105: memerr();
106: break;
107:
108: case 0x82: case 0x83: /* bus error on write; can't recover */
109: memerr();
110: return (0);
111: }
112: /*
113: * might be able to recover
114: */
115: if (f->psl & PSL_FPD || (f->state2 & CANTRST) == 0)
116: return (1);
117: return (0);
118: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.