diff options
Diffstat (limited to 'arch/x86/kernel/traps.c')
-rw-r--r-- | arch/x86/kernel/traps.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 9d2073e2ecc9..42819886be0c 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
@@ -925,9 +925,17 @@ dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code) | |||
925 | /* Set of traps needed for early debugging. */ | 925 | /* Set of traps needed for early debugging. */ |
926 | void __init early_trap_init(void) | 926 | void __init early_trap_init(void) |
927 | { | 927 | { |
928 | set_intr_gate_ist(X86_TRAP_DB, &debug, DEBUG_STACK); | 928 | /* |
929 | * Don't set ist to DEBUG_STACK as it doesn't work until TSS is | ||
930 | * ready in cpu_init() <-- trap_init(). Before trap_init(), CPU | ||
931 | * runs at ring 0 so it is impossible to hit an invalid stack. | ||
932 | * Using the original stack works well enough at this early | ||
933 | * stage. DEBUG_STACK will be equipped after cpu_init() in | ||
934 | * trap_init(). | ||
935 | */ | ||
936 | set_intr_gate_ist(X86_TRAP_DB, &debug, 0); | ||
929 | /* int3 can be called from all */ | 937 | /* int3 can be called from all */ |
930 | set_system_intr_gate_ist(X86_TRAP_BP, &int3, DEBUG_STACK); | 938 | set_system_intr_gate_ist(X86_TRAP_BP, &int3, 0); |
931 | #ifdef CONFIG_X86_32 | 939 | #ifdef CONFIG_X86_32 |
932 | set_intr_gate(X86_TRAP_PF, page_fault); | 940 | set_intr_gate(X86_TRAP_PF, page_fault); |
933 | #endif | 941 | #endif |
@@ -1005,6 +1013,15 @@ void __init trap_init(void) | |||
1005 | */ | 1013 | */ |
1006 | cpu_init(); | 1014 | cpu_init(); |
1007 | 1015 | ||
1016 | /* | ||
1017 | * X86_TRAP_DB and X86_TRAP_BP have been set | ||
1018 | * in early_trap_init(). However, DEBUG_STACK works only after | ||
1019 | * cpu_init() loads TSS. See comments in early_trap_init(). | ||
1020 | */ | ||
1021 | set_intr_gate_ist(X86_TRAP_DB, &debug, DEBUG_STACK); | ||
1022 | /* int3 can be called from all */ | ||
1023 | set_system_intr_gate_ist(X86_TRAP_BP, &int3, DEBUG_STACK); | ||
1024 | |||
1008 | x86_init.irqs.trap_init(); | 1025 | x86_init.irqs.trap_init(); |
1009 | 1026 | ||
1010 | #ifdef CONFIG_X86_64 | 1027 | #ifdef CONFIG_X86_64 |