i386: convert hardware exception 18 to an interrupt gate
authorAlexander van Heukelum <heukelum@fastmail.fm>
Tue, 9 Sep 2008 19:56:11 +0000 (21:56 +0200)
committerIngo Molnar <mingo@elte.hu>
Mon, 13 Oct 2008 08:20:38 +0000 (10:20 +0200)
Handle machine check exception with interrupt initially off.

Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/entry_32.S
arch/x86/kernel/traps_32.c

index 5a885855fc886c344de942a746d0e4837e2f69f0..c5fe01bca6c0e9b69a6255487143e0d6f4f6ec4f 100644 (file)
@@ -1019,7 +1019,7 @@ ENTRY(machine_check)
        RING0_INT_FRAME
        pushl $0
        CFI_ADJUST_CFA_OFFSET 4
-       pushl machine_check_vector
+       pushl $do_machine_check
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
index 86c808b4dafb1497a7097ca9137b03d7f50de8c8..54b89f497bac77b46220cdb4a21a12557b50ec08 100644 (file)
@@ -62,6 +62,7 @@
 #include <asm/traps.h>
 
 #include "mach_traps.h"
+#include "cpu/mcheck/mce.h"
 
 DECLARE_BITMAP(used_vectors, NR_VECTORS);
 EXPORT_SYMBOL_GPL(used_vectors);
@@ -1252,6 +1253,14 @@ void __kprobes do_device_not_available(struct pt_regs *regs, long error)
        }
 }
 
+#ifdef CONFIG_X86_MCE
+void __kprobes do_machine_check(struct pt_regs *regs, long error)
+{
+       conditional_sti(regs);
+       machine_check_vector(regs, error);
+}
+#endif
+
 void __init trap_init(void)
 {
        int i;
@@ -1283,7 +1292,7 @@ void __init trap_init(void)
        set_intr_gate(16, &coprocessor_error);
        set_intr_gate(17, &alignment_check);
 #ifdef CONFIG_X86_MCE
-       set_trap_gate(18, &machine_check);
+       set_intr_gate(18, &machine_check);
 #endif
        set_trap_gate(19, &simd_coprocessor_error);