|
|
@ -101,11 +101,22 @@ std::unique_ptr<Dynarmic::A64::Jit> MakeJit(const std::unique_ptr<ARM_Dynarmic_C |
|
|
return std::make_unique<Dynarmic::A64::Jit>(config); |
|
|
return std::make_unique<Dynarmic::A64::Jit>(config); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void ARM_Dynarmic::Run() { |
|
|
|
|
|
ASSERT(Memory::GetCurrentPageTable() == current_page_table); |
|
|
|
|
|
|
|
|
|
|
|
jit->Run(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void ARM_Dynarmic::Step() { |
|
|
|
|
|
cb->InterpreterFallback(jit->GetPC(), 1); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
ARM_Dynarmic::ARM_Dynarmic() |
|
|
ARM_Dynarmic::ARM_Dynarmic() |
|
|
: cb(std::make_unique<ARM_Dynarmic_Callbacks>(*this)), jit(MakeJit(cb)) { |
|
|
: cb(std::make_unique<ARM_Dynarmic_Callbacks>(*this)), jit(MakeJit(cb)) { |
|
|
ARM_Interface::ThreadContext ctx; |
|
|
ARM_Interface::ThreadContext ctx; |
|
|
inner_unicorn.SaveContext(ctx); |
|
|
inner_unicorn.SaveContext(ctx); |
|
|
LoadContext(ctx); |
|
|
LoadContext(ctx); |
|
|
|
|
|
PageTableChanged(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
ARM_Dynarmic::~ARM_Dynarmic() = default; |
|
|
ARM_Dynarmic::~ARM_Dynarmic() = default; |
|
|
@ -164,13 +175,6 @@ void ARM_Dynarmic::SetTlsAddress(u64 address) { |
|
|
cb->tpidrro_el0 = address; |
|
|
cb->tpidrro_el0 = address; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void ARM_Dynarmic::ExecuteInstructions(int num_instructions) { |
|
|
|
|
|
cb->ticks_remaining = num_instructions; |
|
|
|
|
|
jit->Run(); |
|
|
|
|
|
CoreTiming::AddTicks(num_instructions - cb->num_interpreted_instructions); |
|
|
|
|
|
cb->num_interpreted_instructions = 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { |
|
|
void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { |
|
|
ctx.cpu_registers = jit->GetRegisters(); |
|
|
ctx.cpu_registers = jit->GetRegisters(); |
|
|
ctx.sp = jit->GetSP(); |
|
|
ctx.sp = jit->GetSP(); |
|
|
@ -203,4 +207,5 @@ void ARM_Dynarmic::ClearInstructionCache() { |
|
|
|
|
|
|
|
|
void ARM_Dynarmic::PageTableChanged() { |
|
|
void ARM_Dynarmic::PageTableChanged() { |
|
|
jit = MakeJit(cb); |
|
|
jit = MakeJit(cb); |
|
|
|
|
|
current_page_table = Memory::GetCurrentPageTable(); |
|
|
} |
|
|
} |