|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Mt. Xinu. ! 7: * ! 8: * Redistribution is only permitted until one year after the first shipment ! 9: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and ! 10: * binary forms are permitted provided that: (1) source distributions retain ! 11: * this entire copyright notice and comment, and (2) distributions including ! 12: * binaries display the following acknowledgement: This product includes ! 13: * software developed by the University of California, Berkeley and its ! 14: * contributors'' in the documentation or other materials provided with the ! 15: * distribution and in all advertising materials mentioning features or use ! 16: * of this software. Neither the name of the University nor the names of ! 17: * its contributors may be used to endorse or promote products derived from ! 18: * this software without specific prior written permission. ! 19: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 20: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 21: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 22: * ! 23: * @(#)ka650.c 7.6 (Berkeley) 6/28/90 ! 24: */ ! 25: ! 26: #if VAX650 ! 27: ! 28: /* ! 29: * vax650-specific code. ! 30: */ ! 31: ! 32: #include "param.h" ! 33: #include "time.h" ! 34: #include "kernel.h" ! 35: #include "systm.h" ! 36: ! 37: #include "cpu.h" ! 38: #include "clock.h" ! 39: #include "psl.h" ! 40: #include "mem.h" ! 41: #include "mtpr.h" ! 42: #include "ka650.h" ! 43: ! 44: ! 45: ka650_init() ! 46: { ! 47: ioaccess(KA650_MERR, KA650MERRmap, sizeof(ka650merr)); ! 48: ioaccess(KA650_CBD, KA650CBDmap, sizeof(ka650cbd)); ! 49: ioaccess(KA650_SSC, KA650SSCmap, sizeof(ka650ssc)); ! 50: ioaccess(KA650_IPCR, KA650IPCRmap, sizeof(ka650ipcr)); ! 51: ioaccess(KA650_CACHE, KA650CACHEmap, KA650_CACHESIZE); ! 52: ka650encache(); ! 53: if (ctob(physmem) > ka650merr.merr_qbmbr) { ! 54: printf("physmem(0x%x) > qbmbr(0x%x)\n", ! 55: ctob(physmem), ka650merr.merr_qbmbr); ! 56: panic("qbus map unprotected"); ! 57: } ! 58: } ! 59: ! 60: ka650_clkstartrt() ! 61: { ! 62: mtpr(ICCS, ICCS_IE); ! 63: } ! 64: ! 65: ka650_memnop() ! 66: { ! 67: /* void */ ! 68: } ! 69: ! 70: ka650_memerr() ! 71: { ! 72: register char *cp = (char *)0; ! 73: register int m; ! 74: extern u_int cache2tag; ! 75: ! 76: if (ka650cbd.cbd_cacr & CACR_CPE) { ! 77: printf("cache 2 tag parity error: "); ! 78: if (time.tv_sec - cache2tag < 7) { ! 79: ka650discache(); ! 80: printf("cacheing disabled\n"); ! 81: } else { ! 82: cache2tag = time.tv_sec; ! 83: printf("flushing cache\n"); ! 84: ka650encache(); ! 85: } ! 86: } ! 87: m = ka650merr.merr_errstat; ! 88: ka650merr.merr_errstat = MEM_EMASK; ! 89: if (m & MEM_CDAL) { ! 90: cp = "Bus Parity"; ! 91: } else if (m & MEM_RDS) { ! 92: cp = "Hard ECC"; ! 93: } else if (m & MEM_CRD) { ! 94: cp = "Soft ECC"; ! 95: } ! 96: if (cp) { ! 97: printf("%sMemory %s Error: page 0x%x\n", ! 98: (m & MEM_DMA) ? "DMA " : "", cp, ! 99: (m & MEM_PAGE) >> MEM_PAGESHFT); ! 100: } ! 101: } ! 102: ! 103: #define NMC650 15 ! 104: char *mc650[] = { ! 105: 0, "FPA proto err", "FPA resv inst", ! 106: "FPA Ill Stat 2", "FPA Ill Stat 1", "PTE in P0, TB miss", ! 107: "PTE in P1, TB miss", "PTE in P0, Mod", "PTE in P1, Mod", ! 108: "Illegal intr IPL", "MOVC state error", "bus read error", ! 109: "SCB read error", "bus write error", "PCB write error" ! 110: }; ! 111: u_int cache1tag; ! 112: u_int cache1data; ! 113: u_int cdalerr; ! 114: u_int cache2tag; ! 115: ! 116: struct mc650frame { ! 117: int mc65_bcnt; /* byte count == 0xc */ ! 118: int mc65_summary; /* summary parameter */ ! 119: int mc65_mrvaddr; /* most recent vad */ ! 120: int mc65_istate1; /* internal state */ ! 121: int mc65_istate2; /* internal state */ ! 122: int mc65_pc; /* trapped pc */ ! 123: int mc65_psl; /* trapped psl */ ! 124: }; ! 125: ! 126: ka650_mchk(cmcf) ! 127: caddr_t cmcf; ! 128: { ! 129: register struct mc650frame *mcf = (struct mc650frame *)cmcf; ! 130: register u_int type = mcf->mc65_summary; ! 131: register u_int i; ! 132: ! 133: printf("machine check %x", type); ! 134: if (type >= 0x80 && type <= 0x83) ! 135: type -= (0x80 + 11); ! 136: if (type < NMC650 && mc650[type]) ! 137: printf(": %s", mc650[type]); ! 138: printf("\n\tvap %x istate1 %x istate2 %x pc %x psl %x\n", ! 139: mcf->mc65_mrvaddr, mcf->mc65_istate1, mcf->mc65_istate2, ! 140: mcf->mc65_pc, mcf->mc65_psl); ! 141: printf("dmaser=0x%b qbear=0x%x dmaear=0x%x\n", ! 142: ka650merr.merr_dser, DMASER_BITS, ka650merr.merr_qbear, ! 143: ka650merr.merr_dear); ! 144: ka650merr.merr_dser = DSER_CLEAR; ! 145: ! 146: i = mfpr(CAER); ! 147: mtpr(CAER, CAER_MCC | CAER_DAT | CAER_TAG); ! 148: if (i & CAER_MCC) { ! 149: printf("cache 1 "); ! 150: if (i & CAER_DAT) { ! 151: printf("data"); ! 152: i = cache1data; ! 153: cache1data = time.tv_sec; ! 154: } ! 155: if (i & CAER_TAG) { ! 156: printf("tag"); ! 157: i = cache1tag; ! 158: cache1tag = time.tv_sec; ! 159: } ! 160: } else if ((i & CAER_MCD) || (ka650merr.merr_errstat & MEM_CDAL)) { ! 161: printf("CDAL"); ! 162: i = cdalerr; ! 163: cdalerr = time.tv_sec; ! 164: } ! 165: if (time.tv_sec - i < 7) { ! 166: ka650discache(); ! 167: printf(" parity error: cacheing disabled\n"); ! 168: } else { ! 169: printf(" parity error: flushing cache\n"); ! 170: ka650encache(); ! 171: } ! 172: /* ! 173: * May be able to recover if type is 1-4, 0x80 or 0x81, but ! 174: * only if FPD is set in the saved PSL, or bit VCR in Istate2 ! 175: * is clear. ! 176: */ ! 177: if ((type > 0 && type < 5) || type == 11 || type == 12) { ! 178: if ((mcf->mc65_psl & PSL_FPD) ! 179: || !(mcf->mc65_istate2 & IS2_VCR)) { ! 180: ka650_memerr(); ! 181: return (MCHK_RECOVERED); ! 182: } ! 183: } ! 184: return (MCHK_PANIC); ! 185: } ! 186: ! 187: /* ! 188: * Make sure both caches are off and not in diagnostic mode. Clear the ! 189: * 2nd level cache (by writing to each quadword entry), then enable it. ! 190: * Enable 1st level cache too. ! 191: */ ! 192: ka650encache() ! 193: { ! 194: register int i; ! 195: ! 196: ka650discache(); ! 197: for (i = 0; i < (KA650_CACHESIZE / sizeof(ka650cache[0])); i += 2) ! 198: ka650cache[i] = 0; ! 199: ka650cbd.cbd_cacr = CACR_CEN; ! 200: mtpr(CADR, CADR_SEN2 | CADR_SEN1 | CADR_CENI | CADR_CEND); ! 201: } ! 202: ! 203: ka650discache() ! 204: { ! 205: mtpr(CADR, 0); ! 206: ka650cbd.cbd_cacr = CACR_CPE; ! 207: } ! 208: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.