summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/arm/arm_interface.h7
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.cpp14
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.h2
-rw-r--r--src/core/arm/dyncom/arm_dyncom.cpp7
-rw-r--r--src/core/arm/dyncom/arm_dyncom.h2
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
160VAddr ARM_Dynarmic::GetTlsAddress() const {
161 return jit->TlsAddr();
162}
163
164void ARM_Dynarmic::SetTlsAddress(VAddr address) {
165 jit->TlsAddr() = address;
166}
167
160void ARM_Dynarmic::AddTicks(u64 ticks) { 168void 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
190void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) { 201void 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
203void ARM_Dynarmic::PrepareReschedule() { 217void 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
76VAddr ARM_DynCom::GetTlsAddress() const {
77 return {};
78}
79
80void ARM_DynCom::SetTlsAddress(VAddr /*address*/) {
81}
82
76void ARM_DynCom::AddTicks(u64 ticks) { 83void 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