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.3 (Berkeley) 12/16/90 7 */ 8 9 #if VAX750 10 11 /* 12 * 750-specific code. 13 */ 14 15 #include "sys/param.h" 16 17 #include "../include/cpu.h" 18 #include "mem.h" 19 #include "../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 106