Commit | Line | Data |
---|---|---|
df7e5265 | 1 | /* Native-dependent code for x86 (i386 and x86-64). |
9bb9e8ad | 2 | |
30baf67b | 3 | Low level functions to implement Operating System specific |
df7e5265 | 4 | code to manipulate x86 debug registers. |
9bb9e8ad | 5 | |
b811d2c2 | 6 | Copyright (C) 2009-2020 Free Software Foundation, Inc. |
9bb9e8ad PM |
7 | |
8 | This file is part of GDB. | |
9 | ||
10 | This program is free software; you can redistribute it and/or modify | |
11 | it under the terms of the GNU General Public License as published by | |
12 | the Free Software Foundation; either version 3 of the License, or | |
13 | (at your option) any later version. | |
14 | ||
15 | This program is distributed in the hope that it will be useful, | |
16 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 | GNU General Public License for more details. | |
19 | ||
20 | You should have received a copy of the GNU General Public License | |
21 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
22 | ||
df7e5265 GB |
23 | #ifndef X86_NAT_H |
24 | #define X86_NAT_H 1 | |
9bb9e8ad | 25 | |
f6ac5f3d | 26 | #include "breakpoint.h" |
df7e5265 | 27 | #include "nat/x86-dregs.h" |
f6ac5f3d | 28 | #include "target.h" |
b9228891 | 29 | |
9bb9e8ad PM |
30 | /* Hardware-assisted breakpoints and watchpoints. */ |
31 | ||
df7e5265 | 32 | /* Use this function to set x86_dr_low debug_register_length field |
9bb9e8ad PM |
33 | rather than setting it directly to check that the length is only |
34 | set once. It also enables the 'maint set/show show-debug-regs' | |
35 | command. */ | |
36 | ||
df7e5265 | 37 | extern void x86_set_debug_register_length (int len); |
9bb9e8ad | 38 | |
df7e5265 | 39 | /* Use this function to reset the x86-nat.c debug register state. */ |
9bb9e8ad | 40 | |
df7e5265 | 41 | extern void x86_cleanup_dregs (void); |
9bb9e8ad | 42 | |
26cb8b7c PA |
43 | /* Called whenever GDB is no longer debugging process PID. It deletes |
44 | data structures that keep track of debug register state. */ | |
45 | ||
df7e5265 | 46 | extern void x86_forget_process (pid_t pid); |
7b50312a | 47 | |
f6ac5f3d PA |
48 | /* Helper functions used by x86_nat_target below. See their |
49 | definitions. */ | |
50 | ||
51 | extern int x86_can_use_hw_breakpoint (enum bptype type, int cnt, int othertype); | |
52 | extern int x86_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len); | |
53 | extern int x86_stopped_by_watchpoint (); | |
54 | extern int x86_stopped_data_address (CORE_ADDR *addr_p); | |
55 | extern int x86_insert_watchpoint (CORE_ADDR addr, int len, | |
56 | enum target_hw_bp_type type, | |
57 | struct expression *cond); | |
58 | extern int x86_remove_watchpoint (CORE_ADDR addr, int len, | |
59 | enum target_hw_bp_type type, | |
60 | struct expression *cond); | |
61 | extern int x86_insert_hw_breakpoint (struct gdbarch *gdbarch, | |
62 | struct bp_target_info *bp_tgt); | |
63 | extern int x86_remove_hw_breakpoint (struct gdbarch *gdbarch, | |
64 | struct bp_target_info *bp_tgt); | |
65 | extern int x86_stopped_by_hw_breakpoint (); | |
66 | ||
67 | /* Convenience template mixin used to add x86 watchpoints support to a | |
68 | target. */ | |
69 | ||
70 | template <typename BaseTarget> | |
71 | struct x86_nat_target : public BaseTarget | |
72 | { | |
73 | /* Hook in the x86 hardware watchpoints/breakpoints support. */ | |
74 | ||
f6ac5f3d PA |
75 | int can_use_hw_breakpoint (enum bptype type, int cnt, int othertype) override |
76 | { return x86_can_use_hw_breakpoint (type, cnt, othertype); } | |
77 | ||
78 | int region_ok_for_hw_watchpoint (CORE_ADDR addr, int len) override | |
79 | { return x86_region_ok_for_hw_watchpoint (addr, len); } | |
80 | ||
81 | int insert_watchpoint (CORE_ADDR addr, int len, | |
82 | enum target_hw_bp_type type, | |
83 | struct expression *cond) override | |
84 | { return x86_insert_watchpoint (addr, len, type, cond); } | |
85 | ||
86 | int remove_watchpoint (CORE_ADDR addr, int len, | |
87 | enum target_hw_bp_type type, | |
88 | struct expression *cond) override | |
89 | { return x86_remove_watchpoint (addr, len, type, cond); } | |
90 | ||
91 | int insert_hw_breakpoint (struct gdbarch *gdbarch, | |
92 | struct bp_target_info *bp_tgt) override | |
93 | { return x86_insert_hw_breakpoint (gdbarch, bp_tgt); } | |
94 | ||
95 | int remove_hw_breakpoint (struct gdbarch *gdbarch, | |
96 | struct bp_target_info *bp_tgt) override | |
97 | { return x86_remove_hw_breakpoint (gdbarch, bp_tgt); } | |
98 | ||
57810aa7 | 99 | bool stopped_by_watchpoint () override |
f6ac5f3d PA |
100 | { return x86_stopped_by_watchpoint (); } |
101 | ||
57810aa7 | 102 | bool stopped_data_address (CORE_ADDR *addr_p) override |
f6ac5f3d PA |
103 | { return x86_stopped_data_address (addr_p); } |
104 | ||
105 | /* A target must provide an implementation of the | |
106 | "supports_stopped_by_hw_breakpoint" target method before this | |
107 | callback will be used. */ | |
57810aa7 | 108 | bool stopped_by_hw_breakpoint () override |
f6ac5f3d PA |
109 | { return x86_stopped_by_hw_breakpoint (); } |
110 | }; | |
111 | ||
df7e5265 | 112 | #endif /* X86_NAT_H */ |