From e23b9d6ed259f2acb3a775e49ba7cdd7a228278f Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Mon, 22 Jul 2013 13:17:51 +0000 Subject: [PATCH] 2013-07-22 Edjunior Barbosa Machado * ppc-linux-nat.c (PPC_DEBUG_FEATURE_DATA_BP_DAWR): New define. (ppc_linux_region_ok_for_hw_watchpoint): Add checking to use the new DAWR interface for longer ranges hardware watchpoint (up to 512 bytes). --- gdb/ChangeLog | 6 ++++++ gdb/ppc-linux-nat.c | 19 +++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 82b8b83..3ad3fae 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2013-07-22 Edjunior Barbosa Machado + + * ppc-linux-nat.c (PPC_DEBUG_FEATURE_DATA_BP_DAWR): New define. + (ppc_linux_region_ok_for_hw_watchpoint): Add checking to use the new + DAWR interface for longer ranges hardware watchpoint (up to 512 bytes). + 2013-07-22 Phil Muldoon * top.c (print_gdb_version): Add help, apropos description and diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c index 4b3c78c..1f3f080 100644 --- a/gdb/ppc-linux-nat.c +++ b/gdb/ppc-linux-nat.c @@ -177,7 +177,11 @@ struct ppc_hw_breakpoint (1<<((n)+PPC_BREAKPOINT_CONDITION_BE_SHIFT)) #endif /* PPC_PTRACE_GETHWDBGINFO */ - +/* Feature defined on Linux kernel v3.9: DAWR interface, that enables wider + watchpoint (up to 512 bytes). */ +#ifndef PPC_DEBUG_FEATURE_DATA_BP_DAWR +#define PPC_DEBUG_FEATURE_DATA_BP_DAWR 0x10 +#endif /* PPC_DEBUG_FEATURE_DATA_BP_DAWR */ /* Similarly for the general-purpose (gp0 -- gp31) and floating-point registers (fp0 -- fp31). */ @@ -1504,6 +1508,7 @@ ppc_linux_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len) watchpoints. */ if (have_ptrace_hwdebug_interface ()) { + int region_size; /* Embedded DAC-based processors, like the PowerPC 440 have ranged watchpoints and can watch any access within an arbitrary memory region. This is useful to watch arrays and structs, for instance. It @@ -1512,11 +1517,17 @@ ppc_linux_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len) && hwdebug_info.features & PPC_DEBUG_FEATURE_DATA_BP_RANGE && ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE) return 2; + /* Check if the processor provides DAWR interface. */ + if (hwdebug_info.features & PPC_DEBUG_FEATURE_DATA_BP_DAWR) + /* DAWR interface allows to watch up to 512 byte wide ranges which + can't cross a 512 byte boundary. */ + region_size = 512; + else + region_size = hwdebug_info.data_bp_alignment; /* Server processors provide one hardware watchpoint and addr+len should fall in the watchable region provided by the ptrace interface. */ - if (hwdebug_info.data_bp_alignment - && (addr + len > (addr & ~(hwdebug_info.data_bp_alignment - 1)) - + hwdebug_info.data_bp_alignment)) + if (region_size + && (addr + len > (addr & ~(region_size - 1)) + region_size)) return 0; } /* addr+len must fall in the 8 byte watchable region for DABR-based -- 2.7.4