diff options
| -rw-r--r-- | arch/x86/kernel/cpu/common.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 82f29e70d058..6b9333b429ba 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -1101,14 +1101,20 @@ int is_debug_stack(unsigned long addr) | |||
| 1101 | addr > (__get_cpu_var(debug_stack_addr) - DEBUG_STKSZ)); | 1101 | addr > (__get_cpu_var(debug_stack_addr) - DEBUG_STKSZ)); |
| 1102 | } | 1102 | } |
| 1103 | 1103 | ||
| 1104 | static DEFINE_PER_CPU(u32, debug_stack_use_ctr); | ||
| 1105 | |||
| 1104 | void debug_stack_set_zero(void) | 1106 | void debug_stack_set_zero(void) |
| 1105 | { | 1107 | { |
| 1108 | this_cpu_inc(debug_stack_use_ctr); | ||
| 1106 | load_idt((const struct desc_ptr *)&nmi_idt_descr); | 1109 | load_idt((const struct desc_ptr *)&nmi_idt_descr); |
| 1107 | } | 1110 | } |
| 1108 | 1111 | ||
| 1109 | void debug_stack_reset(void) | 1112 | void debug_stack_reset(void) |
| 1110 | { | 1113 | { |
| 1111 | load_idt((const struct desc_ptr *)&idt_descr); | 1114 | if (WARN_ON(!this_cpu_read(debug_stack_use_ctr))) |
| 1115 | return; | ||
| 1116 | if (this_cpu_dec_return(debug_stack_use_ctr) == 0) | ||
| 1117 | load_idt((const struct desc_ptr *)&idt_descr); | ||
| 1112 | } | 1118 | } |
| 1113 | 1119 | ||
| 1114 | #else /* CONFIG_X86_64 */ | 1120 | #else /* CONFIG_X86_64 */ |
