diff options
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/arch/alpha/alpha/interrupt.c | 27 | ||||
| -rw-r--r-- | sys/arch/alpha/include/alpha.h | 8 |
2 files changed, 30 insertions, 5 deletions
diff --git a/sys/arch/alpha/alpha/interrupt.c b/sys/arch/alpha/alpha/interrupt.c index 76732696210..33bc754694c 100644 --- a/sys/arch/alpha/alpha/interrupt.c +++ b/sys/arch/alpha/alpha/interrupt.c @@ -1,4 +1,4 @@ -/* $NetBSD: interrupt.c,v 1.59 2001/04/28 06:10:49 thorpej Exp $ */ +/* $NetBSD: interrupt.c,v 1.60 2001/05/14 19:56:22 ross Exp $ */ /*- * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. @@ -72,7 +72,7 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.59 2001/04/28 06:10:49 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.60 2001/05/14 19:56:22 ross Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -81,6 +81,7 @@ __KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.59 2001/04/28 06:10:49 thorpej Exp $ #include <sys/sched.h> #include <sys/malloc.h> #include <sys/kernel.h> +#include <sys/time.h> #include <machine/cpuvar.h> @@ -180,7 +181,8 @@ interrupt(unsigned long a0, unsigned long a1, unsigned long a2, case ALPHA_INTR_ERROR: /* Machine Check or Correctable Error */ atomic_add_ulong(&ci->ci_intrdepth, 1); a0 = alpha_pal_rdmces(); - if (platform.mcheck_handler) + if (platform.mcheck_handler != NULL && + (void *)framep->tf_regs[FRAME_PC] != XentArith) (*platform.mcheck_handler)(a0, framep, a1, a2); else machine_check(a0, framep, a1, a2); @@ -245,6 +247,7 @@ machine_check(unsigned long mces, struct trapframe *framep, { const char *type; struct mchkinfo *mcp; + static struct timeval ratelimit[1]; mcp = &curcpu()->ci_mcinfo; /* Make sure it's an error we know about. */ @@ -277,8 +280,11 @@ machine_check(unsigned long mces, struct trapframe *framep, return; fatal: - /* Clear pending machine checks and correctable errors */ alpha_pal_wrmces(mces); + if ((void *)framep->tf_regs[FRAME_PC] == XentArith) { + rlprintf(ratelimit, "Stray machine check\n"); + return; + } printf("\n"); printf("%s:\n", type); @@ -560,3 +566,16 @@ softintr_disestablish(void *arg) free(sih, M_DEVBUF); } + +/* + * Security sensitive rate limiting printf + */ +void +rlprintf(struct timeval *t, const char *fmt, ...) +{ + va_list ap; + static const struct timeval msgperiod[1] = {{ 5, 0 }}; + + if (ratecheck(t, msgperiod)) + vprintf(fmt, ap); +} diff --git a/sys/arch/alpha/include/alpha.h b/sys/arch/alpha/include/alpha.h index 2ae746676c9..db6ed63e2f2 100644 --- a/sys/arch/alpha/include/alpha.h +++ b/sys/arch/alpha/include/alpha.h @@ -1,4 +1,4 @@ -/* $NetBSD: alpha.h,v 1.15 2001/04/26 03:10:46 ross Exp $ */ +/* $NetBSD: alpha.h,v 1.16 2001/05/14 19:56:23 ross Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -62,6 +62,7 @@ typedef union alpha_t_float { #ifdef _KERNEL #include <machine/bus.h> +#include <machine/stdarg.h> struct pcb; struct proc; @@ -117,6 +118,7 @@ void fpusave_cpu(struct cpu_info *, int); void fpusave_proc(struct proc *, int); /* Multiprocessor glue; cpu.c */ + struct cpu_info; int cpu_iccb_send(long, const char *); void cpu_iccb_receive(void); @@ -145,5 +147,9 @@ void alpha_write_fp_c(struct proc *, u_int64_t); void alpha_enable_fp(struct proc *, int); int alpha_fp_complete(u_long, u_long, struct proc *, u_int64_t *); +/* Security sensitive rate limiting printf */ + +void rlprintf(struct timeval *t, const char *fmt, ...); + #endif /* _KERNEL */ #endif /* _ALPHA_H_ */ |
