|
@@ -7,6 +7,7 @@
|
|
|
#include "common/assert.h"
|
|
#include "common/assert.h"
|
|
|
#include "common/microprofile.h"
|
|
#include "common/microprofile.h"
|
|
|
#include "core/arm/dynarmic/arm_dynarmic.h"
|
|
#include "core/arm/dynarmic/arm_dynarmic.h"
|
|
|
|
|
+#include "core/arm/dynarmic/arm_dynarmic_cp15.h"
|
|
|
#include "core/arm/dyncom/arm_dyncom_interpreter.h"
|
|
#include "core/arm/dyncom/arm_dyncom_interpreter.h"
|
|
|
#include "core/core.h"
|
|
#include "core/core.h"
|
|
|
#include "core/core_timing.h"
|
|
#include "core/core_timing.h"
|
|
@@ -39,28 +40,30 @@ static bool IsReadOnlyMemory(u32 vaddr) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static Dynarmic::UserCallbacks GetUserCallbacks(ARMul_State* interpeter_state) {
|
|
|
|
|
|
|
+static Dynarmic::UserCallbacks GetUserCallbacks(
|
|
|
|
|
+ const std::shared_ptr<ARMul_State>& interpeter_state) {
|
|
|
Dynarmic::UserCallbacks user_callbacks{};
|
|
Dynarmic::UserCallbacks user_callbacks{};
|
|
|
user_callbacks.InterpreterFallback = &InterpreterFallback;
|
|
user_callbacks.InterpreterFallback = &InterpreterFallback;
|
|
|
- user_callbacks.user_arg = static_cast<void*>(interpeter_state);
|
|
|
|
|
|
|
+ user_callbacks.user_arg = static_cast<void*>(interpeter_state.get());
|
|
|
user_callbacks.CallSVC = &SVC::CallSVC;
|
|
user_callbacks.CallSVC = &SVC::CallSVC;
|
|
|
- user_callbacks.IsReadOnlyMemory = &IsReadOnlyMemory;
|
|
|
|
|
- user_callbacks.MemoryReadCode = &Memory::Read32;
|
|
|
|
|
- user_callbacks.MemoryRead8 = &Memory::Read8;
|
|
|
|
|
- user_callbacks.MemoryRead16 = &Memory::Read16;
|
|
|
|
|
- user_callbacks.MemoryRead32 = &Memory::Read32;
|
|
|
|
|
- user_callbacks.MemoryRead64 = &Memory::Read64;
|
|
|
|
|
- user_callbacks.MemoryWrite8 = &Memory::Write8;
|
|
|
|
|
- user_callbacks.MemoryWrite16 = &Memory::Write16;
|
|
|
|
|
- user_callbacks.MemoryWrite32 = &Memory::Write32;
|
|
|
|
|
- user_callbacks.MemoryWrite64 = &Memory::Write64;
|
|
|
|
|
|
|
+ user_callbacks.memory.IsReadOnlyMemory = &IsReadOnlyMemory;
|
|
|
|
|
+ user_callbacks.memory.ReadCode = &Memory::Read32;
|
|
|
|
|
+ user_callbacks.memory.Read8 = &Memory::Read8;
|
|
|
|
|
+ user_callbacks.memory.Read16 = &Memory::Read16;
|
|
|
|
|
+ user_callbacks.memory.Read32 = &Memory::Read32;
|
|
|
|
|
+ user_callbacks.memory.Read64 = &Memory::Read64;
|
|
|
|
|
+ user_callbacks.memory.Write8 = &Memory::Write8;
|
|
|
|
|
+ user_callbacks.memory.Write16 = &Memory::Write16;
|
|
|
|
|
+ user_callbacks.memory.Write32 = &Memory::Write32;
|
|
|
|
|
+ user_callbacks.memory.Write64 = &Memory::Write64;
|
|
|
user_callbacks.page_table = Memory::GetCurrentPageTablePointers();
|
|
user_callbacks.page_table = Memory::GetCurrentPageTablePointers();
|
|
|
|
|
+ user_callbacks.coprocessors[15] = std::make_shared<DynarmicCP15>(interpeter_state);
|
|
|
return user_callbacks;
|
|
return user_callbacks;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ARM_Dynarmic::ARM_Dynarmic(PrivilegeMode initial_mode) {
|
|
ARM_Dynarmic::ARM_Dynarmic(PrivilegeMode initial_mode) {
|
|
|
- interpreter_state = std::make_unique<ARMul_State>(initial_mode);
|
|
|
|
|
- jit = std::make_unique<Dynarmic::Jit>(GetUserCallbacks(interpreter_state.get()));
|
|
|
|
|
|
|
+ interpreter_state = std::make_shared<ARMul_State>(initial_mode);
|
|
|
|
|
+ jit = std::make_unique<Dynarmic::Jit>(GetUserCallbacks(interpreter_state));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void ARM_Dynarmic::SetPC(u32 pc) {
|
|
void ARM_Dynarmic::SetPC(u32 pc) {
|