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 bb6006e3e295..dca2802c666f 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) | |||
486 | rcu_read_lock(); | 486 | rcu_read_lock(); |
487 | 487 | ||
488 | bp = per_cpu(bp_per_reg[i], cpu); | 488 | bp = per_cpu(bp_per_reg[i], cpu); |
489 | if (bp) | ||
490 | rc = NOTIFY_DONE; | ||
491 | /* | 489 | /* |
492 | * Reset the 'i'th TRAP bit in dr6 to denote completion of | 490 | * Reset the 'i'th TRAP bit in dr6 to denote completion of |
493 | * exception handling | 491 | * exception handling |
@@ -506,7 +504,13 @@ static int __kprobes hw_breakpoint_handler(struct die_args *args) | |||
506 | 504 | ||
507 | rcu_read_unlock(); | 505 | rcu_read_unlock(); |
508 | } | 506 | } |
509 | if (dr6 & (~DR_TRAP_BITS)) | 507 | /* |
508 | * Further processing in do_debug() is needed for a) user-space | ||
509 | * breakpoints (to generate signals) and b) when the system has | ||
510 | * taken exception due to multiple causes | ||
511 | */ | ||
512 | if ((current->thread.debugreg6 & DR_TRAP_BITS) || | ||
513 | (dr6 & (~DR_TRAP_BITS))) | ||
510 | rc = NOTIFY_DONE; | 514 | rc = NOTIFY_DONE; |
511 | 515 | ||
512 | set_debugreg(dr7, 7); | 516 | set_debugreg(dr7, 7); |