136 lines
4.2 KiB
Groff
136 lines
4.2 KiB
Groff
.\" $NetBSD: nmi.9,v 1.3 2011/03/17 10:02:54 jruoho Exp $
|
|
.\"
|
|
.\" Copyright (c) 2010 The NetBSD Foundation, Inc.
|
|
.\" All rights reserved.
|
|
.\"
|
|
.\" This code is derived from software contributed to The NetBSD Foundation
|
|
.\" by David Young.
|
|
.\"
|
|
.\" 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.
|
|
.\"
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
|
|
.\"
|
|
.Dd March 17, 2011
|
|
.Dt NMI 9 x86
|
|
.Os
|
|
.Sh NAME
|
|
.Nm nmi ,
|
|
.Nm nmi_establish ,
|
|
.Nm nmi_disestablish ,
|
|
.Nd NMI
|
|
.Sh SYNOPSIS
|
|
.In x86/nmi.h
|
|
.Ft nmi_handler_t *
|
|
.Fn nmi_establish "int (*func)(const struct trapframe *, void *)" "void *arg"
|
|
.Ft void
|
|
.Fn nmi_disestablish "nmi_handler_t *handle"
|
|
.Sh DESCRIPTION
|
|
The
|
|
.Nm
|
|
interface lets the kernel establish handlers for x86 Non-Maskable
|
|
Interrupts (NMIs).
|
|
An NMI signals to the processor an exception on a processor, memory
|
|
controller, or I/O bus that is irrecoverable or else needs attention
|
|
at a high priority.
|
|
A
|
|
.Dq "debug switch"
|
|
or a performance/watchdog timer may also trigger an NMI.
|
|
.Pp
|
|
An NMI handler will run to completion on the same processor where
|
|
it began without being preempted by any thread or interrupt except
|
|
for another NMI.
|
|
An NMI handler must prepare for re-entry.
|
|
An NMI handler may run simultaneously on more than one CPU.
|
|
.Pp
|
|
Synchronizing access to a shared data structure from
|
|
an NMI handler is a different challenge than synchronizing access
|
|
from hardware/software interrupt routines or from kernel threads.
|
|
An NMI handler may not perform any operation that may sleep, acquire
|
|
a mutex, or schedule a software interrupt.
|
|
An NMI handler may use
|
|
.Xr atomic_ops 3 .
|
|
An NMI handler may reference per-CPU storage
|
|
.Po
|
|
.Xr percpu 9
|
|
.Pc .
|
|
.Pp
|
|
An NMI handler may not write to the kernel message buffer.
|
|
.Sh FUNCTIONS
|
|
.Bl -tag -width compact
|
|
.It Fn nmi_establish "func" "arg"
|
|
Call this in thread context to establish a handler for non-maskable
|
|
interrupts.
|
|
Establish
|
|
.Fa func
|
|
as one of the handler functions to call when an NMI occurs.
|
|
Where
|
|
.Fa tf
|
|
is a
|
|
.Vt struct trapframe
|
|
representation of the processor context where the NMI was received,
|
|
and
|
|
.Fa arg
|
|
is the argument to
|
|
.Fn nmi_establish ,
|
|
the kernel will call
|
|
.Fo (*func)
|
|
.Fa tf
|
|
.Fa arg
|
|
.Fc
|
|
every time an NMI occurs until the handler is removed with
|
|
.Fn nmi_disestablish .
|
|
.Fa func
|
|
should return non-zero if it handled a condition that causes
|
|
NMI, or zero if it did not.
|
|
If, for a given NMI, all handlers return zero, the system will
|
|
panic or enter the kernel debugger,
|
|
.Xr ddb 4 .
|
|
.Fn nmi_establish
|
|
returns
|
|
.Dv NULL
|
|
on failure, and a handle for the NMI handler on success.
|
|
.It Fn nmi_disestablish "handle"
|
|
Call this in thread context to stop the kernel from calling an NMI
|
|
handler.
|
|
Indicate the handler to disestablish with the
|
|
.Fa handle
|
|
returned by
|
|
.Fn nmi_establish .
|
|
.El
|
|
.Sh CODE REFERENCES
|
|
The
|
|
.Nm
|
|
interface is implemented within the file
|
|
.Pa sys/arch/x86/x86/nmi.c .
|
|
.\" .Sh EXAMPLES
|
|
.Sh SEE ALSO
|
|
.Xr atomic_ops 3 ,
|
|
.Xr ddb 4
|
|
.Sh HISTORY
|
|
The
|
|
.Nm
|
|
interface first appeared in
|
|
.Nx 6.0 .
|
|
.Sh AUTHORS
|
|
.An YAMAMOTO Takashi Aq yamt@NetBSD.org
|
|
.\" .Sh CAVEATS
|
|
.\" .Sh BUGS
|
|
.\" .Sh SECURITY CONSIDERATIONS
|