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