Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(151)

Side by Side Diff: gdb/i386-nat.c

Issue 11969036: Merge GDB 7.5.1 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@master
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gdb/i386-nat.h ('k') | gdb/i386-nto-tdep.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* Native-dependent code for the i386. 1 /* Native-dependent code for the i386.
2 2
3 Copyright (C) 2001, 2004-2005, 2007-2012 Free Software Foundation, 3 Copyright (C) 2001, 2004-2005, 2007-2012 Free Software Foundation,
4 Inc. 4 Inc.
5 5
6 This file is part of GDB. 6 This file is part of GDB.
7 7
8 This program is free software; you can redistribute it and/or modify 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 9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or 10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version. 11 (at your option) any later version.
12 12
13 This program is distributed in the hope that it will be useful, 13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details. 16 GNU General Public License for more details.
17 17
18 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 20
21 #include "i386-nat.h" 21 #include "i386-nat.h"
22 #include "defs.h" 22 #include "defs.h"
23 #include "breakpoint.h" 23 #include "breakpoint.h"
24 #include "command.h" 24 #include "command.h"
25 #include "gdbcmd.h" 25 #include "gdbcmd.h"
26 #include "target.h" 26 #include "target.h"
27 #include "gdb_assert.h" 27 #include "gdb_assert.h"
28 #include "inferior.h"
28 29
29 /* Support for hardware watchpoints and breakpoints using the i386 30 /* Support for hardware watchpoints and breakpoints using the i386
30 debug registers. 31 debug registers.
31 32
32 This provides several functions for inserting and removing 33 This provides several functions for inserting and removing
33 hardware-assisted breakpoints and watchpoints, testing if one or 34 hardware-assisted breakpoints and watchpoints, testing if one or
34 more of the watchpoints triggered and at what address, checking 35 more of the watchpoints triggered and at what address, checking
35 whether a given region can be watched, etc. 36 whether a given region can be watched, etc.
36 37
37 The functions below implement debug registers sharing by reference 38 The functions below implement debug registers sharing by reference
38 counts, and allow to watch regions up to 16 bytes long. */ 39 counts, and allow to watch regions up to 16 bytes long. */
39 40
40 struct i386_dr_low_type i386_dr_low; 41 struct i386_dr_low_type i386_dr_low;
41 42
42 43
43 /* Support for 8-byte wide hw watchpoints. */ 44 /* Support for 8-byte wide hw watchpoints. */
44 #define TARGET_HAS_DR_LEN_8 (i386_dr_low.debug_register_length == 8) 45 #define TARGET_HAS_DR_LEN_8 (i386_dr_low.debug_register_length == 8)
45 46
46 /* Debug registers' indices. */
47 #define DR_NADDR 4 /* The number of debug address registers. */
48 #define DR_STATUS 6 /* Index of debug status register (DR6). */
49 #define DR_CONTROL 7 /* Index of debug control register (DR7). */
50
51 /* DR7 Debug Control register fields. */ 47 /* DR7 Debug Control register fields. */
52 48
53 /* How many bits to skip in DR7 to get to R/W and LEN fields. */ 49 /* How many bits to skip in DR7 to get to R/W and LEN fields. */
54 #define DR_CONTROL_SHIFT 16 50 #define DR_CONTROL_SHIFT 16
55 /* How many bits in DR7 per R/W and LEN field for each watchpoint. */ 51 /* How many bits in DR7 per R/W and LEN field for each watchpoint. */
56 #define DR_CONTROL_SIZE 4 52 #define DR_CONTROL_SIZE 4
57 53
58 /* Watchpoint/breakpoint read/write fields in DR7. */ 54 /* Watchpoint/breakpoint read/write fields in DR7. */
59 #define DR_RW_EXECUTE (0x0) /* Break on instruction execution. */ 55 #define DR_RW_EXECUTE (0x0) /* Break on instruction execution. */
60 #define DR_RW_WRITE (0x1) /* Break on data writes. */ 56 #define DR_RW_WRITE (0x1) /* Break on data writes. */
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 147
152 /* Mask that this I'th watchpoint has triggered. */ 148 /* Mask that this I'th watchpoint has triggered. */
153 #define I386_DR_WATCH_MASK(i) (1 << (i)) 149 #define I386_DR_WATCH_MASK(i) (1 << (i))
154 150
155 /* Did the watchpoint whose address is in the I'th register break? */ 151 /* Did the watchpoint whose address is in the I'th register break? */
156 #define I386_DR_WATCH_HIT(dr6, i) ((dr6) & (1 << (i))) 152 #define I386_DR_WATCH_HIT(dr6, i) ((dr6) & (1 << (i)))
157 153
158 /* A macro to loop over all debug registers. */ 154 /* A macro to loop over all debug registers. */
159 #define ALL_DEBUG_REGISTERS(i) for (i = 0; i < DR_NADDR; i++) 155 #define ALL_DEBUG_REGISTERS(i) for (i = 0; i < DR_NADDR; i++)
160 156
161
162 /* Global state needed to track h/w watchpoints. */
163
164 struct i386_debug_reg_state
165 {
166 /* Mirror the inferior's DRi registers. We keep the status and
167 control registers separated because they don't hold addresses.
168 Note that since we can change these mirrors while threads are
169 running, we never trust them to explain a cause of a trap.
170 For that, we need to peek directly in the inferior registers. */
171 CORE_ADDR dr_mirror[DR_NADDR];
172 unsigned dr_status_mirror, dr_control_mirror;
173
174 /* Reference counts for each debug register. */
175 int dr_ref_count[DR_NADDR];
176 };
177
178 /* Clear the reference counts and forget everything we knew about the 157 /* Clear the reference counts and forget everything we knew about the
179 debug registers. */ 158 debug registers. */
180 159
181 static void 160 static void
182 i386_init_dregs (struct i386_debug_reg_state *state) 161 i386_init_dregs (struct i386_debug_reg_state *state)
183 { 162 {
184 int i; 163 int i;
185 164
186 ALL_DEBUG_REGISTERS (i) 165 ALL_DEBUG_REGISTERS (i)
187 { 166 {
188 state->dr_mirror[i] = 0; 167 state->dr_mirror[i] = 0;
189 state->dr_ref_count[i] = 0; 168 state->dr_ref_count[i] = 0;
190 } 169 }
191 state->dr_control_mirror = 0; 170 state->dr_control_mirror = 0;
192 state->dr_status_mirror = 0; 171 state->dr_status_mirror = 0;
193 } 172 }
194 173
195 static struct i386_debug_reg_state dr_mirror; 174 /* Per-inferior data key. */
175 static const struct inferior_data *i386_inferior_data;
176
177 /* Per-inferior data. */
178 struct i386_inferior_data
179 {
180 /* Copy of i386 hardware debug registers for performance reasons. */
181 struct i386_debug_reg_state state;
182 };
183
184 /* Per-inferior hook for register_inferior_data_with_cleanup. */
185
186 static void
187 i386_inferior_data_cleanup (struct inferior *inf, void *arg)
188 {
189 struct i386_inferior_data *inf_data = arg;
190
191 xfree (inf_data);
192 }
193
194 /* Get data specific for INFERIOR_PTID LWP. Return special data area
195 for processes being detached. */
196
197 static struct i386_inferior_data *
198 i386_inferior_data_get (void)
199 {
200 struct inferior *inf = current_inferior ();
201 struct i386_inferior_data *inf_data;
202
203 inf_data = inferior_data (inf, i386_inferior_data);
204 if (inf_data == NULL)
205 {
206 inf_data = xzalloc (sizeof (*inf_data));
207 set_inferior_data (current_inferior (), i386_inferior_data, inf_data);
208 }
209
210 if (inf->pid != ptid_get_pid (inferior_ptid))
211 {
212 /* INFERIOR_PTID is being detached from the inferior INF.
213 » Provide local cache specific for the detached LWP. */
214
215 static struct i386_inferior_data detached_inf_data_local;
216 static int detached_inf_pid = -1;
217
218 if (detached_inf_pid != ptid_get_pid (inferior_ptid))
219 » {
220 » /* Reinitialize the local cache if INFERIOR_PTID is
221 » different from the LWP last detached.
222
223 » Linux kernel before 2.6.33 commit
224 » 72f674d203cd230426437cdcf7dd6f681dad8b0d
225 » will inherit hardware debug registers from parent
226 » on fork/vfork/clone. Newer Linux kernels create such tasks with
227 » zeroed debug registers.
228
229 » GDB will remove all breakpoints (and watchpoints) from the forked
230 » off process. We also need to reset the debug registers in that
231 » process to be compatible with the older Linux kernels.
232
233 » Copy the debug registers mirrors into the new process so that all
234 » breakpoints and watchpoints can be removed together. The debug
235 » registers mirror will become zeroed in the end before detaching
236 » the forked off process. */
237
238 » detached_inf_pid = ptid_get_pid (inferior_ptid);
239 » detached_inf_data_local = *inf_data;
240 » }
241
242 return &detached_inf_data_local;
243 }
244
245 return inf_data;
246 }
247
248 /* Get debug registers state for INFERIOR_PTID, see
249 i386_inferior_data_get. */
250
251 struct i386_debug_reg_state *
252 i386_debug_reg_state (void)
253 {
254 return &i386_inferior_data_get ()->state;
255 }
196 256
197 /* Whether or not to print the mirrored debug registers. */ 257 /* Whether or not to print the mirrored debug registers. */
198 static int maint_show_dr; 258 static int maint_show_dr;
199 259
200 /* Types of operations supported by i386_handle_nonaligned_watchpoint. */ 260 /* Types of operations supported by i386_handle_nonaligned_watchpoint. */
201 typedef enum { WP_INSERT, WP_REMOVE, WP_COUNT } i386_wp_op_t; 261 typedef enum { WP_INSERT, WP_REMOVE, WP_COUNT } i386_wp_op_t;
202 262
203 /* Internal functions. */ 263 /* Internal functions. */
204 264
205 /* Return the value of a 4-bit field for DR7 suitable for watching a 265 /* Return the value of a 4-bit field for DR7 suitable for watching a
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 enum target_hw_bp_type type); 297 enum target_hw_bp_type type);
238 298
239 /* Implementation. */ 299 /* Implementation. */
240 300
241 /* Clear the reference counts and forget everything we knew about the 301 /* Clear the reference counts and forget everything we knew about the
242 debug registers. */ 302 debug registers. */
243 303
244 void 304 void
245 i386_cleanup_dregs (void) 305 i386_cleanup_dregs (void)
246 { 306 {
247 i386_init_dregs (&dr_mirror); 307 struct i386_debug_reg_state *state = i386_debug_reg_state ();
308
309 i386_init_dregs (state);
248 } 310 }
249 311
250 /* Print the values of the mirrored debug registers. This is called 312 /* Print the values of the mirrored debug registers. This is called
251 when maint_show_dr is non-zero. To set that up, type "maint 313 when maint_show_dr is non-zero. To set that up, type "maint
252 show-debug-regs" at GDB's prompt. */ 314 show-debug-regs" at GDB's prompt. */
253 315
254 static void 316 static void
255 i386_show_dr (struct i386_debug_reg_state *state, 317 i386_show_dr (struct i386_debug_reg_state *state,
256 const char *func, CORE_ADDR addr, 318 const char *func, CORE_ADDR addr,
257 int len, enum target_hw_bp_type type) 319 int len, enum target_hw_bp_type type)
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 563
502 return retval; 564 return retval;
503 } 565 }
504 566
505 /* Update the inferior's debug registers with the new debug registers 567 /* Update the inferior's debug registers with the new debug registers
506 state, in NEW_STATE, and then update our local mirror to match. */ 568 state, in NEW_STATE, and then update our local mirror to match. */
507 569
508 static void 570 static void
509 i386_update_inferior_debug_regs (struct i386_debug_reg_state *new_state) 571 i386_update_inferior_debug_regs (struct i386_debug_reg_state *new_state)
510 { 572 {
573 struct i386_debug_reg_state *state = i386_debug_reg_state ();
511 int i; 574 int i;
512 575
513 ALL_DEBUG_REGISTERS (i) 576 ALL_DEBUG_REGISTERS (i)
514 { 577 {
515 if (I386_DR_VACANT (new_state, i) != I386_DR_VACANT (&dr_mirror, i)) 578 if (I386_DR_VACANT (new_state, i) != I386_DR_VACANT (state, i))
516 » { 579 » i386_dr_low.set_addr (i, new_state->dr_mirror[i]);
517 » if (!I386_DR_VACANT (new_state, i))
518 » {
519 » i386_dr_low.set_addr (i, new_state->dr_mirror[i]);
520
521 » /* Only a sanity check for leftover bits (set possibly only
522 » » by inferior). */
523 » if (i386_dr_low.unset_status)
524 » » i386_dr_low.unset_status (I386_DR_WATCH_MASK (i));
525 » }
526 » else
527 » {
528 » if (i386_dr_low.reset_addr)
529 » » i386_dr_low.reset_addr (i);
530 » }
531 » }
532 else 580 else
533 » gdb_assert (new_state->dr_mirror[i] == dr_mirror.dr_mirror[i]); 581 » gdb_assert (new_state->dr_mirror[i] == state->dr_mirror[i]);
534 } 582 }
535 583
536 if (new_state->dr_control_mirror != dr_mirror.dr_control_mirror) 584 if (new_state->dr_control_mirror != state->dr_control_mirror)
537 i386_dr_low.set_control (new_state->dr_control_mirror); 585 i386_dr_low.set_control (new_state->dr_control_mirror);
538 586
539 dr_mirror = *new_state; 587 *state = *new_state;
540 } 588 }
541 589
542 /* Insert a watchpoint to watch a memory region which starts at 590 /* Insert a watchpoint to watch a memory region which starts at
543 address ADDR and whose length is LEN bytes. Watch memory accesses 591 address ADDR and whose length is LEN bytes. Watch memory accesses
544 of the type TYPE. Return 0 on success, -1 on failure. */ 592 of the type TYPE. Return 0 on success, -1 on failure. */
545 593
546 static int 594 static int
547 i386_insert_watchpoint (CORE_ADDR addr, int len, int type, 595 i386_insert_watchpoint (CORE_ADDR addr, int len, int type,
548 struct expression *cond) 596 struct expression *cond)
549 { 597 {
598 struct i386_debug_reg_state *state = i386_debug_reg_state ();
550 int retval; 599 int retval;
551 /* Work on a local copy of the debug registers, and on success, 600 /* Work on a local copy of the debug registers, and on success,
552 commit the change back to the inferior. */ 601 commit the change back to the inferior. */
553 struct i386_debug_reg_state local_state = dr_mirror; 602 struct i386_debug_reg_state local_state = *state;
554 603
555 if (type == hw_read) 604 if (type == hw_read)
556 return 1; /* unsupported */ 605 return 1; /* unsupported */
557 606
558 if (((len != 1 && len !=2 && len !=4) && !(TARGET_HAS_DR_LEN_8 && len == 8)) 607 if (((len != 1 && len !=2 && len !=4) && !(TARGET_HAS_DR_LEN_8 && len == 8))
559 || addr % len != 0) 608 || addr % len != 0)
560 retval = i386_handle_nonaligned_watchpoint (&local_state, 609 retval = i386_handle_nonaligned_watchpoint (&local_state,
561 WP_INSERT, addr, len, type); 610 WP_INSERT, addr, len, type);
562 else 611 else
563 { 612 {
564 unsigned len_rw = i386_length_and_rw_bits (len, type); 613 unsigned len_rw = i386_length_and_rw_bits (len, type);
565 614
566 retval = i386_insert_aligned_watchpoint (&local_state, 615 retval = i386_insert_aligned_watchpoint (&local_state,
567 addr, len_rw); 616 addr, len_rw);
568 } 617 }
569 618
570 if (retval == 0) 619 if (retval == 0)
571 i386_update_inferior_debug_regs (&local_state); 620 i386_update_inferior_debug_regs (&local_state);
572 621
573 if (maint_show_dr) 622 if (maint_show_dr)
574 i386_show_dr (&dr_mirror, "insert_watchpoint", addr, len, type); 623 i386_show_dr (state, "insert_watchpoint", addr, len, type);
575 624
576 return retval; 625 return retval;
577 } 626 }
578 627
579 /* Remove a watchpoint that watched the memory region which starts at 628 /* Remove a watchpoint that watched the memory region which starts at
580 address ADDR, whose length is LEN bytes, and for accesses of the 629 address ADDR, whose length is LEN bytes, and for accesses of the
581 type TYPE. Return 0 on success, -1 on failure. */ 630 type TYPE. Return 0 on success, -1 on failure. */
582 static int 631 static int
583 i386_remove_watchpoint (CORE_ADDR addr, int len, int type, 632 i386_remove_watchpoint (CORE_ADDR addr, int len, int type,
584 struct expression *cond) 633 struct expression *cond)
585 { 634 {
635 struct i386_debug_reg_state *state = i386_debug_reg_state ();
586 int retval; 636 int retval;
587 /* Work on a local copy of the debug registers, and on success, 637 /* Work on a local copy of the debug registers, and on success,
588 commit the change back to the inferior. */ 638 commit the change back to the inferior. */
589 struct i386_debug_reg_state local_state = dr_mirror; 639 struct i386_debug_reg_state local_state = *state;
590 640
591 if (((len != 1 && len !=2 && len !=4) && !(TARGET_HAS_DR_LEN_8 && len == 8)) 641 if (((len != 1 && len !=2 && len !=4) && !(TARGET_HAS_DR_LEN_8 && len == 8))
592 || addr % len != 0) 642 || addr % len != 0)
593 retval = i386_handle_nonaligned_watchpoint (&local_state, 643 retval = i386_handle_nonaligned_watchpoint (&local_state,
594 WP_REMOVE, addr, len, type); 644 WP_REMOVE, addr, len, type);
595 else 645 else
596 { 646 {
597 unsigned len_rw = i386_length_and_rw_bits (len, type); 647 unsigned len_rw = i386_length_and_rw_bits (len, type);
598 648
599 retval = i386_remove_aligned_watchpoint (&local_state, 649 retval = i386_remove_aligned_watchpoint (&local_state,
600 addr, len_rw); 650 addr, len_rw);
601 } 651 }
602 652
603 if (retval == 0) 653 if (retval == 0)
604 i386_update_inferior_debug_regs (&local_state); 654 i386_update_inferior_debug_regs (&local_state);
605 655
606 if (maint_show_dr) 656 if (maint_show_dr)
607 i386_show_dr (&dr_mirror, "remove_watchpoint", addr, len, type); 657 i386_show_dr (state, "remove_watchpoint", addr, len, type);
608 658
609 return retval; 659 return retval;
610 } 660 }
611 661
612 /* Return non-zero if we can watch a memory region that starts at 662 /* Return non-zero if we can watch a memory region that starts at
613 address ADDR and whose length is LEN bytes. */ 663 address ADDR and whose length is LEN bytes. */
614 664
615 static int 665 static int
616 i386_region_ok_for_watchpoint (CORE_ADDR addr, int len) 666 i386_region_ok_for_watchpoint (CORE_ADDR addr, int len)
617 { 667 {
668 struct i386_debug_reg_state *state = i386_debug_reg_state ();
618 int nregs; 669 int nregs;
619 670
620 /* Compute how many aligned watchpoints we would need to cover this 671 /* Compute how many aligned watchpoints we would need to cover this
621 region. */ 672 region. */
622 nregs = i386_handle_nonaligned_watchpoint (&dr_mirror, 673 nregs = i386_handle_nonaligned_watchpoint (state,
623 WP_COUNT, addr, len, hw_write); 674 WP_COUNT, addr, len, hw_write);
624 return nregs <= DR_NADDR ? 1 : 0; 675 return nregs <= DR_NADDR ? 1 : 0;
625 } 676 }
626 677
627 /* If the inferior has some watchpoint that triggered, set the 678 /* If the inferior has some watchpoint that triggered, set the
628 address associated with that watchpoint and return non-zero. 679 address associated with that watchpoint and return non-zero.
629 Otherwise, return zero. */ 680 Otherwise, return zero. */
630 681
631 static int 682 static int
632 i386_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p) 683 i386_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
633 { 684 {
685 struct i386_debug_reg_state *state = i386_debug_reg_state ();
634 CORE_ADDR addr = 0; 686 CORE_ADDR addr = 0;
635 int i; 687 int i;
636 int rc = 0; 688 int rc = 0;
689 /* The current thread's DR_STATUS. We always need to read this to
690 check whether some watchpoint caused the trap. */
637 unsigned status; 691 unsigned status;
638 unsigned control; 692 /* We need DR_CONTROL as well, but only iff DR_STATUS indicates a
639 struct i386_debug_reg_state *state = &dr_mirror; 693 data breakpoint trap. Only fetch it when necessary, to avoid an
694 unnecessary extra syscall when no watchpoint triggered. */
695 int control_p = 0;
696 unsigned control = 0;
640 697
641 dr_mirror.dr_status_mirror = i386_dr_low.get_status (); 698 /* In non-stop/async, threads can be running while we change the
642 status = dr_mirror.dr_status_mirror; 699 STATE (and friends). Say, we set a watchpoint, and let threads
643 control = dr_mirror.dr_control_mirror; 700 resume. Now, say you delete the watchpoint, or add/remove
701 watchpoints such that STATE changes while threads are running.
702 On targets that support non-stop, inserting/deleting watchpoints
703 updates the STATE only. It does not update the real thread's
704 debug registers; that's only done prior to resume. Instead, if
705 threads are running when the mirror changes, a temporary and
706 transparent stop on all threads is forced so they can get their
707 copy of the debug registers updated on re-resume. Now, say,
708 a thread hit a watchpoint before having been updated with the new
709 STATE contents, and we haven't yet handled the corresponding
710 SIGTRAP. If we trusted STATE below, we'd mistake the real
711 trapped address (from the last time we had updated debug
712 registers in the thread) with whatever was currently in STATE.
713 So to fix this, STATE always represents intention, what we _want_
714 threads to have in debug registers. To get at the address and
715 cause of the trap, we need to read the state the thread still has
716 in its debug registers.
717
718 In sum, always get the current debug register values the current
719 thread has, instead of trusting the global mirror. If the thread
720 was running when we last changed watchpoints, the mirror no
721 longer represents what was set in this thread's debug
722 registers. */
723 status = i386_dr_low.get_status ();
644 724
645 ALL_DEBUG_REGISTERS(i) 725 ALL_DEBUG_REGISTERS(i)
646 { 726 {
647 if (I386_DR_WATCH_HIT (status, i) 727 if (!I386_DR_WATCH_HIT (status, i))
648 » /* This second condition makes sure DRi is set up for a data 728 » continue;
649 » watchpoint, not a hardware breakpoint. The reason is 729
650 » that GDB doesn't call the target_stopped_data_address 730 if (!control_p)
651 » method except for data watchpoints. In other words, I'm
652 » being paranoiac. */
653 » && I386_DR_GET_RW_LEN (control, i) != 0
654 » /* This third condition makes sure DRi is not vacant, this
655 » avoids false positives in windows-nat.c. */
656 » && !I386_DR_VACANT (state, i))
657 { 731 {
658 » addr = state->dr_mirror[i]; 732 » control = i386_dr_low.get_control ();
733 » control_p = 1;
734 » }
735
736 /* This second condition makes sure DRi is set up for a data
737 » watchpoint, not a hardware breakpoint. The reason is that
738 » GDB doesn't call the target_stopped_data_address method
739 » except for data watchpoints. In other words, I'm being
740 » paranoiac. */
741 if (I386_DR_GET_RW_LEN (control, i) != 0)
742 » {
743 » addr = i386_dr_low.get_addr (i);
659 rc = 1; 744 rc = 1;
660 if (maint_show_dr) 745 if (maint_show_dr)
661 » i386_show_dr (&dr_mirror, "watchpoint_hit", addr, -1, hw_write); 746 » i386_show_dr (state, "watchpoint_hit", addr, -1, hw_write);
662 } 747 }
663 } 748 }
664 if (maint_show_dr && addr == 0) 749 if (maint_show_dr && addr == 0)
665 i386_show_dr (&dr_mirror, "stopped_data_addr", 0, 0, hw_write); 750 i386_show_dr (state, "stopped_data_addr", 0, 0, hw_write);
666 751
667 if (rc) 752 if (rc)
668 *addr_p = addr; 753 *addr_p = addr;
669 return rc; 754 return rc;
670 } 755 }
671 756
672 static int 757 static int
673 i386_stopped_by_watchpoint (void) 758 i386_stopped_by_watchpoint (void)
674 { 759 {
675 CORE_ADDR addr = 0; 760 CORE_ADDR addr = 0;
676 return i386_stopped_data_address (&current_target, &addr); 761 return i386_stopped_data_address (&current_target, &addr);
677 } 762 }
678 763
679 /* Insert a hardware-assisted breakpoint at BP_TGT->placed_address. 764 /* Insert a hardware-assisted breakpoint at BP_TGT->placed_address.
680 Return 0 on success, EBUSY on failure. */ 765 Return 0 on success, EBUSY on failure. */
681 static int 766 static int
682 i386_insert_hw_breakpoint (struct gdbarch *gdbarch, 767 i386_insert_hw_breakpoint (struct gdbarch *gdbarch,
683 struct bp_target_info *bp_tgt) 768 struct bp_target_info *bp_tgt)
684 { 769 {
770 struct i386_debug_reg_state *state = i386_debug_reg_state ();
685 unsigned len_rw = i386_length_and_rw_bits (1, hw_execute); 771 unsigned len_rw = i386_length_and_rw_bits (1, hw_execute);
686 CORE_ADDR addr = bp_tgt->placed_address; 772 CORE_ADDR addr = bp_tgt->placed_address;
687 /* Work on a local copy of the debug registers, and on success, 773 /* Work on a local copy of the debug registers, and on success,
688 commit the change back to the inferior. */ 774 commit the change back to the inferior. */
689 struct i386_debug_reg_state local_state = dr_mirror; 775 struct i386_debug_reg_state local_state = *state;
690 int retval = i386_insert_aligned_watchpoint (&local_state, 776 int retval = i386_insert_aligned_watchpoint (&local_state,
691 addr, len_rw) ? EBUSY : 0; 777 addr, len_rw) ? EBUSY : 0;
692 778
693 if (retval == 0) 779 if (retval == 0)
694 i386_update_inferior_debug_regs (&local_state); 780 i386_update_inferior_debug_regs (&local_state);
695 781
696 if (maint_show_dr) 782 if (maint_show_dr)
697 i386_show_dr (&dr_mirror, "insert_hwbp", addr, 1, hw_execute); 783 i386_show_dr (state, "insert_hwbp", addr, 1, hw_execute);
698 784
699 return retval; 785 return retval;
700 } 786 }
701 787
702 /* Remove a hardware-assisted breakpoint at BP_TGT->placed_address. 788 /* Remove a hardware-assisted breakpoint at BP_TGT->placed_address.
703 Return 0 on success, -1 on failure. */ 789 Return 0 on success, -1 on failure. */
704 790
705 static int 791 static int
706 i386_remove_hw_breakpoint (struct gdbarch *gdbarch, 792 i386_remove_hw_breakpoint (struct gdbarch *gdbarch,
707 struct bp_target_info *bp_tgt) 793 struct bp_target_info *bp_tgt)
708 { 794 {
795 struct i386_debug_reg_state *state = i386_debug_reg_state ();
709 unsigned len_rw = i386_length_and_rw_bits (1, hw_execute); 796 unsigned len_rw = i386_length_and_rw_bits (1, hw_execute);
710 CORE_ADDR addr = bp_tgt->placed_address; 797 CORE_ADDR addr = bp_tgt->placed_address;
711 /* Work on a local copy of the debug registers, and on success, 798 /* Work on a local copy of the debug registers, and on success,
712 commit the change back to the inferior. */ 799 commit the change back to the inferior. */
713 struct i386_debug_reg_state local_state = dr_mirror; 800 struct i386_debug_reg_state local_state = *state;
714 int retval = i386_remove_aligned_watchpoint (&local_state, 801 int retval = i386_remove_aligned_watchpoint (&local_state,
715 addr, len_rw); 802 addr, len_rw);
716 803
717 if (retval == 0) 804 if (retval == 0)
718 i386_update_inferior_debug_regs (&local_state); 805 i386_update_inferior_debug_regs (&local_state);
719 806
720 if (maint_show_dr) 807 if (maint_show_dr)
721 i386_show_dr (&dr_mirror, "remove_hwbp", addr, 1, hw_execute); 808 i386_show_dr (state, "remove_hwbp", addr, 1, hw_execute);
722 809
723 return retval; 810 return retval;
724 } 811 }
725 812
726 /* Returns the number of hardware watchpoints of type TYPE that we can 813 /* Returns the number of hardware watchpoints of type TYPE that we can
727 set. Value is positive if we can set CNT watchpoints, zero if 814 set. Value is positive if we can set CNT watchpoints, zero if
728 setting watchpoints of type TYPE is not supported, and negative if 815 setting watchpoints of type TYPE is not supported, and negative if
729 CNT is more than the maximum number of watchpoints of type TYPE 816 CNT is more than the maximum number of watchpoints of type TYPE
730 that we can support. TYPE is one of bp_hardware_watchpoint, 817 that we can support. TYPE is one of bp_hardware_watchpoint,
731 bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint. 818 bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 t->to_have_continuable_watchpoint = 1; 863 t->to_have_continuable_watchpoint = 1;
777 864
778 t->to_can_use_hw_breakpoint = i386_can_use_hw_breakpoint; 865 t->to_can_use_hw_breakpoint = i386_can_use_hw_breakpoint;
779 t->to_region_ok_for_hw_watchpoint = i386_region_ok_for_watchpoint; 866 t->to_region_ok_for_hw_watchpoint = i386_region_ok_for_watchpoint;
780 t->to_stopped_by_watchpoint = i386_stopped_by_watchpoint; 867 t->to_stopped_by_watchpoint = i386_stopped_by_watchpoint;
781 t->to_stopped_data_address = i386_stopped_data_address; 868 t->to_stopped_data_address = i386_stopped_data_address;
782 t->to_insert_watchpoint = i386_insert_watchpoint; 869 t->to_insert_watchpoint = i386_insert_watchpoint;
783 t->to_remove_watchpoint = i386_remove_watchpoint; 870 t->to_remove_watchpoint = i386_remove_watchpoint;
784 t->to_insert_hw_breakpoint = i386_insert_hw_breakpoint; 871 t->to_insert_hw_breakpoint = i386_insert_hw_breakpoint;
785 t->to_remove_hw_breakpoint = i386_remove_hw_breakpoint; 872 t->to_remove_hw_breakpoint = i386_remove_hw_breakpoint;
873
874 if (i386_inferior_data == NULL)
875 i386_inferior_data
876 = register_inferior_data_with_cleanup (i386_inferior_data_cleanup);
786 } 877 }
787 878
788 void 879 void
789 i386_set_debug_register_length (int len) 880 i386_set_debug_register_length (int len)
790 { 881 {
791 /* This function should be called only once for each native target. */ 882 /* This function should be called only once for each native target. */
792 gdb_assert (i386_dr_low.debug_register_length == 0); 883 gdb_assert (i386_dr_low.debug_register_length == 0);
793 gdb_assert (len == 4 || len == 8); 884 gdb_assert (len == 4 || len == 8);
794 i386_dr_low.debug_register_length = len; 885 i386_dr_low.debug_register_length = len;
795 add_show_debug_regs_command (); 886 add_show_debug_regs_command ();
796 } 887 }
OLDNEW
« no previous file with comments | « gdb/i386-nat.h ('k') | gdb/i386-nto-tdep.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698