X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fx86-nat.h;h=c912a00d5d5e99faa4643cd4c56f2d54c0b4d55f;hb=34156b23862e9719355569182d594c7a9e38047e;hp=161695ff65fc99e22828f1e7827e8893f57ae468;hpb=61baf725eca99af2569262d10aca03dcde2698f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/x86-nat.h b/gdb/x86-nat.h index 161695ff65..c912a00d5d 100644 --- a/gdb/x86-nat.h +++ b/gdb/x86-nat.h @@ -3,7 +3,7 @@ Low level functions to implement Oeprating System specific code to manipulate x86 debug registers. - Copyright (C) 2009-2017 Free Software Foundation, Inc. + Copyright (C) 2009-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -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,68 @@ 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 +struct x86_nat_target : public BaseTarget +{ + /* Hook in the x86 hardware watchpoints/breakpoints support. */ + + 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); } + + bool stopped_by_watchpoint () override + { return x86_stopped_by_watchpoint (); } + + bool 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. */ + bool stopped_by_hw_breakpoint () override + { return x86_stopped_by_hw_breakpoint (); } +}; + #endif /* X86_NAT_H */