Sanitize memerr*() a bit.

This commit is contained in:
pk 1998-09-06 21:14:56 +00:00
parent dccbf9bc96
commit cda6fb7430
6 changed files with 150 additions and 128 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: cpu.c,v 1.63 1998/07/26 23:35:34 pk Exp $ */
/* $NetBSD: cpu.c,v 1.64 1998/09/06 21:14:57 pk Exp $ */
/*
* Copyright (c) 1996
@ -70,6 +70,7 @@
#include <sparc/sparc/cache.h>
#include <sparc/sparc/asm.h>
#include <sparc/sparc/cpuvar.h>
#include <sparc/sparc/memreg.h>
/* The following are used externally (sysctl_hw). */
char machine[] = MACHINE; /* from <machine/param.h> */
@ -383,7 +384,8 @@ struct module_info module_sun4 = {
sun4_vcache_flush_region,
sun4_vcache_flush_context,
noop_pcache_flush_line,
noop_pure_vcache_flush
noop_pure_vcache_flush,
memerr4
};
void
@ -506,7 +508,8 @@ struct module_info module_sun4c = {
sun4_vcache_flush_region,
sun4_vcache_flush_context,
noop_pcache_flush_line,
noop_pure_vcache_flush
noop_pure_vcache_flush,
memerr4c
};
void
@ -701,7 +704,8 @@ struct module_info module_ms1 = {
noop_vcache_flush_region,
noop_vcache_flush_context,
noop_pcache_flush_line,
noop_pure_vcache_flush
noop_pure_vcache_flush,
memerr4m
};
void
@ -725,7 +729,9 @@ struct module_info module_ms2 = { /* UNTESTED */
srmmu_vcache_flush_segment,
srmmu_vcache_flush_region,
srmmu_vcache_flush_context,
noop_pcache_flush_line
noop_pcache_flush_line,
noop_pure_vcache_flush,
memerr4m
};
@ -745,7 +751,8 @@ struct module_info module_swift = { /* UNTESTED */
srmmu_vcache_flush_region,
srmmu_vcache_flush_context,
srmmu_pcache_flush_line,
noop_pure_vcache_flush
noop_pure_vcache_flush,
memerr4m
};
void
@ -781,7 +788,8 @@ struct module_info module_viking = { /* UNTESTED */
noop_vcache_flush_region,
noop_vcache_flush_context,
viking_pcache_flush_line,
noop_pure_vcache_flush
noop_pure_vcache_flush,
viking_memerr
};
void
@ -859,7 +867,8 @@ struct module_info module_hypersparc = { /* UNTESTED */
srmmu_vcache_flush_region,
srmmu_vcache_flush_context,
srmmu_pcache_flush_line,
hypersparc_pure_vcache_flush
hypersparc_pure_vcache_flush,
hypersparc_memerr
};
void
@ -905,7 +914,8 @@ struct module_info module_cypress = { /* UNTESTED */
srmmu_vcache_flush_region,
srmmu_vcache_flush_context,
srmmu_pcache_flush_line,
noop_pure_vcache_flush
noop_pure_vcache_flush,
memerr4m
};
/* Fujitsu Turbosparc */
@ -925,7 +935,8 @@ struct module_info module_turbosparc = { /* UNTESTED */
srmmu_vcache_flush_region,
srmmu_vcache_flush_context,
srmmu_pcache_flush_line,
noop_pure_vcache_flush
noop_pure_vcache_flush,
memerr4m
};
void
@ -1146,6 +1157,7 @@ getcpuinfo(sc, node)
MPCOPY(vcache_flush_context);
MPCOPY(pcache_flush_line);
MPCOPY(pure_vcache_flush);
MPCOPY(memerr);
#undef MPCOPY
return;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: cpuvar.h,v 1.7 1998/07/26 23:35:34 pk Exp $ */
/* $NetBSD: cpuvar.h,v 1.8 1998/09/06 21:14:57 pk Exp $ */
/*
* Copyright (c) 1996 The NetBSD Foundation, Inc.
@ -70,6 +70,8 @@ struct module_info {
void (*vcache_flush_context)__P((void));
void (*pcache_flush_line)__P((int, int));
void (*pure_vcache_flush)__P((void));
void (*memerr)__P((unsigned, u_int, u_int, u_int, u_int,
struct trapframe *));
};
@ -188,6 +190,12 @@ struct cpu_softc {
void (*mbusflush) __P((void));
#endif
/*
* Memory error handler; parity errors, unhandled NMIs and other
* unrecoverable faults end up here.
*/
void (*memerr)__P((unsigned, u_int, u_int, u_int, u_int,
struct trapframe *));
/* XXX: Add more here! */
};

