diff options
author | attilio <attilio@FreeBSD.org> | 2010-02-25 14:13:39 +0000 |
---|---|---|
committer | attilio <attilio@FreeBSD.org> | 2010-02-25 14:13:39 +0000 |
commit | 1b75a98556931f83129a222260dbc32a104b8bc3 (patch) | |
tree | d968b8185d78ca4c30d4e35c028883a9027fcb5f /sys/x86/isa/nmi.c | |
parent | 2705e272e16f3352f585937363f0557635e5149f (diff) | |
download | FreeBSD-src-1b75a98556931f83129a222260dbc32a104b8bc3.zip FreeBSD-src-1b75a98556931f83129a222260dbc32a104b8bc3.tar.gz |
Introduce the new kernel sub-tree x86 which should contain all the code
shared and generalized between our current amd64, i386 and pc98.
This is just an initial step that should lead to a more complete effort.
For the moment, a very simple porting of cpufreq modules, BIOS calls and
the whole MD specific ISA bus part is added to the sub-tree but ideally
a lot of code might be added and more shared support should grow.
Sponsored by: Sandvine Incorporated
Reviewed by: emaste, kib, jhb, imp
Discussed on: arch
MFC: 3 weeks
Diffstat (limited to 'sys/x86/isa/nmi.c')
-rw-r--r-- | sys/x86/isa/nmi.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/sys/x86/isa/nmi.c b/sys/x86/isa/nmi.c new file mode 100644 index 0000000..db5550c --- /dev/null +++ b/sys/x86/isa/nmi.c @@ -0,0 +1,107 @@ +/*- + * Copyright (c) 1991 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)isa.c 7.2 (Berkeley) 5/13/91 + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include "opt_mca.h" + +#include <sys/types.h> +#include <sys/syslog.h> +#include <sys/systm.h> + +#include <machine/md_var.h> + +#ifdef DEV_MCA +#include <i386/bios/mca_machdep.h> +#endif + +#define NMI_PARITY (1 << 7) +#define NMI_IOCHAN (1 << 6) +#define ENMI_WATCHDOG (1 << 7) +#define ENMI_BUSTIMER (1 << 6) +#define ENMI_IOSTATUS (1 << 5) + +/* + * Handle a NMI, possibly a machine check. + * return true to panic system, false to ignore. + */ +int +isa_nmi(int cd) +{ + int retval = 0; + int isa_port = inb(0x61); + int eisa_port = inb(0x461); + + log(LOG_CRIT, "NMI ISA %x, EISA %x\n", isa_port, eisa_port); +#ifdef DEV_MCA + if (MCA_system && mca_bus_nmi()) + return(0); +#endif + + if (isa_port & NMI_PARITY) { + log(LOG_CRIT, "RAM parity error, likely hardware failure."); + retval = 1; + } + + if (isa_port & NMI_IOCHAN) { + log(LOG_CRIT, "I/O channel check, likely hardware failure."); + retval = 1; + } + + /* + * On a real EISA machine, this will never happen. However it can + * happen on ISA machines which implement XT style floating point + * error handling (very rare). Save them from a meaningless panic. + */ + if (eisa_port == 0xff) + return(retval); + + if (eisa_port & ENMI_WATCHDOG) { + log(LOG_CRIT, "EISA watchdog timer expired, likely hardware failure."); + retval = 1; + } + + if (eisa_port & ENMI_BUSTIMER) { + log(LOG_CRIT, "EISA bus timeout, likely hardware failure."); + retval = 1; + } + + if (eisa_port & ENMI_IOSTATUS) { + log(LOG_CRIT, "EISA I/O port status error."); + retval = 1; + } + + return(retval); +} |