|
@@ -502,8 +502,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
|
|
@@ -522,7 +520,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);
|