mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 15:11:31 +00:00
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 <schwab@linux-m68k.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
364a124652
commit
4dfbf290ae
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user