aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/nmi.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-08-14 10:58:32 +0100
committerKeir Fraser <keir.fraser@citrix.com>2009-08-14 10:58:32 +0100
commita569ec61475b1df9f78ee369ad99d1f04a481eeb (patch)
tree89b1e955565817ea97ecbdca749d53c7f89b6eb0 /xen/arch/x86/nmi.c
parent3ad8ef602620bdc428a6de55014605aebf78794e (diff)
downloadxen-a569ec61475b1df9f78ee369ad99d1f04a481eeb.tar.gz
xen-a569ec61475b1df9f78ee369ad99d1f04a481eeb.tar.bz2
xen-a569ec61475b1df9f78ee369ad99d1f04a481eeb.zip
VMX: issue an NMI rather than just calling the NMI handler
when the VMEXIT code indicates that an NMI has been raised. Otherwise we might hit a real NMI while in the handler. Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
Diffstat (limited to 'xen/arch/x86/nmi.c')
-rw-r--r--xen/arch/x86/nmi.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/xen/arch/x86/nmi.c b/xen/arch/x86/nmi.c
index f1d8ec3093..7400442433 100644
--- a/xen/arch/x86/nmi.c
+++ b/xen/arch/x86/nmi.c
@@ -441,18 +441,21 @@ void nmi_watchdog_tick(struct cpu_user_regs * regs)
* 8-3 and 8-4 in IA32 Reference Manual Volume 3. We send the IPI to
* our own APIC ID explicitly which is valid.
*/
-static void do_nmi_trigger(unsigned char key)
+void self_nmi(void)
{
u32 id = get_apic_id();
-
- printk("Triggering NMI on APIC ID %x\n", id);
-
local_irq_disable();
apic_wait_icr_idle();
apic_icr_write(APIC_DM_NMI | APIC_DEST_PHYSICAL, id);
local_irq_enable();
}
+static void do_nmi_trigger(unsigned char key)
+{
+ printk("Triggering NMI on APIC ID %x\n", get_apic_id());
+ self_nmi();
+}
+
static struct keyhandler nmi_trigger_keyhandler = {
.u.fn = do_nmi_trigger,
.desc = "trigger an NMI"