diff options
author | bunnei <bunneidev@gmail.com> | 2020-04-19 06:51:21 +0200 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2020-04-19 06:53:23 +0200 |
commit | 74c27fd1b52d3456dfe745f8bb1387736302c466 (patch) | |
tree | 2cc379b2206d1d94b336b5a3eed202617e80d4f3 /src/core/arm/unicorn | |
parent | Merge pull request #3719 from jbeich/clang (diff) | |
download | yuzu-74c27fd1b52d3456dfe745f8bb1387736302c466.tar yuzu-74c27fd1b52d3456dfe745f8bb1387736302c466.tar.gz yuzu-74c27fd1b52d3456dfe745f8bb1387736302c466.tar.bz2 yuzu-74c27fd1b52d3456dfe745f8bb1387736302c466.tar.lz yuzu-74c27fd1b52d3456dfe745f8bb1387736302c466.tar.xz yuzu-74c27fd1b52d3456dfe745f8bb1387736302c466.tar.zst yuzu-74c27fd1b52d3456dfe745f8bb1387736302c466.zip |
Diffstat (limited to 'src/core/arm/unicorn')
-rw-r--r-- | src/core/arm/unicorn/arm_unicorn.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp index d189efb63..b96583123 100644 --- a/src/core/arm/unicorn/arm_unicorn.cpp +++ b/src/core/arm/unicorn/arm_unicorn.cpp @@ -11,6 +11,7 @@ #include "core/core_timing.h" #include "core/hle/kernel/scheduler.h" #include "core/hle/kernel/svc.h" +#include "core/memory.h" namespace Core { @@ -171,7 +172,17 @@ MICROPROFILE_DEFINE(ARM_Jit_Unicorn, "ARM JIT", "Unicorn", MP_RGB(255, 64, 64)); void ARM_Unicorn::ExecuteInstructions(std::size_t num_instructions) { MICROPROFILE_SCOPE(ARM_Jit_Unicorn); + + // Temporarily map the code page for Unicorn + u64 map_addr{GetPC() & ~Memory::PAGE_MASK}; + std::vector<u8> page_buffer(Memory::PAGE_SIZE); + system.Memory().ReadBlock(map_addr, page_buffer.data(), page_buffer.size()); + + CHECKED(uc_mem_map_ptr(uc, map_addr, page_buffer.size(), + UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, page_buffer.data())); CHECKED(uc_emu_start(uc, GetPC(), 1ULL << 63, 0, num_instructions)); + CHECKED(uc_mem_unmap(uc, map_addr, page_buffer.size())); + system.CoreTiming().AddTicks(num_instructions); if (GDBStub::IsServerEnabled()) { if (last_bkpt_hit && last_bkpt.type == GDBStub::BreakpointType::Execute) { |