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 */
ka730_memenable()42 ka730_memenable()
43 {
44
45 M730_ENA((struct mcr730 *)mcraddr[0]);
46 }
47
48 /* log crd errors */
ka730_memerr()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
ka730_mchk(cmcf)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