|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1986, 1988 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution is only permitted until one year after the first shipment ! 6: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and ! 7: * binary forms are permitted provided that: (1) source distributions retain ! 8: * this entire copyright notice and comment, and (2) distributions including ! 9: * binaries display the following acknowledgement: This product includes ! 10: * software developed by the University of California, Berkeley and its ! 11: * contributors'' in the documentation or other materials provided with the ! 12: * distribution and in all advertising materials mentioning features or use ! 13: * of this software. Neither the name of the University nor the names of ! 14: * its contributors may be used to endorse or promote products derived from ! 15: * this software without specific prior written permission. ! 16: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 17: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 18: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 19: * ! 20: * @(#)ka860.c 7.3 (Berkeley) 6/28/90 ! 21: */ ! 22: ! 23: #if VAX8600 ! 24: ! 25: /* ! 26: * VAX 8600 specific routines. ! 27: */ ! 28: ! 29: #include "param.h" ! 30: ! 31: #include "cpu.h" ! 32: #include "mtpr.h" ! 33: ! 34: /* ! 35: * 8600 memory register (MERG) bit definitions ! 36: */ ! 37: #define M8600_ICRD 0x400 /* inhibit crd interrupts */ ! 38: #define M8600_TB_ERR 0xf00 /* translation buffer error mask */ ! 39: ! 40: /* ! 41: * MDECC register ! 42: */ ! 43: #define M8600_ADDR_PE 0x080000 /* address parity error */ ! 44: #define M8600_DBL_ERR 0x100000 /* data double bit error */ ! 45: #define M8600_SNG_ERR 0x200000 /* data single bit error */ ! 46: #define M8600_BDT_ERR 0x400000 /* bad data error */ ! 47: ! 48: /* ! 49: * ESPA register is used to address scratch pad registers in the Ebox. ! 50: * To access a register in the scratch pad, write the ESPA with the address ! 51: * and then read the ESPD register. ! 52: * ! 53: * NOTE: In assmebly code, the mfpr instruction that reads the ESPD ! 54: * register must immedately follow the mtpr instruction that setup ! 55: * the ESPA register -- per the VENUS processor register spec. ! 56: * ! 57: * The scratchpad registers that are supplied for a single bit ECC ! 58: * error are: ! 59: */ ! 60: #define SPAD_MSTAT1 0x25 /* scratch pad mstat1 register */ ! 61: #define SPAD_MSTAT2 0x26 /* scratch pad mstat2 register */ ! 62: #define SPAD_MDECC 0x27 /* scratch pad mdecc register */ ! 63: #define SPAD_MEAR 0x2a /* scratch pad mear register */ ! 64: ! 65: #define M8600_MEMERR(mdecc) ((mdecc) & 0x780000) ! 66: #define M8600_HRDERR(mdecc) ((mdecc) & 0x580000) ! 67: #define M8600_SYN(mdecc) (((mdecc) >> 9) & 0x3f) ! 68: #define M8600_ADDR(mear) ((mear) & 0x3ffffffc) ! 69: #define M8600_ARRAY(mear) (((mear) >> 22) & 0x0f) ! 70: ! 71: #define M8600_MDECC_BITS \ ! 72: "\20\27BAD_DT_ERR\26SNG_BIT_ERR\25DBL_BIT_ERR\24ADDR_PE" ! 73: ! 74: #define M8600_MSTAT1_BITS "\20\30CPR_PE_A\27CPR_PE_B\26ABUS_DT_PE\ ! 75: \25ABUS_CTL_MSK_PE\24ABUS_ADR_PE\23ABUS_C/A_CYCLE\22ABUS_ADP_1\21ABUS_ADP_0\ ! 76: \20TB_MISS\17BLK_HIT\16C0_TAG_MISS\15CHE_MISS\14TB_VAL_ERR\13TB_PTE_B_PE\ ! 77: \12TB_PTE_A_PE\11TB_TAG_PE\10WR_DT_PE_B3\7WR_DT_PE_B2\6WR_DT_PE_B1\ ! 78: \5WR_DT_PE_B0\4CHE_RD_DT_PE\3CHE_SEL\2ANY_REFL\1CP_BW_CHE_DT_PE" ! 79: ! 80: #define M8600_MSTAT2_BITS "\20\20CP_BYT_WR\17ABUS_BD_DT_CODE\10MULT_ERR\ ! 81: \7CHE_TAG_PE\6CHE_TAG_W_PE\5CHE_WRTN_BIT\4NXM\3CP-IO_BUF_ERR\2MBOX_LOCK" ! 82: ! 83: /* enable CRD reports */ ! 84: ka860_memenable() ! 85: { ! 86: ! 87: mtpr(MERG, mfpr(MERG) & ~M8600_ICRD); ! 88: } ! 89: ! 90: /* log CRD errors */ ! 91: ka860_memerr() ! 92: { ! 93: register int reg11; /* known to be r11 below */ ! 94: int mdecc, mear, mstat1, mstat2, array; ! 95: ! 96: /* ! 97: * Scratchpad registers in the Ebox must be read by ! 98: * storing their ID number in ESPA and then immediately ! 99: * reading ESPD's contents with no other intervening ! 100: * machine instructions! ! 101: * ! 102: * The asm's below have a number of constants which ! 103: * are defined correctly above and in mtpr.h. ! 104: */ ! 105: #ifdef lint ! 106: reg11 = 0; ! 107: #else ! 108: asm("mtpr $0x27,$0x4e; mfpr $0x4f,r11"); ! 109: #endif ! 110: mdecc = reg11; /* must acknowledge interrupt? */ ! 111: if (M8600_MEMERR(mdecc)) { ! 112: asm("mtpr $0x2a,$0x4e; mfpr $0x4f,r11"); ! 113: mear = reg11; ! 114: asm("mtpr $0x25,$0x4e; mfpr $0x4f,r11"); ! 115: mstat1 = reg11; ! 116: asm("mtpr $0x26,$0x4e; mfpr $0x4f,r11"); ! 117: mstat2 = reg11; ! 118: array = M8600_ARRAY(mear); ! 119: ! 120: printf("mcr0: ecc error, addr %x (array %d) syn %x\n", ! 121: M8600_ADDR(mear), array, M8600_SYN(mdecc)); ! 122: printf("\tMSTAT1 = %b\n\tMSTAT2 = %b\n", ! 123: mstat1, M8600_MSTAT1_BITS, ! 124: mstat2, M8600_MSTAT2_BITS); ! 125: mtpr(EHSR, 0); ! 126: mtpr(MERG, mfpr(MERG) | M8600_ICRD); ! 127: } ! 128: } ! 129: ! 130: #define NMC8600 7 ! 131: char *mc8600[] = { ! 132: "unkn type", "fbox error", "ebox error", "ibox error", ! 133: "mbox error", "tbuf error", "mbox 1D error" ! 134: }; ! 135: /* codes for above */ ! 136: #define MC_FBOX 1 ! 137: #define MC_EBOX 2 ! 138: #define MC_IBOX 3 ! 139: #define MC_MBOX 4 ! 140: #define MC_TBUF 5 ! 141: #define MC_MBOX1D 6 ! 142: ! 143: /* error bits */ ! 144: #define MBOX_FE 0x8000 /* Mbox fatal error */ ! 145: #define FBOX_SERV 0x10000000 /* Fbox service error */ ! 146: #define IBOX_ERR 0x2000 /* Ibox error */ ! 147: #define EBOX_ERR 0x1e00 /* Ebox error */ ! 148: #define MBOX_1D 0x81d0000 /* Mbox 1D error */ ! 149: #define EDP_PE 0x200 ! 150: ! 151: struct mc8600frame { ! 152: int mc86_bcnt; /* byte count == 0x58 */ ! 153: int mc86_ehmsts; ! 154: int mc86_evmqsav; ! 155: int mc86_ebcs; ! 156: int mc86_edpsr; ! 157: int mc86_cslint; ! 158: int mc86_ibesr; ! 159: int mc86_ebxwd1; ! 160: int mc86_ebxwd2; ! 161: int mc86_ivasav; ! 162: int mc86_vibasav; ! 163: int mc86_esasav; ! 164: int mc86_isasav; ! 165: int mc86_cpc; ! 166: int mc86_mstat1; ! 167: int mc86_mstat2; ! 168: int mc86_mdecc; ! 169: int mc86_merg; ! 170: int mc86_cshctl; ! 171: int mc86_mear; ! 172: int mc86_medr; ! 173: int mc86_accs; ! 174: int mc86_cses; ! 175: int mc86_pc; /* trapped pc */ ! 176: int mc86_psl; /* trapped psl */ ! 177: }; ! 178: ! 179: /* machine check */ ! 180: ka860_mchk(cmcf) ! 181: caddr_t cmcf; ! 182: { ! 183: register struct mc8600frame *mcf = (struct mc8600frame *)cmcf; ! 184: register int type; ! 185: ! 186: if (mcf->mc86_ebcs & MBOX_FE) ! 187: mcf->mc86_ehmsts |= MC_MBOX; ! 188: else if (mcf->mc86_ehmsts & FBOX_SERV) ! 189: mcf->mc86_ehmsts |= MC_FBOX; ! 190: else if (mcf->mc86_ebcs & EBOX_ERR) { ! 191: if (mcf->mc86_ebcs & EDP_PE) ! 192: mcf->mc86_ehmsts |= MC_MBOX; ! 193: else ! 194: mcf->mc86_ehmsts |= MC_EBOX; ! 195: } else if (mcf->mc86_ehmsts & IBOX_ERR) ! 196: mcf->mc86_ehmsts |= MC_IBOX; ! 197: else if (mcf->mc86_mstat1 & M8600_TB_ERR) ! 198: mcf->mc86_ehmsts |= MC_TBUF; ! 199: else if ((mcf->mc86_cslint & MBOX_1D) == MBOX_1D) ! 200: mcf->mc86_ehmsts |= MC_MBOX1D; ! 201: ! 202: type = mcf->mc86_ehmsts & 0x7; ! 203: printf("machine check %x: %s\n", type, ! 204: type < NMC8600 ? mc8600[type] : "???"); ! 205: printf("\tehm.sts %x evmqsav %x ebcs %x edpsr %x cslint %x\n", ! 206: mcf->mc86_ehmsts, mcf->mc86_evmqsav, mcf->mc86_ebcs, ! 207: mcf->mc86_edpsr, mcf->mc86_cslint); ! 208: printf("\tibesr %x ebxwd %x %x ivasav %x vibasav %x\n", ! 209: mcf->mc86_ibesr, mcf->mc86_ebxwd1, mcf->mc86_ebxwd2, ! 210: mcf->mc86_ivasav, mcf->mc86_vibasav); ! 211: printf("\tesasav %x isasav %x cpc %x mstat %x %x mdecc %x\n", ! 212: mcf->mc86_esasav, mcf->mc86_isasav, mcf->mc86_cpc, ! 213: mcf->mc86_mstat1, mcf->mc86_mstat2, mcf->mc86_mdecc); ! 214: printf("\tmerg %x cshctl %x mear %x medr %x accs %x cses %x\n", ! 215: mcf->mc86_merg, mcf->mc86_cshctl, mcf->mc86_mear, ! 216: mcf->mc86_medr, mcf->mc86_accs, mcf->mc86_cses); ! 217: printf("\tpc %x psl %x\n", mcf->mc86_pc, mcf->mc86_psl); ! 218: mtpr(EHSR, 0); ! 219: return (MCHK_PANIC); ! 220: } ! 221: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.