Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753294AbbBZGS6 (ORCPT ); Thu, 26 Feb 2015 01:18:58 -0500 Received: from szxga02-in.huawei.com ([119.145.14.65]:53959 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751577AbbBZGS5 (ORCPT ); Thu, 26 Feb 2015 01:18:57 -0500 From: Wang Nan To: , CC: , , , , , , , , Subject: [PATCH] x86, traps: install gates using IST after cpu_init(). Date: Thu, 26 Feb 2015 14:15:15 +0800 Message-ID: <1424931315-44482-1-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.4 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.197.247] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2456 Lines: 71 X86_TRAP_NMI, X86_TRAP_DF and X86_TRAP_MC use their own stack. Those stacks are invalid until cpu_init() installs TSS. This patch moves setting of the 3 gates after cpu_init(). Signed-off-by: Wang Nan --- If I understand correctly, logically speaking the original code is incorrect. However, there is no real bug caused by it for serval years. I'm not sure whether this fix is practical or not. Fix them only for logical correctness. --- arch/x86/kernel/traps.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 4281988..cf7898e 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -962,7 +962,6 @@ void __init trap_init(void) #endif set_intr_gate(X86_TRAP_DE, divide_error); - set_intr_gate_ist(X86_TRAP_NMI, &nmi, NMI_STACK); /* int4 can be called from all */ set_system_intr_gate(X86_TRAP_OF, &overflow); set_intr_gate(X86_TRAP_BR, bounds); @@ -970,8 +969,6 @@ void __init trap_init(void) set_intr_gate(X86_TRAP_NM, device_not_available); #ifdef CONFIG_X86_32 set_task_gate(X86_TRAP_DF, GDT_ENTRY_DOUBLEFAULT_TSS); -#else - set_intr_gate_ist(X86_TRAP_DF, &double_fault, DOUBLEFAULT_STACK); #endif set_intr_gate(X86_TRAP_OLD_MF, coprocessor_segment_overrun); set_intr_gate(X86_TRAP_TS, invalid_TSS); @@ -981,9 +978,6 @@ void __init trap_init(void) set_intr_gate(X86_TRAP_SPURIOUS, spurious_interrupt_bug); set_intr_gate(X86_TRAP_MF, coprocessor_error); set_intr_gate(X86_TRAP_AC, alignment_check); -#ifdef CONFIG_X86_MCE - set_intr_gate_ist(X86_TRAP_MC, &machine_check, MCE_STACK); -#endif set_intr_gate(X86_TRAP_XF, simd_coprocessor_error); /* Reserve all the builtin and the syscall vector: */ @@ -1013,6 +1007,14 @@ void __init trap_init(void) */ cpu_init(); + set_intr_gate_ist(X86_TRAP_NMI, &nmi, NMI_STACK); +#ifndef CONFIG_X86_32 + set_intr_gate_ist(X86_TRAP_DF, &double_fault, DOUBLEFAULT_STACK); +#endif +#ifdef CONFIG_X86_MCE + set_intr_gate_ist(X86_TRAP_MC, &machine_check, MCE_STACK); +#endif + /* * X86_TRAP_DB and X86_TRAP_BP have been set * in early_trap_init(). However, DEBUG_STACK works only after -- 1.8.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/