core: arm_unicorn: Fix interpret fallback by temporarily mapping instruction page.
This commit is contained in:
parent
4d7d3651f3
commit
74c27fd1b5
@ -11,6 +11,7 @@
|
|||||||
#include "core/core_timing.h"
|
#include "core/core_timing.h"
|
||||||
#include "core/hle/kernel/scheduler.h"
|
#include "core/hle/kernel/scheduler.h"
|
||||||
#include "core/hle/kernel/svc.h"
|
#include "core/hle/kernel/svc.h"
|
||||||
|
#include "core/memory.h"
|
||||||
|
|
||||||
namespace Core {
|
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) {
|
void ARM_Unicorn::ExecuteInstructions(std::size_t num_instructions) {
|
||||||
MICROPROFILE_SCOPE(ARM_Jit_Unicorn);
|
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_emu_start(uc, GetPC(), 1ULL << 63, 0, num_instructions));
|
||||||
|
CHECKED(uc_mem_unmap(uc, map_addr, page_buffer.size()));
|
||||||
|
|
||||||
system.CoreTiming().AddTicks(num_instructions);
|
system.CoreTiming().AddTicks(num_instructions);
|
||||||
if (GDBStub::IsServerEnabled()) {
|
if (GDBStub::IsServerEnabled()) {
|
||||||
if (last_bkpt_hit && last_bkpt.type == GDBStub::BreakpointType::Execute) {
|
if (last_bkpt_hit && last_bkpt.type == GDBStub::BreakpointType::Execute) {
|
||||||
|
Loading…
Reference in New Issue
Block a user