Browse Source
[dynarmic] minor optimization on codepage caching for non-fastmem
remotes/1785372757367212240/tmp_refs/heads/variable-page-size
Exverge
1 month ago
No known key found for this signature in database
GPG Key ID: DAD399BCC5FB77E4
6 changed files with
16 additions and
11 deletions
-
src/core/arm/dynarmic/arm_dynarmic_32.cpp
-
src/core/arm/dynarmic/arm_dynarmic_32.h
-
src/core/arm/dynarmic/arm_dynarmic_64.cpp
-
src/core/arm/dynarmic/arm_dynarmic_64.h
-
src/core/hle/service/jit/jit_context.cpp
-
src/dynarmic/src/dynarmic/interface/code_page.h
|
|
|
@ -42,7 +42,7 @@ u64 DynarmicCallbacks32::MemoryRead64(u32 vaddr) { |
|
|
|
std::optional<u32> 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; |
|
|
|
|
|
|
|
@ -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 { |
|
|
|
|
|
|
|
@ -45,7 +45,7 @@ Dynarmic::A64::Vector DynarmicCallbacks64::MemoryRead128(u64 vaddr) { |
|
|
|
std::optional<u32> 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; |
|
|
|
|
|
|
|
@ -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 { |
|
|
|
|
|
|
|
@ -60,9 +60,7 @@ public: |
|
|
|
{} |
|
|
|
|
|
|
|
std::optional<std::uint32_t> 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<Dynarmic::CodePage>(aligned_vaddr); |
|
|
|
last_code_addr = aligned_vaddr; |
|
|
|
@ -167,8 +165,8 @@ private: |
|
|
|
std::vector<u8>& 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 { |
|
|
|
|
|
|
|
@ -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)]; |
|
|
|
}; |
|
|
|
|
|
|
|
} |