qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: mttcg@listserver.greensocs.com, qemu-devel@nongnu.org,
	fred.konrad@greensocs.com, a.rigo@virtualopensystems.com,
	serge.fdrv@gmail.com, cota@braap.org, bobby.prani@gmail.com
Cc: mark.burton@greensocs.com, pbonzini@redhat.com,
	jan.kiszka@siemens.com, rth@twiddle.net,
	peter.maydell@linaro.org, claudio.fontana@huawei.com,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Peter Crosthwaite" <crosthwaite.peter@gmail.com>
Subject: [Qemu-devel] [RFC v3 05/19] exec: add assert_debug_safe and notes on debug structures
Date: Fri,  3 Jun 2016 21:40:14 +0100	[thread overview]
Message-ID: <1464986428-6739-6-git-send-email-alex.bennee@linaro.org> (raw)
In-Reply-To: <1464986428-6739-1-git-send-email-alex.bennee@linaro.org>

The debug structures are different from many of the other shared ones as
they are modified from two places:

  - architectural debug registers
  - the gdb stub

The first is usually in the context of vCPU currently running so
modifications are safe. The second is generally only changed while the
vCPUs are halted and therefore not going to clash.

I fixed the commenting on DEBUG_SUBPAGE when I added the new DEBUG_DEBUG
flag.

KNOWN ISSUES: arm powerctl resets will trigger the asserts in
multi-thread mode with smp > 1 as the reset operation is cross-cpu and
clears all watchpoints.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 exec.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 57 insertions(+), 2 deletions(-)

diff --git a/exec.c b/exec.c
index a3a93ae..b225282 100644
--- a/exec.c
+++ b/exec.c
@@ -25,6 +25,7 @@
 #include "qemu/cutils.h"
 #include "cpu.h"
 #include "exec/exec-all.h"
+#include "qom/cpu.h"
 #include "tcg.h"
 #include "hw/qdev-core.h"
 #if !defined(CONFIG_USER_ONLY)
@@ -62,7 +63,46 @@
 #include "qemu/mmap-alloc.h"
 #endif
 
