]> git.baikalelectronics.ru Git - kernel.git/commitdiff
x86/entry: Convert Machine Check to IDTENTRY_IST
authorThomas Gleixner <tglx@linutronix.de>
Tue, 25 Feb 2020 22:33:23 +0000 (23:33 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 11 Jun 2020 13:14:57 +0000 (15:14 +0200)
Convert #MC to IDTENTRY_MCE:
  - Implement the C entry points with DEFINE_IDTENTRY_MCE
  - Emit the ASM stub with DECLARE_IDTENTRY_MCE
  - Remove the ASM idtentry in 64bit
  - Remove the open coded ASM entry code in 32bit
  - Fixup the XEN/PV code
  - Remove the old prototypes
  - Remove the error code from *machine_check_vector() as
    it is always 0 and not used by any of the functions
    it can point to. Fixup all the functions as well.

No functional change.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Acked-by: Andy Lutomirski <luto@kernel.org>
Link: https://lkml.kernel.org/r/20200505135314.334980426@linutronix.de
15 files changed:
arch/x86/entry/entry_32.S
arch/x86/entry/entry_64.S
arch/x86/include/asm/idtentry.h
arch/x86/include/asm/mce.h
arch/x86/include/asm/traps.h
arch/x86/kernel/cpu/mce/core.c
arch/x86/kernel/cpu/mce/inject.c
arch/x86/kernel/cpu/mce/internal.h
arch/x86/kernel/cpu/mce/p5.c
arch/x86/kernel/cpu/mce/winchip.c
arch/x86/kernel/idt.c
arch/x86/kvm/svm/svm.c
arch/x86/kvm/vmx/vmx.c
arch/x86/xen/enlighten_pv.c
arch/x86/xen/xen-asm_64.S

index b9b0ddb53a08287c49ff5b5626b7a8eb35b84128..4dd3d706d9fcbbfd1f5ddb2ef89e6b68db81e617 100644 (file)
@@ -1297,15 +1297,6 @@ SYM_CODE_START(native_iret)
 SYM_CODE_END(native_iret)
 #endif
 
-#ifdef CONFIG_X86_MCE
-SYM_CODE_START(machine_check)
-       ASM_CLAC
-       pushl   $0
-       pushl   $do_mce
-       jmp     common_exception
-SYM_CODE_END(machine_check)
-#endif
-
 #ifdef CONFIG_XEN_PV
 SYM_FUNC_START(xen_hypervisor_callback)
        /*
index 69ddd052aef2117ad344060040b3cadec94357ff..5007b975ca7cc5581d1afae0396ab063ecaacd8d 100644 (file)
@@ -1074,9 +1074,6 @@ apicinterrupt IRQ_WORK_VECTOR                     irq_work_interrupt              smp_irq_work_interrupt
 
 idtentry       X86_TRAP_PF             page_fault              do_page_fault                   has_error_code=1
 
-#ifdef CONFIG_X86_MCE
-idtentry_mce_db        X86_TRAP_MCE            machine_check           do_mce
-#endif
 idtentry_mce_db        X86_TRAP_DB             debug                   do_debug
 idtentry_df    X86_TRAP_DF             double_fault            do_double_fault
 
index 3edd6d011ecd5959ce257066908619fdafb1dff0..36fe964c0d53eec22af2090471aaab9d8490793f 100644 (file)
@@ -238,4 +238,8 @@ DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_AC,     exc_alignment_check);
 /* Raw exception entries which need extra work */
 DECLARE_IDTENTRY_RAW(X86_TRAP_BP,      exc_int3);
 
+#ifdef CONFIG_X86_MCE
+DECLARE_IDTENTRY_MCE(X86_TRAP_MC,      exc_machine_check);
+#endif
+
 #endif
index f9cea081c05b016d185d4f5542b22a8aca323814..a00130112b0245c503a162578de6416477f4491c 100644 (file)
@@ -238,7 +238,7 @@ extern void mce_disable_bank(int bank);
 /*
  * Exception handler
  */
-void do_machine_check(struct pt_regs *, long);
+void do_machine_check(struct pt_regs *pt_regs);
 
 /*
  * Threshold handler
index 698285a2b6608b32d5585bbe997edea3f5228e40..6096db912625fcbed9afb410074058ae70c79dd7 100644 (file)
@@ -18,25 +18,18 @@ asmlinkage void double_fault(void);
 #endif
 asmlinkage void page_fault(void);
 asmlinkage void async_page_fault(void);
-#ifdef CONFIG_X86_MCE
-asmlinkage void machine_check(void);
-#endif /* CONFIG_X86_MCE */
 
 #if defined(CONFIG_X86_64) && defined(CONFIG_XEN_PV)
 asmlinkage void xen_xennmi(void);
 asmlinkage void xen_xendebug(void);
 asmlinkage void xen_double_fault(void);
 asmlinkage void xen_page_fault(void);
-#ifdef CONFIG_X86_MCE
-asmlinkage void xen_machine_check(void);
-#endif /* CONFIG_X86_MCE */
 #endif
 
 dotraplinkage void do_debug(struct pt_regs *regs, long error_code);
 dotraplinkage void do_nmi(struct pt_regs *regs, long error_code);
 dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code, unsigned long cr2);
 dotraplinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address);
