powerpc: fix PPC_PTRACE_SETHWDEBUG on PPC_BOOK3S
Subsystems (2)
PATCH 1/1 powerpc: fix PPC_PTRACE_SETHWDEBUG on PPC_BOOK3S
Properly set the DABR_TRANSLATION/DABR_DATA_READ/DABR_DATA_READ bits in the dabr when setting the debug register via PPC_PTRACE_SETHWDEBUG. Also don't reject trigger type of PPC_BREAKPOINT_TRIGGER_READ.
Signed-off-by Andreas Schwab <[email protected]>
--- arch/powerpc/kernel/ptrace.c | 22 ++++++++++++++++------ 1 files changed, 16 insertions(+), 6 deletions(-)
arch/powerpc/kernel/ptrace.c +16 -6
@@ -1316,6 +1316,10 @@ static int set_dac_range(struct task_struct *child,static long ppc_set_hwdebug (struct task_struct *child,struct ppc_hw_breakpoint *bp_info) { +#ifndef CONFIG_PPC_ADV_DEBUG_REGS +unsigned long dabr; +#endif +if (bp_info->version !=1 )return -ENOTSUPP ;#ifdef CONFIG_PPC_ADV_DEBUG_REGS
@@ -1353,11 +1357,10 @@ static long ppc_set_hwdebug(struct task_struct *child,/* * We only support one data breakpoint */ -if (((bp_info->trigger_type &PPC_BREAKPOINT_TRIGGER_RW ) ==0 ) || - ((bp_info->trigger_type & ~PPC_BREAKPOINT_TRIGGER_RW ) !=0 ) || - (bp_info->trigger_type !=PPC_BREAKPOINT_TRIGGER_WRITE ) || - (bp_info->addr_mode !=PPC_BREAKPOINT_MODE_EXACT ) || - (bp_info->condition_mode !=PPC_BREAKPOINT_CONDITION_NONE )) +if ((bp_info->trigger_type &PPC_BREAKPOINT_TRIGGER_RW ) ==0 || + (bp_info->trigger_type & ~PPC_BREAKPOINT_TRIGGER_RW ) !=0 || + bp_info->addr_mode !=PPC_BREAKPOINT_MODE_EXACT || + bp_info->condition_mode !=PPC_BREAKPOINT_CONDITION_NONE )return -EINVAL ;if (child->thread.dabr)
@@ -1366,7 +1369,14 @@ static long ppc_set_hwdebug(struct task_struct *child,if ((unsigned long )bp_info->addr >=TASK_SIZE )return -EIO ; - child->thread.dabr = (unsigned long )bp_info->addr; + dabr = (unsigned long )bp_info->addr & ~7UL ; + dabr |=DABR_TRANSLATION ; +if (bp_info->trigger_type &PPC_BREAKPOINT_TRIGGER_READ ) + dabr |=DABR_DATA_READ ; +if (bp_info->trigger_type &PPC_BREAKPOINT_TRIGGER_WRITE ) + dabr |=DABR_DATA_WRITE ; + + child->thread.dabr = dabr;return 1 ;#endif /* !CONFIG_PPC_ADV_DEBUG_DVCS */
Signature · 7 lines
1.7.3.2 -- Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."