|
|
|
@ -67,10 +67,11 @@ ARM_Unicorn::ARM_Unicorn(System& system) : system{system} { |
|
|
|
CHECKED(uc_reg_write(uc, UC_ARM64_REG_CPACR_EL1, &fpv)); |
|
|
|
|
|
|
|
uc_hook hook{}; |
|
|
|
CHECKED(uc_hook_add(uc, &hook, UC_HOOK_INTR, (void*)InterruptHook, this, 0, -1)); |
|
|
|
CHECKED(uc_hook_add(uc, &hook, UC_HOOK_MEM_INVALID, (void*)UnmappedMemoryHook, &system, 0, -1)); |
|
|
|
CHECKED(uc_hook_add(uc, &hook, UC_HOOK_INTR, (void*)InterruptHook, this, 0, UINT64_MAX)); |
|
|
|
CHECKED(uc_hook_add(uc, &hook, UC_HOOK_MEM_INVALID, (void*)UnmappedMemoryHook, &system, 0, |
|
|
|
UINT64_MAX)); |
|
|
|
if (GDBStub::IsServerEnabled()) { |
|
|
|
CHECKED(uc_hook_add(uc, &hook, UC_HOOK_CODE, (void*)CodeHook, this, 0, -1)); |
|
|
|
CHECKED(uc_hook_add(uc, &hook, UC_HOOK_CODE, (void*)CodeHook, this, 0, UINT64_MAX)); |
|
|
|
last_bkpt_hit = false; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -154,9 +155,10 @@ void ARM_Unicorn::SetTPIDR_EL0(u64 value) { |
|
|
|
|
|
|
|
void ARM_Unicorn::Run() { |
|
|
|
if (GDBStub::IsServerEnabled()) { |
|
|
|
ExecuteInstructions(std::max(4000000, 0)); |
|
|
|
ExecuteInstructions(std::max(4000000U, 0U)); |
|
|
|
} else { |
|
|
|
ExecuteInstructions(std::max(system.CoreTiming().GetDowncount(), s64{0})); |
|
|
|
ExecuteInstructions( |
|
|
|
std::max(std::size_t(system.CoreTiming().GetDowncount()), std::size_t{0})); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -166,7 +168,7 @@ void ARM_Unicorn::Step() { |
|
|
|
|
|
|
|
MICROPROFILE_DEFINE(ARM_Jit_Unicorn, "ARM JIT", "Unicorn", MP_RGB(255, 64, 64)); |
|
|
|
|
|
|
|
void ARM_Unicorn::ExecuteInstructions(int num_instructions) { |
|
|
|
void ARM_Unicorn::ExecuteInstructions(std::size_t num_instructions) { |
|
|
|
MICROPROFILE_SCOPE(ARM_Jit_Unicorn); |
|
|
|
CHECKED(uc_emu_start(uc, GetPC(), 1ULL << 63, 0, num_instructions)); |
|
|
|
system.CoreTiming().AddTicks(num_instructions); |
|
|
|
|