Commit | Line | Data |
---|---|---|
611cb4a5 | 1 | /* Memory breakpoint interfaces for the remote server for GDB. |
b811d2c2 | 2 | Copyright (C) 2002-2020 Free Software Foundation, Inc. |
611cb4a5 DJ |
3 | |
4 | Contributed by MontaVista Software. | |
5 | ||
6 | This file is part of GDB. | |
7 | ||
8 | This program is free software; you can redistribute it and/or modify | |
9 | it under the terms of the GNU General Public License as published by | |
a9762ec7 | 10 | the Free Software Foundation; either version 3 of the License, or |
611cb4a5 DJ |
11 | (at your option) any later version. |
12 | ||
13 | This program is distributed in the hope that it will be useful, | |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public License | |
a9762ec7 | 19 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
611cb4a5 | 20 | |
1a5c2598 TT |
21 | #ifndef GDBSERVER_MEM_BREAK_H |
22 | #define GDBSERVER_MEM_BREAK_H | |
611cb4a5 | 23 | |
268a13a5 | 24 | #include "gdbsupport/break-common.h" |
932539e3 | 25 | |
611cb4a5 | 26 | /* Breakpoints are opaque. */ |
414a389f | 27 | struct breakpoint; |
9aa76cd0 | 28 | struct gdb_breakpoint; |
fa593d66 | 29 | struct fast_tracepoint_jump; |
802e8e6d PA |
30 | struct raw_breakpoint; |
31 | struct process_info; | |
611cb4a5 | 32 | |
932539e3 PA |
33 | #define Z_PACKET_SW_BP '0' |
34 | #define Z_PACKET_HW_BP '1' | |
35 | #define Z_PACKET_WRITE_WP '2' | |
36 | #define Z_PACKET_READ_WP '3' | |
37 | #define Z_PACKET_ACCESS_WP '4' | |
38 | ||
802e8e6d | 39 | /* The low level breakpoint types. */ |
932539e3 | 40 | |
802e8e6d PA |
41 | enum raw_bkpt_type |
42 | { | |
43 | /* Software/memory breakpoint. */ | |
44 | raw_bkpt_type_sw, | |
932539e3 | 45 | |
802e8e6d PA |
46 | /* Hardware-assisted breakpoint. */ |
47 | raw_bkpt_type_hw, | |
d50171e4 | 48 | |
802e8e6d PA |
49 | /* Hardware-assisted write watchpoint. */ |
50 | raw_bkpt_type_write_wp, | |
d50171e4 | 51 | |
802e8e6d PA |
52 | /* Hardware-assisted read watchpoint. */ |
53 | raw_bkpt_type_read_wp, | |
54 | ||
55 | /* Hardware-assisted access watchpoint. */ | |
56 | raw_bkpt_type_access_wp | |
57 | }; | |
58 | ||
59 | /* Map the protocol breakpoint/watchpoint type Z_TYPE to the internal | |
60 | raw breakpoint type. */ | |
61 | ||
62 | enum raw_bkpt_type Z_packet_to_raw_bkpt_type (char z_type); | |
63 | ||
64 | /* Map a raw breakpoint type to an enum target_hw_bp_type. */ | |
65 | ||
66 | enum target_hw_bp_type raw_bkpt_type_to_target_hw_bp_type | |
67 | (enum raw_bkpt_type raw_type); | |
68 | ||
27165294 | 69 | /* Create a new GDB breakpoint of type Z_TYPE at ADDR with kind KIND. |
802e8e6d PA |
70 | Returns a pointer to the newly created breakpoint on success. On |
71 | failure returns NULL and sets *ERR to either -1 for error, or 1 if | |
72 | Z_TYPE breakpoints are not supported on this target. */ | |
73 | ||
9aa76cd0 YQ |
74 | struct gdb_breakpoint *set_gdb_breakpoint (char z_type, CORE_ADDR addr, |
75 | int kind, int *err); | |
802e8e6d | 76 | |
27165294 | 77 | /* Delete a GDB breakpoint of type Z_TYPE and kind KIND previously |
802e8e6d PA |
78 | inserted at ADDR with set_gdb_breakpoint_at. Returns 0 on success, |
79 | -1 on error, and 1 if Z_TYPE breakpoints are not supported on this | |
80 | target. */ | |
81 | ||
27165294 | 82 | int delete_gdb_breakpoint (char z_type, CORE_ADDR addr, int kind); |
802e8e6d PA |
83 | |
84 | /* Returns TRUE if there's a software or hardware (code) breakpoint at | |
85 | ADDR in our tables, inserted, or not. */ | |
d50171e4 PA |
86 | |
87 | int breakpoint_here (CORE_ADDR addr); | |
88 | ||
802e8e6d PA |
89 | /* Returns TRUE if there's any inserted software or hardware (code) |
90 | breakpoint set at ADDR. */ | |
d50171e4 PA |
91 | |
92 | int breakpoint_inserted_here (CORE_ADDR addr); | |
93 | ||
582511be PA |
94 | /* Returns TRUE if there's any inserted software breakpoint at |
95 | ADDR. */ | |
96 | ||
97 | int software_breakpoint_inserted_here (CORE_ADDR addr); | |
98 | ||
99 | /* Returns TRUE if there's any inserted hardware (code) breakpoint at | |
100 | ADDR. */ | |
101 | ||
102 | int hardware_breakpoint_inserted_here (CORE_ADDR addr); | |
103 | ||
3b9a79ef | 104 | /* Returns TRUE if there's any single-step breakpoint at ADDR. */ |
2d97cd35 | 105 | |
3b9a79ef | 106 | int single_step_breakpoint_inserted_here (CORE_ADDR addr); |
2d97cd35 | 107 | |
0a261ed8 PA |
108 | /* Clear all breakpoint conditions and commands associated with a |
109 | breakpoint. */ | |
9f3a5c85 | 110 | |
9aa76cd0 | 111 | void clear_breakpoint_conditions_and_commands (struct gdb_breakpoint *bp); |
9f3a5c85 | 112 | |
d708bcd1 PA |
113 | /* Set target-side condition CONDITION to the breakpoint at ADDR. |
114 | Returns false on failure. On success, advances CONDITION pointer | |
115 | past the condition and returns true. */ | |
9f3a5c85 | 116 | |
256642e8 PA |
117 | int add_breakpoint_condition (struct gdb_breakpoint *bp, |
118 | const char **condition); | |
9f3a5c85 | 119 | |
d708bcd1 PA |
120 | /* Set target-side commands COMMANDS to the breakpoint at ADDR. |
121 | Returns false on failure. On success, advances COMMANDS past the | |
122 | commands and returns true. If PERSIST, the commands should run | |
123 | even while GDB is disconnected. */ | |
124 | ||
256642e8 | 125 | int add_breakpoint_commands (struct gdb_breakpoint *bp, const char **commands, |
802e8e6d | 126 | int persist); |
d3ce09f5 | 127 | |
31445d10 PA |
128 | /* Return true if PROC has any persistent command. */ |
129 | bool any_persistent_commands (process_info *proc); | |
d3ce09f5 | 130 | |
9f3a5c85 LM |
131 | /* Evaluation condition (if any) at breakpoint BP. Return 1 if |
132 | true and 0 otherwise. */ | |
133 | ||
134 | int gdb_condition_true_at_breakpoint (CORE_ADDR where); | |
135 | ||
d3ce09f5 SS |
136 | int gdb_no_commands_at_breakpoint (CORE_ADDR where); |
137 | ||
138 | void run_breakpoint_commands (CORE_ADDR where); | |
139 | ||
802e8e6d PA |
140 | /* Returns TRUE if there's a GDB breakpoint (Z0 or Z1) set at |
141 | WHERE. */ | |
8b07ae33 PA |
142 | |
143 | int gdb_breakpoint_here (CORE_ADDR where); | |
144 | ||
611cb4a5 | 145 | /* Create a new breakpoint at WHERE, and call HANDLER when |
b65d95c5 | 146 | it is hit. HANDLER should return 1 if the breakpoint |
811f8301 YQ |
147 | should be deleted, 0 otherwise. The type of the created |
148 | breakpoint is other_breakpoint. */ | |
611cb4a5 | 149 | |
414a389f PA |
150 | struct breakpoint *set_breakpoint_at (CORE_ADDR where, |
151 | int (*handler) (CORE_ADDR)); | |
611cb4a5 | 152 | |
219f2f23 PA |
153 | /* Delete a breakpoint. */ |
154 | ||
155 | int delete_breakpoint (struct breakpoint *bkpt); | |
156 | ||
3b9a79ef | 157 | /* Set a single-step breakpoint at STOP_AT for thread represented by |
bec903c9 | 158 | PTID. */ |
d50171e4 | 159 | |
3b9a79ef | 160 | void set_single_step_breakpoint (CORE_ADDR stop_at, ptid_t ptid); |
d50171e4 | 161 | |
3b9a79ef | 162 | /* Delete all single-step breakpoints of THREAD. */ |
611cb4a5 | 163 | |
3b9a79ef | 164 | void delete_single_step_breakpoints (struct thread_info *thread); |
611cb4a5 | 165 | |
3b9a79ef | 166 | /* Reinsert all single-step breakpoints of THREAD. */ |
2e7b624b | 167 | |
3b9a79ef | 168 | void reinsert_single_step_breakpoints (struct thread_info *thread); |
2e7b624b | 169 | |
3b9a79ef YQ |
170 | /* Uninsert all single-step breakpoints of THREAD. This still leaves |
171 | the single-step breakpoints in the table. */ | |
2e7b624b | 172 | |
3b9a79ef | 173 | void uninsert_single_step_breakpoints (struct thread_info *thread); |
2e7b624b | 174 | |
d50171e4 PA |
175 | /* Reinsert breakpoints at WHERE (and change their status to |
176 | inserted). */ | |
611cb4a5 | 177 | |
d50171e4 | 178 | void reinsert_breakpoints_at (CORE_ADDR where); |
611cb4a5 | 179 | |
3b9a79ef | 180 | /* The THREAD has single-step breakpoints or not. */ |
f79b145d | 181 | |
3b9a79ef | 182 | int has_single_step_breakpoints (struct thread_info *thread); |
f79b145d | 183 | |
d50171e4 PA |
184 | /* Uninsert breakpoints at WHERE (and change their status to |
185 | uninserted). This still leaves the breakpoints in the table. */ | |
611cb4a5 | 186 | |
d50171e4 | 187 | void uninsert_breakpoints_at (CORE_ADDR where); |
611cb4a5 | 188 | |
0fb4aa4b PA |
189 | /* Reinsert all breakpoints of the current process (and change their |
190 | status to inserted). */ | |
191 | ||
192 | void reinsert_all_breakpoints (void); | |
193 | ||
194 | /* Uninsert all breakpoints of the current process (and change their | |
195 | status to uninserted). This still leaves the breakpoints in the | |
196 | table. */ | |
197 | ||
198 | void uninsert_all_breakpoints (void); | |
199 | ||
611cb4a5 DJ |
200 | /* See if any breakpoint claims ownership of STOP_PC. Call the handler for |
201 | the breakpoint, if found. */ | |
202 | ||
d50171e4 | 203 | void check_breakpoints (CORE_ADDR stop_pc); |
611cb4a5 DJ |
204 | |
205 | /* See if any breakpoints shadow the target memory area from MEM_ADDR | |
206 | to MEM_ADDR + MEM_LEN. Update the data already read from the target | |
207 | (in BUF) if necessary. */ | |
208 | ||
f450004a | 209 | void check_mem_read (CORE_ADDR mem_addr, unsigned char *buf, int mem_len); |
611cb4a5 DJ |
210 | |
211 | /* See if any breakpoints shadow the target memory area from MEM_ADDR | |
212 | to MEM_ADDR + MEM_LEN. Update the data to be written to the target | |
b9fd1791 PA |
213 | (in BUF, a copy of MYADDR on entry) if necessary, as well as the |
214 | original data for any breakpoints. */ | |
611cb4a5 | 215 | |
b9fd1791 PA |
216 | void check_mem_write (CORE_ADDR mem_addr, |
217 | unsigned char *buf, const unsigned char *myaddr, int mem_len); | |
611cb4a5 | 218 | |
ae13219e DJ |
219 | /* Delete all breakpoints. */ |
220 | ||
221 | void delete_all_breakpoints (void); | |
222 | ||
f9e39928 PA |
223 | /* Clear the "inserted" flag in all breakpoints of PROC. */ |
224 | ||
225 | void mark_breakpoints_out (struct process_info *proc); | |
226 | ||
95954743 PA |
227 | /* Delete all breakpoints, but do not try to un-insert them from the |
228 | inferior. */ | |
229 | ||
230 | void free_all_breakpoints (struct process_info *proc); | |
231 | ||
d3bbe7a0 PA |
232 | /* Check if breakpoints still seem to be inserted in the inferior. */ |
233 | ||
234 | void validate_breakpoints (void); | |
235 | ||
fa593d66 PA |
236 | /* Insert a fast tracepoint jump at WHERE, using instruction INSN, of |
237 | LENGTH bytes. */ | |
238 | ||
239 | struct fast_tracepoint_jump *set_fast_tracepoint_jump (CORE_ADDR where, | |
240 | unsigned char *insn, | |
241 | ULONGEST length); | |
242 | ||
5c73ff4e YQ |
243 | /* Increment reference counter of JP. */ |
244 | void inc_ref_fast_tracepoint_jump (struct fast_tracepoint_jump *jp); | |
245 | ||
fa593d66 PA |
246 | /* Delete fast tracepoint jump TODEL from our tables, and uninsert if |
247 | from memory. */ | |
248 | ||
249 | int delete_fast_tracepoint_jump (struct fast_tracepoint_jump *todel); | |
250 | ||
251 | /* Returns true if there's fast tracepoint jump set at WHERE. */ | |
252 | ||
253 | int fast_tracepoint_jump_here (CORE_ADDR); | |
254 | ||
255 | /* Uninsert fast tracepoint jumps at WHERE (and change their status to | |
256 | uninserted). This still leaves the tracepoints in the table. */ | |
257 | ||
258 | void uninsert_fast_tracepoint_jumps_at (CORE_ADDR pc); | |
259 | ||
260 | /* Reinsert fast tracepoint jumps at WHERE (and change their status to | |
261 | inserted). */ | |
262 | ||
263 | void reinsert_fast_tracepoint_jumps_at (CORE_ADDR where); | |
264 | ||
802e8e6d PA |
265 | /* Insert a memory breakpoint. */ |
266 | ||
267 | int insert_memory_breakpoint (struct raw_breakpoint *bp); | |
268 | ||
269 | /* Remove a previously inserted memory breakpoint. */ | |
270 | ||
271 | int remove_memory_breakpoint (struct raw_breakpoint *bp); | |
272 | ||
63c40ec7 YQ |
273 | /* Create a new breakpoint list in CHILD_THREAD's process that is a |
274 | copy of breakpoint list in PARENT_THREAD's process. */ | |
ddcbc397 | 275 | |
63c40ec7 YQ |
276 | void clone_all_breakpoints (struct thread_info *child_thread, |
277 | const struct thread_info *parent_thread); | |
ddcbc397 | 278 | |
1a5c2598 | 279 | #endif /* GDBSERVER_MEM_BREAK_H */ |