View File

@ -1,4 +1,4 @@
# $NetBSD: genassym.cf,v 1.7 1998/09/05 15:28:09 christos Exp $
# $NetBSD: genassym.cf,v 1.8 1998/09/06 21:14:56 pk Exp $
#
# Copyright (c) 1998 The NetBSD Foundation, Inc.
@ -148,6 +148,7 @@ endif
# CPU info structure
define CPUINFO_FAULTSTATUS offsetof(struct cpu_softc, get_faultstatus)
define CPUINFO_PURE_VCACHE_FLS offsetof(struct cpu_softc, pure_vcache_flush)
define CPUINFO_MEMERR offsetof(struct cpu_softc, memerr)
# PTE bits and related information
define PG_W PG_W

View File

@ -1,4 +1,4 @@
/* $NetBSD: memreg.c,v 1.25 1998/03/30 14:21:39 pk Exp $ */
/* $NetBSD: memreg.c,v 1.26 1998/09/06 21:14:56 pk Exp $ */
/*
* Copyright (c) 1992, 1993
@ -78,9 +78,8 @@ struct cfattach memreg_obio_ca = {
sizeof(struct device), memregmatch_obio, memregattach_obio
};
void memerr __P((int, u_int, u_int, u_int, u_int));
#if defined(SUN4M)
static void hardmemerr4m __P((int, u_int, u_int));
static void hardmemerr4m __P((u_int, u_int, u_int, u_int));
#endif
/*
@ -184,66 +183,51 @@ memregattach_obio(parent, self, aux)
* and take the page out of the page pool, but for now...
*/
void
memerr(issync, ser, sva, aer, ava)
int issync;
u_int ser, sva, aer, ava;
{
#if defined(SUN4) || defined(SUN4C)
char bits[64];
#endif
/* XXX Ugh! Clean up this switch and all the ifdefs! */
switch (cputyp) {
#if defined(SUN4)
case CPU_SUN4:
if (par_err_reg) {
printf("mem err: ser=%s sva=0x%x\n",
bitmask_snprintf(ser, SER_BITS, bits,
sizeof(bits)), sva);
printf("parity error register = %s\n",
bitmask_snprintf(*par_err_reg, PER_BITS,
bits, sizeof(bits)));
} else {
printf("mem err: ser=? sva=?\n");
printf("parity error register not mapped yet!\n"); /* XXX */
}
#ifdef DEBUG
callrom();
#else
panic("memory error"); /* XXX */
#endif
break;
#endif /* Sun4 */
void
memerr4(issync, ser, sva, aer, ava, tf)
unsigned int issync;
u_int ser, sva, aer, ava;
struct trapframe *tf; /* XXX - unused/invalid */
{
char bits[64];
if (par_err_reg) {
printf("mem err: ser=%s sva=0x%x\n",
bitmask_snprintf(ser, SER_BITS, bits,
sizeof(bits)), sva);
printf("parity error register = %s\n",
bitmask_snprintf(*par_err_reg, PER_BITS,
bits, sizeof(bits)));
} else {
printf("mem err: ser=? sva=?\n");
printf("parity error register not mapped yet!\n"); /* XXX */
}
panic("memory error"); /* XXX */
}
#endif /* SUN4 */
#if defined(SUN4C)
case CPU_SUN4C:
printf("%ssync mem arr: ser=%s sva=0x%x ",
issync ? "" : "a", bitmask_snprintf(ser, SER_BITS,
bits, sizeof(bits)), sva);
printf("aer=%s ava=0x%x\n", bitmask_snprintf(aer & 0xff,
AER_BITS, bits, sizeof(bits)), ava);
if (par_err_reg)
printf("parity error register = %s\n",
bitmask_snprintf(*par_err_reg, PER_BITS,
bits, sizeof(bits)));
#ifdef DEBUG
callrom();
#else
panic("memory error"); /* XXX */
#endif
break;
#endif /* Sun4C */
void
memerr4c(issync, ser, sva, aer, ava, tf)
unsigned int issync;
u_int ser, sva, aer, ava;
struct trapframe *tf; /* XXX - unused/invalid */
{
char bits[64];
#if defined(SUN4M)
case CPU_SUN4M:
hardmemerr4m(2, ser, sva);
break;
#endif /* Sun4M */
default:
break;
}
printf("%ssync mem arr: ser=%s sva=0x%x ",
issync ? "" : "a", bitmask_snprintf(ser, SER_BITS,
bits, sizeof(bits)), sva);
printf("aer=%s ava=0x%x\n", bitmask_snprintf(aer & 0xff,
AER_BITS, bits, sizeof(bits)), ava);
if (par_err_reg)
printf("parity error register = %s\n",
bitmask_snprintf(*par_err_reg, PER_BITS,
bits, sizeof(bits)));
panic("memory error"); /* XXX */
}
#endif /* SUN4C */
#if defined(SUN4M)
@ -257,35 +241,25 @@ memerr(issync, ser, sva, aer, ava)
*/
static void
hardmemerr4m(issync, fsr, faddr)
int issync;
u_int fsr, faddr;
hardmemerr4m(sfsr, sfva, afsr, afva)
u_int sfsr;
u_int sfva;
u_int afsr;
u_int afva;
{
char bits[64];
char *s, bits[64];
printf("memory error: ");
s = bitmask_snprintf(sfsr, SFSR_BITS, bits, sizeof(bits));
printf("sfsr=%s sfva=0x%x\n", s, sfva);
s = bitmask_snprintf(afsr, AFSR_BITS, bits, sizeof(bits));
printf("; afsr=%s afva=0x%x%x\n", s,
(afsr & AFSR_AFA) >> AFSR_AFA_RSHIFT, afva);
if ((sfsr & SFSR_FT) == SFSR_FT_NONE && (afsr & AFSR_AFO) == 0)
return;
switch (issync) {
case 1:
if ((fsr & SFSR_FT) == SFSR_FT_NONE)
return;
printf("mem err: sfsr=%s sfaddr=0x%x\n", bitmask_snprintf(fsr,
SFSR_BITS, bits, sizeof(bits)), faddr);
break;
case 0:
if (!(fsr & AFSR_AFO))
return;
printf("async (HS) mem err: afsr=%s afaddr=0x%x physaddr=0x%x%x\n",
bitmask_snprintf(fsr, AFSR_BITS, bits, sizeof(bits)),
faddr, (fsr & AFSR_AFA) >> AFSR_AFA_RSHIFT, faddr);
break;
default: /* unknown; print both decodings*/
printf("unknown mem err: if sync, fsr=%s fva=0x%x; ",
bitmask_snprintf(fsr, SFSR_BITS, bits, sizeof(bits)),
faddr);
printf("if async, fsr=%s fa=0x%x pa=0x%x%x", bitmask_snprintf(fsr,
AFSR_BITS, bits, sizeof(bits)), faddr,
(fsr & AFSR_AFA) >> AFSR_AFA_RSHIFT, faddr);
break;
}
panic("hard memory error");
}
@ -301,15 +275,14 @@ static int addroldtop = (int) 0xdeadbeef;
static int oldtype = -1;
void
memerr4m(type, sfsr, sfva, afsr, afva, tf)
register unsigned type;
register u_int sfsr;
register u_int sfva;
register u_int afsr;
register u_int afva;
register struct trapframe *tf;
hypersparc_memerr(type, sfsr, sfva, afsr, afva, tf)
unsigned type;
u_int sfsr;
u_int sfva;
u_int afsr;
u_int afva;
struct trapframe *tf;
{
char bits[64];
if ((afsr & AFSR_AFO) != 0) { /* HS async fault! */
@ -318,14 +291,27 @@ memerr4m(type, sfsr, sfva, afsr, afva, tf)
afva);
if (afva == addrold && (afsr & AFSR_AFA) == addroldtop)
hardmemerr4m(0, afsr, afva);
/* NOTREACHED */
hardmemerr4m(sfsr, sfva, afsr, afva);
oldtype = -1;
addrold = afva;
addroldtop = afsr & AFSR_AFA;
return;
}
memerr4m(type, sfsr, sfva, afsr, afva, tf);
}
} else if (type == T_STOREBUFFAULT && cpuinfo.cpu_vers == 4) {
void
viking_memerr(type, sfsr, sfva, afsr, afva, tf)
unsigned type;
u_int sfsr;
u_int sfva;
u_int afsr;
u_int afva;
struct trapframe *tf;
{
if (type == T_STOREBUFFAULT) {
/*
* On Supersparc, we try to reenable the store buffers
@ -335,8 +321,7 @@ memerr4m(type, sfsr, sfva, afsr, afva, tf)
sfva);
if (oldtype == T_STOREBUFFAULT || addrold == sfva)
hardmemerr4m(1, sfsr, sfva);
/* NOTREACHED */
hardmemerr4m(sfsr, sfva, afsr, afva);
oldtype = T_STOREBUFFAULT;
addrold = sfva;
@ -345,18 +330,34 @@ memerr4m(type, sfsr, sfva, afsr, afva, tf)
sta(SRMMU_PCR, ASI_SRMMU,
lda(SRMMU_PCR, ASI_SRMMU) | VIKING_PCR_SB);
} else if (type == T_DATAFAULT && !(sfsr & SFSR_FAV)) { /* bizarre */
/* XXX: Should handle better. See SuperSPARC manual pg. 9-35 */
return;
}
memerr4m(type, sfsr, sfva, afsr, afva, tf);
}
void
memerr4m(type, sfsr, sfva, afsr, afva, tf)
unsigned type;
u_int sfsr;
u_int sfva;
u_int afsr;
u_int afva;
struct trapframe *tf;
{
char bits[64];
if (type == T_DATAFAULT && !(sfsr & SFSR_FAV)) { /* bizarre */
/* XXX: Should handle better. See SuperSPARC manual pg. 9-35 */
printf("warning: got data fault with no faulting address."
" Ignoring.\n");
if (oldtype == T_DATAFAULT)
hardmemerr4m(1, sfsr, sfva);
/* NOTREACHED */
hardmemerr4m(sfsr, sfva, afsr, afva);
oldtype = T_DATAFAULT;
} else if (type == 0) { /* NMI */
printf("ERROR: got NMI with sfsr=0x%s, sfva=0x%x, ",
bitmask_snprintf(sfsr, SFSR_BITS, bits, sizeof(bits)),
sfva);
@ -364,20 +365,16 @@ memerr4m(type, sfsr, sfva, afsr, afva, tf)
bitmask_snprintf(afsr, AFSR_BITS, bits, sizeof(bits)),
afva);
if (oldtype == 0 || addrold == sfva)
hardmemerr4m(1, sfsr, sfva); /* XXX: async? */
/* NOTREACHED */
hardmemerr4m(sfsr, sfva, afsr, afva);
oldtype = 0;
addrold = sfva;
} else /* something we don't know about?!? */ {
printf("unknown fatal memory error, type=%d, sfsr=%s, sfva=0x%x",
type, bitmask_snprintf(sfsr, SFSR_BITS, bits, sizeof(bits)),
sfva);
printf(", afsr=%s, afaddr=0x%x\n", bitmask_snprintf(afsr,
AFSR_BITS, bits, sizeof(bits)), afva);
panic("memerr4m");
} else {
/* something we don't know about?!? */
hardmemerr4m(sfsr, sfva, afsr, afva);
}
return;
}
#endif /* 4m */
#endif /* SUN4M */

