diff options
Diffstat (limited to 'src/core/arm')
| -rw-r--r-- | src/core/arm/arm_interface.h | 22 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.cpp | 93 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.h | 17 | ||||
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom.cpp | 19 | ||||
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom.h | 5 | ||||
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom_interpreter.cpp | 8 | ||||
| -rw-r--r-- | src/core/arm/skyeye_common/armstate.h | 2 |
7 files changed, 80 insertions, 86 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index f613556dd..0b3096347 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include "common/common_types.h" | 7 | #include "common/common_types.h" |
| 8 | #include "core/hle/kernel/vm_manager.h" | ||
| 8 | #include "core/arm/skyeye_common/arm_regformat.h" | 9 | #include "core/arm/skyeye_common/arm_regformat.h" |
| 9 | #include "core/arm/skyeye_common/vfp/asm_vfp.h" | 10 | #include "core/arm/skyeye_common/vfp/asm_vfp.h" |
| 10 | 11 | ||
| @@ -19,10 +20,11 @@ public: | |||
| 19 | u64 sp; | 20 | u64 sp; |
| 20 | u64 pc; | 21 | u64 pc; |
| 21 | u64 cpsr; | 22 | u64 cpsr; |
| 22 | u64 fpu_registers[64]; | 23 | u128 fpu_registers[32]; |
| 23 | u64 fpscr; | 24 | u64 fpscr; |
| 24 | u64 fpexc; | 25 | u64 fpexc; |
| 25 | 26 | ||
| 27 | |||
| 26 | // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT | 28 | // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT |
| 27 | VAddr tls_address; | 29 | VAddr tls_address; |
| 28 | }; | 30 | }; |
| @@ -41,9 +43,14 @@ public: | |||
| 41 | Run(1); | 43 | Run(1); |
| 42 | } | 44 | } |
| 43 | 45 | ||
| 46 | virtual void MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) {} | ||
| 47 | |||
| 44 | /// Clear all instruction cache | 48 | /// Clear all instruction cache |
| 45 | virtual void ClearInstructionCache() = 0; | 49 | virtual void ClearInstructionCache() = 0; |
| 46 | 50 | ||
| 51 | /// Notify CPU emulation that page tables have changed | ||
| 52 | virtual void PageTableChanged() = 0; | ||
| 53 | |||
| 47 | /** | 54 | /** |
| 48 | * Set the Program Counter to an address | 55 | * Set the Program Counter to an address |
| 49 | * @param addr Address to set PC to | 56 | * @param addr Address to set PC to |
| @@ -70,6 +77,10 @@ public: | |||
| 70 | */ | 77 | */ |
| 71 | virtual void SetReg(int index, u64 value) = 0; | 78 | virtual void SetReg(int index, u64 value) = 0; |
| 72 | 79 | ||
| 80 | virtual const u128& GetExtReg(int index) const = 0; | ||
| 81 | |||
| 82 | virtual void SetExtReg(int index, u128& value) = 0; | ||
| 83 | |||
| 73 | /** | 84 | /** |
| 74 | * Gets the value of a VFP register | 85 | * Gets the value of a VFP register |
| 75 | * @param index Register index (0-31) | 86 | * @param index Register index (0-31) |
| @@ -129,12 +140,6 @@ public: | |||
| 129 | virtual void SetTlsAddress(VAddr address) = 0; | 140 | virtual void SetTlsAddress(VAddr address) = 0; |
| 130 | 141 | ||
| 131 | /** | 142 | /** |
| 132 | * Advance the CPU core by the specified number of ticks (e.g. to simulate CPU execution time) | ||
| 133 | * @param ticks Number of ticks to advance the CPU core | ||
| 134 | */ | ||
| 135 | virtual void AddTicks(u64 ticks) = 0; | ||
| 136 | |||
| 137 | /** | ||
| 138 | * Saves the current CPU context | 143 | * Saves the current CPU context |
| 139 | * @param ctx Thread context to save | 144 | * @param ctx Thread context to save |
| 140 | */ | 145 | */ |
| @@ -154,9 +159,6 @@ public: | |||
| 154 | return num_instructions; | 159 | return num_instructions; |
| 155 | } | 160 | } |
| 156 | 161 | ||
| 157 | s64 down_count = 0; ///< A decreasing counter of remaining cycles before the next event, | ||
| 158 | /// decreased by the cpu run loop | ||
| 159 | |||
| 160 | protected: | 162 | protected: |
| 161 | /** | 163 | /** |
| 162 | * Executes the given number of instructions | 164 | * Executes the given number of instructions |
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index 0ea1d76e4..6dcab5bab 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp | |||
| @@ -16,24 +16,6 @@ | |||
| 16 | 16 | ||
| 17 | static void InterpreterFallback(u64 pc, Dynarmic::Jit* jit, void* user_arg) { | 17 | static void InterpreterFallback(u64 pc, Dynarmic::Jit* jit, void* user_arg) { |
| 18 | UNIMPLEMENTED_MSG("InterpreterFallback for ARM64 JIT does not exist!"); | 18 | UNIMPLEMENTED_MSG("InterpreterFallback for ARM64 JIT does not exist!"); |
| 19 | //ARMul_State* state = static_cast<ARMul_State*>(user_arg); | ||
| 20 | |||
| 21 | //state->Reg = jit->Regs(); | ||
| 22 | //state->Cpsr = jit->Cpsr(); | ||
| 23 | //state->Reg[15] = static_cast<u32>(pc); | ||
| 24 | //state->ExtReg = jit->ExtRegs(); | ||
| 25 | //state->VFP[VFP_FPSCR] = jit->Fpscr(); | ||
| 26 | //state->NumInstrsToExecute = 1; | ||
| 27 | |||
| 28 | //InterpreterMainLoop(state); | ||
| 29 | |||
| 30 | //bool is_thumb = (state->Cpsr & (1 << 5)) != 0; | ||
| 31 | //state->Reg[15] &= (is_thumb ? 0xFFFFFFFE : 0xFFFFFFFC); | ||
| 32 | |||
| 33 | //jit->Regs() = state->Reg; | ||
| 34 | //jit->Cpsr() = state->Cpsr; | ||
| 35 | //jit->ExtRegs() = state->ExtReg; | ||
| 36 | //jit->SetFpscr(state->VFP[VFP_FPSCR]); | ||
| 37 | } | 19 | } |
| 38 | 20 | ||
| 39 | static bool IsReadOnlyMemory(u64 vaddr) { | 21 | static bool IsReadOnlyMemory(u64 vaddr) { |
| @@ -73,11 +55,10 @@ void MemoryWrite64(const u64 addr, const u64 data) { | |||
| 73 | Memory::Write64(static_cast<VAddr>(addr), data); | 55 | Memory::Write64(static_cast<VAddr>(addr), data); |
| 74 | } | 56 | } |
| 75 | 57 | ||
| 76 | static Dynarmic::UserCallbacks GetUserCallbacks( | 58 | static Dynarmic::UserCallbacks GetUserCallbacks(ARM_Dynarmic* this_) { |
| 77 | const std::shared_ptr<ARMul_State>& interpeter_state) { | ||
| 78 | Dynarmic::UserCallbacks user_callbacks{}; | 59 | Dynarmic::UserCallbacks user_callbacks{}; |
| 79 | //user_callbacks.InterpreterFallback = &InterpreterFallback; | 60 | user_callbacks.InterpreterFallback = &InterpreterFallback; |
| 80 | //user_callbacks.user_arg = static_cast<void*>(interpeter_state.get()); | 61 | user_callbacks.user_arg = static_cast<void*>(this_); |
| 81 | user_callbacks.CallSVC = &SVC::CallSVC; | 62 | user_callbacks.CallSVC = &SVC::CallSVC; |
| 82 | user_callbacks.memory.IsReadOnlyMemory = &IsReadOnlyMemory; | 63 | user_callbacks.memory.IsReadOnlyMemory = &IsReadOnlyMemory; |
| 83 | user_callbacks.memory.ReadCode = &MemoryRead32; | 64 | user_callbacks.memory.ReadCode = &MemoryRead32; |
| @@ -90,13 +71,13 @@ static Dynarmic::UserCallbacks GetUserCallbacks( | |||
| 90 | user_callbacks.memory.Write32 = &MemoryWrite32; | 71 | user_callbacks.memory.Write32 = &MemoryWrite32; |
| 91 | user_callbacks.memory.Write64 = &MemoryWrite64; | 72 | user_callbacks.memory.Write64 = &MemoryWrite64; |
| 92 | //user_callbacks.page_table = Memory::GetCurrentPageTablePointers(); | 73 | //user_callbacks.page_table = Memory::GetCurrentPageTablePointers(); |
| 93 | user_callbacks.coprocessors[15] = std::make_shared<DynarmicCP15>(interpeter_state); | ||
| 94 | return user_callbacks; | 74 | return user_callbacks; |
| 95 | } | 75 | } |
| 96 | 76 | ||
| 97 | ARM_Dynarmic::ARM_Dynarmic(PrivilegeMode initial_mode) { | 77 | ARM_Dynarmic::ARM_Dynarmic(PrivilegeMode initial_mode) { |
| 98 | interpreter_state = std::make_shared<ARMul_State>(initial_mode); | 78 | } |
| 99 | jit = std::make_unique<Dynarmic::Jit>(GetUserCallbacks(interpreter_state), Dynarmic::Arch::ARM64); | 79 | |
| 80 | void ARM_Dynarmic::MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) { | ||
| 100 | } | 81 | } |
| 101 | 82 | ||
| 102 | void ARM_Dynarmic::SetPC(u64 pc) { | 83 | void ARM_Dynarmic::SetPC(u64 pc) { |
| @@ -115,30 +96,26 @@ void ARM_Dynarmic::SetReg(int index, u64 value) { | |||
| 115 | jit->Regs64()[index] = value; | 96 | jit->Regs64()[index] = value; |
| 116 | } | 97 | } |
| 117 | 98 | ||
| 99 | const u128& ARM_Dynarmic::GetExtReg(int index) const { | ||
| 100 | return jit->ExtRegs64()[index]; | ||
| 101 | } | ||
| 102 | |||
| 103 | void ARM_Dynarmic::SetExtReg(int index, u128& value) { | ||
| 104 | jit->ExtRegs64()[index] = value; | ||
| 105 | } | ||
| 106 | |||
| 118 | u32 ARM_Dynarmic::GetVFPReg(int index) const { | 107 | u32 ARM_Dynarmic::GetVFPReg(int index) const { |
| 119 | return jit->ExtRegs()[index]; | 108 | return {}; |
| 120 | } | 109 | } |
| 121 | 110 | ||
| 122 | void ARM_Dynarmic::SetVFPReg(int index, u32 value) { | 111 | void ARM_Dynarmic::SetVFPReg(int index, u32 value) { |
| 123 | jit->ExtRegs()[index] = value; | ||
| 124 | } | 112 | } |
| 125 | 113 | ||
| 126 | u32 ARM_Dynarmic::GetVFPSystemReg(VFPSystemRegister reg) const { | 114 | u32 ARM_Dynarmic::GetVFPSystemReg(VFPSystemRegister reg) const { |
| 127 | if (reg == VFP_FPSCR) { | 115 | return {}; |
| 128 | return jit->Fpscr(); | ||
| 129 | } | ||
| 130 | |||
| 131 | // Dynarmic does not implement and/or expose other VFP registers, fallback to interpreter state | ||
| 132 | return interpreter_state->VFP[reg]; | ||
| 133 | } | 116 | } |
| 134 | 117 | ||
| 135 | void ARM_Dynarmic::SetVFPSystemReg(VFPSystemRegister reg, u32 value) { | 118 | void ARM_Dynarmic::SetVFPSystemReg(VFPSystemRegister reg, u32 value) { |
| 136 | if (reg == VFP_FPSCR) { | ||
| 137 | jit->SetFpscr(value); | ||
| 138 | } | ||
| 139 | |||
| 140 | // Dynarmic does not implement and/or expose other VFP registers, fallback to interpreter state | ||
| 141 | interpreter_state->VFP[reg] = value; | ||
| 142 | } | 119 | } |
| 143 | 120 | ||
| 144 | u32 ARM_Dynarmic::GetCPSR() const { | 121 | u32 ARM_Dynarmic::GetCPSR() const { |
| @@ -150,11 +127,10 @@ void ARM_Dynarmic::SetCPSR(u32 cpsr) { | |||
| 150 | } | 127 | } |
| 151 | 128 | ||
| 152 | u32 ARM_Dynarmic::GetCP15Register(CP15Register reg) { | 129 | u32 ARM_Dynarmic::GetCP15Register(CP15Register reg) { |
| 153 | return interpreter_state->CP15[reg]; | 130 | return {}; |
| 154 | } | 131 | } |
| 155 | 132 | ||
| 156 | void ARM_Dynarmic::SetCP15Register(CP15Register reg, u32 value) { | 133 | void ARM_Dynarmic::SetCP15Register(CP15Register reg, u32 value) { |
| 157 | interpreter_state->CP15[reg] = value; | ||
| 158 | } | 134 | } |
| 159 | 135 | ||
| 160 | VAddr ARM_Dynarmic::GetTlsAddress() const { | 136 | VAddr ARM_Dynarmic::GetTlsAddress() const { |
| @@ -165,51 +141,39 @@ void ARM_Dynarmic::SetTlsAddress(VAddr address) { | |||
| 165 | jit->TlsAddr() = address; | 141 | jit->TlsAddr() = address; |
| 166 | } | 142 | } |
| 167 | 143 | ||
| 168 | void ARM_Dynarmic::AddTicks(u64 ticks) { | ||
| 169 | down_count -= ticks; | ||
| 170 | if (down_count < 0) { | ||
| 171 | CoreTiming::Advance(); | ||
| 172 | } | ||
| 173 | } | ||
| 174 | |||
| 175 | MICROPROFILE_DEFINE(ARM_Jit, "ARM JIT", "ARM JIT", MP_RGB(255, 64, 64)); | 144 | MICROPROFILE_DEFINE(ARM_Jit, "ARM JIT", "ARM JIT", MP_RGB(255, 64, 64)); |
| 176 | 145 | ||
| 177 | void ARM_Dynarmic::ExecuteInstructions(int num_instructions) { | 146 | void ARM_Dynarmic::ExecuteInstructions(int num_instructions) { |
| 147 | ASSERT(Memory::GetCurrentPageTable() == current_page_table); | ||
| 178 | MICROPROFILE_SCOPE(ARM_Jit); | 148 | MICROPROFILE_SCOPE(ARM_Jit); |
| 179 | 149 | ||
| 180 | unsigned ticks_executed = jit->Run(1 /*static_cast<unsigned>(num_instructions)*/); | 150 | std::size_t ticks_executed = jit->Run(static_cast<unsigned>(num_instructions)); |
| 181 | 151 | ||
| 182 | AddTicks(ticks_executed); | 152 | CoreTiming::AddTicks(ticks_executed); |
| 183 | } | 153 | } |
| 184 | 154 | ||
| 185 | void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { | 155 | void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { |
| 186 | memcpy(ctx.cpu_registers, jit->Regs64().data(), sizeof(ctx.cpu_registers)); | 156 | memcpy(ctx.cpu_registers, jit->Regs64().data(), sizeof(ctx.cpu_registers)); |
| 187 | //memcpy(ctx.fpu_registers, jit->ExtRegs().data(), sizeof(ctx.fpu_registers)); | 157 | memcpy(ctx.fpu_registers, jit->ExtRegs64().data(), sizeof(ctx.fpu_registers)); |
| 188 | 158 | ||
| 189 | ctx.lr = jit->Regs64()[30]; | 159 | ctx.lr = jit->Regs64()[30]; |
| 190 | ctx.sp = jit->Regs64()[31]; | 160 | ctx.sp = jit->Regs64()[31]; |
| 191 | ctx.pc = jit->Regs64()[32]; | 161 | ctx.pc = jit->Regs64()[32]; |
| 192 | ctx.cpsr = jit->Cpsr(); | 162 | ctx.cpsr = jit->Cpsr(); |
| 193 | 163 | ||
| 194 | ctx.fpscr = jit->Fpscr(); | ||
| 195 | ctx.fpexc = interpreter_state->VFP[VFP_FPEXC]; | ||
| 196 | |||
| 197 | // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT | 164 | // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT |
| 198 | ctx.tls_address = jit->TlsAddr(); | 165 | ctx.tls_address = jit->TlsAddr(); |
| 199 | } | 166 | } |
| 200 | 167 | ||
| 201 | void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) { | 168 | void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) { |
| 202 | memcpy(jit->Regs64().data(), ctx.cpu_registers, sizeof(ctx.cpu_registers)); | 169 | memcpy(jit->Regs64().data(), ctx.cpu_registers, sizeof(ctx.cpu_registers)); |
| 203 | //memcpy(jit->ExtRegs().data(), ctx.fpu_registers, sizeof(ctx.fpu_registers)); | 170 | memcpy(jit->ExtRegs64().data(), ctx.fpu_registers, sizeof(ctx.fpu_registers)); |
| 204 | 171 | ||
| 205 | jit->Regs64()[30] = ctx.lr; | 172 | jit->Regs64()[30] = ctx.lr; |
| 206 | jit->Regs64()[31] = ctx.sp; | 173 | jit->Regs64()[31] = ctx.sp; |
| 207 | jit->Regs64()[32] = ctx.pc; | 174 | jit->Regs64()[32] = ctx.pc; |
| 208 | jit->Cpsr() = ctx.cpsr; | 175 | jit->Cpsr() = ctx.cpsr; |
| 209 | 176 | ||
| 210 | jit->SetFpscr(ctx.fpscr); | ||
| 211 | interpreter_state->VFP[VFP_FPEXC] = ctx.fpexc; | ||
| 212 | |||
| 213 | // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT | 177 | // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT |
| 214 | jit->TlsAddr() = ctx.tls_address; | 178 | jit->TlsAddr() = ctx.tls_address; |
| 215 | } | 179 | } |
| @@ -223,3 +187,16 @@ void ARM_Dynarmic::PrepareReschedule() { | |||
| 223 | void ARM_Dynarmic::ClearInstructionCache() { | 187 | void ARM_Dynarmic::ClearInstructionCache() { |
| 224 | jit->ClearCache(); | 188 | jit->ClearCache(); |
| 225 | } | 189 | } |
| 190 | |||
| 191 | void ARM_Dynarmic::PageTableChanged() { | ||
| 192 | current_page_table = Memory::GetCurrentPageTable(); | ||
| 193 | |||
| 194 | auto iter = jits.find(current_page_table); | ||
| 195 | if (iter != jits.end()) { | ||
| 196 | jit = iter->second.get(); | ||
| 197 | return; | ||
| 198 | } | ||
| 199 | |||
| 200 | jit = new Dynarmic::Jit(GetUserCallbacks(this), Dynarmic::Arch::ARM64); | ||
| 201 | jits.emplace(current_page_table, std::unique_ptr<Dynarmic::Jit>(jit)); | ||
| 202 | } | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index fcdc1c0e0..6567359b0 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.h +++ b/src/core/arm/dynarmic/arm_dynarmic.h | |||
| @@ -4,20 +4,29 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <map> | ||
| 7 | #include <memory> | 8 | #include <memory> |
| 8 | #include <dynarmic/dynarmic.h> | 9 | #include <dynarmic/dynarmic.h> |
| 9 | #include "common/common_types.h" | 10 | #include "common/common_types.h" |
| 10 | #include "core/arm/arm_interface.h" | 11 | #include "core/arm/arm_interface.h" |
| 11 | #include "core/arm/skyeye_common/armstate.h" | 12 | #include "core/arm/skyeye_common/armstate.h" |
| 12 | 13 | ||
| 14 | namespace Memory { | ||
| 15 | struct PageTable; | ||
| 16 | } // namespace Memory | ||
| 17 | |||
| 13 | class ARM_Dynarmic final : public ARM_Interface { | 18 | class ARM_Dynarmic final : public ARM_Interface { |
| 14 | public: | 19 | public: |
| 15 | ARM_Dynarmic(PrivilegeMode initial_mode); | 20 | ARM_Dynarmic(PrivilegeMode initial_mode); |
| 16 | 21 | ||
| 22 | void MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) override; | ||
| 23 | |||
| 17 | void SetPC(u64 pc) override; | 24 | void SetPC(u64 pc) override; |
| 18 | u64 GetPC() const override; | 25 | u64 GetPC() const override; |
| 19 | u64 GetReg(int index) const override; | 26 | u64 GetReg(int index) const override; |
| 20 | void SetReg(int index, u64 value) override; | 27 | void SetReg(int index, u64 value) override; |
| 28 | const u128& GetExtReg(int index) const override; | ||
| 29 | void SetExtReg(int index, u128& value) override; | ||
| 21 | u32 GetVFPReg(int index) const override; | 30 | u32 GetVFPReg(int index) const override; |
| 22 | void SetVFPReg(int index, u32 value) override; | 31 | void SetVFPReg(int index, u32 value) override; |
| 23 | u32 GetVFPSystemReg(VFPSystemRegister reg) const override; | 32 | u32 GetVFPSystemReg(VFPSystemRegister reg) const override; |
| @@ -29,8 +38,6 @@ public: | |||
| 29 | VAddr GetTlsAddress() const override; | 38 | VAddr GetTlsAddress() const override; |
| 30 | void SetTlsAddress(VAddr address) override; | 39 | void SetTlsAddress(VAddr address) override; |
| 31 | 40 | ||
| 32 | void AddTicks(u64 ticks) override; | ||
| 33 | |||
| 34 | void SaveContext(ThreadContext& ctx) override; | 41 | void SaveContext(ThreadContext& ctx) override; |
| 35 | void LoadContext(const ThreadContext& ctx) override; | 42 | void LoadContext(const ThreadContext& ctx) override; |
| 36 | 43 | ||
| @@ -38,8 +45,10 @@ public: | |||
| 38 | void ExecuteInstructions(int num_instructions) override; | 45 | void ExecuteInstructions(int num_instructions) override; |
| 39 | 46 | ||
| 40 | void ClearInstructionCache() override; | 47 | void ClearInstructionCache() override; |
| 48 | void PageTableChanged() override; | ||
| 41 | 49 | ||
| 42 | private: | 50 | private: |
| 43 | std::unique_ptr<Dynarmic::Jit> jit; | 51 | Dynarmic::Jit* jit = nullptr; |
| 44 | std::shared_ptr<ARMul_State> interpreter_state; | 52 | Memory::PageTable* current_page_table = nullptr; |
| 53 | std::map<Memory::PageTable*, std::unique_ptr<Dynarmic::Jit>> jits; | ||
| 45 | }; | 54 | }; |
diff --git a/src/core/arm/dyncom/arm_dyncom.cpp b/src/core/arm/dyncom/arm_dyncom.cpp index 99758fc2a..5ebf7a2f1 100644 --- a/src/core/arm/dyncom/arm_dyncom.cpp +++ b/src/core/arm/dyncom/arm_dyncom.cpp | |||
| @@ -29,6 +29,10 @@ void ARM_DynCom::SetPC(u64 pc) { | |||
| 29 | state->Reg[15] = pc; | 29 | state->Reg[15] = pc; |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | void ARM_DynCom::PageTableChanged() { | ||
| 33 | ClearInstructionCache(); | ||
| 34 | } | ||
| 35 | |||
| 32 | u64 ARM_DynCom::GetPC() const { | 36 | u64 ARM_DynCom::GetPC() const { |
| 33 | return state->Reg[15]; | 37 | return state->Reg[15]; |
| 34 | } | 38 | } |
| @@ -41,6 +45,13 @@ void ARM_DynCom::SetReg(int index, u64 value) { | |||
| 41 | state->Reg[index] = value; | 45 | state->Reg[index] = value; |
| 42 | } | 46 | } |
| 43 | 47 | ||
| 48 | const u128& ARM_DynCom::GetExtReg(int index) const { | ||
| 49 | return {}; | ||
| 50 | } | ||
| 51 | |||
| 52 | void ARM_DynCom::SetExtReg(int index, u128& value) { | ||
| 53 | } | ||
| 54 | |||
| 44 | u32 ARM_DynCom::GetVFPReg(int index) const { | 55 | u32 ARM_DynCom::GetVFPReg(int index) const { |
| 45 | return state->ExtReg[index]; | 56 | return state->ExtReg[index]; |
| 46 | } | 57 | } |
| @@ -80,12 +91,6 @@ VAddr ARM_DynCom::GetTlsAddress() const { | |||
| 80 | void ARM_DynCom::SetTlsAddress(VAddr /*address*/) { | 91 | void ARM_DynCom::SetTlsAddress(VAddr /*address*/) { |
| 81 | } | 92 | } |
| 82 | 93 | ||
| 83 | void ARM_DynCom::AddTicks(u64 ticks) { | ||
| 84 | down_count -= ticks; | ||
| 85 | if (down_count < 0) | ||
| 86 | CoreTiming::Advance(); | ||
| 87 | } | ||
| 88 | |||
| 89 | void ARM_DynCom::ExecuteInstructions(int num_instructions) { | 94 | void ARM_DynCom::ExecuteInstructions(int num_instructions) { |
| 90 | state->NumInstrsToExecute = num_instructions; | 95 | state->NumInstrsToExecute = num_instructions; |
| 91 | 96 | ||
| @@ -93,7 +98,7 @@ void ARM_DynCom::ExecuteInstructions(int num_instructions) { | |||
| 93 | // executing one instruction at a time. Otherwise, if a block is being executed, more | 98 | // executing one instruction at a time. Otherwise, if a block is being executed, more |
| 94 | // instructions may actually be executed than specified. | 99 | // instructions may actually be executed than specified. |
| 95 | unsigned ticks_executed = InterpreterMainLoop(state.get()); | 100 | unsigned ticks_executed = InterpreterMainLoop(state.get()); |
| 96 | AddTicks(ticks_executed); | 101 | CoreTiming::AddTicks(ticks_executed); |
| 97 | } | 102 | } |
| 98 | 103 | ||
| 99 | void ARM_DynCom::SaveContext(ThreadContext& ctx) { | 104 | void ARM_DynCom::SaveContext(ThreadContext& ctx) { |
diff --git a/src/core/arm/dyncom/arm_dyncom.h b/src/core/arm/dyncom/arm_dyncom.h index 44e674ae2..cc3c0f3da 100644 --- a/src/core/arm/dyncom/arm_dyncom.h +++ b/src/core/arm/dyncom/arm_dyncom.h | |||
| @@ -16,11 +16,14 @@ public: | |||
| 16 | ~ARM_DynCom(); | 16 | ~ARM_DynCom(); |
| 17 | 17 | ||
| 18 | void ClearInstructionCache() override; | 18 | void ClearInstructionCache() override; |
| 19 | void PageTableChanged() override; | ||
| 19 | 20 | ||
| 20 | void SetPC(u64 pc) override; | 21 | void SetPC(u64 pc) override; |
| 21 | u64 GetPC() const override; | 22 | u64 GetPC() const override; |
| 22 | u64 GetReg(int index) const override; | 23 | u64 GetReg(int index) const override; |
| 23 | void SetReg(int index, u64 value) override; | 24 | void SetReg(int index, u64 value) override; |
| 25 | const u128& GetExtReg(int index) const override; | ||
| 26 | void SetExtReg(int index, u128& value) override; | ||
| 24 | u32 GetVFPReg(int index) const override; | 27 | u32 GetVFPReg(int index) const override; |
| 25 | void SetVFPReg(int index, u32 value) override; | 28 | void SetVFPReg(int index, u32 value) override; |
| 26 | u32 GetVFPSystemReg(VFPSystemRegister reg) const override; | 29 | u32 GetVFPSystemReg(VFPSystemRegister reg) const override; |
| @@ -32,8 +35,6 @@ public: | |||
| 32 | VAddr GetTlsAddress() const override; | 35 | VAddr GetTlsAddress() const override; |
| 33 | void SetTlsAddress(VAddr address) override; | 36 | void SetTlsAddress(VAddr address) override; |
| 34 | 37 | ||
| 35 | void AddTicks(u64 ticks) override; | ||
| 36 | |||
| 37 | void SaveContext(ThreadContext& ctx) override; | 38 | void SaveContext(ThreadContext& ctx) override; |
| 38 | void LoadContext(const ThreadContext& ctx) override; | 39 | void LoadContext(const ThreadContext& ctx) override; |
| 39 | 40 | ||
diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp index f4fbb8d04..3522d1e82 100644 --- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp +++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp | |||
| @@ -759,7 +759,7 @@ static ThumbDecodeStatus DecodeThumbInstruction(u32 inst, u32 addr, u32* arm_ins | |||
| 759 | ThumbDecodeStatus ret = TranslateThumbInstruction(addr, inst, arm_inst, inst_size); | 759 | ThumbDecodeStatus ret = TranslateThumbInstruction(addr, inst, arm_inst, inst_size); |
| 760 | if (ret == ThumbDecodeStatus::BRANCH) { | 760 | if (ret == ThumbDecodeStatus::BRANCH) { |
| 761 | int inst_index; | 761 | int inst_index; |
| 762 | int table_length = arm_instruction_trans_len; | 762 | int table_length = static_cast<int>(arm_instruction_trans_len); |
| 763 | u32 tinstr = GetThumbInstruction(inst, addr); | 763 | u32 tinstr = GetThumbInstruction(inst, addr); |
| 764 | 764 | ||
| 765 | switch ((tinstr & 0xF800) >> 11) { | 765 | switch ((tinstr & 0xF800) >> 11) { |
| @@ -838,7 +838,7 @@ static unsigned int InterpreterTranslateInstruction(const ARMul_State* cpu, cons | |||
| 838 | return inst_size; | 838 | return inst_size; |
| 839 | } | 839 | } |
| 840 | 840 | ||
| 841 | static int InterpreterTranslateBlock(ARMul_State* cpu, int& bb_start, u32 addr) { | 841 | static int InterpreterTranslateBlock(ARMul_State* cpu, std::size_t& bb_start, u32 addr) { |
| 842 | MICROPROFILE_SCOPE(DynCom_Decode); | 842 | MICROPROFILE_SCOPE(DynCom_Decode); |
| 843 | 843 | ||
| 844 | // Decode instruction, get index | 844 | // Decode instruction, get index |
| @@ -871,7 +871,7 @@ static int InterpreterTranslateBlock(ARMul_State* cpu, int& bb_start, u32 addr) | |||
| 871 | return KEEP_GOING; | 871 | return KEEP_GOING; |
| 872 | } | 872 | } |
| 873 | 873 | ||
| 874 | static int InterpreterTranslateSingle(ARMul_State* cpu, int& bb_start, u32 addr) { | 874 | static int InterpreterTranslateSingle(ARMul_State* cpu, std::size_t& bb_start, u32 addr) { |
| 875 | MICROPROFILE_SCOPE(DynCom_Decode); | 875 | MICROPROFILE_SCOPE(DynCom_Decode); |
| 876 | 876 | ||
| 877 | ARM_INST_PTR inst_base = nullptr; | 877 | ARM_INST_PTR inst_base = nullptr; |
| @@ -1620,7 +1620,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) { | |||
| 1620 | unsigned int addr; | 1620 | unsigned int addr; |
| 1621 | unsigned int num_instrs = 0; | 1621 | unsigned int num_instrs = 0; |
| 1622 | 1622 | ||
| 1623 | int ptr; | 1623 | std::size_t ptr; |
| 1624 | 1624 | ||
| 1625 | LOAD_NZCVT; | 1625 | LOAD_NZCVT; |
| 1626 | DISPATCH : { | 1626 | DISPATCH : { |
diff --git a/src/core/arm/skyeye_common/armstate.h b/src/core/arm/skyeye_common/armstate.h index 1a707ff7e..893877797 100644 --- a/src/core/arm/skyeye_common/armstate.h +++ b/src/core/arm/skyeye_common/armstate.h | |||
| @@ -230,7 +230,7 @@ public: | |||
| 230 | 230 | ||
| 231 | // TODO(bunnei): Move this cache to a better place - it should be per codeset (likely per | 231 | // TODO(bunnei): Move this cache to a better place - it should be per codeset (likely per |
| 232 | // process for our purposes), not per ARMul_State (which tracks CPU core state). | 232 | // process for our purposes), not per ARMul_State (which tracks CPU core state). |
| 233 | std::unordered_map<u32, int> instruction_cache; | 233 | std::unordered_map<u32, std::size_t> instruction_cache; |
| 234 | 234 | ||
| 235 | private: | 235 | private: |
| 236 | void ResetMPCoreCP15Registers(); | 236 | void ResetMPCoreCP15Registers(); |