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