-dotraplinkage void do_mce(struct pt_regs *regs, long error_code);
 
 #ifdef CONFIG_X86_64
 asmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs);
index f5993ed6e16b86de358f897a70a01bff7b3e41f9..842dd03c3918cc55dc8f0f24faf6ffa28bcf7cc5 100644 (file)
@@ -1232,7 +1232,7 @@ static void kill_me_maybe(struct callback_head *cb)
  * backing the user stack, tracing that reads the user stack will cause
  * potentially infinite recursion.
  */
-void noinstr do_machine_check(struct pt_regs *regs, long error_code)
+void noinstr do_machine_check(struct pt_regs *regs)
 {
        DECLARE_BITMAP(valid_banks, MAX_NR_BANKS);
        DECLARE_BITMAP(toclear, MAX_NR_BANKS);
@@ -1366,7 +1366,7 @@ void noinstr do_machine_check(struct pt_regs *regs, long error_code)
                        current->mce_kill_me.func = kill_me_now;
                task_work_add(current, &current->mce_kill_me, true);
        } else {
-               if (!fixup_exception(regs, X86_TRAP_MC, error_code, 0))
+               if (!fixup_exception(regs, X86_TRAP_MC, 0, 0))
                        mce_panic("Failed kernel mode recovery", &m, msg);
        }
 }
@@ -1895,27 +1895,32 @@ bool filter_mce(struct mce *m)
 }
 
 /* Handle unconfigured int18 (should never happen) */
-static void unexpected_machine_check(struct pt_regs *regs, long error_code)
+static void unexpected_machine_check(struct pt_regs *regs)
 {
        pr_err("CPU#%d: Unexpected int18 (Machine Check)\n",
               smp_processor_id());
 }
 
 /* Call the installed machine check handler for this CPU setup. */
-void (*machine_check_vector)(struct pt_regs *, long error_code) =
-                                               unexpected_machine_check;
+void (*machine_check_vector)(struct pt_regs *) = unexpected_machine_check;
 
-dotraplinkage noinstr void do_mce(struct pt_regs *regs, long error_code)
+DEFINE_IDTENTRY_MCE(exc_machine_check)
 {
        if (machine_check_vector == do_machine_check &&
            mce_check_crashing_cpu())
                return;
 
-       nmi_enter();
+       if (user_mode(regs))
+               idtentry_enter(regs);
+       else
+               nmi_enter();
 
-       machine_check_vector(regs, error_code);
+       machine_check_vector(regs);
 
-       nmi_exit();
+       if (user_mode(regs))
+               idtentry_exit(regs);
+       else
+               nmi_exit();
 }
 
 /*
index 3413b41b8d55f202a646bb1439ecea262462159c..0593b192eb8fae76c49a5459180b3fb63968565b 100644 (file)
@@ -146,9 +146,9 @@ static void raise_exception(struct mce *m, struct pt_regs *pregs)
                regs.cs = m->cs;
                pregs = &regs;
        }
-       /* in mcheck exeception handler, irq will be disabled */
+       /* do_machine_check() expects interrupts disabled -- at least */
        local_irq_save(flags);
-       do_machine_check(pregs, 0);
+       do_machine_check(pregs);
        local_irq_restore(flags);
        m->finished = 0;
 }
index 3b008172ad73d594a6c57b73a99dc363d74e1942..b74ca4a28c6670c4df40948ce57204993142f1ea 100644 (file)
@@ -9,7 +9,7 @@
 #include <asm/mce.h>
 
 /* Pointer to the installed machine check handler for this CPU setup. */
