diff options
Diffstat (limited to 'arch/x86/kernel/hw_breakpoint.c')
| -rw-r--r-- | arch/x86/kernel/hw_breakpoint.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoint.c index bb6006e3e29..dca2802c666 100644 --- a/arch/x86/kernel/hw_breakpoint.c +++ b/arch/x86/kernel/hw_breakpoint.c @@ -486,8 +486,6 @@ static int __kprobes hw_breakpoint_handler(struct die_args *args)  		rcu_read_lock();  		bp = per_cpu(bp_per_reg[i], cpu); -		if (bp) -			rc = NOTIFY_DONE;  		/*  		 * Reset the 'i'th TRAP bit in dr6 to denote completion of  		 * exception handling @@ -506,7 +504,13 @@ static int __kprobes hw_breakpoint_handler(struct die_args *args)  		rcu_read_unlock();  	} -	if (dr6 & (~DR_TRAP_BITS)) +	/* +	 * Further processing in do_debug() is needed for a) user-space +	 * breakpoints (to generate signals) and b) when the system has +	 * taken exception due to multiple causes +	 */ +	if ((current->thread.debugreg6 & DR_TRAP_BITS) || +	    (dr6 & (~DR_TRAP_BITS)))  		rc = NOTIFY_DONE;  	set_debugreg(dr7, 7);  |