qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: Joelle van Dyne <j@getutm.app>
Subject: [PATCH v4 04/43] util: Specialize flush_idcache_range for aarch64
Date: Mon, 14 Dec 2020 08:02:35 -0600	[thread overview]
Message-ID: <20201214140314.18544-5-richard.henderson@linaro.org> (raw)
In-Reply-To: <20201214140314.18544-1-richard.henderson@linaro.org>

For darwin, the CTR_EL0 register is not accessible, but there
are system routines that we can use.

For other hosts, copy the single pointer implementation from
libgcc and modify it to support the double pointer interface
we require.  This halves the number of cache operations required
when split-rwx is enabled.

Cc: Joelle van Dyne <j@getutm.app>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 util/cacheflush.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/util/cacheflush.c b/util/cacheflush.c
index 92805efe49..6a20723902 100644
--- a/util/cacheflush.c
+++ b/util/cacheflush.c
@@ -7,12 +7,81 @@
 
 #include "qemu/osdep.h"
 #include "qemu/cacheflush.h"
+#include "qemu/bitops.h"
 
 
 #if defined(__i386__) || defined(__x86_64__) || defined(__s390__)
 
 /* Caches are coherent and do not require flushing; symbol inline. */
 
+#elif defined(__aarch64__)
+
+#ifdef CONFIG_DARWIN
+/* Apple does not expose CTR_EL0, so we must use system interfaces. */
+extern void sys_icache_invalidate(void *start, size_t len);
+extern void sys_dcache_flush(void *start, size_t len);
+void flush_idcache_range(uintptr_t rx, uintptr_t rw, size_t len)
+{
+    sys_dcache_flush((void *)rw, len);
+    sys_icache_invalidate((void *)rx, len);
+}
+#else
+
+/*
+ * TODO: unify this with cacheinfo.c.
+ * We want to save the whole contents of CTR_EL0, so that we
+ * have more than the linesize, but also IDC and DIC.
+ */
+static unsigned int save_ctr_el0;
+static void __attribute__((constructor)) init_ctr_el0(void)
+{
+    asm volatile("mrs\t%0, ctr_el0" : "=r"(save_ctr_el0));
+}
+
+/*
+ * This is a copy of gcc's __aarch64_sync_cache_range, modified
+ * to fit this three-operand interface.
+ */
+void flush_idcache_range(uintptr_t rx, uintptr_t rw, size_t len)
+{
+    const unsigned CTR_IDC = 1u << 28;
+    const unsigned CTR_DIC = 1u << 29;
+    const unsigned int ctr_el0 = save_ctr_el0;
+    const uintptr_t icache_lsize = 4 << extract32(ctr_el0, 0, 4);
+    const uintptr_t dcache_lsize = 4 << extract32(ctr_el0, 16, 4);
+    uintptr_t p;
+
+    /*
+     * If CTR_EL0.IDC is enabled, Data cache clean to the Point of Unification
+     * is not required for instruction to data coherence.
+     */
+    if (!(ctr_el0 & CTR_IDC)) {
+        /*
+         * Loop over the address range, clearing one cache line at once.
+         * Data cache must be flushed to unification first to make sure
+         * the instruction cache fetches the updated data.
+         */
+        for (p = rw & -dcache_lsize; p < rw + len; p += dcache_lsize) {
+            asm volatile("dc\tcvau, %0" : : "r" (p) : "memory");
+        }
+        asm volatile("dsb\tish" : : : "memory");
+    }
+
+    /*
+     * If CTR_EL0.DIC is enabled, Instruction cache cleaning to the Point
+     * of Unification is not required for instruction to data coherence.
+     */
+    if (!(ctr_el0 & CTR_DIC)) {
+        for (p = rx & -icache_lsize; p < rx + len; p += icache_lsize) {
+            asm volatile("ic\tivau, %0" : : "r"(p) : "memory");
+        }
+        asm volatile ("dsb\tish" : : : "memory");
+    }
+
+    asm volatile("isb" : : : "memory");
+}
+#endif /* CONFIG_DARWIN */
+
 #elif defined(__mips__)
 
 #ifdef __OpenBSD__
