"kexec -l" sends the rest cpu to halt state with local apic disabled. But they can still respond to MCE. Meanwhile the execution of MCE handler relies on the 1st kernel's page table and text, which may be cracked during the 2nd kernel bootup. Hence Before sending SIPI to AP in 2nd kernel, an MCE event makes AP take the risk of running in weird context. Heavily suppress it by disallowing MCE handler on rebooting AP. Note: after this patch, "kexec -l" still has a little window vulnerable to weird context, despite AP uses tlb cache and icache. Consider the scenario: The 1st kernel code native_halt() in stop_this_cpu() is modified during the 2nd kernel bootup. Then AP is waken up by MCE after the modification, and will continue in a weired context. This needs extra effort. Signed-off-by: Pingfan Liu <kernelfans@xxxxxxxxx> To: Thomas Gleixner <tglx@xxxxxxxxxxxxx> To: Andy Lutomirski <luto@xxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxxxxx> Cc: Borislav Petkov <bp@xxxxxxxxx> Cc: "H. Peter Anvin" <hpa@xxxxxxxxx> Cc: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> To: x86@xxxxxxxxxx Cc: Masami Hiramatsu <mhiramat@xxxxxxxxxx> Cc: Qian Cai <cai@xxxxxx> Cc: Vlastimil Babka <vbabka@xxxxxxx> Cc: Daniel Drake <drake@xxxxxxxxxxxx> Cc: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> Cc: Michal Hocko <mhocko@xxxxxxxx> Cc: Eric Biederman <ebiederm@xxxxxxxxxxxx> Cc: linux-kernel@xxxxxxxxxxxxxxx Cc: Dave Young <dyoung@xxxxxxxxxx> Cc: Baoquan He <bhe@xxxxxxxxxx> Cc: kexec@xxxxxxxxxxxxxxxxxxx --- arch/x86/kernel/smp.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index 96421f9..55b0f11 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c @@ -157,11 +157,15 @@ void native_send_call_func_ipi(const struct cpumask *mask) static int smp_stop_nmi_callback(unsigned int val, struct pt_regs *regs) { + struct desc_ptr null_ptr = { 0 }; + /* We are registered on stopping cpu too, avoid spurious NMI */ if (raw_smp_processor_id() == atomic_read(&stopping_cpu)) return NMI_HANDLED; cpu_emergency_vmxoff(); + /* prevent from dispatching MCE handler */ + load_idt(&null_ptr); stop_this_cpu(NULL); return NMI_HANDLED; @@ -173,8 +177,12 @@ static int smp_stop_nmi_callback(unsigned int val, struct pt_regs *regs) asmlinkage __visible void smp_reboot_interrupt(void) { + struct desc_ptr null_ptr = { 0 }; + ipi_entering_ack_irq(); cpu_emergency_vmxoff(); + /* prevent from dispatching MCE handler */ + load_idt(&null_ptr); stop_this_cpu(NULL); irq_exit(); } -- 2.7.5 _______________________________________________ kexec mailing list kexec@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec