diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c index 1d5fbf1d1c67..0fec4f3890ad 100644 --- a/arch/arm/kernel/hw_breakpoint.c +++ b/arch/arm/kernel/hw_breakpoint.c @@ -725,6 +725,20 @@ static void watchpoint_handler(unsigned long addr, unsigned int fsr, /* Check if the watchpoint value matches. */ val = read_wb_reg(ARM_BASE_WVR + i); + /* + * It seems Cortex-A12/A17 do not report report + * watchpoint hit address that matches the watchpoint + * set as ARM64. + * Add this workaround for pass Android 8+ CTS + * bionic ptrace watchpoint_imprecise. + */ + if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A12) { + unsigned long dist; + + dist = val > addr ? val - addr : addr - val; + if (dist > 8) + goto unlock; + } else if (val != (addr & ~alignment_mask)) goto unlock;