From patchwork Tue Jun 17 14:12:47 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gary Benson X-Patchwork-Id: 1518 Received: (qmail 27885 invoked by alias); 17 Jun 2014 14:13:29 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 27727 invoked by uid 89); 17 Jun 2014 14:13:28 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS, T_FILL_THIS_FORM_SHORT autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 17 Jun 2014 14:13:07 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s5HED6qH006551 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 17 Jun 2014 10:13:06 -0400 Received: from blade.nx (ovpn-116-59.ams2.redhat.com [10.36.116.59]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s5HED4pE031544 for ; Tue, 17 Jun 2014 10:13:05 -0400 Received: from blade.nx (localhost [127.0.0.1]) by blade.nx (Postfix) with ESMTP id 5447226247F for ; Tue, 17 Jun 2014 15:13:04 +0100 (BST) From: Gary Benson To: gdb-patches@sourceware.org Subject: [PATCH 04/15] Comment changes Date: Tue, 17 Jun 2014 15:12:47 +0100 Message-Id: <1403014378-4349-5-git-send-email-gbenson@redhat.com> In-Reply-To: <1403014378-4349-1-git-send-email-gbenson@redhat.com> References: <1403014378-4349-1-git-send-email-gbenson@redhat.com> X-IsSubscribed: yes This commit fixes various whitespace differences between i386-nat.[ch] and i386-low.[ch]. gdb/ 2014-06-17 Gary Benson * i386-nat.c: Comment changes. gdb/gdbserver/ 2014-06-17 Gary Benson * i386-low.h: Comment changes. * i386-low.c: Likewise. --- gdb/ChangeLog | 4 +++ gdb/gdbserver/ChangeLog | 5 ++++ gdb/gdbserver/i386-low.c | 24 +++++++++++++++------ gdb/gdbserver/i386-low.h | 6 ++-- gdb/i386-nat.c | 51 ++++++++++++++++++++++++--------------------- 5 files changed, 56 insertions(+), 34 deletions(-) diff --git a/gdb/gdbserver/i386-low.c b/gdb/gdbserver/i386-low.c index 304d6f3..d122ff7 100644 --- a/gdb/gdbserver/i386-low.c +++ b/gdb/gdbserver/i386-low.c @@ -21,6 +21,17 @@ #include "target.h" #include "i386-low.h" +/* Support for hardware watchpoints and breakpoints using the i386 + debug registers. + + This provides several functions for inserting and removing + hardware-assisted breakpoints and watchpoints, testing if one or + more of the watchpoints triggered and at what address, checking + whether a given region can be watched, etc. + + The functions below implement debug registers sharing by reference + counts, and allow to watch regions up to 16 bytes long. */ + /* Support for 8-byte wide hw watchpoints. */ #ifndef TARGET_HAS_DR_LEN_8 /* NOTE: sizeof (long) == 4 on win64. */ @@ -156,8 +167,7 @@ i386_low_init_dregs (struct i386_debug_reg_state *state) state->dr_status_mirror = 0; } -/* Print the values of the mirrored debug registers. This is enabled via - the "set debug-hw-points 1" monitor command. */ +/* Print the values of the mirrored debug registers. */ static void i386_show_dr (struct i386_debug_reg_state *state, @@ -427,7 +437,7 @@ i386_update_inferior_debug_regs (struct i386_debug_reg_state *inf_state, /* Insert a watchpoint to watch a memory region which starts at address ADDR and whose length is LEN bytes. Watch memory accesses - of the type TYPE_FROM_PACKET. Return 0 on success, -1 on failure. */ + of the type TYPE. Return 0 on success, -1 on failure. */ int i386_low_insert_watchpoint (struct i386_debug_reg_state *state, @@ -523,8 +533,8 @@ i386_low_region_ok_for_watchpoint (struct i386_debug_reg_state *state, } /* If the inferior has some break/watchpoint that triggered, set the - address associated with that break/watchpoint and return true. - Otherwise, return false. */ + address associated with that break/watchpoint and return non-zero. + Otherwise, return zero. */ int i386_low_stopped_data_address (struct i386_debug_reg_state *state, @@ -603,8 +613,8 @@ i386_low_stopped_data_address (struct i386_debug_reg_state *state, return rc; } -/* Return true if the inferior has some watchpoint that triggered. - Otherwise return false. */ +/* Return non-zero if the inferior has some watchpoint that triggered. + Otherwise return zero. */ int i386_low_stopped_by_watchpoint (struct i386_debug_reg_state *state) diff --git a/gdb/gdbserver/i386-low.h b/gdb/gdbserver/i386-low.h index 8d8e73f..681ade0 100644 --- a/gdb/gdbserver/i386-low.h +++ b/gdb/gdbserver/i386-low.h @@ -32,9 +32,9 @@ /* Debug registers' indices. */ #define DR_FIRSTADDR 0 #define DR_LASTADDR 3 -#define DR_NADDR 4 /* The number of debug address registers. */ -#define DR_STATUS 6 -#define DR_CONTROL 7 +#define DR_NADDR 4 /* The number of debug address registers. */ +#define DR_STATUS 6 /* Index of debug status register (DR6). */ +#define DR_CONTROL 7 /* Index of debug control register (DR7). */ /* Global state needed to track h/w watchpoints. */ diff --git a/gdb/i386-nat.c b/gdb/i386-nat.c index f9fb52f..a7742f2 100644 --- a/gdb/i386-nat.c +++ b/gdb/i386-nat.c @@ -37,6 +37,7 @@ The functions below implement debug registers sharing by reference counts, and allow to watch regions up to 16 bytes long. */ +/* Low-level function vector. */ struct i386_dr_low_type i386_dr_low; /* Support for 8-byte wide hw watchpoints. */ @@ -265,9 +266,7 @@ i386_cleanup_dregs (void) i386_forget_process (ptid_get_pid (inferior_ptid)); } -/* Print the values of the mirrored debug registers. This is called - when maint_show_dr is non-zero. To set that up, type "maint - show-debug-regs" at GDB's prompt. */ +/* Print the values of the mirrored debug registers. */ static void i386_show_dr (struct i386_debug_reg_state *state, @@ -439,7 +438,7 @@ i386_remove_aligned_watchpoint (struct i386_debug_reg_state *state, && state->dr_mirror[i] == addr && I386_DR_GET_RW_LEN (state->dr_control_mirror, i) == len_rw_bits) { - if (--state->dr_ref_count[i] == 0) /* no longer in use? */ + if (--state->dr_ref_count[i] == 0) /* No longer in use? */ { /* Reset our mirror. */ state->dr_mirror[i] = 0; @@ -646,8 +645,8 @@ i386_region_ok_for_watchpoint (struct target_ops *self, return nregs <= DR_NADDR ? 1 : 0; } -/* If the inferior has some watchpoint that triggered, set the - address associated with that watchpoint and return non-zero. +/* If the inferior has some break/watchpoint that triggered, set the + address associated with that break/watchpoint and return non-zero. Otherwise, return zero. */ static int @@ -668,24 +667,25 @@ i386_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p) unsigned control = 0; /* In non-stop/async, threads can be running while we change the - STATE (and friends). Say, we set a watchpoint, and let threads - resume. Now, say you delete the watchpoint, or add/remove - watchpoints such that STATE changes while threads are running. - On targets that support non-stop, inserting/deleting watchpoints - updates the STATE only. It does not update the real thread's - debug registers; that's only done prior to resume. Instead, if - threads are running when the mirror changes, a temporary and - transparent stop on all threads is forced so they can get their - copy of the debug registers updated on re-resume. Now, say, - a thread hit a watchpoint before having been updated with the new - STATE contents, and we haven't yet handled the corresponding - SIGTRAP. If we trusted STATE below, we'd mistake the real - trapped address (from the last time we had updated debug - registers in the thread) with whatever was currently in STATE. - So to fix this, STATE always represents intention, what we _want_ - threads to have in debug registers. To get at the address and - cause of the trap, we need to read the state the thread still has - in its debug registers. + global dr_mirror (and friends). Say, we set a watchpoint, and + let threads resume. Now, say you delete the watchpoint, or + add/remove watchpoints such that dr_mirror changes while threads + are running. On targets that support non-stop, + inserting/deleting watchpoints updates the global dr_mirror only. + It does not update the real thread's debug registers; that's only + done prior to resume. Instead, if threads are running when the + mirror changes, a temporary and transparent stop on all threads + is forced so they can get their copy of the debug registers + updated on re-resume. Now, say, a thread hit a watchpoint before + having been updated with the new dr_mirror contents, and we + haven't yet handled the corresponding SIGTRAP. If we trusted + dr_mirror below, we'd mistake the real trapped address (from the + last time we had updated debug registers in the thread) with + whatever was currently in dr_mirror. So to fix this, dr_mirror + always represents intention, what we _want_ threads to have in + debug registers. To get at the address and cause of the trap, we + need to read the state the thread still has in its debug + registers. In sum, always get the current debug register values the current thread has, instead of trusting the global mirror. If the thread @@ -727,6 +727,9 @@ i386_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p) return rc; } +/* Return non-zero if the inferior has some watchpoint that triggered. + Otherwise return zero. */ + static int i386_stopped_by_watchpoint (struct target_ops *ops) {