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