Comparing to the old (2.6.32) logic, I think it might be this (untested).
I also note this is the sole use of get_si_code, seems like it should
just be rolled in here.


Thanks,
Roland


diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 3339917..16a88f5 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -530,7 +530,6 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, 
long error_code)
 {
        struct task_struct *tsk = current;
        unsigned long dr6;
-       int si_code;
 
        get_debugreg(dr6, 6);
 
@@ -569,14 +568,15 @@ dotraplinkage void __kprobes do_debug(struct pt_regs 
*regs, long error_code)
         * We already checked v86 mode above, so we can check for kernel mode
         * by just checking the CPL of CS.
         */
+       dr6 = tsk->thread.debugreg6;
        if ((dr6 & DR_STEP) && !user_mode(regs)) {
                tsk->thread.debugreg6 &= ~DR_STEP;
                set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
                regs->flags &= ~X86_EFLAGS_TF;
+       } else if (dr6 & (DR_STEP | DR_TRAP_BITS)) {
+               send_sigtrap(tsk, regs, error_code, get_si_code(dr6));
        }
-       si_code = get_si_code(tsk->thread.debugreg6);
-       if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS))
-               send_sigtrap(tsk, regs, error_code, si_code);
+
        preempt_conditional_cli(regs);
 
        return;

Reply via email to