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