Browse Source

[dynarmic] minor optimization on codepage caching for non-fastmem

remotes/1785372757367212240/tmp_refs/heads/variable-page-size
Exverge 1 month ago
parent
commit
da54e20332
No known key found for this signature in database GPG Key ID: DAD399BCC5FB77E4
  1. 2
      src/core/arm/dynarmic/arm_dynarmic_32.cpp
  2. 2
      src/core/arm/dynarmic/arm_dynarmic_32.h
  3. 2
      src/core/arm/dynarmic/arm_dynarmic_64.cpp
  4. 2
      src/core/arm/dynarmic/arm_dynarmic_64.h
  5. 6
      src/core/hle/service/jit/jit_context.cpp
  6. 13
      src/dynarmic/src/dynarmic/interface/code_page.h

2
src/core/arm/dynarmic/arm_dynarmic_32.cpp

@ -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;

2
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 {

2
src/core/arm/dynarmic/arm_dynarmic_64.cpp

@ -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;

2
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 {

6
src/core/hle/service/jit/jit_context.cpp

@ -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 {

13
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)];
};
}
Loading…
Cancel
Save