-//#define DEBUG_SUBPAGE
+/* #define DEBUG_SUBPAGE */
+/* #define DEBUG_DEBUG */
+
+#ifdef DEBUG_DEBUG
+#define CHECK_DEBUG_SAFE 1
+#else
+#define CHECK_DEBUG_SAFE 0
+#endif
+
+/*
+ * Safe access to debugging structures.
+ *
+ * Breakpoints and Watchpoints are kept in the vCPU structures. There
+ * are two ways they are manipulated:
+ *
+ *   - Outside of the context of the vCPU thread (e.g. gdbstub)
+ *   - Inside the context of the vCPU (architectural debug registers)
+ *
+ * In system emulation mode the chance of corruption is usually
+ * mitigated by the fact the vCPUs is usually suspended whenever these
+ * changes are made.
+ *
+ * In user emulation mode it is less clear (XXX: work this out)
+ */
+
+#ifdef CONFIG_SOFTMMU
+#define assert_debug_safe(cpu) do {                                     \
+        if (CHECK_DEBUG_SAFE) {                                         \
+            g_assert(!cpu->created ||                                   \
+                     (cpu_is_stopped(cpu) || cpu == current_cpu));      \
+        }                                                               \
+    } while (0)
+#else
+#define assert_debug_safe(cpu) do {                                     \
+        if (CHECK_DEBUG_SAFE) {                                         \
+            g_assert(false);                                            \
+        }                                                               \
+    } while (0)
+#endif
+
 
 #if !defined(CONFIG_USER_ONLY)
 /* ram_list is read under rcu_read_lock()/rcu_read_unlock().  Writes
@@ -737,6 +777,8 @@ int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len,
 {
     CPUWatchpoint *wp;
 
+    assert_debug_safe(cpu);
+
     /* forbid ranges which are empty or run off the end of the address space */
     if (len == 0 || (addr + len - 1) < addr) {
         error_report("tried to set invalid watchpoint at %"
@@ -769,6 +811,8 @@ int cpu_watchpoint_remove(CPUState *cpu, vaddr addr, vaddr len,
 {
     CPUWatchpoint *wp;
 
+    assert_debug_safe(cpu);
+
     QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
         if (addr == wp->vaddr && len == wp->len
                 && flags == (wp->flags & ~BP_WATCHPOINT_HIT)) {
@@ -782,6 +826,8 @@ int cpu_watchpoint_remove(CPUState *cpu, vaddr addr, vaddr len,
 /* Remove a specific watchpoint by reference.  */
 void cpu_watchpoint_remove_by_ref(CPUState *cpu, CPUWatchpoint *watchpoint)
 {
+    assert_debug_safe(cpu);
+
     QTAILQ_REMOVE(&cpu->watchpoints, watchpoint, entry);
 
     tlb_flush_page(cpu, watchpoint->vaddr);
@@ -794,6 +840,8 @@ void cpu_watchpoint_remove_all(CPUState *cpu, int mask)
 {
     CPUWatchpoint *wp, *next;
 
+    assert_debug_safe(cpu);
+
     QTAILQ_FOREACH_SAFE(wp, &cpu->watchpoints, entry, next) {
         if (wp->flags & mask) {
             cpu_watchpoint_remove_by_ref(cpu, wp);
@@ -829,6 +877,8 @@ int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags,
 {
     CPUBreakpoint *bp;
 
+    assert_debug_safe(cpu);
+
     bp = g_malloc(sizeof(*bp));
 
     bp->pc = pc;
@@ -849,11 +899,16 @@ int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags,
     return 0;
 }
 
-/* Remove a specific breakpoint.  */
+/* Remove a specific breakpoint.
+ *
+ * See cpu_breakpoint_insert notes for information about locking.
+ */
 int cpu_breakpoint_remove(CPUState *cpu, vaddr pc, int flags)
 {
     CPUBreakpoint *bp;
 
+    assert_debug_safe(cpu);
+
     QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) {
         if (bp->pc == pc && bp->flags == flags) {
             cpu_breakpoint_remove_by_ref(cpu, bp);
-- 
2.7.4

  parent reply	other threads:[~2016-06-03 20:40 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-03 20:40 [Qemu-devel] [RFC v3 00/19] Base enabling patches for MTTCG Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 01/19] cpus: make all_vcpus_paused() return bool Alex Bennée
2016-06-07 15:05   ` Richard Henderson
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 02/19] translate_all: DEBUG_FLUSH -> DEBUG_TB_FLUSH Alex Bennée
2016-06-07 14:54   ` Richard Henderson
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 03/19] translate-all: add DEBUG_LOCKING asserts Alex Bennée
2016-06-23 14:34   ` Sergey Fedorov
2016-06-23 17:14     ` Alex Bennée
2016-06-23 18:43       ` Sergey Fedorov
2016-07-01 23:21   ` Richard Henderson
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 04/19] docs: new design document multi-thread-tcg.txt (DRAFTING) Alex Bennée
2016-06-23 21:33   ` Sergey Fedorov
2016-06-03 20:40 ` Alex Bennée [this message]
2016-06-24 15:28   ` [Qemu-devel] [RFC v3 05/19] exec: add assert_debug_safe and notes on debug structures Sergey Fedorov
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 06/19] tcg: comment on which functions have to be called with tb_lock held Alex Bennée
2016-06-24 15:38   ` Sergey Fedorov
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 07/19] translate-all: Add assert_memory_lock annotations Alex Bennée
2016-06-24 15:48   ` Sergey Fedorov
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 08/19] tcg: protect TBContext with tb_lock Alex Bennée
2016-07-01 23:40   ` Richard Henderson
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 09/19] target-arm/arm-powerctl: wake up sleeping CPUs Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 10/19] tcg: cpus rm tcg_exec_all() Alex Bennée
2016-06-24 17:09   ` Sergey Fedorov
2016-07-01 23:50   ` Richard Henderson
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 11/19] tcg: add options for enabling MTTCG Alex Bennée
2016-06-27 21:07   ` Sergey Fedorov
2016-07-22 16:17     ` Alex Bennée
2016-07-01 23:53   ` Richard Henderson
2016-07-02  7:11     ` Alex Bennée
2016-07-02  7:38       ` Sergey Fedorov
2016-07-04 10:10         ` Paolo Bonzini
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 12/19] tcg: add kick timer for single-threaded vCPU emulation Alex Bennée
2016-06-27 21:20   ` Sergey Fedorov
2016-07-02  0:17     ` Richard Henderson
2016-07-02  7:36       ` Sergey Fedorov
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 13/19] tcg: rename tcg_current_cpu to tcg_current_rr_cpu Alex Bennée
2016-06-06 15:30   ` Paolo Bonzini
2016-06-06 16:05     ` Alex Bennée
2016-06-06 17:05       ` Paolo Bonzini
2016-06-06 17:26         ` Alex Bennée
2016-06-06 18:25           ` Paolo Bonzini
2016-06-07 12:59   ` Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 14/19] tcg: remove global exit_request Alex Bennée
2016-06-28 16:20   ` Sergey Fedorov
2016-08-03 11:42     ` Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 15/19] tcg: drop global lock during TCG code execution Alex Bennée
2016-06-28 16:54   ` Sergey Fedorov
2016-08-10 13:51     ` Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 16/19] tcg: move locking for tb_invalidate_phys_page_range up Alex Bennée
2016-06-28 19:43   ` Sergey Fedorov
2016-06-28 19:51     ` Sergey Fedorov
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 17/19] tcg: enable thread-per-vCPU Alex Bennée
2016-06-29 14:09   ` Sergey Fedorov
2016-08-10 14:44     ` Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 18/19] tcg: Ensure safe TB lookup out of 'tb_lock' Alex Bennée
2016-06-03 20:40 ` [Qemu-devel] [RFC v3 19/19] cpu-exec: remove tb_lock from the hot-path Alex Bennée
2016-06-29 14:35   ` Sergey Fedorov
2016-06-29 14:47     ` Alex Bennée
2016-06-29 14:52       ` Sergey Fedorov
2016-06-29 16:08         ` Alex Bennée
2016-06-30  9:24           ` Sergey Fedorov
2016-06-04 14:40 ` [Qemu-devel] [RFC v3 00/19] Base enabling patches for MTTCG Pranith Kumar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1464986428-6739-6-git-send-email-alex.bennee@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=a.rigo@virtualopensystems.com \
    --cc=bobby.prani@gmail.com \
    --cc=claudio.fontana@huawei.com \
    --cc=cota@braap.org \
    --cc=crosthwaite.peter@gmail.com \
    --cc=fred.konrad@greensocs.com \
    --cc=jan.kiszka@siemens.com \
    --cc=mark.burton@greensocs.com \
    --cc=mttcg@listserver.greensocs.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=serge.fdrv@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).