From 5ab21fd8436abed375bf74046c229a9da6e44dad Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 20 Oct 2025 00:32:57 +0000 Subject: [PATCH] disable NCE temporarily to fix mvk issues Signed-off-by: lizzie --- CMakeLists.txt | 3 ++- src/common/host_memory.cpp | 12 +++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dbd0b17dc2..9e4bbbbbb2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -303,7 +303,8 @@ if (YUZU_LEGACY) add_compile_definitions(YUZU_LEGACY) endif() -if (ARCHITECTURE_arm64 AND (ANDROID OR APPLE OR PLATFORM_LINUX)) +# TODO: APPLE +if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX)) set(HAS_NCE 1) add_compile_definitions(HAS_NCE=1) endif() diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index c9c7506c68..02871e878a 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -397,8 +397,8 @@ private: #else // ^^^ Windows ^^^ vvv POSIX vvv -#ifdef ARCHITECTURE_arm64 - +// Use NCE friendly mapping techniques +#if defined(ARCHITECTURE_arm64) && defined(HAS_NCE) static void* ChooseVirtualBase(size_t virtual_size) { constexpr uintptr_t Map36BitSize = (1ULL << 36); #ifdef __APPLE__ @@ -484,9 +484,7 @@ static void* ChooseVirtualBase(size_t virtual_size) { return MAP_FAILED; #endif } - #else - static void* ChooseVirtualBase(size_t virtual_size) { #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__managarm__) || defined(__AIX__) void* virtual_base = mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER, -1, 0); @@ -495,7 +493,6 @@ static void* ChooseVirtualBase(size_t virtual_size) { #endif return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); } - #endif #if defined(__sun__) || defined(__HAIKU__) || defined(__NetBSD__) || defined(__DragonFly__) @@ -622,9 +619,10 @@ public: prot_flags |= PROT_READ; if (True(perms & MemoryPermission::Write)) prot_flags |= PROT_WRITE; -#ifdef ARCHITECTURE_arm64 + // W^X only supported with NCE +#if defined(ARCHITECTURE_arm64) && defined(HAS_NCE) if (True(perms & MemoryPermission::Execute)) - prot_flags |= PROT_EXEC; + flags |= PROT_EXEC; #endif int flags = (fd > 0 ? MAP_SHARED : MAP_PRIVATE) | MAP_FIXED; void* ret = mmap(virtual_base + virtual_offset, length, prot_flags, flags, fd, host_offset);