diff options
Diffstat (limited to 'gdb/x86-nat.h')
-rw-r--r-- | gdb/x86-nat.h | 79 |
1 files changed, 73 insertions, 6 deletions
diff --git a/gdb/x86-nat.h b/gdb/x86-nat.h index 80c7fdf..8ad1821 100644 --- a/gdb/x86-nat.h +++ b/gdb/x86-nat.h @@ -23,16 +23,12 @@ #ifndef X86_NAT_H #define X86_NAT_H 1 +#include "breakpoint.h" #include "nat/x86-dregs.h" +#include "target.h" /* Hardware-assisted breakpoints and watchpoints. */ -/* Add watchpoint methods to the provided target_ops. - Targets using x86 family debug registers for watchpoints should call - this. */ -struct target_ops; -extern void x86_use_watchpoints (struct target_ops *); - /* Use this function to set x86_dr_low debug_register_length field rather than setting it directly to check that the length is only set once. It also enables the 'maint set/show show-debug-regs' @@ -49,4 +45,75 @@ extern void x86_cleanup_dregs (void); extern void x86_forget_process (pid_t pid); +/* Helper functions used by x86_nat_target below. See their + definitions. */ + +extern int x86_can_use_hw_breakpoint (enum bptype type, int cnt, int othertype); +extern int x86_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len); +extern int x86_stopped_by_watchpoint (); +extern int x86_stopped_data_address (CORE_ADDR *addr_p); +extern int x86_insert_watchpoint (CORE_ADDR addr, int len, + enum target_hw_bp_type type, + struct expression *cond); +extern int x86_remove_watchpoint (CORE_ADDR addr, int len, + enum target_hw_bp_type type, + struct expression *cond); +extern int x86_insert_hw_breakpoint (struct gdbarch *gdbarch, + struct bp_target_info *bp_tgt); +extern int x86_remove_hw_breakpoint (struct gdbarch *gdbarch, + struct bp_target_info *bp_tgt); +extern int x86_stopped_by_hw_breakpoint (); + +/* Convenience template mixin used to add x86 watchpoints support to a + target. */ + +template <typename BaseTarget> +struct x86_nat_target : public BaseTarget +{ + /* Hook in the x86 hardware watchpoints/breakpoints support. */ + + /* 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. */ + bool have_continuable_watchpoint () override + { return true; } + + int can_use_hw_breakpoint (enum bptype type, int cnt, int othertype) override + { return x86_can_use_hw_breakpoint (type, cnt, othertype); } + + int region_ok_for_hw_watchpoint (CORE_ADDR addr, int len) override + { return x86_region_ok_for_hw_watchpoint (addr, len); } + + int insert_watchpoint (CORE_ADDR addr, int len, + enum target_hw_bp_type type, + struct expression *cond) override + { return x86_insert_watchpoint (addr, len, type, cond); } + + int remove_watchpoint (CORE_ADDR addr, int len, + enum target_hw_bp_type type, + struct expression *cond) override + { return x86_remove_watchpoint (addr, len, type, cond); } + + int insert_hw_breakpoint (struct gdbarch *gdbarch, + struct bp_target_info *bp_tgt) override + { return x86_insert_hw_breakpoint (gdbarch, bp_tgt); } + + int remove_hw_breakpoint (struct gdbarch *gdbarch, + struct bp_target_info *bp_tgt) override + { return x86_remove_hw_breakpoint (gdbarch, bp_tgt); } + + int stopped_by_watchpoint () override + { return x86_stopped_by_watchpoint (); } + + int stopped_data_address (CORE_ADDR *addr_p) override + { return x86_stopped_data_address (addr_p); } + + /* A target must provide an implementation of the + "supports_stopped_by_hw_breakpoint" target method before this + callback will be used. */ + int stopped_by_hw_breakpoint () override + { return x86_stopped_by_hw_breakpoint (); } +}; + #endif /* X86_NAT_H */ |