From 25513619dbf1a7c4daaa32e841d8f560d0d18bf5 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 6 May 2009 17:18:57 +0000 Subject: [PATCH] * procfs.c (procfs_insert_watchpoint, procfs_remove_watchpoint) (procfs_region_ok_for_hw_watchpoint, procfs_use_watchpoints): New functions. (procfs_stopped_by_watchpoint): Made static, ptid argument removed. (_initialize_procfs): Register new watchpoint related target functions. * config/i386/nm-i386sol2.h (TARGET_CAN_USE_HARDWARE_WATCHPOINT) (TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT, STOPPED_BY_WATCHPOINT) (HAVE_CONTINUABLE_WATCHPOINT): Delete. (target_insert_watchpoint, target_remove_watchpoint): Delete. (procfs_stopped_by_watchpoint, procfs_set_watchpoint): Delete declarations. * config/mips/nm-irix5.h (STOPPED_BY_WATCHPOINT) (TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT): Delete. (target_insert_watchpoint, target_remove_watchpoint): Delete. (procfs_stopped_by_watchpoint, procfs_set_watchpoint): Delete declarations. * config/sparc/nm-sol2.h (TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT) (HAVE_CONTINUABLE_WATCHPOINT, STOPPED_BY_WATCHPOINT): Delete. (target_insert_watchpoint, target_remove_watchpoint): Delete. (procfs_stopped_by_watchpoint, procfs_set_watchpoint): Delete declarations. --- gdb/ChangeLog | 27 ++++++++++++++++ gdb/config/i386/nm-i386sol2.h | 24 --------------- gdb/config/mips/nm-irix5.h | 23 -------------- gdb/config/sparc/nm-sol2.h | 25 --------------- gdb/procfs.c | 58 ++++++++++++++++++++++++++++++++--- 5 files changed, 81 insertions(+), 76 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8d830b3e5f..ffccb85de9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,30 @@ +2009-05-06 Pierre Muller + Pedro Alves + + * procfs.c (procfs_insert_watchpoint, procfs_remove_watchpoint) + (procfs_region_ok_for_hw_watchpoint, procfs_use_watchpoints): New + functions. + (procfs_stopped_by_watchpoint): Made static, ptid argument + removed. + (_initialize_procfs): Register new watchpoint related target + functions. + * config/i386/nm-i386sol2.h (TARGET_CAN_USE_HARDWARE_WATCHPOINT) + (TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT, STOPPED_BY_WATCHPOINT) + (HAVE_CONTINUABLE_WATCHPOINT): Delete. + (target_insert_watchpoint, target_remove_watchpoint): Delete. + (procfs_stopped_by_watchpoint, procfs_set_watchpoint): Delete + declarations. + * config/mips/nm-irix5.h (STOPPED_BY_WATCHPOINT) + (TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT): Delete. + (target_insert_watchpoint, target_remove_watchpoint): Delete. + (procfs_stopped_by_watchpoint, procfs_set_watchpoint): Delete + declarations. + * config/sparc/nm-sol2.h (TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT) + (HAVE_CONTINUABLE_WATCHPOINT, STOPPED_BY_WATCHPOINT): Delete. + (target_insert_watchpoint, target_remove_watchpoint): Delete. + (procfs_stopped_by_watchpoint, procfs_set_watchpoint): Delete + declarations. + 2009-05-06 Hui Zhu * i386-tdep.c (i386_process_record): Change bzero to memset. diff --git a/gdb/config/i386/nm-i386sol2.h b/gdb/config/i386/nm-i386sol2.h index 5ac917e443..ab8ff19cc3 100644 --- a/gdb/config/i386/nm-i386sol2.h +++ b/gdb/config/i386/nm-i386sol2.h @@ -20,17 +20,6 @@ #define TARGET_HAS_HARDWARE_WATCHPOINTS -/* The man page for proc4 on solaris 6 and 7 says that the system - can support "thousands" of hardware watchpoints, but gives no - method for finding out how many. So just tell GDB 'yes'. */ -#define TARGET_CAN_USE_HARDWARE_WATCHPOINT(TYPE, CNT, OT) 1 -#define TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT(SIZE) 1 - -/* When a hardware watchpoint fires off the PC will be left at the - instruction following the one which caused the watchpoint. - It will *NOT* be necessary for GDB to step over the watchpoint. */ -#define HAVE_CONTINUABLE_WATCHPOINT 1 - /* Solaris x86 2.6 and 2.7 targets have a kernel bug when stepping over an instruction that causes a page fault without triggering a hardware watchpoint. The kernel properly notices that it shouldn't @@ -41,17 +30,4 @@ step anyway. */ #define CANNOT_STEP_HW_WATCHPOINTS -extern int procfs_stopped_by_watchpoint (ptid_t); -#define STOPPED_BY_WATCHPOINT(W) \ - procfs_stopped_by_watchpoint(inferior_ptid) - -/* Use these macros for watchpoint insertion/deletion. */ -/* type can be 0: write watch, 1: read watch, 2: access watch (read/write) */ - -extern int procfs_set_watchpoint (ptid_t, CORE_ADDR, int, int, int); -#define target_insert_watchpoint(ADDR, LEN, TYPE) \ - procfs_set_watchpoint (inferior_ptid, ADDR, LEN, TYPE, 1) -#define target_remove_watchpoint(ADDR, LEN, TYPE) \ - procfs_set_watchpoint (inferior_ptid, ADDR, 0, 0, 0) - #endif /* NEW_PROC_API */ diff --git a/gdb/config/mips/nm-irix5.h b/gdb/config/mips/nm-irix5.h index 49ac420a44..98ff77a3f5 100644 --- a/gdb/config/mips/nm-irix5.h +++ b/gdb/config/mips/nm-irix5.h @@ -19,26 +19,3 @@ along with this program. If not, see . */ #define TARGET_HAS_HARDWARE_WATCHPOINTS - -/* TARGET_CAN_USE_HARDWARE_WATCHPOINT is now defined to go through - the target vector. For Irix5, procfs_can_use_hw_watchpoint() - should be invoked. */ - -/* When a hardware watchpoint fires off the PC will be left at the - instruction which caused the watchpoint. It will be necessary for - GDB to step over the watchpoint. */ - -#define STOPPED_BY_WATCHPOINT(W) \ - procfs_stopped_by_watchpoint(inferior_ptid) -extern int procfs_stopped_by_watchpoint (ptid_t); - -/* Use these macros for watchpoint insertion/deletion. */ -/* type can be 0: write watch, 1: read watch, 2: access watch (read/write) */ -#define target_insert_watchpoint(ADDR, LEN, TYPE) \ - procfs_set_watchpoint (inferior_ptid, ADDR, LEN, TYPE, 0) -#define target_remove_watchpoint(ADDR, LEN, TYPE) \ - procfs_set_watchpoint (inferior_ptid, ADDR, 0, 0, 0) -extern int procfs_set_watchpoint (ptid_t, CORE_ADDR, int, int, int); - -#define TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT(SIZE) 1 - diff --git a/gdb/config/sparc/nm-sol2.h b/gdb/config/sparc/nm-sol2.h index e1e75c0b66..14fb975159 100644 --- a/gdb/config/sparc/nm-sol2.h +++ b/gdb/config/sparc/nm-sol2.h @@ -30,31 +30,6 @@ #define TARGET_HAS_HARDWARE_WATCHPOINTS -/* The man page for proc(4) on Solaris 2.6 and up says that the system - can support "thousands" of hardware watchpoints, but gives no - method for finding out how many; It doesn't say anything about the - allowed size for the watched area either. So we just tell GDB - 'yes'. */ -#define TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT(SIZE) 1 - -/* When a hardware watchpoint fires off the PC will be left at the - instruction following the one which caused the watchpoint. It will - *NOT* be necessary for GDB to step over the watchpoint. */ -#define HAVE_CONTINUABLE_WATCHPOINT 1 - -extern int procfs_stopped_by_watchpoint (ptid_t); -#define STOPPED_BY_WATCHPOINT(W) \ - procfs_stopped_by_watchpoint(inferior_ptid) - -/* Use these macros for watchpoint insertion/deletion. TYPE can be 0 - (write watch), 1 (read watch), 2 (access watch (read/write). */ - -extern int procfs_set_watchpoint (ptid_t, CORE_ADDR, int, int, int); -#define target_insert_watchpoint(ADDR, LEN, TYPE) \ - procfs_set_watchpoint (inferior_ptid, ADDR, LEN, TYPE, 1) -#define target_remove_watchpoint(ADDR, LEN, TYPE) \ - procfs_set_watchpoint (inferior_ptid, ADDR, 0, 0, 0) - #endif /* NEW_PROC_API */ #endif /* nm-sol2.h */ diff --git a/gdb/procfs.c b/gdb/procfs.c index f62f0752fc..e6f20d1154 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -5322,13 +5322,12 @@ procfs_can_use_hw_breakpoint (int type, int cnt, int othertype) * else returns zero. */ -int -procfs_stopped_by_watchpoint (ptid_t ptid) +static int +procfs_stopped_by_watchpoint (void) { procinfo *pi; - pi = find_procinfo_or_die (PIDGET (ptid) == -1 ? - PIDGET (inferior_ptid) : PIDGET (ptid), 0); + pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); if (!pi) /* If no process, then not stopped by watchpoint! */ return 0; @@ -5350,6 +5349,53 @@ procfs_stopped_by_watchpoint (ptid_t ptid) return 0; } +static int +procfs_insert_watchpoint (CORE_ADDR addr, int len, int type) +{ + if (!HAVE_STEPPABLE_WATCHPOINT + && !gdbarch_have_nonsteppable_watchpoint (current_gdbarch)) + { + /* When a hardware watchpoint fires off the PC will be left at + the instruction following the one which caused the + watchpoint. It will *NOT* be necessary for GDB to step over + the watchpoint. */ + return procfs_set_watchpoint (inferior_ptid, addr, len, type, 1); + } + else + { + /* When a hardware watchpoint fires off the PC will be left at + the instruction which caused the watchpoint. It will be + necessary for GDB to step over the watchpoint. */ + return procfs_set_watchpoint (inferior_ptid, addr, len, type, 0); + } +} + +static int +procfs_remove_watchpoint (CORE_ADDR addr, int len, int type) +{ + return procfs_set_watchpoint (inferior_ptid, addr, 0, 0, 0); +} + +static int +procfs_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len) +{ + /* The man page for proc(4) on Solaris 2.6 and up says that the + system can support "thousands" of hardware watchpoints, but gives + no method for finding out how many; It doesn't say anything about + the allowed size for the watched area either. So we just tell + GDB 'yes'. */ + return 1; +} + +void +procfs_use_watchpoints (struct target_ops *t) +{ + t->to_stopped_by_watchpoint = procfs_stopped_by_watchpoint; + t->to_insert_watchpoint = procfs_insert_watchpoint; + t->to_remove_watchpoint = procfs_remove_watchpoint; + t->to_region_ok_for_hw_watchpoint = procfs_region_ok_for_hw_watchpoint; +} + /* * Memory Mappings Functions: */ @@ -5971,6 +6017,10 @@ _initialize_procfs (void) t = procfs_target (); +#ifdef TARGET_HAS_HARDWARE_WATCHPOINTS + procfs_use_watchpoints (t); +#endif + add_target (t); add_info ("proc", info_proc_cmd, _("\