diff options
Diffstat (limited to 'src/core/arm')
| -rw-r--r-- | src/core/arm/arm_interface.cpp | 24 | ||||
| -rw-r--r-- | src/core/arm/arm_interface.h | 8 | ||||
| -rw-r--r-- | src/core/arm/cpu_interrupt_handler.h | 4 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 10 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.h | 8 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 10 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.h | 8 | ||||
| -rw-r--r-- | src/core/arm/unicorn/arm_unicorn.cpp | 42 | ||||
| -rw-r--r-- | src/core/arm/unicorn/arm_unicorn.h | 8 |
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 | ||
| 213 | u64 ARM_Dynarmic_32::GetReg(std::size_t index) const { | 213 | u64 ARM_Dynarmic_32::GetReg(int index) const { |
| 214 | return jit->Regs()[index]; | 214 | return jit->Regs()[index]; |
| 215 | } | 215 | } |
| 216 | 216 | ||
| 217 | void ARM_Dynarmic_32::SetReg(std::size_t index, u64 value) { | 217 | void 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 | ||
| 221 | u128 ARM_Dynarmic_32::GetVectorReg(std::size_t index) const { | 221 | u128 ARM_Dynarmic_32::GetVectorReg(int index) const { |
| 222 | return {}; | 222 | return {}; |
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | void ARM_Dynarmic_32::SetVectorReg(std::size_t index, u128 value) {} | 225 | void ARM_Dynarmic_32::SetVectorReg(int index, u128 value) {} |
| 226 | 226 | ||
| 227 | u32 ARM_Dynarmic_32::GetPSTATE() const { | 227 | u32 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 | ||
| 268 | u64 ARM_Dynarmic_64::GetReg(std::size_t index) const { | 268 | u64 ARM_Dynarmic_64::GetReg(int index) const { |
| 269 | return jit->GetRegister(index); | 269 | return jit->GetRegister(index); |
| 270 | } | 270 | } |
| 271 | 271 | ||
| 272 | void ARM_Dynarmic_64::SetReg(std::size_t index, u64 value) { | 272 | void ARM_Dynarmic_64::SetReg(int index, u64 value) { |
| 273 | jit->SetRegister(index, value); | 273 | jit->SetRegister(index, value); |
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | u128 ARM_Dynarmic_64::GetVectorReg(std::size_t index) const { | 276 | u128 ARM_Dynarmic_64::GetVectorReg(int index) const { |
| 277 | return jit->GetVector(index); | 277 | return jit->GetVector(index); |
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | void ARM_Dynarmic_64::SetVectorReg(std::size_t index, u128 value) { | 280 | void 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 | ||
| 99 | u64 ARM_Unicorn::GetReg(std::size_t index) const { | 99 | u64 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 | ||
| 111 | void ARM_Unicorn::SetReg(std::size_t index, u64 value) { | 111 | void 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 | ||
| 121 | u128 ARM_Unicorn::GetVectorReg(std::size_t /*index*/) const { | 121 | u128 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 | ||
| 127 | void ARM_Unicorn::SetVectorReg(std::size_t /*index*/, u128 /*value*/) { | 127 | void 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; |