From: Roman Bolshakov <r.bolshakov@yadro.com>
To: <qemu-devel@nongnu.org>
Cc: Richard Henderson <richard.henderson@linaro.org>,
Roman Bolshakov <r.bolshakov@yadro.com>,
Alexander Graf <agraf@csgraf.de>, Joelle van Dyne <j@getutm.app>,
Stefan Hajnoczi <stefanha@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: [PATCH v2] tcg: Fix execution on Apple Silicon
Date: Sun, 3 Jan 2021 17:50:57 +0300 [thread overview]
Message-ID: <20210103145055.11074-1-r.bolshakov@yadro.com> (raw)
Pages can't be both write and executable at the same time on Apple
Silicon. macOS provides public API to switch write protection [1] for
JIT applications, like TCG.
1. https://developer.apple.com/documentation/apple_silicon/porting_just-in-time_compilers_to_apple_silicon
Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
---
v1: https://lists.gnu.org/archive/html/qemu-devel/2021-01/msg00073.html
Changes since v1:
- Pruned not needed fiddling with W^X and dropped symmetry from write
lock/unlock and renamed related functions.
Similar approach is used in JavaScriptCore [1].
- Moved jit helper functions to util/osdep
As outlined in osdep.h, this matches to (2): * In an ideal world this header would contain only: * (1) things which everybody needs * (2) things without which code would work on most platforms but * fail to compile or misbehave on a minority of host OSes
- Fixed a checkpatch error
- Limit new behaviour only to macOS 11.0 and above, because of the
following declarations:
__API_AVAILABLE(macos(11.0))
__API_UNAVAILABLE(ios, tvos, watchos)
void pthread_jit_write_protect_np(int enabled);
__API_AVAILABLE(macos(11.0))
__API_UNAVAILABLE(ios, tvos, watchos)
int pthread_jit_write_protect_supported_np(void);
1. https://bugs.webkit.org/attachment.cgi?id=402515&action=prettypatch
accel/tcg/cpu-exec.c | 2 ++
accel/tcg/translate-all.c | 6 ++++++
include/qemu/osdep.h | 3 +++
tcg/tcg.c | 1 +
util/osdep.c | 22 ++++++++++++++++++++++
5 files changed, 34 insertions(+)
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index 8689c54499..374060eb45 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -175,6 +175,7 @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, TranslationBlock *itb)
}
#endif /* DEBUG_DISAS */
+ qemu_thread_jit_execute();
ret = tcg_qemu_tb_exec(env, tb_ptr);
cpu->can_do_io = 1;
last_tb = (TranslationBlock *)(ret & ~TB_EXIT_MASK);
@@ -382,6 +383,7 @@ static inline void tb_add_jump(TranslationBlock *tb, int n,
{
uintptr_t old;
+ qemu_thread_jit_write();
assert(n < ARRAY_SIZE(tb->jmp_list_next));
qemu_spin_lock(&tb_next->jmp_lock);
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
index b7d50a73d4..88ae5d35ef 100644
--- a/accel/tcg/translate-all.c
+++ b/accel/tcg/translate-all.c
@@ -1072,6 +1072,9 @@ static inline void *alloc_code_gen_buffer(void)
size_t size = tcg_ctx->code_gen_buffer_size;
void *buf;
+#if defined(__APPLE__) && defined(MAC_OS_VERSION_11_0)
+ flags |= MAP_JIT;
+#endif
buf = mmap(NULL, size, prot, flags, -1, 0);
if (buf == MAP_FAILED) {
return NULL;
@@ -1485,7 +1488,9 @@ static void do_tb_phys_invalidate(TranslationBlock *tb, bool rm_from_page_list)
static void tb_phys_invalidate__locked(TranslationBlock *tb)
{
+ qemu_thread_jit_write();
do_tb_phys_invalidate(tb, true);
+ qemu_thread_jit_execute();
}
/* invalidate one TB
@@ -1687,6 +1692,7 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
#endif
assert_memory_lock();
+ qemu_thread_jit_write();
phys_pc = get_page_addr_code(env, pc);
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
index f9ec8c84e9..89abebcf5d 100644
--- a/include/qemu/osdep.h
+++ b/include/qemu/osdep.h
@@ -686,4 +686,7 @@ char *qemu_get_host_name(Error **errp);
*/
size_t qemu_get_host_physmem(void);
+void qemu_thread_jit_write(void);
+void qemu_thread_jit_execute(void);
+
#endif
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 43c6cf8f52..ab8488f5d5 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1065,6 +1065,7 @@ void tcg_prologue_init(TCGContext *s)
s->pool_labels = NULL;
#endif
+ qemu_thread_jit_write();
/* Generate the prologue. */
tcg_target_qemu_prologue(s);
diff --git a/util/osdep.c b/util/osdep.c
index 66d01b9160..80ec7185da 100644
--- a/util/osdep.c
+++ b/util/osdep.c
@@ -606,3 +606,25 @@ writev(int fd, const struct iovec *iov, int iov_cnt)
return readv_writev(fd, iov, iov_cnt, true);
}
#endif
+
+#if defined(__APPLE__) && defined(MAC_OS_VERSION_11_0)
+static inline void qemu_thread_jit_write_protect(bool enabled)
+{
+ if (pthread_jit_write_protect_supported_np()) {
+ pthread_jit_write_protect_np(enabled);
+ }
+}
+
+void qemu_thread_jit_execute(void)
+{
+ qemu_thread_jit_write_protect(true);
+}
+
+void qemu_thread_jit_write(void)
+{
+ qemu_thread_jit_write_protect(false);
+}
+#else
+void qemu_thread_jit_write(void) {}
+void qemu_thread_jit_execute(void) {}
+#endif
--
2.29.2
next reply other threads:[~2021-01-03 14:54 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-03 14:50 Roman Bolshakov [this message]
2021-01-03 16:52 ` [PATCH v2] tcg: Fix execution on Apple Silicon Joelle van Dyne
2021-01-03 21:21 ` Roman Bolshakov
2021-01-04 15:23 ` Alex Bennée
2021-01-04 18:39 ` Alexander Graf
2021-01-04 20:28 ` Alex Bennée
2021-01-05 21:47 ` Roman Bolshakov
2021-01-05 21:39 ` Roman Bolshakov
2021-01-05 20:34 ` Roman Bolshakov
2021-01-05 23:37 ` Alex Bennée
2021-01-05 2:02 ` Joelle van Dyne
2021-01-05 21:50 ` Roman Bolshakov
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=20210103145055.11074-1-r.bolshakov@yadro.com \
--to=r.bolshakov@yadro.com \
--cc=agraf@csgraf.de \
--cc=j@getutm.app \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=stefanha@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.