summaryrefslogtreecommitdiff
path: root/src/core/arm
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/arm')
-rw-r--r--src/core/arm/arm_interface.cpp24
-rw-r--r--src/core/arm/arm_interface.h8
-rw-r--r--src/core/arm/cpu_interrupt_handler.h4
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp10
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.h8
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp10
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.h8
-rw-r--r--src/core/arm/unicorn/arm_unicorn.cpp42
-rw-r--r--src/core/arm/unicorn/arm_unicorn.h8
9 files changed, 53 insertions, 69 deletions
diff --git a/src/core/arm/arm_interface.cpp b/src/core/arm/arm_interface.cpp
index adc6aa5c5..d2295ed90 100644
--- a/src/core/arm/arm_interface.cpp
+++ b/src/core/arm/arm_interface.cpp
@@ -147,18 +147,10 @@ std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContex
147 auto fp = ctx.cpu_registers[29]; 147 auto fp = ctx.cpu_registers[29];
148 auto lr = ctx.cpu_registers[30]; 148 auto lr = ctx.cpu_registers[30];
149 while (true) { 149 while (true) {
150 out.push_back({ 150 out.push_back({"", 0, lr, 0});
151 .module = "", 151 if (!fp) {
152 .address = 0,
153 .original_address = lr,
154 .offset = 0,
155 .name = "",
156 });
157
158 if (fp == 0) {
159 break; 152 break;
160 } 153 }
161
162 lr = memory.Read64(fp + 8) - 4; 154 lr = memory.Read64(fp + 8) - 4;
163 fp = memory.Read64(fp); 155 fp = memory.Read64(fp);
164 } 156 }
@@ -211,18 +203,10 @@ std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktrace() const {
211 auto fp = GetReg(29); 203 auto fp = GetReg(29);
212 auto lr = GetReg(30); 204 auto lr = GetReg(30);
213 while (true) { 205 while (true) {
214 out.push_back({ 206 out.push_back({"", 0, lr, 0, ""});
215 .module = "", 207 if (!fp) {
216 .address = 0,
217 .original_address = lr,
218 .offset = 0,
219 .name = "",
220 });
221
222 if (fp == 0) {
223 break; 208 break;
224 } 209 }
225
226 lr = memory.Read64(fp + 8) - 4; 210 lr = memory.Read64(fp + 8) - 4;
227 fp = memory.Read64(fp); 211 fp = memory.Read64(fp);
228 } 212 }
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h
index 9b86247e2..1f24051e4 100644
--- a/src/core/arm/arm_interface.h
+++ b/src/core/arm/arm_interface.h
@@ -93,14 +93,14 @@ public:
93 * @param index Register index 93 * @param index Register index
94 * @return Returns the value in the register 94 * @return Returns the value in the register
95 */ 95 */
96 virtual u64 GetReg(std::size_t index) const = 0; 96 virtual u64 GetReg(int index) const = 0;
97 97
98 /** 98 /**
99 * Set an ARM register 99 * Set an ARM register
100 * @param index Register index 100 * @param index Register index
101 * @param value Value to set register to 101 * @param value Value to set register to
102 */ 102 */
103 virtual void SetReg(std::size_t index, u64 value) = 0; 103 virtual void SetReg(int index, u64 value) = 0;
104 104
105 /** 105 /**
106 * Gets the value of a specified vector register. 106 * Gets the value of a specified vector register.
@@ -108,7 +108,7 @@ public:
108 * @param index The index of the vector register. 108 * @param index The index of the vector register.
109 * @return the value within the vector register. 109 * @return the value within the vector register.
110 */ 110 */
111 virtual u128 GetVectorReg(std::size_t index) const = 0; 111 virtual u128 GetVectorReg(int index) const = 0;
112 112
113 /** 113 /**
114 * Sets a given value into a vector register. 114 * Sets a given value into a vector register.
@@ -116,7 +116,7 @@ public:
116 * @param index The index of the vector register. 116 * @param index The index of the vector register.
117 * @param value The new value to place in the register. 117 * @param value The new value to place in the register.
118 */ 118 */
119 virtual void SetVectorReg(std::size_t index, u128 value) = 0; 119 virtual void SetVectorReg(int index, u128 value) = 0;
120 120
121 /** 121 /**
122 * Get the current PSTATE register 122 * Get the current PSTATE register
diff --git a/src/core/arm/cpu_interrupt_handler.h b/src/core/arm/cpu_interrupt_handler.h
index c20c280f1..71e582f79 100644
--- a/src/core/arm/cpu_interrupt_handler.h
+++ b/src/core/arm/cpu_interrupt_handler.h
@@ -21,8 +21,8 @@ public:
21 CPUInterruptHandler(const CPUInterruptHandler&) = delete; 21 CPUInterruptHandler(const CPUInterruptHandler&) = delete;
22 CPUInterruptHandler& operator=(const CPUInterruptHandler&) = delete; 22 CPUInterruptHandler& operator=(const CPUInterruptHandler&) = delete;
23 23
24 CPUInterruptHandler(CPUInterruptHandler&&) = delete; 24 CPUInterruptHandler(CPUInterruptHandler&&) = default;
25 CPUInterruptHandler& operator=(CPUInterruptHandler&&) = delete; 25 CPUInterruptHandler& operator=(CPUInterruptHandler&&) = default;
26 26
27 bool IsInterrupted() const { 27 bool IsInterrupted() const {
28 return is_interrupted; 28 return is_interrupted;
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index fab694fc2..b5f28a86e 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -111,7 +111,7 @@ public:
111 } 111 }
112 return 0U; 112 return 0U;
113 } 113 }
114 return static_cast<u64>(std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0)); 114 return std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0);
115 } 115 }
116 116
117 ARM_Dynarmic_32& parent; 117 ARM_Dynarmic_32& parent;
@@ -210,19 +210,19 @@ u64 ARM_Dynarmic_32::GetPC() const {
210 return jit->Regs()[15]; 210 return jit->Regs()[15];
211} 211}
212 212
213u64 ARM_Dynarmic_32::GetReg(std::size_t index) const { 213u64 ARM_Dynarmic_32::GetReg(int index) const {
214 return jit->Regs()[index]; 214 return jit->Regs()[index];
215} 215}
216 216
217void ARM_Dynarmic_32::SetReg(std::size_t index, u64 value) { 217void ARM_Dynarmic_32::SetReg(int index, u64 value) {
218 jit->Regs()[index] = static_cast<u32>(value); 218 jit->Regs()[index] = static_cast<u32>(value);
219} 219}
220 220
221u128 ARM_Dynarmic_32::GetVectorReg(std::size_t index) const { 221u128 ARM_Dynarmic_32::GetVectorReg(int index) const {
222 return {}; 222 return {};
223} 223}
224 224
225void ARM_Dynarmic_32::SetVectorReg(std::size_t index, u128 value) {} 225void ARM_Dynarmic_32::SetVectorReg(int index, u128 value) {}
226 226
227u32 ARM_Dynarmic_32::GetPSTATE() const { 227u32 ARM_Dynarmic_32::GetPSTATE() const {
228 return jit->Cpsr(); 228 return jit->Cpsr();
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h
index ba646c623..2bab31b92 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.h
@@ -35,10 +35,10 @@ public:
35 35
36 void SetPC(u64 pc) override; 36 void SetPC(u64 pc) override;
37 u64 GetPC() const override; 37 u64 GetPC() const override;
38 u64 GetReg(std::size_t index) const override; 38 u64 GetReg(int index) const override;
39 void SetReg(std::size_t index, u64 value) override; 39 void SetReg(int index, u64 value) override;
40 u128 GetVectorReg(std::size_t index) const override; 40 u128 GetVectorReg(int index) const override;
41 void SetVectorReg(std::size_t index, u128 value) override; 41 void SetVectorReg(int index, u128 value) override;
42 u32 GetPSTATE() const override; 42 u32 GetPSTATE() const override;
43 void SetPSTATE(u32 pstate) override; 43 void SetPSTATE(u32 pstate) override;
44 void Run() override; 44 void Run() override;
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
index a2c4c2f30..ce9968724 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -148,7 +148,7 @@ public:
148 } 148 }
149 return 0U; 149 return 0U;
150 } 150 }
151 return static_cast<u64>(std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0)); 151 return std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0);
152 } 152 }
153 153
154 u64 GetCNTPCT() override { 154 u64 GetCNTPCT() override {
@@ -265,19 +265,19 @@ u64 ARM_Dynarmic_64::GetPC() const {
265 return jit->GetPC(); 265 return jit->GetPC();
266} 266}
267 267
268u64 ARM_Dynarmic_64::GetReg(std::size_t index) const { 268u64 ARM_Dynarmic_64::GetReg(int index) const {
269 return jit->GetRegister(index); 269 return jit->GetRegister(index);
270} 270}
271 271
272void ARM_Dynarmic_64::SetReg(std::size_t index, u64 value) { 272void ARM_Dynarmic_64::SetReg(int index, u64 value) {
273 jit->SetRegister(index, value); 273 jit->SetRegister(index, value);
274} 274}
275 275
276u128 ARM_Dynarmic_64::GetVectorReg(std::size_t index) const { 276u128 ARM_Dynarmic_64::GetVectorReg(int index) const {
277 return jit->GetVector(index); 277 return jit->GetVector(index);
278} 278}
279 279
280void ARM_Dynarmic_64::SetVectorReg(std::size_t index, u128 value) { 280void ARM_Dynarmic_64::SetVectorReg(int index, u128 value) {
281 jit->SetVector(index, value); 281 jit->SetVector(index, value);
282} 282}
283 283
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h
index 2afb7e7a4..403c55961 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.h
@@ -33,10 +33,10 @@ public:
33 33
34 void SetPC(u64 pc) override; 34 void SetPC(u64 pc) override;
35 u64 GetPC() const override; 35 u64 GetPC() const override;
36 u64 GetReg(std::size_t index) const override; 36 u64 GetReg(int index) const override;
37 void SetReg(std::size_t index, u64 value) override; 37 void SetReg(int index, u64 value) override;
38 u128 GetVectorReg(std::size_t index) const override; 38 u128 GetVectorReg(int index) const override;
39 void SetVectorReg(std::size_t index, u128 value) override; 39 void SetVectorReg(int index, u128 value) override;
40 u32 GetPSTATE() const override; 40 u32 GetPSTATE() const override;
41 void SetPSTATE(u32 pstate) override; 41 void SetPSTATE(u32 pstate) override;
42 void Run() override; 42 void Run() override;
diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp
index c1612d626..1df3f3ed1 100644
--- a/src/core/arm/unicorn/arm_unicorn.cpp
+++ b/src/core/arm/unicorn/arm_unicorn.cpp
@@ -96,35 +96,35 @@ u64 ARM_Unicorn::GetPC() const {
96 return val; 96 return val;
97} 97}
98 98
99u64 ARM_Unicorn::GetReg(std::size_t index) const { 99u64 ARM_Unicorn::GetReg(int regn) const {
100 u64 val{}; 100 u64 val{};
101 auto treg = UC_ARM64_REG_SP; 101 auto treg = UC_ARM64_REG_SP;
102 if (index <= 28) { 102 if (regn <= 28) {
103 treg = static_cast<uc_arm64_reg>(UC_ARM64_REG_X0 + static_cast<int>(index)); 103 treg = (uc_arm64_reg)(UC_ARM64_REG_X0 + regn);
104 } else if (index < 31) { 104 } else if (regn < 31) {
105 treg = static_cast<uc_arm64_reg>(UC_ARM64_REG_X29 + static_cast<int>(index) - 29); 105 treg = (uc_arm64_reg)(UC_ARM64_REG_X29 + regn - 29);
106 } 106 }
107 CHECKED(uc_reg_read(uc, treg, &val)); 107 CHECKED(uc_reg_read(uc, treg, &val));
108 return val; 108 return val;
109} 109}
110 110
111void ARM_Unicorn::SetReg(std::size_t index, u64 value) { 111void ARM_Unicorn::SetReg(int regn, u64 val) {
112 auto treg = UC_ARM64_REG_SP; 112 auto treg = UC_ARM64_REG_SP;
113 if (index <= 28) { 113 if (regn <= 28) {
114 treg = static_cast<uc_arm64_reg>(UC_ARM64_REG_X0 + static_cast<int>(index)); 114 treg = (uc_arm64_reg)(UC_ARM64_REG_X0 + regn);
115 } else if (index < 31) { 115 } else if (regn < 31) {
116 treg = static_cast<uc_arm64_reg>(UC_ARM64_REG_X29 + static_cast<int>(index) - 29); 116 treg = (uc_arm64_reg)(UC_ARM64_REG_X29 + regn - 29);
117 } 117 }
118 CHECKED(uc_reg_write(uc, treg, &value)); 118 CHECKED(uc_reg_write(uc, treg, &val));
119} 119}
120 120
121u128 ARM_Unicorn::GetVectorReg(std::size_t /*index*/) const { 121u128 ARM_Unicorn::GetVectorReg(int /*index*/) const {
122 UNIMPLEMENTED(); 122 UNIMPLEMENTED();
123 static constexpr u128 res{}; 123 static constexpr u128 res{};
124 return res; 124 return res;
125} 125}
126 126
127void ARM_Unicorn::SetVectorReg(std::size_t /*index*/, u128 /*value*/) { 127void ARM_Unicorn::SetVectorReg(int /*index*/, u128 /*value*/) {
128 UNIMPLEMENTED(); 128 UNIMPLEMENTED();
129} 129}
130 130
@@ -217,8 +217,8 @@ void ARM_Unicorn::SaveContext(ThreadContext64& ctx) {
217 CHECKED(uc_reg_read(uc, UC_ARM64_REG_PC, &ctx.pc)); 217 CHECKED(uc_reg_read(uc, UC_ARM64_REG_PC, &ctx.pc));
218 CHECKED(uc_reg_read(uc, UC_ARM64_REG_NZCV, &ctx.pstate)); 218 CHECKED(uc_reg_read(uc, UC_ARM64_REG_NZCV, &ctx.pstate));
219 219
220 for (std::size_t i = 0; i < 29; ++i) { 220 for (auto i = 0; i < 29; ++i) {
221 uregs[i] = UC_ARM64_REG_X0 + static_cast<int>(i); 221 uregs[i] = UC_ARM64_REG_X0 + i;
222 tregs[i] = &ctx.cpu_registers[i]; 222 tregs[i] = &ctx.cpu_registers[i];
223 } 223 }
224 uregs[29] = UC_ARM64_REG_X29; 224 uregs[29] = UC_ARM64_REG_X29;
@@ -228,8 +228,8 @@ void ARM_Unicorn::SaveContext(ThreadContext64& ctx) {
228 228
229 CHECKED(uc_reg_read_batch(uc, uregs, tregs, 31)); 229 CHECKED(uc_reg_read_batch(uc, uregs, tregs, 31));
230 230
231 for (std::size_t i = 0; i < 32; ++i) { 231 for (int i = 0; i < 32; ++i) {
232 uregs[i] = UC_ARM64_REG_Q0 + static_cast<int>(i); 232 uregs[i] = UC_ARM64_REG_Q0 + i;
233 tregs[i] = &ctx.vector_registers[i]; 233 tregs[i] = &ctx.vector_registers[i];
234 } 234 }
235 235
@@ -244,8 +244,8 @@ void ARM_Unicorn::LoadContext(const ThreadContext64& ctx) {
244 CHECKED(uc_reg_write(uc, UC_ARM64_REG_PC, &ctx.pc)); 244 CHECKED(uc_reg_write(uc, UC_ARM64_REG_PC, &ctx.pc));
245 CHECKED(uc_reg_write(uc, UC_ARM64_REG_NZCV, &ctx.pstate)); 245 CHECKED(uc_reg_write(uc, UC_ARM64_REG_NZCV, &ctx.pstate));
246 246
247 for (std::size_t i = 0; i < 29; ++i) { 247 for (int i = 0; i < 29; ++i) {
248 uregs[i] = UC_ARM64_REG_X0 + static_cast<int>(i); 248 uregs[i] = UC_ARM64_REG_X0 + i;
249 tregs[i] = (void*)&ctx.cpu_registers[i]; 249 tregs[i] = (void*)&ctx.cpu_registers[i];
250 } 250 }
251 uregs[29] = UC_ARM64_REG_X29; 251 uregs[29] = UC_ARM64_REG_X29;
@@ -255,8 +255,8 @@ void ARM_Unicorn::LoadContext(const ThreadContext64& ctx) {
255 255
256 CHECKED(uc_reg_write_batch(uc, uregs, tregs, 31)); 256 CHECKED(uc_reg_write_batch(uc, uregs, tregs, 31));
257 257
258 for (std::size_t i = 0; i < 32; ++i) { 258 for (auto i = 0; i < 32; ++i) {
259 uregs[i] = UC_ARM64_REG_Q0 + static_cast<int>(i); 259 uregs[i] = UC_ARM64_REG_Q0 + i;
260 tregs[i] = (void*)&ctx.vector_registers[i]; 260 tregs[i] = (void*)&ctx.vector_registers[i];
261 } 261 }
262 262
diff --git a/src/core/arm/unicorn/arm_unicorn.h b/src/core/arm/unicorn/arm_unicorn.h
index 1183e9541..810aff311 100644
--- a/src/core/arm/unicorn/arm_unicorn.h
+++ b/src/core/arm/unicorn/arm_unicorn.h
@@ -26,10 +26,10 @@ public:
26 26
27 void SetPC(u64 pc) override; 27 void SetPC(u64 pc) override;
28 u64 GetPC() const override; 28 u64 GetPC() const override;
29 u64 GetReg(std::size_t index) const override; 29 u64 GetReg(int index) const override;
30 void SetReg(std::size_t index, u64 value) override; 30 void SetReg(int index, u64 value) override;
31 u128 GetVectorReg(std::size_t index) const override; 31 u128 GetVectorReg(int index) const override;
32 void SetVectorReg(std::size_t index, u128 value) override; 32 void SetVectorReg(int index, u128 value) override;
33 u32 GetPSTATE() const override; 33 u32 GetPSTATE() const override;
34 void SetPSTATE(u32 pstate) override; 34 void SetPSTATE(u32 pstate) override;
35 VAddr GetTlsAddress() const override; 35 VAddr GetTlsAddress() const override;