|
|
1.1 root 1: /*
2: * MicroVAX III memory errors
3: * bus errors too, as they come through the same trap
4: */
5:
6: #include "sys/param.h"
7: #include "sys/systm.h" /* just for bloody HZ */
8: #include "sys/qbio.h"
9:
10: extern char *iospace;
11: time_t mcrtime; /* one or more */
12:
13: int mcrtimeout = 60; /* seconds between soft error reports */
14:
15: /*
16: * csr16
17: */
18: #define HARDERR 0x80000000 /* uncorrectable error */
19: #define HARDLST 0x40000000 /* nested hard error */
20: #define SOFTERR 0x20000000 /* corrected error */
21:
22: /*
23: * csr17
24: */
25: #define CRDENB 0x1000 /* enable reporting soft errors */
26:
27: /*
28: * mser
29: */
30: #define MSER 39
31: #define C2ERR 0x60 /* second level cache or CDAL parity error */
32: #define C1ERR 0x13 /* first level cache parity error */
33:
34: /*
35: * dser
36: */
37: #define QBERR 0xa0 /* cpu-to-qbus error */
38: #define DMAERR 0x11 /* dma error */
39:
40: mcrinit()
41: {
42: register struct iomfair *m;
43:
44: m = (struct iomfair *)iospace;
45: m->c.memcsr16 = m->c.memcsr16; /* clear error latches */
46: m->c.memcsr17 = CRDENB;
47: }
48:
49: mcrenable(junk)
50: caddr_t junk;
51: {
52: ((struct iomfair *)iospace)->c.memcsr17 = CRDENB;
53: }
54:
55: /*
56: * here on trap:
57: * crd or rds interrupt
58: * machine check type 0x80-0x83
59: * we might be about to crash,
60: * so chat just a little bit
61: */
62:
63: memerr()
64: {
65: register struct iomfair *m;
66: long csr16, csr17, ms, ds, qba, da;
67:
68: if ((m = (struct iomfair *)iospace) == NULL) {
69: printf("mem err\n");
70: return;
71: }
72: csr16 = m->c.memcsr16;
73: csr17 = m->c.memcsr17;
74: ms = mfpr(MSER);
75: ds = m->c.dser;
76: qba = m->c.qbear;
77: da = m->c.dear;
78: machreset();
79: printf("mem trap mser %x dser %x csr16 %x\n", ms, ds, csr16);
80: if (csr16 & (HARDERR|SOFTERR)) {
81: printf("mem %s err; csr17 %x\n",
82: csr16 & HARDERR ? "hard" : "soft", csr17);
83: if (mcrtime != time)
84: mcrtime = time;
85: else {
86: m->c.memcsr17 = 0;
87: timeout(mcrenable, (caddr_t)0, mcrtimeout*HZ);
88: }
89: }
90: if (ms & C2ERR)
91: printf("cdal/2cache\n");
92: if (ms & C1ERR)
93: printf("1cache\n");
94: if (ds & QBERR)
95: printf("qbus addr %x\n", qba << 9);
96: if (ds & DMAERR)
97: printf("dma addr %x\n", da << 9);
98: if (csr16 & HARDERR)
99: panic("memerr");
100: }
101:
102: /*
103: * reset processor error registers
104: */
105:
106: machreset()
107: {
108: register struct iomfair *q;
109:
110: mtpr(MSER, mfpr(MSER));
111: if (iospace == 0)
112: return;
113: q = (struct iomfair *)iospace;
114: q->c.dser = q->c.dser;
115: q->d.cacr = q->d.cacr;
116: q->c.memcsr16 = q->c.memcsr16;
117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.