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 * @(#)ka750.c 7.4 (Berkeley) 05/09/91
8 */
9
10 #if VAX750
11
12 /*
13 * 750-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 mcr750 {
23 int mc_err; /* error bits */
24 int mc_inh; /* inhibit crd */
25 };
26
27 #define M750_ICRD 0x10000000 /* inhibit crd interrupts, in [1] */
28 #define M750_UNCORR 0xc0000000 /* uncorrectable error, in [0] */
29 #define M750_CORERR 0x20000000 /* correctable error, in [0] */
30
31 #define M750_INH(mcr) ((mcr)->mc_inh = 0)
32 #define M750_ENA(mcr) ((mcr)->mc_err = (M750_UNCORR|M750_CORERR), \
33 (mcr)->mc_inh = M750_ICRD)
34 #define M750_ERR(mcr) ((mcr)->mc_err & (M750_UNCORR|M750_CORERR))
35
36 #define M750_SYN(err) ((err) & 0x7f)
37 #define M750_ADDR(err) (((err) >> 9) & 0x7fff)
38
39 /* enable crd interrupts */
ka750_memenable()40 ka750_memenable()
41 {
42
43 M750_ENA((struct mcr750 *)mcraddr[0]);
44 }
45
46 /* log crd errors */
ka750_memerr()47 ka750_memerr()
48 {
49 register struct mcr750 *mcr = (struct mcr750 *)mcraddr[0];
50 register int err;
51
52 if (M750_ERR(mcr)) {
53 err = mcr->mc_err; /* careful with i/o space refs */
54 printf("mcr0: %s", err & M750_UNCORR ?
55 "hard error" : "soft ecc");
56 printf(" addr %x syn %x\n", M750_ADDR(err), M750_SYN(err));
57 M750_INH(mcr);
58 }
59 }
60
61 extern char *mc780750[];
62
63 struct mc750frame {
64 int mc5_bcnt; /* byte count == 0x28 */
65 int mc5_summary; /* summary parameter (as above) */
66 int mc5_va; /* virtual address register */
67 int mc5_errpc; /* error pc */
68 int mc5_mdr;
69 int mc5_svmode; /* saved mode register */
70 int mc5_rdtimo; /* read lock timeout */
71 int mc5_tbgpar; /* tb group parity error register */
72 int mc5_cacherr; /* cache error register */
73 int mc5_buserr; /* bus error register */
74 int mc5_mcesr; /* machine check status register */
75 int mc5_pc; /* trapped pc */
76 int mc5_psl; /* trapped psl */
77 };
78
79 #define MC750_TBERR 2 /* type code of cp tbuf par */
80 #define MC750_TBPAR 4 /* tbuf par bit in mcesr */
81
ka750_mchk(cmcf)82 ka750_mchk(cmcf)
83 caddr_t cmcf;
84 {
85 register struct mc750frame *mcf = (struct mc750frame *)cmcf;
86 register int type = mcf->mc5_summary;
87 int mcsr = mfpr(MCSR);
88
89 printf("machine check %x: %s%s\n", type, mc780750[type&0xf],
90 (type&0xf0) ? " abort" : " fault");
91 mtpr(TBIA, 0);
92 mtpr(MCESR, 0xf);
93 printf(
94 "\tva %x errpc %x mdr %x smr %x rdtimo %x tbgpar %x cacherr %x\n",
95 mcf->mc5_va, mcf->mc5_errpc, mcf->mc5_mdr, mcf->mc5_svmode,
96 mcf->mc5_rdtimo, mcf->mc5_tbgpar, mcf->mc5_cacherr);
97 printf("\tbuserr %x mcesr %x pc %x psl %x mcsr %x\n",
98 mcf->mc5_buserr, mcf->mc5_mcesr, mcf->mc5_pc, mcf->mc5_psl,
99 mcsr);
100 if (type == MC750_TBERR && (mcf->mc5_mcesr&0xe) == MC750_TBPAR) {
101 printf("tbuf par: flushing and returning\n");
102 return (MCHK_RECOVERED);
103 }
104 return (MCHK_PANIC);
105 }
106 #endif
107