|
@@ -375,6 +375,41 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Dump the debug register contents to the user.
|
|
|
+ * We can't dump our per cpu values because it
|
|
|
+ * may contain cpu wide breakpoint, something that
|
|
|
+ * doesn't belong to the current task.
|
|
|
+ *
|
|
|
+ * TODO: include non-ptrace user breakpoints (perf)
|
|
|
+ */
|
|
|
+void aout_dump_debugregs(struct user *dump)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ int dr7 = 0;
|
|
|
+ struct perf_event *bp;
|
|
|
+ struct arch_hw_breakpoint *info;
|
|
|
+ struct thread_struct *thread = ¤t->thread;
|
|
|
+
|
|
|
+ for (i = 0; i < HBP_NUM; i++) {
|
|
|
+ bp = thread->ptrace_bps[i];
|
|
|
+
|
|
|
+ if (bp && !bp->attr.disabled) {
|
|
|
+ dump->u_debugreg[i] = bp->attr.bp_addr;
|
|
|
+ info = counter_arch_bp(bp);
|
|
|
+ dr7 |= encode_dr7(i, info->len, info->type);
|
|
|
+ } else {
|
|
|
+ dump->u_debugreg[i] = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ dump->u_debugreg[4] = 0;
|
|
|
+ dump->u_debugreg[5] = 0;
|
|
|
+ dump->u_debugreg[6] = current->thread.debugreg6;
|
|
|
+
|
|
|
+ dump->u_debugreg[7] = dr7;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Release the user breakpoints used by ptrace
|
|
|
*/
|