View File

@ -1,4 +1,4 @@
/* $NetBSD: memreg.h,v 1.4 1996/03/31 22:52:13 pk Exp $ */
/* $NetBSD: memreg.h,v 1.5 1998/09/06 21:14:56 pk Exp $ */
/*
* Copyright (c) 1992, 1993
@ -71,4 +71,8 @@ volatile u_int *par_err_reg; /* virtual address; NULL if not yet mapped */
* sun4m ...
*/
struct trapframe;
void memerr4 __P((unsigned, u_int, u_int, u_int, u_int, struct trapframe *));
void memerr4c __P((unsigned, u_int, u_int, u_int, u_int, struct trapframe *));
void memerr4m __P((unsigned, u_int, u_int, u_int, u_int, struct trapframe *));
void viking_memerr __P((unsigned, u_int, u_int, u_int, u_int, struct trapframe *));
void hypersparc_memerr __P((unsigned, u_int, u_int, u_int, u_int, struct trapframe *));

View File

@ -1,4 +1,4 @@
/* $NetBSD: trap.c,v 1.70 1998/08/21 14:13:56 pk Exp $ */
/* $NetBSD: trap.c,v 1.71 1998/09/06 21:14:56 pk Exp $ */
/*
* Copyright (c) 1996
@ -861,7 +861,7 @@ mem_access_fault4m(type, sfsr, sfva, afsr, afva, tf)
*/
if ((afsr & AFSR_AFO) != 0 || type == T_STOREBUFFAULT ||
(type == T_DATAFAULT && !(sfsr & SFSR_FAV))) {
memerr4m(type, sfsr, sfva, afsr, afva, tf);
(*cpuinfo.memerr)(type, sfsr, sfva, afsr, afva, tf);
/*
* If we get here, exit the trap handler and wait for the
* trap to re-occur.