Sync config.sub,config.guess with upstream.
[deliverable/binutils-gdb.git] / gdb / x86-nat.c
CommitLineData
df7e5265 1/* Native-dependent code for x86 (i386 and x86-64).
7fa2737c 2
618f726f 3 Copyright (C) 2001-2016 Free Software Foundation, Inc.
52b98211
EZ
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
52b98211
EZ
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
52b98211
EZ
19
20#include "defs.h"
df7e5265 21#include "x86-nat.h"
52b98211 22#include "gdbcmd.h"
4403d8e9 23#include "inferior.h"
52b98211 24
df7e5265 25/* Support for hardware watchpoints and breakpoints using the x86
52b98211
EZ
26 debug registers.
27
28 This provides several functions for inserting and removing
7fa2737c
MK
29 hardware-assisted breakpoints and watchpoints, testing if one or
30 more of the watchpoints triggered and at what address, checking
31 whether a given region can be watched, etc.
32
7fa2737c
MK
33 The functions below implement debug registers sharing by reference
34 counts, and allow to watch regions up to 16 bytes long. */
52b98211 35
6e62758f 36/* Low-level function vector. */
df7e5265 37struct x86_dr_low_type x86_dr_low;
9bb9e8ad 38
26cb8b7c
PA
39/* Per-process data. We don't bind this to a per-inferior registry
40 because of targets like x86 GNU/Linux that need to keep track of
41 processes that aren't bound to any inferior (e.g., fork children,
42 checkpoints). */
1ced966e 43
df7e5265 44struct x86_process_info
1ced966e 45{
26cb8b7c 46 /* Linked list. */
df7e5265 47 struct x86_process_info *next;
1ced966e 48
26cb8b7c
PA
49 /* The process identifier. */
50 pid_t pid;
4403d8e9 51
df7e5265
GB
52 /* Copy of x86 hardware debug registers. */
53 struct x86_debug_reg_state state;
4403d8e9
JK
54};
55
df7e5265 56static struct x86_process_info *x86_process_list = NULL;
d0d8b0c6 57
26cb8b7c
PA
58/* Find process data for process PID. */
59
df7e5265
GB
60static struct x86_process_info *
61x86_find_process_pid (pid_t pid)
d0d8b0c6 62{
df7e5265 63 struct x86_process_info *proc;
26cb8b7c 64
df7e5265 65 for (proc = x86_process_list; proc; proc = proc->next)
26cb8b7c
PA
66 if (proc->pid == pid)
67 return proc;
d0d8b0c6 68
26cb8b7c 69 return NULL;
d0d8b0c6
JK
70}
71
26cb8b7c
PA
72/* Add process data for process PID. Returns newly allocated info
73 object. */
4403d8e9 74
df7e5265
GB
75static struct x86_process_info *
76x86_add_process (pid_t pid)
4403d8e9 77{
8d749320 78 struct x86_process_info *proc = XCNEW (struct x86_process_info);
d0d8b0c6 79
26cb8b7c 80 proc->pid = pid;
df7e5265
GB
81 proc->next = x86_process_list;
82 x86_process_list = proc;
4403d8e9 83
26cb8b7c
PA
84 return proc;
85}
4403d8e9 86
26cb8b7c
PA
87/* Get data specific info for process PID, creating it if necessary.
88 Never returns NULL. */
4403d8e9 89
df7e5265
GB
90static struct x86_process_info *
91x86_process_info_get (pid_t pid)
26cb8b7c 92{
df7e5265 93 struct x86_process_info *proc;
26cb8b7c 94
df7e5265 95 proc = x86_find_process_pid (pid);
26cb8b7c 96 if (proc == NULL)
df7e5265 97 proc = x86_add_process (pid);
4403d8e9 98
26cb8b7c 99 return proc;
4403d8e9
JK
100}
101
26cb8b7c 102/* Get debug registers state for process PID. */
52b98211 103
df7e5265
GB
104struct x86_debug_reg_state *
105x86_debug_reg_state (pid_t pid)
7b50312a 106{
df7e5265 107 return &x86_process_info_get (pid)->state;
26cb8b7c
PA
108}
109
030f17b5 110/* See declaration in x86-nat.h. */
26cb8b7c
PA
111
112void
df7e5265 113x86_forget_process (pid_t pid)
26cb8b7c 114{
df7e5265 115 struct x86_process_info *proc, **proc_link;
26cb8b7c 116
df7e5265
GB
117 proc = x86_process_list;
118 proc_link = &x86_process_list;
26cb8b7c
PA
119
120 while (proc != NULL)
121 {
122 if (proc->pid == pid)
123 {
124 *proc_link = proc->next;
125
126 xfree (proc);
127 return;
128 }
129
130 proc_link = &proc->next;
131 proc = *proc_link;
132 }
7b50312a
PA
133}
134
7fa2737c
MK
135/* Clear the reference counts and forget everything we knew about the
136 debug registers. */
137
52b98211 138void
df7e5265 139x86_cleanup_dregs (void)
52b98211 140{
26cb8b7c 141 /* Starting from scratch has the same effect. */
df7e5265 142 x86_forget_process (ptid_get_pid (inferior_ptid));
52b98211
EZ
143}
144
52b98211
EZ
145/* Insert a watchpoint to watch a memory region which starts at
146 address ADDR and whose length is LEN bytes. Watch memory accesses
147 of the type TYPE. Return 0 on success, -1 on failure. */
7fa2737c 148
9bb9e8ad 149static int
f486487f
SM
150x86_insert_watchpoint (struct target_ops *self, CORE_ADDR addr, int len,
151 enum target_hw_bp_type type, struct expression *cond)
52b98211 152{
df7e5265
GB
153 struct x86_debug_reg_state *state
154 = x86_debug_reg_state (ptid_get_pid (inferior_ptid));
52b98211 155
df7e5265 156 return x86_dr_insert_watchpoint (state, type, addr, len);
52b98211
EZ
157}
158
159/* Remove a watchpoint that watched the memory region which starts at
160 address ADDR, whose length is LEN bytes, and for accesses of the
161 type TYPE. Return 0 on success, -1 on failure. */
9bb9e8ad 162static int
f486487f
SM
163x86_remove_watchpoint (struct target_ops *self, CORE_ADDR addr, int len,
164 enum target_hw_bp_type type, struct expression *cond)
52b98211 165{
df7e5265
GB
166 struct x86_debug_reg_state *state
167 = x86_debug_reg_state (ptid_get_pid (inferior_ptid));
1ced966e 168
df7e5265 169 return x86_dr_remove_watchpoint (state, type, addr, len);
52b98211
EZ
170}
171
172/* Return non-zero if we can watch a memory region that starts at
173 address ADDR and whose length is LEN bytes. */
7fa2737c 174
9bb9e8ad 175static int
df7e5265
GB
176x86_region_ok_for_watchpoint (struct target_ops *self,
177 CORE_ADDR addr, int len)
52b98211 178{
df7e5265
GB
179 struct x86_debug_reg_state *state
180 = x86_debug_reg_state (ptid_get_pid (inferior_ptid));
7fa2737c 181
df7e5265 182 return x86_dr_region_ok_for_watchpoint (state, addr, len);
52b98211
EZ
183}
184
6e62758f
GB
185/* If the inferior has some break/watchpoint that triggered, set the
186 address associated with that break/watchpoint and return non-zero.
4aa7a7f5 187 Otherwise, return zero. */
7fa2737c 188
9bb9e8ad 189static int
df7e5265 190x86_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
52b98211 191{
df7e5265
GB
192 struct x86_debug_reg_state *state
193 = x86_debug_reg_state (ptid_get_pid (inferior_ptid));
52b98211 194
df7e5265 195 return x86_dr_stopped_data_address (state, addr_p);
4aa7a7f5
JJ
196}
197
6e62758f
GB
198/* Return non-zero if the inferior has some watchpoint that triggered.
199 Otherwise return zero. */
200
9bb9e8ad 201static int
df7e5265 202x86_stopped_by_watchpoint (struct target_ops *ops)
4aa7a7f5 203{
df7e5265
GB
204 struct x86_debug_reg_state *state
205 = x86_debug_reg_state (ptid_get_pid (inferior_ptid));
46e33252 206
df7e5265 207 return x86_dr_stopped_by_watchpoint (state);
52b98211
EZ
208}
209
0d5ed153 210/* Insert a hardware-assisted breakpoint at BP_TGT->reqstd_address.
8181d85f 211 Return 0 on success, EBUSY on failure. */
322a8e06 212
9bb9e8ad 213static int
df7e5265
GB
214x86_insert_hw_breakpoint (struct target_ops *self, struct gdbarch *gdbarch,
215 struct bp_target_info *bp_tgt)
52b98211 216{
df7e5265
GB
217 struct x86_debug_reg_state *state
218 = x86_debug_reg_state (ptid_get_pid (inferior_ptid));
46e33252 219
0d5ed153 220 bp_tgt->placed_address = bp_tgt->reqstd_address;
df7e5265
GB
221 return x86_dr_insert_watchpoint (state, hw_execute,
222 bp_tgt->placed_address, 1) ? EBUSY : 0;
52b98211
EZ
223}
224
8181d85f
DJ
225/* Remove a hardware-assisted breakpoint at BP_TGT->placed_address.
226 Return 0 on success, -1 on failure. */
7fa2737c 227
9bb9e8ad 228static int
df7e5265
GB
229x86_remove_hw_breakpoint (struct target_ops *self, struct gdbarch *gdbarch,
230 struct bp_target_info *bp_tgt)
52b98211 231{
df7e5265
GB
232 struct x86_debug_reg_state *state
233 = x86_debug_reg_state (ptid_get_pid (inferior_ptid));
46e33252 234
df7e5265
GB
235 return x86_dr_remove_watchpoint (state, hw_execute,
236 bp_tgt->placed_address, 1);
52b98211
EZ
237}
238
c03374d5
DJ
239/* Returns the number of hardware watchpoints of type TYPE that we can
240 set. Value is positive if we can set CNT watchpoints, zero if
241 setting watchpoints of type TYPE is not supported, and negative if
242 CNT is more than the maximum number of watchpoints of type TYPE
243 that we can support. TYPE is one of bp_hardware_watchpoint,
244 bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint.
245 CNT is the number of such watchpoints used so far (including this
246 one). OTHERTYPE is non-zero if other types of watchpoints are
247 currently enabled.
248
249 We always return 1 here because we don't have enough information
250 about possible overlap of addresses that they want to watch. As an
251 extreme example, consider the case where all the watchpoints watch
252 the same address and the same region length: then we can handle a
253 virtually unlimited number of watchpoints, due to debug register
030f17b5 254 sharing implemented via reference counts in x86-nat.c. */
c03374d5
DJ
255
256static int
df7e5265 257x86_can_use_hw_breakpoint (struct target_ops *self,
f486487f 258 enum bptype type, int cnt, int othertype)
c03374d5
DJ
259{
260 return 1;
261}
262
9bb9e8ad
PM
263static void
264add_show_debug_regs_command (void)
265{
266 /* A maintenance command to enable printing the internal DRi mirror
267 variables. */
268 add_setshow_boolean_cmd ("show-debug-regs", class_maintenance,
c5e92cca 269 &show_debug_regs, _("\
9bb9e8ad
PM
270Set whether to show variables that mirror the x86 debug registers."), _("\
271Show whether to show variables that mirror the x86 debug registers."), _("\
272Use \"on\" to enable, \"off\" to disable.\n\
273If enabled, the debug registers values are shown when GDB inserts\n\
274or removes a hardware breakpoint or watchpoint, and when the inferior\n\
275triggers a breakpoint or watchpoint."),
276 NULL,
277 NULL,
278 &maintenance_set_cmdlist,
279 &maintenance_show_cmdlist);
280}
281
282/* There are only two global functions left. */
283
c03374d5 284void
df7e5265 285x86_use_watchpoints (struct target_ops *t)
c03374d5
DJ
286{
287 /* After a watchpoint trap, the PC points to the instruction after the
288 one that caused the trap. Therefore we don't need to step over it.
289 But we do need to reset the status register to avoid another trap. */
290 t->to_have_continuable_watchpoint = 1;
291
df7e5265
GB
292 t->to_can_use_hw_breakpoint = x86_can_use_hw_breakpoint;
293 t->to_region_ok_for_hw_watchpoint = x86_region_ok_for_watchpoint;
294 t->to_stopped_by_watchpoint = x86_stopped_by_watchpoint;
295 t->to_stopped_data_address = x86_stopped_data_address;
296 t->to_insert_watchpoint = x86_insert_watchpoint;
297 t->to_remove_watchpoint = x86_remove_watchpoint;
298 t->to_insert_hw_breakpoint = x86_insert_hw_breakpoint;
299 t->to_remove_hw_breakpoint = x86_remove_hw_breakpoint;
c03374d5
DJ
300}
301
52b98211 302void
df7e5265 303x86_set_debug_register_length (int len)
52b98211 304{
9bb9e8ad 305 /* This function should be called only once for each native target. */
df7e5265 306 gdb_assert (x86_dr_low.debug_register_length == 0);
9bb9e8ad 307 gdb_assert (len == 4 || len == 8);
df7e5265 308 x86_dr_low.debug_register_length = len;
9bb9e8ad 309 add_show_debug_regs_command ();
52b98211 310}
This page took 1.272314 seconds and 4 git commands to generate.