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