-- 
2.25.1



  parent reply	other threads:[~2020-12-14 14:09 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-14 14:02 [PATCH v4 00/43] Mirror map JIT memory for TCG Richard Henderson
2020-12-14 14:02 ` [PATCH v4 01/43] tcg: Do not flush icache for interpreter Richard Henderson
2020-12-14 21:17   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 02/43] util: Extract flush_icache_range to cacheflush.c Richard Henderson
2020-12-14 21:59   ` Philippe Mathieu-Daudé
2020-12-15  1:41   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 03/43] util: Enhance flush_icache_range with separate data pointer Richard Henderson
2020-12-15  1:43   ` Joelle van Dyne
2020-12-14 14:02 ` Richard Henderson [this message]
2020-12-15  1:46   ` [PATCH v4 04/43] util: Specialize flush_idcache_range for aarch64 Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 05/43] tcg: Move tcg prologue pointer out of TCGContext Richard Henderson
2020-12-14 22:01   ` Philippe Mathieu-Daudé
2020-12-15  1:48   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 06/43] tcg: Move tcg epilogue " Richard Henderson
2020-12-15  1:54   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 07/43] tcg: Add in_code_gen_buffer Richard Henderson
2020-12-14 22:09   ` Philippe Mathieu-Daudé
2020-12-15 22:43     ` Richard Henderson
2020-12-15 23:15       ` Philippe Mathieu-Daudé
2020-12-14 14:02 ` [PATCH v4 08/43] tcg: Introduce tcg_splitwx_to_{rx,rw} Richard Henderson
2021-01-02 20:00   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 09/43] tcg: Adjust TCGLabel for const Richard Henderson
2021-01-02 20:01   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 10/43] tcg: Adjust tcg_out_call " Richard Henderson
2020-12-14 22:16   ` Philippe Mathieu-Daudé
2021-01-02 20:02   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 11/43] tcg: Adjust tcg_out_label " Richard Henderson
2020-12-14 22:18   ` Philippe Mathieu-Daudé
2021-01-02 20:03   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 12/43] tcg: Adjust tcg_register_jit " Richard Henderson
2021-01-02 20:03   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 13/43] tcg: Adjust tb_target_set_jmp_target for split-wx Richard Henderson
2021-01-02 20:05   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 14/43] tcg: Make DisasContextBase.tb const Richard Henderson
2020-12-14 22:14   ` Philippe Mathieu-Daudé
2021-01-02 20:05   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 15/43] tcg: Make tb arg to synchronize_from_tb const Richard Henderson
2020-12-14 22:15   ` Philippe Mathieu-Daudé
2021-01-02 20:06   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 16/43] tcg: Use Error with alloc_code_gen_buffer Richard Henderson
2021-01-02 20:09   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 17/43] tcg: Add --accel tcg,split-wx property Richard Henderson
2020-12-15  2:05   ` Joelle van Dyne
2020-12-15 22:50     ` Richard Henderson
2020-12-14 14:02 ` [PATCH v4 18/43] accel/tcg: Support split-wx for linux with memfd Richard Henderson
2021-01-02 20:11   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 19/43] accel/tcg: Support split-wx for darwin/iOS with vm_remap Richard Henderson
2021-01-05  6:02   ` Joelle van Dyne
2021-01-05 16:57     ` Richard Henderson
2020-12-14 14:02 ` [PATCH v4 20/43] tcg: Return the TB pointer from the rx region from exit_tb Richard Henderson
2021-01-02 20:14   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 21/43] tcg/i386: Support split-wx code generation Richard Henderson
2021-01-02 20:15   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 22/43] tcg/aarch64: Use B not BL for tcg_out_goto_long Richard Henderson
2021-01-02 20:15   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 23/43] tcg/aarch64: Support split-wx code generation Richard Henderson
2021-01-02 20:16   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 24/43] disas: Push const down through host disasassembly Richard Henderson
2020-12-14 22:13   ` Philippe Mathieu-Daudé
2021-01-02 20:18   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 25/43] tcg/tci: Push const down through bytecode reading Richard Henderson
2021-01-02 20:19   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 26/43] tcg: Introduce tcg_tbrel_diff Richard Henderson
2021-01-02 20:19   ` Joelle van Dyne
2020-12-14 14:02 ` [PATCH v4 27/43] tcg/ppc: Use tcg_tbrel_diff Richard Henderson
2020-12-14 14:02 ` [PATCH v4 28/43] tcg/ppc: Use tcg_out_mem_long to reset TCG_REG_TB Richard Henderson
2020-12-14 14:03 ` [PATCH v4 29/43] tcg/ppc: Support split-wx code generation Richard Henderson
2020-12-14 14:03 ` [PATCH v4 30/43] tcg/sparc: Use tcg_tbrel_diff Richard Henderson
2020-12-14 14:03 ` [PATCH v4 31/43] tcg/sparc: Support split-wx code generation Richard Henderson
2020-12-14 14:03 ` [PATCH v4 32/43] tcg/s390: Use tcg_tbrel_diff Richard Henderson
2020-12-14 14:03 ` [PATCH v4 33/43] tcg/s390: Support split-wx code generation Richard Henderson
2020-12-14 14:03 ` [PATCH v4 34/43] tcg/riscv: Fix branch range checks Richard Henderson
2020-12-15 17:29   ` Alistair Francis
2020-12-14 14:03 ` [PATCH v4 35/43] tcg/riscv: Remove branch-over-branch fallback Richard Henderson
2020-12-15 17:30   ` Alistair Francis
2020-12-14 14:03 ` [PATCH v4 36/43] tcg/riscv: Support split-wx code generation Richard Henderson
2020-12-15 17:31   ` Alistair Francis
2020-12-14 14:03 ` [PATCH v4 37/43] accel/tcg: Add mips support to alloc_code_gen_buffer_splitwx_memfd Richard Henderson
2020-12-14 14:03 ` [PATCH v4 38/43] tcg/mips: Do not assert on relocation overflow Richard Henderson
2020-12-14 14:03 ` [PATCH v4 39/43] tcg/mips: Support split-wx code generation Richard Henderson
2020-12-14 14:03 ` [PATCH v4 40/43] tcg/arm: " Richard Henderson
2020-12-14 14:03 ` [PATCH v4 41/43] tcg: Remove TCG_TARGET_SUPPORT_MIRROR Richard Henderson
2021-01-02 20:22   ` Joelle van Dyne
2020-12-14 14:03 ` [PATCH v4 42/43] tcg: Constify tcg_code_gen_epilogue Richard Henderson
2021-01-02 20:23   ` Joelle van Dyne
2020-12-14 14:03 ` [PATCH v4 43/43] tcg: Constify TCGLabelQemuLdst.raddr Richard Henderson
2021-01-02 20:24   ` Joelle van Dyne
2020-12-14 21:01 ` [PATCH v4 00/43] Mirror map JIT memory for TCG no-reply

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=20201214140314.18544-5-richard.henderson@linaro.org \
    --to=richard.henderson@linaro.org \
    --cc=j@getutm.app \
    --cc=qemu-devel@nongnu.org \
    /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).