|
|
1.1 ! root 1: /* ! 2: * comet memory controller ! 3: */ ! 4: ! 5: #include "sys/param.h" ! 6: #include "sys/systm.h" ! 7: #include "sys/nxaddr.h" ! 8: ! 9: /* ! 10: * intentional overlays: ! 11: * if no memory controller configured, ! 12: * mcrcnt will be 0 ! 13: * but there will be no undefined symbols ! 14: */ ! 15: ! 16: int mcrcnt; ! 17: struct nxaddr mcraddr[1]; /* one or more */ ! 18: caddr_t mcrregs[1]; /* one or more */ ! 19: time_t mcrtime[1]; /* one or more */ ! 20: ! 21: int mcrtimeout = 60; /* seconds between soft error reports */ ! 22: ! 23: struct device { ! 24: long csr0; ! 25: long csr1; ! 26: long csr2; ! 27: }; ! 28: ! 29: /* ! 30: * csr0 ! 31: */ ! 32: #define HARDERR 0x80000000 /* uncorrectable error */ ! 33: #define HARDLST 0x40000000 /* nested hard error */ ! 34: #define SOFTERR 0x20000000 /* corrected error */ ! 35: ! 36: /* ! 37: * csr1 ! 38: */ ! 39: #define CRDENB 0x10000000 /* enable reporting soft errors */ ! 40: ! 41: mcrinit() ! 42: { ! 43: register int i; ! 44: register struct device *m; ! 45: ! 46: for (i = 0; i < mcrcnt; i++) ! 47: if ((m = (struct device *)nxaddr(&mcraddr[i])) == NULL ! 48: || badaddr(&m->csr0, sizeof(long))) ! 49: printf("mcr%d absent\n", i); ! 50: else { ! 51: mcrregs[i] = (caddr_t)m; ! 52: mcrenable((caddr_t)m); ! 53: } ! 54: } ! 55: ! 56: mcrenable(mm) ! 57: caddr_t mm; ! 58: { ! 59: ((struct device *)mm)->csr1 = CRDENB; ! 60: } ! 61: ! 62: memerr() ! 63: { ! 64: register int i; ! 65: register struct device *m; ! 66: long csr[3]; ! 67: ! 68: if (mcrcnt == 0) { ! 69: printf("mem err, no controllers configured\n"); ! 70: return; /* and hope */ ! 71: } ! 72: for (i = 0; i < mcrcnt; i++) { ! 73: if ((m = (struct device *)mcrregs[i]) == NULL) ! 74: continue; ! 75: if (m->csr0 & (HARDERR|SOFTERR)) { ! 76: csr[0] = m->csr0; ! 77: csr[1] = m->csr1; ! 78: csr[2] = m->csr2; ! 79: m->csr0 = m->csr0; ! 80: if (mcrtime[i] != time) ! 81: mcrtime[i] = time; ! 82: else { ! 83: m->csr1 = 0; ! 84: timeout(mcrenable, (caddr_t)m, mcrtimeout*HZ); ! 85: } ! 86: printf("mcr%d: mem %s error %x %x %x\n", i, ! 87: csr[0]&HARDERR?"hard":"soft", csr[0], csr[1], csr[2]); ! 88: if (csr[0]&HARDERR) ! 89: panic("memerr"); ! 90: } ! 91: } ! 92: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.