From 1e03ad2088cfda4ebbf8d9358747660171ca33a6 Mon Sep 17 00:00:00 2001 From: Kevin Buettner Date: Tue, 13 Aug 2002 18:03:38 +0000 Subject: [PATCH] * procfs.c (procfs_can_use_hw_breakpoint): New function. (init_procfs_ops): Define ``to_can_use_hw_breakpoint'' for procfs target vector. * config/mips/nm-irix5.h (TARGET_CAN_USE_HARDWARE_WATCHPOINT): Delete. Add comment regarding this now-deleted target method. --- gdb/ChangeLog | 8 ++++++++ gdb/config/mips/nm-irix5.h | 4 +++- gdb/procfs.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1f70d123fa8..489279e5708 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2002-08-13 Kevin Buettner + + * procfs.c (procfs_can_use_hw_breakpoint): New function. + (init_procfs_ops): Define ``to_can_use_hw_breakpoint'' for procfs + target vector. + * config/mips/nm-irix5.h (TARGET_CAN_USE_HARDWARE_WATCHPOINT): + Delete. Add comment regarding this now-deleted target method. + 2002-08-13 Stephane Carrez * m68hc11-tdep.c (M68HC12_NUM_PSEUDO_REGS): New define. diff --git a/gdb/config/mips/nm-irix5.h b/gdb/config/mips/nm-irix5.h index 8e31b592811..59749f66335 100644 --- a/gdb/config/mips/nm-irix5.h +++ b/gdb/config/mips/nm-irix5.h @@ -24,7 +24,9 @@ #define TARGET_HAS_HARDWARE_WATCHPOINTS -#define TARGET_CAN_USE_HARDWARE_WATCHPOINT(type, cnt, ot) 1 +/* 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 diff --git a/gdb/procfs.c b/gdb/procfs.c index 76888992646..79f55758dfe 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -136,6 +136,8 @@ static int proc_find_memory_regions (int (*) (CORE_ADDR, static char * procfs_make_note_section (bfd *, int *); +static int procfs_can_use_hw_breakpoint (int, int, int); + struct target_ops procfs_ops; /* the target vector */ static void @@ -183,6 +185,7 @@ init_procfs_ops (void) procfs_ops.to_has_thread_control = tc_schedlock; procfs_ops.to_find_memory_regions = proc_find_memory_regions; procfs_ops.to_make_corefile_notes = procfs_make_note_section; + procfs_ops.to_can_use_hw_breakpoint = procfs_can_use_hw_breakpoint; procfs_ops.to_magic = OPS_MAGIC; } @@ -5138,6 +5141,37 @@ procfs_set_watchpoint (ptid_t ptid, CORE_ADDR addr, int len, int rwflag, return 0; } +/* Return non-zero if we can set a hardware watchpoint of type TYPE. TYPE + is one of bp_hardware_watchpoint, bp_read_watchpoint, bp_write_watchpoint, + or bp_hardware_watchpoint. CNT is the number of watchpoints used so + far. + + Note: procfs_can_use_hw_breakpoint() is not yet used by all + procfs.c targets due to the fact that some of them still define + TARGET_CAN_USE_HARDWARE_WATCHPOINT. */ + +static int +procfs_can_use_hw_breakpoint (int type, int cnt, int othertype) +{ +#ifndef TARGET_HAS_HARDWARE_WATCHPOINTS + return 0; +#else + /* Due to the way that proc_set_watchpoint() is implemented, host + and target pointers must be of the same size. If they are not, + we can't use hardware watchpoints. This limitation is due to the + fact that proc_set_watchpoint() calls address_to_host_pointer(); + a close inspection of address_to_host_pointer will reveal that + an internal error will be generated when the host and target + pointer sizes are different. */ + if (sizeof (void *) != TYPE_LENGTH (builtin_type_void_data_ptr)) + return 0; + + /* Other tests here??? */ + + return 1; +#endif +} + /* * Function: stopped_by_watchpoint *