Skip to content

Commit

Permalink
ARM: 6657/1: hw_breakpoint: fix ptrace breakpoint advertising on unsu…
Browse files Browse the repository at this point in the history
…pported arch

The ptrace debug information register was advertising breakpoint and
watchpoint resources for unsupported debug architectures. This meant
that setting breakpoints on these architectures would appear to succeed,
although they would never fire in reality.

This patch fixes the breakpoint slot probing so that it returns 0 when
running on an unsupported debug architecture.

Reported-by: Ulrich Weigand <ulrich.weigand@de.ibm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Will Deacon authored and Russell King committed Feb 11, 2011
1 parent ed19b73 commit 66e1cfe
Showing 1 changed file with 13 additions and 5 deletions.
18 changes: 13 additions & 5 deletions arch/arm/kernel/hw_breakpoint.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,10 @@ static u8 get_debug_arch(void)
u32 didr;

/* Do we implement the extended CPUID interface? */
if (((read_cpuid_id() >> 16) & 0xf) != 0xf) {
pr_warning("CPUID feature registers not supported. "
"Assuming v6 debug is present.\n");
if (WARN_ONCE((((read_cpuid_id() >> 16) & 0xf) != 0xf),
"CPUID feature registers not supported. "
"Assuming v6 debug is present.\n"))
return ARM_DEBUG_ARCH_V6;
}

ARM_DBG_READ(c0, 0, didr);
return (didr >> 16) & 0xf;
Expand All @@ -152,6 +151,12 @@ u8 arch_get_debug_arch(void)
return debug_arch;
}

static int debug_arch_supported(void)
{
u8 arch = get_debug_arch();
return arch >= ARM_DEBUG_ARCH_V6 && arch <= ARM_DEBUG_ARCH_V7_ECP14;
}

/* Determine number of BRP register available. */
static int get_num_brp_resources(void)
{
Expand Down Expand Up @@ -268,6 +273,9 @@ static int enable_monitor_mode(void)

int hw_breakpoint_slots(int type)
{
if (!debug_arch_supported())
return 0;

/*
* We can be called early, so don't rely on
* our static variables being initialised.
Expand Down Expand Up @@ -882,7 +890,7 @@ static int __init arch_hw_breakpoint_init(void)

debug_arch = get_debug_arch();

if (debug_arch > ARM_DEBUG_ARCH_V7_ECP14) {
if (!debug_arch_supported()) {
pr_info("debug architecture 0x%x unsupported.\n", debug_arch);
return 0;
}
Expand Down

0 comments on commit 66e1cfe

Please sign in to comment.