diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 724ec26570..e81e21ff13 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -42,7 +42,7 @@ u64 DynarmicCallbacks32::MemoryRead64(u32 vaddr) { std::optional DynarmicCallbacks32::MemoryReadCode(u32 vaddr) { if (!m_memory.IsValidVirtualAddressRange(vaddr, sizeof(u32))) return std::nullopt; - auto const aligned_vaddr = vaddr & ~(Dynarmic::CODE_PAGE_SIZE - 1); + auto const aligned_vaddr = Common::AlignDown(vaddr, Dynarmic::CODE_PAGE_SIZE); if (last_code_addr != aligned_vaddr) { m_memory.ReadBlock(aligned_vaddr, &cached_code_page, sizeof(cached_code_page)); last_code_addr = aligned_vaddr; diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h index 623597152f..53a4543b42 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.h +++ b/src/core/arm/dynarmic/arm_dynarmic_32.h @@ -53,13 +53,13 @@ public: bool CheckMemoryAccess(u64 addr, u64 size, Kernel::DebugWatchpointType type); void ReturnException(u32 pc, Dynarmic::HaltReason hr); // - Dynarmic::CodePage cached_code_page; u64 last_code_addr = u64(-1); ArmDynarmic32& m_parent; Core::Memory::Memory& m_memory; Kernel::KProcess* m_process{}; const bool m_debugger_enabled{}; const bool m_check_memory_access{}; + Dynarmic::CodePage cached_code_page; }; class ArmDynarmic32 final : public ArmInterface { diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 8760e5b1cb..5a6f5b045a 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -45,7 +45,7 @@ Dynarmic::A64::Vector DynarmicCallbacks64::MemoryRead128(u64 vaddr) { std::optional DynarmicCallbacks64::MemoryReadCode(u64 vaddr) { if (!m_memory.IsValidVirtualAddressRange(vaddr, sizeof(u32))) return std::nullopt; - auto const aligned_vaddr = vaddr & ~(Dynarmic::CODE_PAGE_SIZE - 1); + auto const aligned_vaddr = Common::AlignDown(vaddr, Dynarmic::CODE_PAGE_SIZE); if (last_code_addr != aligned_vaddr) { m_memory.ReadBlock(aligned_vaddr, &cached_code_page, sizeof(cached_code_page)); last_code_addr = aligned_vaddr; diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h index 6d0760986f..0f7270af28 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.h +++ b/src/core/arm/dynarmic/arm_dynarmic_64.h @@ -64,7 +64,6 @@ public: bool CheckMemoryAccess(u64 addr, u64 size, Kernel::DebugWatchpointType type); void ReturnException(u64 pc, Dynarmic::HaltReason hr); - Dynarmic::CodePage cached_code_page; u64 last_code_addr = u64(-1); ArmDynarmic64& m_parent; Core::Memory::Memory& m_memory; @@ -74,6 +73,7 @@ public: const bool m_debugger_enabled{}; const bool m_check_memory_access{}; static constexpr u64 MinimumRunCycles = 10000U; + Dynarmic::CodePage cached_code_page; }; class ArmDynarmic64 final : public ArmInterface { diff --git a/src/core/hle/service/jit/jit_context.cpp b/src/core/hle/service/jit/jit_context.cpp index 434f734a44..a1eb9ad41c 100644 --- a/src/core/hle/service/jit/jit_context.cpp +++ b/src/core/hle/service/jit/jit_context.cpp @@ -60,9 +60,7 @@ public: {} std::optional MemoryReadCode(VAddr vaddr) override { - // todo: does code page have to be 4kib? - //static_assert(Core::Memory::YUZU_PAGESIZE == Dynarmic::CODE_PAGE_SIZE); - auto const aligned_vaddr = vaddr & ~(Dynarmic::CODE_PAGE_SIZE - 1); + auto const aligned_vaddr = Common::AlignDown(vaddr, Dynarmic::CODE_PAGE_SIZE); if (last_code_addr != aligned_vaddr) { cached_code_page = ReadMemory(aligned_vaddr); last_code_addr = aligned_vaddr; @@ -167,8 +165,8 @@ private: std::vector& local_memory; IntervalSet& mapped_ranges; JITContextImpl& parent; - Dynarmic::CodePage cached_code_page; u64 last_code_addr = u64(-1); + Dynarmic::CodePage cached_code_page; }; class JITContextImpl { diff --git a/src/dynarmic/src/dynarmic/interface/code_page.h b/src/dynarmic/src/dynarmic/interface/code_page.h index fce3ea3057..0491448823 100644 --- a/src/dynarmic/src/dynarmic/interface/code_page.h +++ b/src/dynarmic/src/dynarmic/interface/code_page.h @@ -8,10 +8,17 @@ namespace Dynarmic { -/// @brief Smallest valid page (may change for Apple?) -constexpr inline uint64_t CODE_PAGE_SIZE = 4096; +/// @brief Smallest valid page +/// +// TODO: can we base this off the system page size without using the heap? +#if defined(__APPLE__) && defined(__aarch64__) +constexpr inline uint64_t CODE_PAGE_SIZE = 0x4000; +#else +constexpr inline uint64_t CODE_PAGE_SIZE = 0x1000; +#endif + struct CodePage { - uint32_t inst[CODE_PAGE_SIZE / sizeof(uint32_t)]; + alignas(CODE_PAGE_SIZE) uint32_t inst[CODE_PAGE_SIZE / sizeof(uint32_t)]; }; }