xref: /original-bsd/sys/sparc/sparc/memreg.c (revision 3705696b)
1 /*
2  * Copyright (c) 1992, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This software was developed by the Computer Systems Engineering group
6  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
7  * contributed to Berkeley.
8  *
9  * All advertising materials mentioning features or use of this software
10  * must display the following acknowledgement:
11  *	This product includes software developed by the University of
12  *	California, Lawrence Berkeley Laboratory.
13  *
14  * %sccs.include.redist.c%
15  *
16  *	@(#)memreg.c	8.1 (Berkeley) 06/11/93
17  *
18  * from: $Header: memreg.c,v 1.7 92/11/26 03:05:04 torek Exp $ (LBL)
19  */
20 
21 #include <sys/param.h>
22 #include <sys/device.h>
23 
24 #include <machine/autoconf.h>
25 #include <machine/ctlreg.h>
26 
27 #include <sparc/sparc/memreg.h>
28 
29 static int memregmatch __P((struct device *, struct cfdata *, void *));
30 static void memregattach __P((struct device *, struct device *, void *));
31 struct cfdriver memregcd =
32     { 0, "memreg", memregmatch, memregattach, DV_DULL, sizeof(struct device) };
33 
34 /*
35  * The OPENPROM calls this "memory-error".
36  */
37 static int
38 memregmatch(parent, cf, aux)
39 	struct device *parent;
40 	struct cfdata *cf;
41 	void *aux;
42 {
43 
44 	return (strcmp("memory-error", ((struct romaux *)aux)->ra_name) == 0);
45 }
46 
47 /* ARGSUSED */
48 static void
49 memregattach(parent, self, aux)
50 	struct device *parent, *self;
51 	void *aux;
52 {
53 	struct romaux *ra = aux;
54 
55 	par_err_reg = ra->ra_vaddr ? (volatile int *)ra->ra_vaddr :
56 	    (volatile int *)mapiodev(ra->ra_paddr, sizeof(int));
57 	printf("\n");
58 }
59 
60 /*
61  * Synchronous and asynchronous memory error handler.
62  * (This is the level 15 interrupt, which is not vectored.)
63  * Should kill the process that got its bits clobbered,
64  * and take the page out of the page pool, but for now...
65  */
66 void
67 memerr(issync, ser, sva, aer, ava)
68 	int issync, ser, sva, aer, ava;
69 {
70 
71 	printf("%ssync mem err: ser=%b sva=%x aer=%b ava=%x\n",
72 	    issync ? "" : "a", ser, SER_BITS, sva, aer & 0xff, AER_BITS, ava);
73 	if (par_err_reg)
74 		printf("parity error register = %b\n", *par_err_reg, PER_BITS);
75 #ifdef DEBUG
76 	callrom();
77 #else
78 	panic("memory error");		/* XXX */
79 #endif
80 }
81