-extern void (*machine_check_vector)(struct pt_regs *, long error_code);
+extern void (*machine_check_vector)(struct pt_regs *);
 
 enum severity_level {
        MCE_NO_SEVERITY,
index dc29f0f7b3ed8b19944ea0c54e3cc0c5fd479cb0..eaebc4ce7398db68ec4824a58877451a7d896307 100644 (file)
@@ -21,7 +21,7 @@
 int mce_p5_enabled __read_mostly;
 
 /* Machine check handler for Pentium class Intel CPUs: */
-static void pentium_machine_check(struct pt_regs *regs, long error_code)
+static void pentium_machine_check(struct pt_regs *regs)
 {
        u32 loaddr, hi, lotype;
 
index 3f8f84ba0f51c968056556bf37c411c2ee646eb4..90e3d60c645e95e39727403adabc6d3785b0beef 100644 (file)
@@ -17,7 +17,7 @@
 #include "internal.h"
 
 /* Machine check handler for WinChip C6: */
-static void winchip_machine_check(struct pt_regs *regs, long error_code)
+static void winchip_machine_check(struct pt_regs *regs)
 {
        pr_emerg("CPU0: Machine Check Exception.\n");
        add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);
index 9ca8af65a2123f4b4fe4ad93afa74dc0e6cb1128..6b93840784d52763c866f4708c28f798f1841009 100644 (file)
@@ -96,7 +96,7 @@ static const __initconst struct idt_data def_idts[] = {
        INTG(X86_TRAP_DB,               debug),
 
 #ifdef CONFIG_X86_MCE
-       INTG(X86_TRAP_MC,               machine_check),
+       INTG(X86_TRAP_MC,               asm_exc_machine_check),
 #endif
 
        SYSG(X86_TRAP_OF,               asm_exc_overflow),
@@ -185,11 +185,11 @@ gate_desc debug_idt_table[IDT_ENTRIES] __page_aligned_bss;
  * cpu_init() when the TSS has been initialized.
  */
 static const __initconst struct idt_data ist_idts[] = {
-       ISTG(X86_TRAP_DB,       debug,          IST_INDEX_DB),
-       ISTG(X86_TRAP_NMI,      nmi,            IST_INDEX_NMI),
-       ISTG(X86_TRAP_DF,       double_fault,   IST_INDEX_DF),
+       ISTG(X86_TRAP_DB,       debug,                  IST_INDEX_DB),
+       ISTG(X86_TRAP_NMI,      nmi,                    IST_INDEX_NMI),
+       ISTG(X86_TRAP_DF,       double_fault,           IST_INDEX_DF),
 #ifdef CONFIG_X86_MCE
-       ISTG(X86_TRAP_MC,       machine_check,  IST_INDEX_MCE),
+       ISTG(X86_TRAP_MC,       asm_exc_machine_check,  IST_INDEX_MCE),
 #endif
 };
 
index 9e333b91ff78282bfdb890ee1915b13dcfabc67a..7502cd65528fb3ee9242f32fea818cb3cba71a46 100644 (file)
@@ -1837,7 +1837,7 @@ static void kvm_machine_check(void)
                .flags = X86_EFLAGS_IF,
        };
 
-       do_machine_check(&regs, 0);
+       do_machine_check(&regs);
 #endif
 }
 
index 170cc76a581f4a0ef186bff2e42a078ab7ca2b50..2b5ba6063a2d6287f5b7b03525c53276274f7c62 100644 (file)
@@ -4683,7 +4683,7 @@ static void kvm_machine_check(void)
                .flags = X86_EFLAGS_IF,
        };
 
-       do_machine_check(&regs, 0);
+       do_machine_check(&regs);
 #endif
 }
 
index 5bcd86c4dff045f1a2a3fcde0f84fd3459012d8c..267583f9b20749b5d78f4a7618bdf4998642713c 100644 (file)
@@ -613,7 +613,7 @@ static struct trap_array_entry trap_array[] = {
        { debug,                       xen_xendebug,                    true },
        { double_fault,                xen_double_fault,                true },
 #ifdef CONFIG_X86_MCE
-       { machine_check,               xen_machine_check,               true },
+       TRAP_ENTRY(exc_machine_check,                   true  ),
 #endif
        { nmi,                         xen_xennmi,                      true },
        TRAP_ENTRY(exc_int3,                            false ),
index 44f55569a37f560f6f8c35222e9aaa688c39e057..617ef3f981604e485dc61129a196396a4d30d23a 100644 (file)
@@ -48,7 +48,7 @@ xen_pv_trap asm_exc_spurious_interrupt_bug
 xen_pv_trap asm_exc_coprocessor_error
 xen_pv_trap asm_exc_alignment_check
 #ifdef CONFIG_X86_MCE
-xen_pv_trap machine_check
+xen_pv_trap asm_exc_machine_check
 #endif /* CONFIG_X86_MCE */
 xen_pv_trap asm_exc_simd_coprocessor_error
 #ifdef CONFIG_IA32_EMULATION