From: Richard Henderson <[email protected]>

In 6d03226b422 we set TLB_MMIO to a non-zero value for user-only
so that we could return a non-zero value from probe_* functions
so that we could force callers like Arm SVE vector moves to use
the slow path rather than direct access.  All for the sake of
exposing these accesses to plugins.

Back then, TLB_FORCE_SLOW did not exist, so TLB_MMIO seemed like
a reasonable solution.  However, user-only doesn't really have
MMIO and this has knock-on effects, like forcing Arm SVE first-fault
vector loads to stop.  Better to use TLB_FORCE_SLOW as a more exact
trigger for plugins.

Cc: [email protected]
Fixes: 6d03226b422 ("plugins: force slow path when plugins instrument memory 
ops")
Acked-by: Alex Bennée <[email protected]>
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Signed-off-by: Richard Henderson <[email protected]>
Message-ID: <[email protected]>
(cherry picked from commit b79a9b6e5b5657534615dd8e574d58305e16841c)
(Mjt: backport to 10.0.x, move changes from include/exec/tlb-flags.h to 
cpu-all.h
 across v10.0.0-145-g4d43552abe "exec/cpu-all: extract tlb flags defines to 
exec/tlb-flags.h"
 and adjust for lack of subsequent changes in this area)
Signed-off-by: Michael Tokarev <[email protected]>

diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c
index 2322181b151..b3a2b0697ef 100644
--- a/accel/tcg/user-exec.c
+++ b/accel/tcg/user-exec.c
@@ -807,7 +807,7 @@ static int probe_access_internal(CPUArchState *env, vaddr 
addr,
         if (page_flags & acc_flag) {
             if (access_type != MMU_INST_FETCH
                 && cpu_plugin_mem_cbs_enabled(env_cpu(env))) {
-                return TLB_MMIO;
+                return TLB_FORCE_SLOW;
             }
             return 0; /* success */
         }
@@ -842,7 +842,7 @@ void *probe_access(CPUArchState *env, vaddr addr, int size,
 
     g_assert(-(addr | TARGET_PAGE_MASK) >= size);
     flags = probe_access_internal(env, addr, size, access_type, false, ra);
-    g_assert((flags & ~TLB_MMIO) == 0);
+    g_assert((flags & ~TLB_FORCE_SLOW) == 0);
 
     return size ? g2h(env_cpu(env), addr) : NULL;
 }
diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h
index 47b14446b8f..808f79663a4 100644
--- a/include/exec/cpu-all.h
+++ b/include/exec/cpu-all.h
@@ -105,12 +105,14 @@ CPUArchState *cpu_copy(CPUArchState *env);
 static inline int cpu_mmu_index(CPUState *cs, bool ifetch);
 
 /*
- * Allow some level of source compatibility with softmmu.  We do not
- * support any of the more exotic features, so only invalid pages may
- * be signaled by probe_access_flags().
+ * Allow some level of source compatibility with softmmu.
+ * Invalid is set when the page does not have requested permissions.
+ * MMIO is set when we want the target helper to use the functional
+ * interface for load/store so that plugins see the access.
  */
 #define TLB_INVALID_MASK    (1 << (TARGET_PAGE_BITS_MIN - 1))
-#define TLB_MMIO            (1 << (TARGET_PAGE_BITS_MIN - 2))
+#define TLB_FORCE_SLOW      (1 << (TARGET_PAGE_BITS_MIN - 2))
+#define TLB_MMIO            0
 #define TLB_WATCHPOINT      0
 
 static inline int cpu_mmu_index(CPUState *cs, bool ifetch)
-- 
2.47.3


Reply via email to