|
@@ -316,9 +316,15 @@ dotraplinkage void __kprobes do_int3(struct pt_regs *regs, long error_code)
|
|
return;
|
|
return;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Let others (NMI) know that the debug stack is in use
|
|
|
|
+ * as we may switch to the interrupt stack.
|
|
|
|
+ */
|
|
|
|
+ debug_stack_usage_inc();
|
|
preempt_conditional_sti(regs);
|
|
preempt_conditional_sti(regs);
|
|
do_trap(3, SIGTRAP, "int3", regs, error_code, NULL);
|
|
do_trap(3, SIGTRAP, "int3", regs, error_code, NULL);
|
|
preempt_conditional_cli(regs);
|
|
preempt_conditional_cli(regs);
|
|
|
|
+ debug_stack_usage_dec();
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_X86_64
|
|
#ifdef CONFIG_X86_64
|
|
@@ -411,6 +417,12 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
|
|
SIGTRAP) == NOTIFY_STOP)
|
|
SIGTRAP) == NOTIFY_STOP)
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Let others (NMI) know that the debug stack is in use
|
|
|
|
+ * as we may switch to the interrupt stack.
|
|
|
|
+ */
|
|
|
|
+ debug_stack_usage_inc();
|
|
|
|
+
|
|
/* It's safe to allow irq's after DR6 has been saved */
|
|
/* It's safe to allow irq's after DR6 has been saved */
|
|
preempt_conditional_sti(regs);
|
|
preempt_conditional_sti(regs);
|
|
|
|
|
|
@@ -418,6 +430,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
|
|
handle_vm86_trap((struct kernel_vm86_regs *) regs,
|
|
handle_vm86_trap((struct kernel_vm86_regs *) regs,
|
|
error_code, 1);
|
|
error_code, 1);
|
|
preempt_conditional_cli(regs);
|
|
preempt_conditional_cli(regs);
|
|
|
|
+ debug_stack_usage_dec();
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -437,6 +450,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
|
|
if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS) || user_icebp)
|
|
if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS) || user_icebp)
|
|
send_sigtrap(tsk, regs, error_code, si_code);
|
|
send_sigtrap(tsk, regs, error_code, si_code);
|
|
preempt_conditional_cli(regs);
|
|
preempt_conditional_cli(regs);
|
|
|
|
+ debug_stack_usage_dec();
|
|
|
|
|
|
return;
|
|
return;
|
|
}
|
|
}
|