|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986, 1988 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)ka750.c 7.2 (Berkeley) 7/9/88 ! 7: */ ! 8: ! 9: #if VAX750 ! 10: ! 11: /* ! 12: * 750-specific code. ! 13: */ ! 14: ! 15: #include "param.h" ! 16: ! 17: #include "cpu.h" ! 18: #include "mem.h" ! 19: #include "mtpr.h" ! 20: ! 21: struct mcr750 { ! 22: int mc_err; /* error bits */ ! 23: int mc_inh; /* inhibit crd */ ! 24: }; ! 25: ! 26: #define M750_ICRD 0x10000000 /* inhibit crd interrupts, in [1] */ ! 27: #define M750_UNCORR 0xc0000000 /* uncorrectable error, in [0] */ ! 28: #define M750_CORERR 0x20000000 /* correctable error, in [0] */ ! 29: ! 30: #define M750_INH(mcr) ((mcr)->mc_inh = 0) ! 31: #define M750_ENA(mcr) ((mcr)->mc_err = (M750_UNCORR|M750_CORERR), \ ! 32: (mcr)->mc_inh = M750_ICRD) ! 33: #define M750_ERR(mcr) ((mcr)->mc_err & (M750_UNCORR|M750_CORERR)) ! 34: ! 35: #define M750_SYN(err) ((err) & 0x7f) ! 36: #define M750_ADDR(err) (((err) >> 9) & 0x7fff) ! 37: ! 38: /* enable crd interrupts */ ! 39: ka750_memenable() ! 40: { ! 41: ! 42: M750_ENA((struct mcr750 *)mcraddr[0]); ! 43: } ! 44: ! 45: /* log crd errors */ ! 46: ka750_memerr() ! 47: { ! 48: register struct mcr750 *mcr = (struct mcr750 *)mcraddr[0]; ! 49: register int err; ! 50: ! 51: if (M750_ERR(mcr)) { ! 52: err = mcr->mc_err; /* careful with i/o space refs */ ! 53: printf("mcr0: %s", err & M750_UNCORR ? ! 54: "hard error" : "soft ecc"); ! 55: printf(" addr %x syn %x\n", M750_ADDR(err), M750_SYN(err)); ! 56: M750_INH(mcr); ! 57: } ! 58: } ! 59: ! 60: extern char *mc780750[]; ! 61: ! 62: struct mc750frame { ! 63: int mc5_bcnt; /* byte count == 0x28 */ ! 64: int mc5_summary; /* summary parameter (as above) */ ! 65: int mc5_va; /* virtual address register */ ! 66: int mc5_errpc; /* error pc */ ! 67: int mc5_mdr; ! 68: int mc5_svmode; /* saved mode register */ ! 69: int mc5_rdtimo; /* read lock timeout */ ! 70: int mc5_tbgpar; /* tb group parity error register */ ! 71: int mc5_cacherr; /* cache error register */ ! 72: int mc5_buserr; /* bus error register */ ! 73: int mc5_mcesr; /* machine check status register */ ! 74: int mc5_pc; /* trapped pc */ ! 75: int mc5_psl; /* trapped psl */ ! 76: }; ! 77: ! 78: #define MC750_TBERR 2 /* type code of cp tbuf par */ ! 79: #define MC750_TBPAR 4 /* tbuf par bit in mcesr */ ! 80: ! 81: ka750_mchk(cmcf) ! 82: caddr_t cmcf; ! 83: { ! 84: register struct mc750frame *mcf = (struct mc750frame *)cmcf; ! 85: register int type = mcf->mc5_summary; ! 86: int mcsr = mfpr(MCSR); ! 87: ! 88: printf("machine check %x: %s%s\n", type, mc780750[type&0xf], ! 89: (type&0xf0) ? " abort" : " fault"); ! 90: mtpr(TBIA, 0); ! 91: mtpr(MCESR, 0xf); ! 92: printf( ! 93: "\tva %x errpc %x mdr %x smr %x rdtimo %x tbgpar %x cacherr %x\n", ! 94: mcf->mc5_va, mcf->mc5_errpc, mcf->mc5_mdr, mcf->mc5_svmode, ! 95: mcf->mc5_rdtimo, mcf->mc5_tbgpar, mcf->mc5_cacherr); ! 96: printf("\tbuserr %x mcesr %x pc %x psl %x mcsr %x\n", ! 97: mcf->mc5_buserr, mcf->mc5_mcesr, mcf->mc5_pc, mcf->mc5_psl, ! 98: mcsr); ! 99: if (type == MC750_TBERR && (mcf->mc5_mcesr&0xe) == MC750_TBPAR) { ! 100: printf("tbuf par: flushing and returning\n"); ! 101: return (MCHK_RECOVERED); ! 102: } ! 103: return (MCHK_PANIC); ! 104: } ! 105: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.