From fbd00033d63e4295ac38cea69615821de8639e96 Mon Sep 17 00:00:00 2001 From: Trung Date: Mon, 31 Aug 2026 22:33:08 +0700 Subject: [PATCH] Clear ARM64 instruction cache on mprotect exec Flush data cache and invalidate instruction cache using __builtin___clear_cache when sys_mprotect marks memory with LINUX_PROT_EXEC. This prevents Apple Silicon CPUs from executing stale cached instructions when dynamic JIT compilers like Android ART generate and execute new ARM64 machine code. --- src/syscall/mem.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/syscall/mem.c b/src/syscall/mem.c index 68f41596..ffa2bb52 100644 --- a/src/syscall/mem.c +++ b/src/syscall/mem.c @@ -4540,6 +4540,11 @@ int64_t sys_mprotect(guest_t *g, uint64_t addr, uint64_t length, int prot) return -LINUX_ENOMEM; } guest_region_set_prot(g, addr, mprot_end, prot); + if (prot & LINUX_PROT_EXEC) { + char *host_start = (char *) g->host_base + addr; + char *host_end = (char *) g->host_base + mprot_end; + __builtin___clear_cache(host_start, host_end); + } return 0; } uint64_t mprot_off = addr - g->ipa_base;