|
@@ -41,6 +41,7 @@
|
|
|
#include <asm/switch_to.h>
|
|
|
#include <asm/tm.h>
|
|
|
#include <asm/asm-prototypes.h>
|
|
|
+#include <asm/debug.h>
|
|
|
|
|
|
#define CREATE_TRACE_POINTS
|
|
|
#include <trace/events/syscalls.h>
|
|
@@ -2378,6 +2379,7 @@ static int ptrace_set_debugreg(struct task_struct *task, unsigned long addr,
|
|
|
struct perf_event_attr attr;
|
|
|
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
|
|
#ifndef CONFIG_PPC_ADV_DEBUG_REGS
|
|
|
+ bool set_bp = true;
|
|
|
struct arch_hw_breakpoint hw_brk;
|
|
|
#endif
|
|
|
|
|
@@ -2411,9 +2413,10 @@ static int ptrace_set_debugreg(struct task_struct *task, unsigned long addr,
|
|
|
hw_brk.address = data & (~HW_BRK_TYPE_DABR);
|
|
|
hw_brk.type = (data & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
|
|
|
hw_brk.len = 8;
|
|
|
+ set_bp = (data) && (hw_brk.type & HW_BRK_TYPE_RDWR);
|
|
|
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
|
|
bp = thread->ptrace_bps[0];
|
|
|
- if ((!data) || !(hw_brk.type & HW_BRK_TYPE_RDWR)) {
|
|
|
+ if (!set_bp) {
|
|
|
if (bp) {
|
|
|
unregister_hw_breakpoint(bp);
|
|
|
thread->ptrace_bps[0] = NULL;
|
|
@@ -2450,6 +2453,9 @@ static int ptrace_set_debugreg(struct task_struct *task, unsigned long addr,
|
|
|
return PTR_ERR(bp);
|
|
|
}
|
|
|
|
|
|
+#else /* !CONFIG_HAVE_HW_BREAKPOINT */
|
|
|
+ if (set_bp && (!ppc_breakpoint_available()))
|
|
|
+ return -ENODEV;
|
|
|
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
|
|
task->thread.hw_brk = hw_brk;
|
|
|
#else /* CONFIG_PPC_ADV_DEBUG_REGS */
|
|
@@ -2904,6 +2910,9 @@ static long ppc_set_hwdebug(struct task_struct *child,
|
|
|
if (child->thread.hw_brk.address)
|
|
|
return -ENOSPC;
|
|
|
|
|
|
+ if (!ppc_breakpoint_available())
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
child->thread.hw_brk = brk;
|
|
|
|
|
|
return 1;
|
|
@@ -3052,7 +3061,10 @@ long arch_ptrace(struct task_struct *child, long request,
|
|
|
#endif
|
|
|
#else /* !CONFIG_PPC_ADV_DEBUG_REGS */
|
|
|
dbginfo.num_instruction_bps = 0;
|
|
|
- dbginfo.num_data_bps = 1;
|
|
|
+ if (ppc_breakpoint_available())
|
|
|
+ dbginfo.num_data_bps = 1;
|
|
|
+ else
|
|
|
+ dbginfo.num_data_bps = 0;
|
|
|
dbginfo.num_condition_regs = 0;
|
|
|
#ifdef CONFIG_PPC64
|
|
|
dbginfo.data_bp_alignment = 8;
|