|
@@ -1026,6 +1026,8 @@ __setup("clearcpuid=", setup_disablecpuid);
|
|
|
|
|
|
#ifdef CONFIG_X86_64
|
|
|
struct desc_ptr idt_descr = { NR_VECTORS * 16 - 1, (unsigned long) idt_table };
|
|
|
+struct desc_ptr nmi_idt_descr = { NR_VECTORS * 16 - 1,
|
|
|
+ (unsigned long) nmi_idt_table };
|
|
|
|
|
|
DEFINE_PER_CPU_FIRST(union irq_stack_union,
|
|
|
irq_stack_union) __aligned(PAGE_SIZE);
|
|
@@ -1090,6 +1092,24 @@ unsigned long kernel_eflags;
|
|
|
*/
|
|
|
DEFINE_PER_CPU(struct orig_ist, orig_ist);
|
|
|
|
|
|
+static DEFINE_PER_CPU(unsigned long, debug_stack_addr);
|
|
|
+
|
|
|
+int is_debug_stack(unsigned long addr)
|
|
|
+{
|
|
|
+ return addr <= __get_cpu_var(debug_stack_addr) &&
|
|
|
+ addr > (__get_cpu_var(debug_stack_addr) - DEBUG_STKSZ);
|
|
|
+}
|
|
|
+
|
|
|
+void debug_stack_set_zero(void)
|
|
|
+{
|
|
|
+ load_idt((const struct desc_ptr *)&nmi_idt_descr);
|
|
|
+}
|
|
|
+
|
|
|
+void debug_stack_reset(void)
|
|
|
+{
|
|
|
+ load_idt((const struct desc_ptr *)&idt_descr);
|
|
|
+}
|
|
|
+
|
|
|
#else /* CONFIG_X86_64 */
|
|
|
|
|
|
DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task;
|
|
@@ -1208,6 +1228,8 @@ void __cpuinit cpu_init(void)
|
|
|
estacks += exception_stack_sizes[v];
|
|
|
oist->ist[v] = t->x86_tss.ist[v] =
|
|
|
(unsigned long)estacks;
|
|
|
+ if (v == DEBUG_STACK-1)
|
|
|
+ per_cpu(debug_stack_addr, cpu) = (unsigned long)estacks;
|
|
|
}
|
|
|
}
|
|
|
|