mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-23 08:23:50 +08:00
* Makefile.in (i386-nat.o): Update.
* amd64-linux-nat.c (_initialize_amd64_linux_nat): Call i386_use_watchpoints. * i386-linux-nat.c (_initialize_i386_linux_nat): Call i386_use_watchpoints. * i386-nat.c (i386_stopped_data_address): Take two arguments. (i386_stopped_by_watchpoint): Update call. (i386_can_use_hw_breakpoint, i386_use_watchpoints): New. * config/i386/nm-i386.h: Conditionalize definitions on ! I386_WATCHPOINTS_IN_TARGET_VECTOR. (i386_use_watchpoints): Declare. (i386_stopped_data_address): Update. * config/i386/nm-linux.h (I386_WATCHPOINTS_IN_TARGET_VECTOR): Define. * config/i386/nm-linux64.h (I386_WATCHPOINTS_IN_TARGET_VECTOR): Define.
This commit is contained in:
parent
16fb4e2d3a
commit
c03374d554
@ -1,3 +1,20 @@
|
||||
2007-02-29 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* Makefile.in (i386-nat.o): Update.
|
||||
* amd64-linux-nat.c (_initialize_amd64_linux_nat): Call
|
||||
i386_use_watchpoints.
|
||||
* i386-linux-nat.c (_initialize_i386_linux_nat): Call
|
||||
i386_use_watchpoints.
|
||||
* i386-nat.c (i386_stopped_data_address): Take two arguments.
|
||||
(i386_stopped_by_watchpoint): Update call.
|
||||
(i386_can_use_hw_breakpoint, i386_use_watchpoints): New.
|
||||
* config/i386/nm-i386.h: Conditionalize definitions on
|
||||
! I386_WATCHPOINTS_IN_TARGET_VECTOR.
|
||||
(i386_use_watchpoints): Declare.
|
||||
(i386_stopped_data_address): Update.
|
||||
* config/i386/nm-linux.h (I386_WATCHPOINTS_IN_TARGET_VECTOR): Define.
|
||||
* config/i386/nm-linux64.h (I386_WATCHPOINTS_IN_TARGET_VECTOR): Define.
|
||||
|
||||
2008-02-29 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
GDB 6.8 branch created (branch timestamp: 2008-02-26 10:00 UTC)
|
||||
|
@ -2229,7 +2229,8 @@ i386-linux-tdep.o: i386-linux-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \
|
||||
$(value_h) $(regcache_h) $(inferior_h) $(osabi_h) $(reggroups_h) \
|
||||
$(dwarf2_frame_h) $(gdb_string_h) $(i386_tdep_h) \
|
||||
$(i386_linux_tdep_h) $(glibc_tdep_h) $(solib_svr4_h) $(symtab_h)
|
||||
i386-nat.o: i386-nat.c $(defs_h) $(breakpoint_h) $(command_h) $(gdbcmd_h)
|
||||
i386-nat.o: i386-nat.c $(defs_h) $(breakpoint_h) $(command_h) $(gdbcmd_h) \
|
||||
$(target_h)
|
||||
i386nbsd-nat.o: i386nbsd-nat.c $(defs_h) $(gdbcore_h) $(regcache_h) \
|
||||
$(target_h) $(i386_tdep_h) $(i386bsd_nat_h) $(nbsd_nat_h) \
|
||||
$(bsd_kvm_h)
|
||||
|
@ -421,6 +421,8 @@ _initialize_amd64_linux_nat (void)
|
||||
/* Fill in the generic GNU/Linux methods. */
|
||||
t = linux_target ();
|
||||
|
||||
i386_use_watchpoints (t);
|
||||
|
||||
/* Override the GNU/Linux inferior startup hook. */
|
||||
super_post_startup_inferior = t->to_post_startup_inferior;
|
||||
t->to_post_startup_inferior = amd64_linux_child_post_startup_inferior;
|
||||
|
@ -24,6 +24,11 @@
|
||||
/* Targets should define this to use the generic x86 watchpoint support. */
|
||||
#ifdef I386_USE_GENERIC_WATCHPOINTS
|
||||
|
||||
/* Add watchpoint methods to the provided target_ops. Targets which call
|
||||
this should also define I386_WATCHPOINTS_IN_TARGET_VECTOR. */
|
||||
struct target_ops;
|
||||
void i386_use_watchpoints (struct target_ops *);
|
||||
|
||||
/* Clear the reference counts and forget everything we knew about DRi. */
|
||||
extern void i386_cleanup_dregs (void);
|
||||
|
||||
@ -48,7 +53,7 @@ extern int i386_stopped_by_hwbp (void);
|
||||
/* If the inferior has some break/watchpoint that triggered, set
|
||||
the address associated with that break/watchpoint and return
|
||||
true. Otherwise, return false. */
|
||||
extern int i386_stopped_data_address (CORE_ADDR *);
|
||||
extern int i386_stopped_data_address (struct target_ops *, CORE_ADDR *);
|
||||
|
||||
/* Insert a hardware-assisted breakpoint at BP_TGT->placed_address.
|
||||
Return 0 on success, EBUSY on failure. */
|
||||
@ -59,6 +64,10 @@ extern int i386_insert_hw_breakpoint (struct bp_target_info *bp_tgt);
|
||||
Return 0 on success, -1 on failure. */
|
||||
extern int i386_remove_hw_breakpoint (struct bp_target_info *bp_tgt);
|
||||
|
||||
extern int i386_stopped_by_watchpoint (void);
|
||||
|
||||
#ifndef I386_WATCHPOINTS_IN_TARGET_VECTOR
|
||||
|
||||
/* Returns the number of hardware watchpoints of type TYPE that we can
|
||||
set. Value is positive if we can set CNT watchpoints, zero if
|
||||
setting watchpoints of type TYPE is not supported, and negative if
|
||||
@ -90,11 +99,10 @@ extern int i386_remove_hw_breakpoint (struct bp_target_info *bp_tgt);
|
||||
|
||||
#define HAVE_CONTINUABLE_WATCHPOINT 1
|
||||
|
||||
extern int i386_stopped_by_watchpoint (void);
|
||||
|
||||
#define STOPPED_BY_WATCHPOINT(W) (i386_stopped_by_watchpoint () != 0)
|
||||
|
||||
#define target_stopped_data_address(target, x) i386_stopped_data_address(x)
|
||||
#define target_stopped_data_address(target, x) \
|
||||
i386_stopped_data_address(target, x)
|
||||
|
||||
/* Use these macros for watchpoint insertion/removal. */
|
||||
|
||||
@ -110,6 +118,8 @@ extern int i386_stopped_by_watchpoint (void);
|
||||
#define target_remove_hw_breakpoint(bp_tgt) \
|
||||
i386_remove_hw_breakpoint (bp_tgt)
|
||||
|
||||
#endif /* I386_WATCHPOINTS_IN_TARGET_VECTOR */
|
||||
|
||||
#endif /* I386_USE_GENERIC_WATCHPOINTS */
|
||||
|
||||
#endif /* NM_I386_H */
|
||||
|
@ -23,6 +23,7 @@
|
||||
|
||||
/* GNU/Linux supports the i386 hardware debugging registers. */
|
||||
#define I386_USE_GENERIC_WATCHPOINTS
|
||||
#define I386_WATCHPOINTS_IN_TARGET_VECTOR
|
||||
|
||||
#include "i386/nm-i386.h"
|
||||
#include "config/nm-linux.h"
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
/* GNU/Linux supports the i386 hardware debugging registers. */
|
||||
#define I386_USE_GENERIC_WATCHPOINTS
|
||||
#define I386_WATCHPOINTS_IN_TARGET_VECTOR
|
||||
|
||||
#include "i386/nm-i386.h"
|
||||
#include "config/nm-linux.h"
|
||||
|
@ -820,6 +820,8 @@ _initialize_i386_linux_nat (void)
|
||||
/* Fill in the generic GNU/Linux methods. */
|
||||
t = linux_target ();
|
||||
|
||||
i386_use_watchpoints (t);
|
||||
|
||||
/* Override the default ptrace resume method. */
|
||||
t->to_resume = i386_linux_resume;
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "breakpoint.h"
|
||||
#include "command.h"
|
||||
#include "gdbcmd.h"
|
||||
#include "target.h"
|
||||
|
||||
/* Support for hardware watchpoints and breakpoints using the i386
|
||||
debug registers.
|
||||
@ -563,7 +564,7 @@ i386_region_ok_for_watchpoint (CORE_ADDR addr, int len)
|
||||
Otherwise, return zero. */
|
||||
|
||||
int
|
||||
i386_stopped_data_address (CORE_ADDR *addr_p)
|
||||
i386_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
|
||||
{
|
||||
CORE_ADDR addr = 0;
|
||||
int i;
|
||||
@ -599,7 +600,7 @@ int
|
||||
i386_stopped_by_watchpoint (void)
|
||||
{
|
||||
CORE_ADDR addr = 0;
|
||||
return i386_stopped_data_address (&addr);
|
||||
return i386_stopped_data_address (¤t_target, &addr);
|
||||
}
|
||||
|
||||
/* Return non-zero if the inferior has some break/watchpoint that
|
||||
@ -654,6 +655,47 @@ i386_remove_hw_breakpoint (struct bp_target_info *bp_tgt)
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* Returns the number of hardware watchpoints of type TYPE that we can
|
||||
set. Value is positive if we can set CNT watchpoints, zero if
|
||||
setting watchpoints of type TYPE is not supported, and negative if
|
||||
CNT is more than the maximum number of watchpoints of type TYPE
|
||||
that we can support. TYPE is one of bp_hardware_watchpoint,
|
||||
bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint.
|
||||
CNT is the number of such watchpoints used so far (including this
|
||||
one). OTHERTYPE is non-zero if other types of watchpoints are
|
||||
currently enabled.
|
||||
|
||||
We always return 1 here because we don't have enough information
|
||||
about possible overlap of addresses that they want to watch. As an
|
||||
extreme example, consider the case where all the watchpoints watch
|
||||
the same address and the same region length: then we can handle a
|
||||
virtually unlimited number of watchpoints, due to debug register
|
||||
sharing implemented via reference counts in i386-nat.c. */
|
||||
|
||||
static int
|
||||
i386_can_use_hw_breakpoint (int type, int cnt, int othertype)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
i386_use_watchpoints (struct target_ops *t)
|
||||
{
|
||||
/* After a watchpoint trap, the PC points to the instruction after the
|
||||
one that caused the trap. Therefore we don't need to step over it.
|
||||
But we do need to reset the status register to avoid another trap. */
|
||||
t->to_have_continuable_watchpoint = 1;
|
||||
|
||||
t->to_can_use_hw_breakpoint = i386_can_use_hw_breakpoint;
|
||||
t->to_region_ok_for_hw_watchpoint = i386_region_ok_for_watchpoint;
|
||||
t->to_stopped_by_watchpoint = i386_stopped_by_watchpoint;
|
||||
t->to_stopped_data_address = i386_stopped_data_address;
|
||||
t->to_insert_watchpoint = i386_insert_watchpoint;
|
||||
t->to_remove_watchpoint = i386_remove_watchpoint;
|
||||
t->to_insert_hw_breakpoint = i386_insert_hw_breakpoint;
|
||||
t->to_remove_hw_breakpoint = i386_remove_hw_breakpoint;
|
||||
}
|
||||
|
||||
#endif /* I386_USE_GENERIC_WATCHPOINTS */
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user