From db672a66abbcaf2d6bea662c4849ff54f3fdcf21 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 17 Jan 2026 00:52:51 +0000 Subject: [PATCH] reduce arm codeisze, force 16x4 pages again --- src/common/virtual_buffer.cpp | 36 +++++++++++++++-------- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 2 +- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 2 +- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index 5b9764d236..f3a3a695e0 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -105,21 +105,24 @@ struct Ucontext { } static boost::container::static_vector, 16> swap_regions; +static std::mutex evil_swap_mutex; extern "C" int sceKernelRemoveExceptionHandler(s32 sig_num); static void SwapHandler(int sig, void* raw_context) { + std::unique_lock lk{evil_swap_mutex}; auto& mctx = ((Orbis::Ucontext*)raw_context)->uc_mcontext; if (auto const it = std::ranges::find_if(swap_regions, [addr = mctx.mc_addr](auto const& e) { return uintptr_t(addr) >= uintptr_t(e.first) && uintptr_t(addr) < uintptr_t(e.first) + e.second; }); it != swap_regions.end()) { - size_t const page_size = 4096 * 4; //16K + size_t const page_size = 4096 * 8; //16K size_t const page_mask = ~(page_size - 1); // should replace the existing mapping... ugh void* aligned_addr = reinterpret_cast(uintptr_t(mctx.mc_addr) & page_mask); void* res = mmap(aligned_addr, page_size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); if (res == MAP_FAILED) { - LOG_ERROR(HW_Memory, "{},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); + LOG_ERROR(HW_Memory, "{:#x},{} @ {}:{:#x}", mctx.mc_addr, aligned_addr, it->first, it->second); + sceKernelRemoveExceptionHandler(SIGSEGV); // to not catch the next signal } else { - LOG_TRACE(HW_Memory, "{},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); + LOG_TRACE(HW_Memory, "{:#x},{} @ {}:{:#x}", mctx.mc_addr, aligned_addr, it->first, it->second); } } else { LOG_ERROR(HW_Memory, "fault in addr {:#x} at {:#x}", mctx.mc_addr, mctx.mc_rip); // print caller address @@ -138,15 +141,17 @@ void* AllocateMemoryPages(std::size_t size) noexcept { void* addr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); ASSERT(addr != nullptr); #elif defined(__OPENORBIS__) - // void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); - // if (addr == MAP_FAILED) { - LOG_WARNING(HW_Memory, "Using VoidMem for {}B area", size); - void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); - ASSERT(addr != MAP_FAILED); - swap_regions.emplace_back(addr, size); - // } else { - // LOG_INFO(HW_Memory, "mmap {} bytes", size); - // } + void* addr; + if (size <= 8192 * 4096) { + addr = malloc(size); + LOG_WARNING(HW_Memory, "Using DMem for {} bytes area @ {}", size, addr); + ASSERT(addr != nullptr); + } else { + addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); + LOG_WARNING(HW_Memory, "Using VoidMem for {} bytes area @ {}", size, addr); + ASSERT(addr != MAP_FAILED); + swap_regions.emplace_back(addr, size); + } #else void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); ASSERT(addr != MAP_FAILED); @@ -159,6 +164,13 @@ void FreeMemoryPages(void* addr, [[maybe_unused]] std::size_t size) noexcept { return; #ifdef _WIN32 VirtualFree(addr, 0, MEM_RELEASE); +#elif defined(__OPENORBIS__) + if (size <= 8192 * 4096) { + free(addr); + } else { + int rc = munmap(addr, size); + ASSERT(rc == 0); + } #else int rc = munmap(addr, size); ASSERT(rc == 0); diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 3bfddcb80c..005543edec 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -204,7 +204,7 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { // Code cache size #if defined(__OPENORBIS__) - config.code_cache_size = std::uint32_t(32_MiB); + config.code_cache_size = std::uint32_t(8_MiB); #elif defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) config.code_cache_size = std::uint32_t(128_MiB); #else diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index f0bc4a7f1e..921bf8269b 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -255,7 +255,7 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s // Code cache size #if defined(__OPENORBIS__) - config.code_cache_size = std::uint32_t(32_MiB); + config.code_cache_size = std::uint32_t(8_MiB); #elif defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) config.code_cache_size = std::uint32_t(128_MiB); #else