[PATCH] Enable hw watchpoint with longer ranges using DAWR on Power http://sourceware.org/ml/gdb-patches/2013-07/msg00085.html http://sourceware.org/ml/gdb-cvs/2013-07/msg00097.html ### src/gdb/ChangeLog 2013/07/22 11:42:30 1.15812 ### src/gdb/ChangeLog 2013/07/22 13:17:51 1.15813 ## -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 --- gdb-7.6/gdb/ppc-linux-nat.c.orig 2013-07-24 17:39:30.434549279 +0200 +++ gdb-7.6/gdb/ppc-linux-nat.c 2013-07-24 17:41:31.337706502 +0200 @@ -178,7 +178,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). */ @@ -1503,6 +1507,7 @@ ppc_linux_region_ok_for_hw_watchpoint (C to determine the hardcoded watchable region for watchpoints. */ if (have_ptrace_booke_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 @@ -1511,11 +1516,17 @@ ppc_linux_region_ok_for_hw_watchpoint (C && booke_debug_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 (booke_debug_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 = booke_debug_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 (booke_debug_info.data_bp_alignment - && (addr + len > (addr & ~(booke_debug_info.data_bp_alignment - 1)) - + booke_debug_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