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 * @(#)ka730.c 7.4 (Berkeley) 05/09/91 8 */ 9 10 #if VAX730 11 12 /* 13 * 730-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 mcr730 { 23 int mc_addr; /* address and syndrome */ 24 int mc_err; /* error bits */ 25 }; 26 27 #define M730_UNCORR 0x80000000 /* rds, uncorrectable error */ 28 #define M730_CRD 0x40000000 /* crd */ 29 #define M730_FTBPE 0x20000000 /* force tbuf parity error */ 30 #define M730_ENACRD 0x10000000 /* enable crd interrupt */ 31 #define M730_MME 0x08000000 /* mem-man enable (ala ipr) */ 32 #define M730_DM 0x04000000 /* diagnostic mode */ 33 #define M730_DISECC 0x02000000 /* disable ecc */ 34 35 #define M730_INH(mcr) ((mcr)->mc_err = M730_MME) 36 #define M730_ENA(mcr) ((mcr)->mc_err = (M730_MME|M730_ENACRD)) 37 #define M730_ERR(mcr) ((mcr)->mc_err & (M730_UNCORR|M730_CRD)) 38 #define M730_SYN(addr) ((mcr)->mc_addr & 0x7f) 39 #define M730_ADDR(addr) (((mcr)->mc_addr >> 8) & 0x7fff) 40 41 /* enable crd interrupts */ 42 ka730_memenable() 43 { 44 45 M730_ENA((struct mcr730 *)mcraddr[0]); 46 } 47 48 /* log crd errors */ 49 ka730_memerr() 50 { 51 register struct mcr730 *mcr = (struct mcr730 *)mcraddr[0]; 52 struct mcr730 amcr; 53 54 /* 55 * Must be careful on the 730 not to use invalid 56 * instructions in I/O space, so make a copy; 57 */ 58 amcr.mc_addr = mcr->mc_addr; 59 amcr.mc_err = mcr->mc_err; 60 if (M730_ERR(&amcr)) { 61 printf("mcr0: %s", (amcr.mc_err & M730_UNCORR) ? 62 "hard error" : "soft ecc"); 63 printf(" addr %x syn %x\n", M730_ADDR(&amcr), M730_SYN(&amcr)); 64 M730_INH(mcr); 65 } 66 } 67 68 #define NMC730 12 69 char *mc730[] = { 70 "tb par", "bad retry", "bad intr id", "cant write ptem", 71 "unkn mcr err", "iib rd err", "nxm ref", "cp rds", 72 "unalgn ioref", "nonlw ioref", "bad ioaddr", "unalgn ubaddr", 73 }; 74 75 struct mc730frame { 76 int mc3_bcnt; /* byte count == 0xc */ 77 int mc3_summary; /* summary parameter */ 78 int mc3_parm[2]; /* parameter 1 and 2 */ 79 int mc3_pc; /* trapped pc */ 80 int mc3_psl; /* trapped psl */ 81 }; 82 83 ka730_mchk(cmcf) 84 caddr_t cmcf; 85 { 86 register struct mc730frame *mcf = (struct mc730frame *)cmcf; 87 register u_int type = mcf->mc3_summary; 88 89 printf("machine check %x: %s\n", type, 90 type < NMC730 ? mc730[type] : "???"); 91 printf("\tparams %x,%x pc %x psl %x mcesr %x\n", 92 mcf->mc3_parm[0], mcf->mc3_parm[1], 93 mcf->mc3_pc, mcf->mc3_psl, mfpr(MCESR)); 94 mtpr(MCESR, 0xf); 95 return (MCHK_PANIC); 96 } 97 #endif 98