X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fx86-nat.h;h=913291a23052a6dfb59351152b1430848f7035eb;hb=e008305278cb42a576107cd8aa9f0b182eea1af2;hp=df5e9f2d2e2105962a2d3ffdb6e4c1ee6728be87;hpb=df7e526582809b829ee8651a1315a17627cfea4d;p=binutils-gdb.git diff --git a/gdb/x86-nat.h b/gdb/x86-nat.h index df5e9f2d2e2..913291a2305 100644 --- a/gdb/x86-nat.h +++ b/gdb/x86-nat.h @@ -1,9 +1,9 @@ /* Native-dependent code for x86 (i386 and x86-64). - Low level functions to implement Oeprating System specific + Low level functions to implement Operating System specific code to manipulate x86 debug registers. - Copyright (C) 2009-2014 Free Software Foundation, Inc. + Copyright (C) 2009-2022 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' @@ -44,14 +40,73 @@ extern void x86_set_debug_register_length (int len); extern void x86_cleanup_dregs (void); -/* Return a pointer to the local mirror of the debug registers of - process PID. */ - -extern struct x86_debug_reg_state *x86_debug_reg_state (pid_t pid); - /* Called whenever GDB is no longer debugging process PID. It deletes data structures that keep track of debug register state. */ 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 */