diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/arm/arm_interface.h | 7 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.cpp | 14 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.h | 2 | ||||
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom.cpp | 7 | ||||
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom.h | 2 |
5 files changed, 32 insertions, 0 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index b52228476..f613556dd 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h | |||
| @@ -22,6 +22,9 @@ public: | |||
| 22 | u64 fpu_registers[64]; | 22 | u64 fpu_registers[64]; |
| 23 | u64 fpscr; | 23 | u64 fpscr; |
| 24 | u64 fpexc; | 24 | u64 fpexc; |
| 25 | |||
| 26 | // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT | ||
| 27 | VAddr tls_address; | ||
| 25 | }; | 28 | }; |
| 26 | 29 | ||
| 27 | /** | 30 | /** |
| @@ -121,6 +124,10 @@ public: | |||
| 121 | */ | 124 | */ |
| 122 | virtual void SetCP15Register(CP15Register reg, u32 value) = 0; | 125 | virtual void SetCP15Register(CP15Register reg, u32 value) = 0; |
| 123 | 126 | ||
| 127 | virtual VAddr GetTlsAddress() const = 0; | ||
| 128 | |||
| 129 | virtual void SetTlsAddress(VAddr address) = 0; | ||
| 130 | |||
| 124 | /** | 131 | /** |
| 125 | * Advance the CPU core by the specified number of ticks (e.g. to simulate CPU execution time) | 132 | * Advance the CPU core by the specified number of ticks (e.g. to simulate CPU execution time) |
| 126 | * @param ticks Number of ticks to advance the CPU core | 133 | * @param ticks Number of ticks to advance the CPU core |
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index 3da968344..0ea1d76e4 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp | |||
| @@ -157,6 +157,14 @@ void ARM_Dynarmic::SetCP15Register(CP15Register reg, u32 value) { | |||
| 157 | interpreter_state->CP15[reg] = value; | 157 | interpreter_state->CP15[reg] = value; |
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | VAddr ARM_Dynarmic::GetTlsAddress() const { | ||
| 161 | return jit->TlsAddr(); | ||
| 162 | } | ||
| 163 | |||
| 164 | void ARM_Dynarmic::SetTlsAddress(VAddr address) { | ||
| 165 | jit->TlsAddr() = address; | ||
| 166 | } | ||
| 167 | |||
| 160 | void ARM_Dynarmic::AddTicks(u64 ticks) { | 168 | void ARM_Dynarmic::AddTicks(u64 ticks) { |
| 161 | down_count -= ticks; | 169 | down_count -= ticks; |
| 162 | if (down_count < 0) { | 170 | if (down_count < 0) { |
| @@ -185,6 +193,9 @@ void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { | |||
| 185 | 193 | ||
| 186 | ctx.fpscr = jit->Fpscr(); | 194 | ctx.fpscr = jit->Fpscr(); |
| 187 | ctx.fpexc = interpreter_state->VFP[VFP_FPEXC]; | 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 | ||
| 198 | ctx.tls_address = jit->TlsAddr(); | ||
| 188 | } | 199 | } |
| 189 | 200 | ||
| 190 | void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) { | 201 | void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) { |
| @@ -198,6 +209,9 @@ void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) { | |||
| 198 | 209 | ||
| 199 | jit->SetFpscr(ctx.fpscr); | 210 | jit->SetFpscr(ctx.fpscr); |
| 200 | interpreter_state->VFP[VFP_FPEXC] = ctx.fpexc; | 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 | ||
| 214 | jit->TlsAddr() = ctx.tls_address; | ||
| 201 | } | 215 | } |
| 202 | 216 | ||
| 203 | void ARM_Dynarmic::PrepareReschedule() { | 217 | void ARM_Dynarmic::PrepareReschedule() { |
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index f77548d0f..fcdc1c0e0 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.h +++ b/src/core/arm/dynarmic/arm_dynarmic.h | |||
| @@ -26,6 +26,8 @@ public: | |||
| 26 | void SetCPSR(u32 cpsr) override; | 26 | void SetCPSR(u32 cpsr) override; |
| 27 | u32 GetCP15Register(CP15Register reg) override; | 27 | u32 GetCP15Register(CP15Register reg) override; |
| 28 | void SetCP15Register(CP15Register reg, u32 value) override; | 28 | void SetCP15Register(CP15Register reg, u32 value) override; |
| 29 | VAddr GetTlsAddress() const override; | ||
| 30 | void SetTlsAddress(VAddr address) override; | ||
| 29 | 31 | ||
| 30 | void AddTicks(u64 ticks) override; | 32 | void AddTicks(u64 ticks) override; |
| 31 | 33 | ||
diff --git a/src/core/arm/dyncom/arm_dyncom.cpp b/src/core/arm/dyncom/arm_dyncom.cpp index 1c55496b5..99758fc2a 100644 --- a/src/core/arm/dyncom/arm_dyncom.cpp +++ b/src/core/arm/dyncom/arm_dyncom.cpp | |||
| @@ -73,6 +73,13 @@ void ARM_DynCom::SetCP15Register(CP15Register reg, u32 value) { | |||
| 73 | state->CP15[reg] = value; | 73 | state->CP15[reg] = value; |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | VAddr ARM_DynCom::GetTlsAddress() const { | ||
| 77 | return {}; | ||
| 78 | } | ||
| 79 | |||
| 80 | void ARM_DynCom::SetTlsAddress(VAddr /*address*/) { | ||
| 81 | } | ||
| 82 | |||
| 76 | void ARM_DynCom::AddTicks(u64 ticks) { | 83 | void ARM_DynCom::AddTicks(u64 ticks) { |
| 77 | down_count -= ticks; | 84 | down_count -= ticks; |
| 78 | if (down_count < 0) | 85 | if (down_count < 0) |
diff --git a/src/core/arm/dyncom/arm_dyncom.h b/src/core/arm/dyncom/arm_dyncom.h index 90cc56c41..44e674ae2 100644 --- a/src/core/arm/dyncom/arm_dyncom.h +++ b/src/core/arm/dyncom/arm_dyncom.h | |||
| @@ -29,6 +29,8 @@ public: | |||
| 29 | void SetCPSR(u32 cpsr) override; | 29 | void SetCPSR(u32 cpsr) override; |
| 30 | u32 GetCP15Register(CP15Register reg) override; | 30 | u32 GetCP15Register(CP15Register reg) override; |
| 31 | void SetCP15Register(CP15Register reg, u32 value) override; | 31 | void SetCP15Register(CP15Register reg, u32 value) override; |
| 32 | VAddr GetTlsAddress() const override; | ||
| 33 | void SetTlsAddress(VAddr address) override; | ||
| 32 | 34 | ||
| 33 | void AddTicks(u64 ticks) override; | 35 | void AddTicks(u64 ticks) override; |
| 34 | 36 | ||