summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/CMakeLists.txt9
-rw-r--r--src/core/arm/arm_interface.cpp84
-rw-r--r--src/core/arm/arm_interface.h37
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.h29
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp64
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.h16
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp64
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.h18
-rw-r--r--src/core/arm/dynarmic/dynarmic_cp15.cpp (renamed from src/core/arm/dynarmic/arm_dynarmic_cp15.cpp)2
-rw-r--r--src/core/arm/dynarmic/dynarmic_cp15.h (renamed from src/core/arm/dynarmic/arm_dynarmic_cp15.h)0
-rw-r--r--src/core/arm/dynarmic/dynarmic_exclusive_monitor.cpp (renamed from src/core/arm/dynarmic/arm_exclusive_monitor.cpp)2
-rw-r--r--src/core/arm/dynarmic/dynarmic_exclusive_monitor.h (renamed from src/core/arm/dynarmic/arm_exclusive_monitor.h)0
-rw-r--r--src/core/arm/exclusive_monitor.cpp2
-rw-r--r--src/core/core.cpp26
-rw-r--r--src/core/core.h8
15 files changed, 189 insertions, 172 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 99602699a..ce92b7cc1 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -4,8 +4,6 @@
4add_library(core STATIC 4add_library(core STATIC
5 arm/arm_interface.h 5 arm/arm_interface.h
6 arm/arm_interface.cpp 6 arm/arm_interface.cpp
7 arm/dynarmic/arm_exclusive_monitor.cpp
8 arm/dynarmic/arm_exclusive_monitor.h
9 arm/exclusive_monitor.cpp 7 arm/exclusive_monitor.cpp
10 arm/exclusive_monitor.h 8 arm/exclusive_monitor.h
11 arm/symbols.cpp 9 arm/symbols.cpp
@@ -849,12 +847,15 @@ endif()
849 847
850if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) 848if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)
851 target_sources(core PRIVATE 849 target_sources(core PRIVATE
850 arm/dynarmic/arm_dynarmic.h
852 arm/dynarmic/arm_dynarmic_64.cpp 851 arm/dynarmic/arm_dynarmic_64.cpp
853 arm/dynarmic/arm_dynarmic_64.h 852 arm/dynarmic/arm_dynarmic_64.h
854 arm/dynarmic/arm_dynarmic_32.cpp 853 arm/dynarmic/arm_dynarmic_32.cpp
855 arm/dynarmic/arm_dynarmic_32.h 854 arm/dynarmic/arm_dynarmic_32.h
856 arm/dynarmic/arm_dynarmic_cp15.cpp 855 arm/dynarmic/dynarmic_cp15.cpp
857 arm/dynarmic/arm_dynarmic_cp15.h 856 arm/dynarmic/dynarmic_cp15.h
857 arm/dynarmic/dynarmic_exclusive_monitor.cpp
858 arm/dynarmic/dynarmic_exclusive_monitor.h
858 hle/service/jit/jit_context.cpp 859 hle/service/jit/jit_context.cpp
859 hle/service/jit/jit_context.h 860 hle/service/jit/jit_context.h
860 hle/service/jit/jit.cpp 861 hle/service/jit/jit.cpp
diff --git a/src/core/arm/arm_interface.cpp b/src/core/arm/arm_interface.cpp
index d30914b7a..beaea64b3 100644
--- a/src/core/arm/arm_interface.cpp
+++ b/src/core/arm/arm_interface.cpp
@@ -13,25 +13,68 @@
13#include "core/core.h" 13#include "core/core.h"
14#include "core/debugger/debugger.h" 14#include "core/debugger/debugger.h"
15#include "core/hle/kernel/k_process.h" 15#include "core/hle/kernel/k_process.h"
16#include "core/hle/kernel/k_thread.h"
16#include "core/hle/kernel/svc.h" 17#include "core/hle/kernel/svc.h"
17#include "core/loader/loader.h" 18#include "core/loader/loader.h"
18#include "core/memory.h" 19#include "core/memory.h"
19 20
20#include "core/arm/dynarmic/arm_dynarmic_32.h"
21#include "core/arm/dynarmic/arm_dynarmic_64.h"
22
23namespace Core { 21namespace Core {
24 22
25constexpr u64 SEGMENT_BASE = 0x7100000000ull; 23constexpr u64 SEGMENT_BASE = 0x7100000000ull;
26 24
27std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext( 25std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext(
28 Core::System& system, const ARM_Interface::ThreadContext32& ctx) { 26 Core::System& system, const ARM_Interface::ThreadContext32& ctx) {
29 return ARM_Dynarmic_32::GetBacktraceFromContext(system, ctx); 27 std::vector<BacktraceEntry> out;
28 auto& memory = system.ApplicationMemory();
29
30 const auto& reg = ctx.cpu_registers;
31 u32 pc = reg[15], lr = reg[14], fp = reg[11];
32 out.push_back({"", 0, pc, 0, ""});
33
34 // fp (= r11) points to the last frame record.
35 // Frame records are two words long:
36 // fp+0 : pointer to previous frame record
37 // fp+4 : value of lr for frame
38 for (size_t i = 0; i < 256; i++) {
39 out.push_back({"", 0, lr, 0, ""});
40 if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 8)) {
41 break;
42 }
43 lr = memory.Read32(fp + 4);
44 fp = memory.Read32(fp);
45 }
46
47 SymbolicateBacktrace(system, out);
48
49 return out;
30} 50}
31 51
32std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext( 52std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext(
33 Core::System& system, const ARM_Interface::ThreadContext64& ctx) { 53 Core::System& system, const ARM_Interface::ThreadContext64& ctx) {
34 return ARM_Dynarmic_64::GetBacktraceFromContext(system, ctx); 54 std::vector<BacktraceEntry> out;
55 auto& memory = system.ApplicationMemory();
56
57 const auto& reg = ctx.cpu_registers;
58 u64 pc = ctx.pc, lr = reg[30], fp = reg[29];
59
60 out.push_back({"", 0, pc, 0, ""});
61
62 // fp (= x29) points to the previous frame record.
63 // Frame records are two words long:
64 // fp+0 : pointer to previous frame record
65 // fp+8 : value of lr for frame
66 for (size_t i = 0; i < 256; i++) {
67 out.push_back({"", 0, lr, 0, ""});
68 if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 16)) {
69 break;
70 }
71 lr = memory.Read64(fp + 8);
72 fp = memory.Read64(fp);
73 }
74
75 SymbolicateBacktrace(system, out);
76
77 return out;
35} 78}
36 79
37void ARM_Interface::SymbolicateBacktrace(Core::System& system, std::vector<BacktraceEntry>& out) { 80void ARM_Interface::SymbolicateBacktrace(Core::System& system, std::vector<BacktraceEntry>& out) {
@@ -76,6 +119,18 @@ void ARM_Interface::SymbolicateBacktrace(Core::System& system, std::vector<Backt
76 } 119 }
77} 120}
78 121
122std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktrace() const {
123 if (GetArchitecture() == Architecture::Aarch64) {
124 ThreadContext64 ctx;
125 SaveContext(ctx);
126 return GetBacktraceFromContext(system, ctx);
127 } else {
128 ThreadContext32 ctx;
129 SaveContext(ctx);
130 return GetBacktraceFromContext(system, ctx);
131 }
132}
133
79void ARM_Interface::LogBacktrace() const { 134void ARM_Interface::LogBacktrace() const {
80 const VAddr sp = GetSP(); 135 const VAddr sp = GetSP();
81 const VAddr pc = GetPC(); 136 const VAddr pc = GetPC();
@@ -83,7 +138,6 @@ void ARM_Interface::LogBacktrace() const {
83 LOG_ERROR(Core_ARM, "{:20}{:20}{:20}{:20}{}", "Module Name", "Address", "Original Address", 138 LOG_ERROR(Core_ARM, "{:20}{:20}{:20}{:20}{}", "Module Name", "Address", "Original Address",
84 "Offset", "Symbol"); 139 "Offset", "Symbol");
85 LOG_ERROR(Core_ARM, ""); 140 LOG_ERROR(Core_ARM, "");
86
87 const auto backtrace = GetBacktrace(); 141 const auto backtrace = GetBacktrace();
88 for (const auto& entry : backtrace) { 142 for (const auto& entry : backtrace) {
89 LOG_ERROR(Core_ARM, "{:20}{:016X} {:016X} {:016X} {}", entry.module, entry.address, 143 LOG_ERROR(Core_ARM, "{:20}{:016X} {:016X} {:016X} {}", entry.module, entry.address,
@@ -97,7 +151,7 @@ void ARM_Interface::Run() {
97 151
98 while (true) { 152 while (true) {
99 Kernel::KThread* current_thread{Kernel::GetCurrentThreadPointer(system.Kernel())}; 153 Kernel::KThread* current_thread{Kernel::GetCurrentThreadPointer(system.Kernel())};
100 Dynarmic::HaltReason hr{}; 154 HaltReason hr{};
101 155
102 // Notify the debugger and go to sleep if a step was performed 156 // Notify the debugger and go to sleep if a step was performed
103 // and this thread has been scheduled again. 157 // and this thread has been scheduled again.
@@ -108,17 +162,17 @@ void ARM_Interface::Run() {
108 } 162 }
109 163
110 // Otherwise, run the thread. 164 // Otherwise, run the thread.
111 system.EnterDynarmicProfile(); 165 system.EnterCPUProfile();
112 if (current_thread->GetStepState() == StepState::StepPending) { 166 if (current_thread->GetStepState() == StepState::StepPending) {
113 hr = StepJit(); 167 hr = StepJit();
114 168
115 if (Has(hr, step_thread)) { 169 if (True(hr & HaltReason::StepThread)) {
116 current_thread->SetStepState(StepState::StepPerformed); 170 current_thread->SetStepState(StepState::StepPerformed);
117 } 171 }
118 } else { 172 } else {
119 hr = RunJit(); 173 hr = RunJit();
120 } 174 }
121 system.ExitDynarmicProfile(); 175 system.ExitCPUProfile();
122 176
123 // If the thread is scheduled for termination, exit the thread. 177 // If the thread is scheduled for termination, exit the thread.
124 if (current_thread->HasDpc()) { 178 if (current_thread->HasDpc()) {
@@ -130,8 +184,8 @@ void ARM_Interface::Run() {
130 184
131 // Notify the debugger and go to sleep if a breakpoint was hit, 185 // Notify the debugger and go to sleep if a breakpoint was hit,
132 // or if the thread is unable to continue for any reason. 186 // or if the thread is unable to continue for any reason.
133 if (Has(hr, breakpoint) || Has(hr, no_execute)) { 187 if (True(hr & HaltReason::InstructionBreakpoint) || True(hr & HaltReason::PrefetchAbort)) {
134 if (!Has(hr, no_execute)) { 188 if (!True(hr & HaltReason::InstructionBreakpoint)) {
135 RewindBreakpointInstruction(); 189 RewindBreakpointInstruction();
136 } 190 }
137 if (system.DebuggerEnabled()) { 191 if (system.DebuggerEnabled()) {
@@ -144,7 +198,7 @@ void ARM_Interface::Run() {
144 } 198 }
145 199
146 // Notify the debugger and go to sleep if a watchpoint was hit. 200 // Notify the debugger and go to sleep if a watchpoint was hit.
147 if (Has(hr, watchpoint)) { 201 if (True(hr & HaltReason::DataAbort)) {
148 if (system.DebuggerEnabled()) { 202 if (system.DebuggerEnabled()) {
149 system.GetDebugger().NotifyThreadWatchpoint(current_thread, *HaltedWatchpoint()); 203 system.GetDebugger().NotifyThreadWatchpoint(current_thread, *HaltedWatchpoint());
150 } 204 }
@@ -153,11 +207,11 @@ void ARM_Interface::Run() {
153 } 207 }
154 208
155 // Handle syscalls and scheduling (this may change the current thread/core) 209 // Handle syscalls and scheduling (this may change the current thread/core)
156 if (Has(hr, svc_call)) { 210 if (True(hr & HaltReason::SupervisorCall)) {
157 Kernel::Svc::Call(system, GetSvcNumber()); 211 Kernel::Svc::Call(system, GetSvcNumber());
158 break; 212 break;
159 } 213 }
160 if (Has(hr, break_loop) || !uses_wall_clock) { 214 if (True(hr & HaltReason::BreakLoop) || !uses_wall_clock) {
161 break; 215 break;
162 } 216 }
163 } 217 }
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h
index 8e40702cc..d5f2fa09a 100644
--- a/src/core/arm/arm_interface.h
+++ b/src/core/arm/arm_interface.h
@@ -8,8 +8,6 @@
8#include <string> 8#include <string>
9#include <vector> 9#include <vector>
10 10
11#include <dynarmic/interface/halt_reason.h>
12
13#include "common/common_funcs.h" 11#include "common/common_funcs.h"
14#include "common/common_types.h" 12#include "common/common_types.h"
15#include "core/hardware_properties.h" 13#include "core/hardware_properties.h"
@@ -30,6 +28,22 @@ class CPUInterruptHandler;
30 28
31using WatchpointArray = std::array<Kernel::DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>; 29using WatchpointArray = std::array<Kernel::DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>;
32 30
31// NOTE: these values match the HaltReason enum in Dynarmic
32enum class HaltReason : u64 {
33 StepThread = 0x00000001,
34 DataAbort = 0x00000004,
35 BreakLoop = 0x02000000,
36 SupervisorCall = 0x04000000,
37 InstructionBreakpoint = 0x08000000,
38 PrefetchAbort = 0x20000000,
39};
40DECLARE_ENUM_FLAG_OPERATORS(HaltReason);
41
42enum class Architecture {
43 Aarch32,
44 Aarch64,
45};
46
33/// Generic ARMv8 CPU interface 47/// Generic ARMv8 CPU interface
34class ARM_Interface { 48class ARM_Interface {
35public: 49public:
@@ -167,8 +181,9 @@ public:
167 */ 181 */
168 virtual void SetTPIDR_EL0(u64 value) = 0; 182 virtual void SetTPIDR_EL0(u64 value) = 0;
169 183
170 virtual void SaveContext(ThreadContext32& ctx) = 0; 184 virtual Architecture GetArchitecture() const = 0;
171 virtual void SaveContext(ThreadContext64& ctx) = 0; 185 virtual void SaveContext(ThreadContext32& ctx) const = 0;
186 virtual void SaveContext(ThreadContext64& ctx) const = 0;
172 virtual void LoadContext(const ThreadContext32& ctx) = 0; 187 virtual void LoadContext(const ThreadContext32& ctx) = 0;
173 virtual void LoadContext(const ThreadContext64& ctx) = 0; 188 virtual void LoadContext(const ThreadContext64& ctx) = 0;
174 void LoadWatchpointArray(const WatchpointArray& wp); 189 void LoadWatchpointArray(const WatchpointArray& wp);
@@ -195,17 +210,9 @@ public:
195 static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system, 210 static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system,
196 const ThreadContext64& ctx); 211 const ThreadContext64& ctx);
197 212
198 virtual std::vector<BacktraceEntry> GetBacktrace() const = 0; 213 std::vector<BacktraceEntry> GetBacktrace() const;
199
200 void LogBacktrace() const; 214 void LogBacktrace() const;
201 215
202 static constexpr Dynarmic::HaltReason step_thread = Dynarmic::HaltReason::Step;
203 static constexpr Dynarmic::HaltReason break_loop = Dynarmic::HaltReason::UserDefined2;
204 static constexpr Dynarmic::HaltReason svc_call = Dynarmic::HaltReason::UserDefined3;
205 static constexpr Dynarmic::HaltReason breakpoint = Dynarmic::HaltReason::UserDefined4;
206 static constexpr Dynarmic::HaltReason watchpoint = Dynarmic::HaltReason::MemoryAbort;
207 static constexpr Dynarmic::HaltReason no_execute = Dynarmic::HaltReason::UserDefined6;
208
209protected: 216protected:
210 /// System context that this ARM interface is running under. 217 /// System context that this ARM interface is running under.
211 System& system; 218 System& system;
@@ -216,8 +223,8 @@ protected:
216 const Kernel::DebugWatchpoint* MatchingWatchpoint( 223 const Kernel::DebugWatchpoint* MatchingWatchpoint(
217 u64 addr, u64 size, Kernel::DebugWatchpointType access_type) const; 224 u64 addr, u64 size, Kernel::DebugWatchpointType access_type) const;
218 225
219 virtual Dynarmic::HaltReason RunJit() = 0; 226 virtual HaltReason RunJit() = 0;
220 virtual Dynarmic::HaltReason StepJit() = 0; 227 virtual HaltReason StepJit() = 0;
221 virtual u32 GetSvcNumber() const = 0; 228 virtual u32 GetSvcNumber() const = 0;
222 virtual const Kernel::DebugWatchpoint* HaltedWatchpoint() const = 0; 229 virtual const Kernel::DebugWatchpoint* HaltedWatchpoint() const = 0;
223 virtual void RewindBreakpointInstruction() = 0; 230 virtual void RewindBreakpointInstruction() = 0;
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h
new file mode 100644
index 000000000..eef7c3116
--- /dev/null
+++ b/src/core/arm/dynarmic/arm_dynarmic.h
@@ -0,0 +1,29 @@
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include <dynarmic/interface/halt_reason.h>
5
6#include "core/arm/arm_interface.h"
7
8namespace Core {
9
10constexpr Dynarmic::HaltReason StepThread = Dynarmic::HaltReason::Step;
11constexpr Dynarmic::HaltReason DataAbort = Dynarmic::HaltReason::MemoryAbort;
12constexpr Dynarmic::HaltReason BreakLoop = Dynarmic::HaltReason::UserDefined2;
13constexpr Dynarmic::HaltReason SupervisorCall = Dynarmic::HaltReason::UserDefined3;
14constexpr Dynarmic::HaltReason InstructionBreakpoint = Dynarmic::HaltReason::UserDefined4;
15constexpr Dynarmic::HaltReason PrefetchAbort = Dynarmic::HaltReason::UserDefined6;
16
17constexpr HaltReason TranslateHaltReason(Dynarmic::HaltReason hr) {
18 static_assert(static_cast<u64>(HaltReason::StepThread) == static_cast<u64>(StepThread));
19 static_assert(static_cast<u64>(HaltReason::DataAbort) == static_cast<u64>(DataAbort));
20 static_assert(static_cast<u64>(HaltReason::BreakLoop) == static_cast<u64>(BreakLoop));
21 static_assert(static_cast<u64>(HaltReason::SupervisorCall) == static_cast<u64>(SupervisorCall));
22 static_assert(static_cast<u64>(HaltReason::InstructionBreakpoint) ==
23 static_cast<u64>(InstructionBreakpoint));
24 static_assert(static_cast<u64>(HaltReason::PrefetchAbort) == static_cast<u64>(PrefetchAbort));
25
26 return static_cast<HaltReason>(hr);
27}
28
29} // namespace Core
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index dfdcbe35a..5acf9008d 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -10,9 +10,10 @@
10#include "common/logging/log.h" 10#include "common/logging/log.h"
11#include "common/page_table.h" 11#include "common/page_table.h"
12#include "common/settings.h" 12#include "common/settings.h"
13#include "core/arm/dynarmic/arm_dynarmic.h"
13#include "core/arm/dynarmic/arm_dynarmic_32.h" 14#include "core/arm/dynarmic/arm_dynarmic_32.h"
14#include "core/arm/dynarmic/arm_dynarmic_cp15.h" 15#include "core/arm/dynarmic/dynarmic_cp15.h"
15#include "core/arm/dynarmic/arm_exclusive_monitor.h" 16#include "core/arm/dynarmic/dynarmic_exclusive_monitor.h"
16#include "core/core.h" 17#include "core/core.h"
17#include "core/core_timing.h" 18#include "core/core_timing.h"
18#include "core/debugger/debugger.h" 19#include "core/debugger/debugger.h"
@@ -104,11 +105,11 @@ public:
104 switch (exception) { 105 switch (exception) {
105 case Dynarmic::A32::Exception::NoExecuteFault: 106 case Dynarmic::A32::Exception::NoExecuteFault:
106 LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#08x}", pc); 107 LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#08x}", pc);
107 ReturnException(pc, ARM_Interface::no_execute); 108 ReturnException(pc, PrefetchAbort);
108 return; 109 return;
109 default: 110 default:
110 if (debugger_enabled) { 111 if (debugger_enabled) {
111 ReturnException(pc, ARM_Interface::breakpoint); 112 ReturnException(pc, InstructionBreakpoint);
112 return; 113 return;
113 } 114 }
114 115
@@ -121,7 +122,7 @@ public:
121 122
122 void CallSVC(u32 swi) override { 123 void CallSVC(u32 swi) override {
123 parent.svc_swi = swi; 124 parent.svc_swi = swi;
124 parent.jit.load()->HaltExecution(ARM_Interface::svc_call); 125 parent.jit.load()->HaltExecution(SupervisorCall);
125 } 126 }
126 127
127 void AddTicks(u64 ticks) override { 128 void AddTicks(u64 ticks) override {
@@ -162,7 +163,7 @@ public:
162 if (!memory.IsValidVirtualAddressRange(addr, size)) { 163 if (!memory.IsValidVirtualAddressRange(addr, size)) {
163 LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}", 164 LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}",
164 addr); 165 addr);
165 parent.jit.load()->HaltExecution(ARM_Interface::no_execute); 166 parent.jit.load()->HaltExecution(PrefetchAbort);
166 return false; 167 return false;
167 } 168 }
168 169
@@ -173,7 +174,7 @@ public:
173 const auto match{parent.MatchingWatchpoint(addr, size, type)}; 174 const auto match{parent.MatchingWatchpoint(addr, size, type)};
174 if (match) { 175 if (match) {
175 parent.halted_watchpoint = match; 176 parent.halted_watchpoint = match;
176 parent.jit.load()->HaltExecution(ARM_Interface::watchpoint); 177 parent.jit.load()->HaltExecution(DataAbort);
177 return false; 178 return false;
178 } 179 }
179 180
@@ -329,12 +330,12 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*
329 return std::make_unique<Dynarmic::A32::Jit>(config); 330 return std::make_unique<Dynarmic::A32::Jit>(config);
330} 331}
331 332
332Dynarmic::HaltReason ARM_Dynarmic_32::RunJit() { 333HaltReason ARM_Dynarmic_32::RunJit() {
333 return jit.load()->Run(); 334 return TranslateHaltReason(jit.load()->Run());
334} 335}
335 336
336Dynarmic::HaltReason ARM_Dynarmic_32::StepJit() { 337HaltReason ARM_Dynarmic_32::StepJit() {
337 return jit.load()->Step(); 338 return TranslateHaltReason(jit.load()->Step());
338} 339}
339 340
340u32 ARM_Dynarmic_32::GetSvcNumber() const { 341u32 ARM_Dynarmic_32::GetSvcNumber() const {
@@ -408,7 +409,7 @@ void ARM_Dynarmic_32::SetTPIDR_EL0(u64 value) {
408 cp15->uprw = static_cast<u32>(value); 409 cp15->uprw = static_cast<u32>(value);
409} 410}
410 411
411void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) { 412void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) const {
412 Dynarmic::A32::Jit* j = jit.load(); 413 Dynarmic::A32::Jit* j = jit.load();
413 ctx.cpu_registers = j->Regs(); 414 ctx.cpu_registers = j->Regs();
414 ctx.extension_registers = j->ExtRegs(); 415 ctx.extension_registers = j->ExtRegs();
@@ -425,11 +426,11 @@ void ARM_Dynarmic_32::LoadContext(const ThreadContext32& ctx) {
425} 426}
426 427
427void ARM_Dynarmic_32::SignalInterrupt() { 428void ARM_Dynarmic_32::SignalInterrupt() {
428 jit.load()->HaltExecution(break_loop); 429 jit.load()->HaltExecution(BreakLoop);
429} 430}
430 431
431void ARM_Dynarmic_32::ClearInterrupt() { 432void ARM_Dynarmic_32::ClearInterrupt() {
432 jit.load()->ClearHalt(break_loop); 433 jit.load()->ClearHalt(BreakLoop);
433} 434}
434 435
435void ARM_Dynarmic_32::ClearInstructionCache() { 436void ARM_Dynarmic_32::ClearInstructionCache() {
@@ -462,39 +463,4 @@ void ARM_Dynarmic_32::PageTableChanged(Common::PageTable& page_table,
462 jit_cache.emplace(key, std::move(new_jit)); 463 jit_cache.emplace(key, std::move(new_jit));
463} 464}
464 465
465std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktrace(Core::System& system,
466 u64 fp, u64 lr, u64 pc) {
467 std::vector<BacktraceEntry> out;
468 auto& memory = system.ApplicationMemory();
469
470 out.push_back({"", 0, pc, 0, ""});
471
472 // fp (= r11) points to the last frame record.
473 // Frame records are two words long:
474 // fp+0 : pointer to previous frame record
475 // fp+4 : value of lr for frame
476 for (size_t i = 0; i < 256; i++) {
477 out.push_back({"", 0, lr, 0, ""});
478 if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 8)) {
479 break;
480 }
481 lr = memory.Read32(fp + 4);
482 fp = memory.Read32(fp);
483 }
484
485 SymbolicateBacktrace(system, out);
486
487 return out;
488}
489
490std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktraceFromContext(
491 System& system, const ThreadContext32& ctx) {
492 const auto& reg = ctx.cpu_registers;
493 return GetBacktrace(system, reg[11], reg[14], reg[15]);
494}
495
496std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktrace() const {
497 return GetBacktrace(system, GetReg(11), GetReg(14), GetReg(15));
498}
499
500} // namespace Core 466} // namespace Core
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h
index bce695daf..a990845cb 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.h
@@ -50,8 +50,11 @@ public:
50 return (GetPSTATE() & 0x20) != 0; 50 return (GetPSTATE() & 0x20) != 0;
51 } 51 }
52 52
53 void SaveContext(ThreadContext32& ctx) override; 53 Architecture GetArchitecture() const override {
54 void SaveContext(ThreadContext64& ctx) override {} 54 return Architecture::Aarch32;
55 }
56 void SaveContext(ThreadContext32& ctx) const override;
57 void SaveContext(ThreadContext64& ctx) const override {}
55 void LoadContext(const ThreadContext32& ctx) override; 58 void LoadContext(const ThreadContext32& ctx) override;
56 void LoadContext(const ThreadContext64& ctx) override {} 59 void LoadContext(const ThreadContext64& ctx) override {}
57 60
@@ -64,14 +67,9 @@ public:
64 void PageTableChanged(Common::PageTable& new_page_table, 67 void PageTableChanged(Common::PageTable& new_page_table,
65 std::size_t new_address_space_size_in_bits) override; 68 std::size_t new_address_space_size_in_bits) override;
66 69
67 static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system,
68 const ThreadContext32& ctx);
69
70 std::vector<BacktraceEntry> GetBacktrace() const override;
71
72protected: 70protected:
73 Dynarmic::HaltReason RunJit() override; 71 HaltReason RunJit() override;
74 Dynarmic::HaltReason StepJit() override; 72 HaltReason StepJit() override;
75 u32 GetSvcNumber() const override; 73 u32 GetSvcNumber() const override;
76 const Kernel::DebugWatchpoint* HaltedWatchpoint() const override; 74 const Kernel::DebugWatchpoint* HaltedWatchpoint() const override;
77 void RewindBreakpointInstruction() override; 75 void RewindBreakpointInstruction() override;
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
index bbbcb4f9d..bb97ed5bc 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -10,8 +10,9 @@
10#include "common/logging/log.h" 10#include "common/logging/log.h"
11#include "common/page_table.h" 11#include "common/page_table.h"
12#include "common/settings.h" 12#include "common/settings.h"
13#include "core/arm/dynarmic/arm_dynarmic.h"
13#include "core/arm/dynarmic/arm_dynarmic_64.h" 14#include "core/arm/dynarmic/arm_dynarmic_64.h"
14#include "core/arm/dynarmic/arm_exclusive_monitor.h" 15#include "core/arm/dynarmic/dynarmic_exclusive_monitor.h"
15#include "core/core.h" 16#include "core/core.h"
16#include "core/core_timing.h" 17#include "core/core_timing.h"
17#include "core/debugger/debugger.h" 18#include "core/debugger/debugger.h"
@@ -113,7 +114,7 @@ public:
113 LOG_ERROR(Core_ARM, 114 LOG_ERROR(Core_ARM,
114 "Unimplemented instruction @ 0x{:X} for {} instructions (instr = {:08X})", pc, 115 "Unimplemented instruction @ 0x{:X} for {} instructions (instr = {:08X})", pc,
115 num_instructions, memory.Read32(pc)); 116 num_instructions, memory.Read32(pc));
116 ReturnException(pc, ARM_Interface::no_execute); 117 ReturnException(pc, PrefetchAbort);
117 } 118 }
118 119
119 void InstructionCacheOperationRaised(Dynarmic::A64::InstructionCacheOperation op, 120 void InstructionCacheOperationRaised(Dynarmic::A64::InstructionCacheOperation op,
@@ -148,11 +149,11 @@ public:
148 return; 149 return;
149 case Dynarmic::A64::Exception::NoExecuteFault: 150 case Dynarmic::A64::Exception::NoExecuteFault:
150 LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#016x}", pc); 151 LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#016x}", pc);
151 ReturnException(pc, ARM_Interface::no_execute); 152 ReturnException(pc, PrefetchAbort);
152 return; 153 return;
153 default: 154 default:
154 if (debugger_enabled) { 155 if (debugger_enabled) {
155 ReturnException(pc, ARM_Interface::breakpoint); 156 ReturnException(pc, InstructionBreakpoint);
156 return; 157 return;
157 } 158 }
158 159
@@ -164,7 +165,7 @@ public:
164 165
165 void CallSVC(u32 swi) override { 166 void CallSVC(u32 swi) override {
166 parent.svc_swi = swi; 167 parent.svc_swi = swi;
167 parent.jit.load()->HaltExecution(ARM_Interface::svc_call); 168 parent.jit.load()->HaltExecution(SupervisorCall);
168 } 169 }
169 170
170 void AddTicks(u64 ticks) override { 171 void AddTicks(u64 ticks) override {
@@ -207,7 +208,7 @@ public:
207 if (!memory.IsValidVirtualAddressRange(addr, size)) { 208 if (!memory.IsValidVirtualAddressRange(addr, size)) {
208 LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}", 209 LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}",
209 addr); 210 addr);
210 parent.jit.load()->HaltExecution(ARM_Interface::no_execute); 211 parent.jit.load()->HaltExecution(PrefetchAbort);
211 return false; 212 return false;
212 } 213 }
213 214
@@ -218,7 +219,7 @@ public:
218 const auto match{parent.MatchingWatchpoint(addr, size, type)}; 219 const auto match{parent.MatchingWatchpoint(addr, size, type)};
219 if (match) { 220 if (match) {
220 parent.halted_watchpoint = match; 221 parent.halted_watchpoint = match;
221 parent.jit.load()->HaltExecution(ARM_Interface::watchpoint); 222 parent.jit.load()->HaltExecution(DataAbort);
222 return false; 223 return false;
223 } 224 }
224 225
@@ -383,12 +384,12 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
383 return std::make_shared<Dynarmic::A64::Jit>(config); 384 return std::make_shared<Dynarmic::A64::Jit>(config);
384} 385}
385 386
386Dynarmic::HaltReason ARM_Dynarmic_64::RunJit() { 387HaltReason ARM_Dynarmic_64::RunJit() {
387 return jit.load()->Run(); 388 return TranslateHaltReason(jit.load()->Run());
388} 389}
389 390
390Dynarmic::HaltReason ARM_Dynarmic_64::StepJit() { 391HaltReason ARM_Dynarmic_64::StepJit() {
391 return jit.load()->Step(); 392 return TranslateHaltReason(jit.load()->Step());
392} 393}
393 394
394u32 ARM_Dynarmic_64::GetSvcNumber() const { 395u32 ARM_Dynarmic_64::GetSvcNumber() const {
@@ -464,7 +465,7 @@ void ARM_Dynarmic_64::SetTPIDR_EL0(u64 value) {
464 cb->tpidr_el0 = value; 465 cb->tpidr_el0 = value;
465} 466}
466 467
467void ARM_Dynarmic_64::SaveContext(ThreadContext64& ctx) { 468void ARM_Dynarmic_64::SaveContext(ThreadContext64& ctx) const {
468 Dynarmic::A64::Jit* j = jit.load(); 469 Dynarmic::A64::Jit* j = jit.load();
469 ctx.cpu_registers = j->GetRegisters(); 470 ctx.cpu_registers = j->GetRegisters();
470 ctx.sp = j->GetSP(); 471 ctx.sp = j->GetSP();
@@ -489,11 +490,11 @@ void ARM_Dynarmic_64::LoadContext(const ThreadContext64& ctx) {
489} 490}
490 491
491void ARM_Dynarmic_64::SignalInterrupt() { 492void ARM_Dynarmic_64::SignalInterrupt() {
492 jit.load()->HaltExecution(break_loop); 493 jit.load()->HaltExecution(BreakLoop);
493} 494}
494 495
495void ARM_Dynarmic_64::ClearInterrupt() { 496void ARM_Dynarmic_64::ClearInterrupt() {
496 jit.load()->ClearHalt(break_loop); 497 jit.load()->ClearHalt(BreakLoop);
497} 498}
498 499
499void ARM_Dynarmic_64::ClearInstructionCache() { 500void ARM_Dynarmic_64::ClearInstructionCache() {
@@ -526,39 +527,4 @@ void ARM_Dynarmic_64::PageTableChanged(Common::PageTable& page_table,
526 jit_cache.emplace(key, std::move(new_jit)); 527 jit_cache.emplace(key, std::move(new_jit));
527} 528}
528 529
529std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_64::GetBacktrace(Core::System& system,
530 u64 fp, u64 lr, u64 pc) {
531 std::vector<BacktraceEntry> out;
532 auto& memory = system.ApplicationMemory();
533
534 out.push_back({"", 0, pc, 0, ""});
535
536 // fp (= x29) points to the previous frame record.
537 // Frame records are two words long:
538 // fp+0 : pointer to previous frame record
539 // fp+8 : value of lr for frame
540 for (size_t i = 0; i < 256; i++) {
541 out.push_back({"", 0, lr, 0, ""});
542 if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 16)) {
543 break;
544 }
545 lr = memory.Read64(fp + 8);
546 fp = memory.Read64(fp);
547 }
548
549 SymbolicateBacktrace(system, out);
550
551 return out;
552}
553
554std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_64::GetBacktraceFromContext(
555 System& system, const ThreadContext64& ctx) {
556 const auto& reg = ctx.cpu_registers;
557 return GetBacktrace(system, reg[29], reg[30], ctx.pc);
558}
559
560std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_64::GetBacktrace() const {
561 return GetBacktrace(system, GetReg(29), GetReg(30), GetPC());
562}
563
564} // namespace Core 530} // namespace Core
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h
index e83599e82..af2aa1f1c 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.h
@@ -43,8 +43,11 @@ public:
43 void SetTPIDR_EL0(u64 value) override; 43 void SetTPIDR_EL0(u64 value) override;
44 u64 GetTPIDR_EL0() const override; 44 u64 GetTPIDR_EL0() const override;
45 45
46 void SaveContext(ThreadContext32& ctx) override {} 46 Architecture GetArchitecture() const override {
47 void SaveContext(ThreadContext64& ctx) override; 47 return Architecture::Aarch64;
48 }
49 void SaveContext(ThreadContext32& ctx) const override {}
50 void SaveContext(ThreadContext64& ctx) const override;
48 void LoadContext(const ThreadContext32& ctx) override {} 51 void LoadContext(const ThreadContext32& ctx) override {}
49 void LoadContext(const ThreadContext64& ctx) override; 52 void LoadContext(const ThreadContext64& ctx) override;
50 53
@@ -57,14 +60,9 @@ public:
57 void PageTableChanged(Common::PageTable& new_page_table, 60 void PageTableChanged(Common::PageTable& new_page_table,
58 std::size_t new_address_space_size_in_bits) override; 61 std::size_t new_address_space_size_in_bits) override;
59 62
60 static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system,
61 const ThreadContext64& ctx);
62
63 std::vector<BacktraceEntry> GetBacktrace() const override;
64
65protected: 63protected:
66 Dynarmic::HaltReason RunJit() override; 64 HaltReason RunJit() override;
67 Dynarmic::HaltReason StepJit() override; 65 HaltReason StepJit() override;
68 u32 GetSvcNumber() const override; 66 u32 GetSvcNumber() const override;
69 const Kernel::DebugWatchpoint* HaltedWatchpoint() const override; 67 const Kernel::DebugWatchpoint* HaltedWatchpoint() const override;
70 void RewindBreakpointInstruction() override; 68 void RewindBreakpointInstruction() override;
@@ -73,8 +71,6 @@ private:
73 std::shared_ptr<Dynarmic::A64::Jit> MakeJit(Common::PageTable* page_table, 71 std::shared_ptr<Dynarmic::A64::Jit> MakeJit(Common::PageTable* page_table,
74 std::size_t address_space_bits) const; 72 std::size_t address_space_bits) const;
75 73
76 static std::vector<BacktraceEntry> GetBacktrace(Core::System& system, u64 fp, u64 lr, u64 pc);
77
78 using JitCacheKey = std::pair<Common::PageTable*, std::size_t>; 74 using JitCacheKey = std::pair<Common::PageTable*, std::size_t>;
79 using JitCacheType = 75 using JitCacheType =
80 std::unordered_map<JitCacheKey, std::shared_ptr<Dynarmic::A64::Jit>, Common::PairHash>; 76 std::unordered_map<JitCacheKey, std::shared_ptr<Dynarmic::A64::Jit>, Common::PairHash>;
diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp b/src/core/arm/dynarmic/dynarmic_cp15.cpp
index 5a4eba3eb..92c548db0 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp
+++ b/src/core/arm/dynarmic/dynarmic_cp15.cpp
@@ -4,7 +4,7 @@
4#include <fmt/format.h> 4#include <fmt/format.h>
5#include "common/logging/log.h" 5#include "common/logging/log.h"
6#include "core/arm/dynarmic/arm_dynarmic_32.h" 6#include "core/arm/dynarmic/arm_dynarmic_32.h"
7#include "core/arm/dynarmic/arm_dynarmic_cp15.h" 7#include "core/arm/dynarmic/dynarmic_cp15.h"
8#include "core/core.h" 8#include "core/core.h"
9#include "core/core_timing.h" 9#include "core/core_timing.h"
10 10
diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.h b/src/core/arm/dynarmic/dynarmic_cp15.h
index d90b3e568..d90b3e568 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_cp15.h
+++ b/src/core/arm/dynarmic/dynarmic_cp15.h
diff --git a/src/core/arm/dynarmic/arm_exclusive_monitor.cpp b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.cpp
index fa0c48b25..b5c9c43c4 100644
--- a/src/core/arm/dynarmic/arm_exclusive_monitor.cpp
+++ b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.cpp
@@ -1,7 +1,7 @@
1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "core/arm/dynarmic/arm_exclusive_monitor.h" 4#include "core/arm/dynarmic/dynarmic_exclusive_monitor.h"
5#include "core/memory.h" 5#include "core/memory.h"
6 6
7namespace Core { 7namespace Core {
diff --git a/src/core/arm/dynarmic/arm_exclusive_monitor.h b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.h
index 57e6dd0d0..57e6dd0d0 100644
--- a/src/core/arm/dynarmic/arm_exclusive_monitor.h
+++ b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.h
diff --git a/src/core/arm/exclusive_monitor.cpp b/src/core/arm/exclusive_monitor.cpp
index 20550faeb..6d9a862e1 100644
--- a/src/core/arm/exclusive_monitor.cpp
+++ b/src/core/arm/exclusive_monitor.cpp
@@ -2,7 +2,7 @@
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64) 4#if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64)
5#include "core/arm/dynarmic/arm_exclusive_monitor.h" 5#include "core/arm/dynarmic/dynarmic_exclusive_monitor.h"
6#endif 6#endif
7#include "core/arm/exclusive_monitor.h" 7#include "core/arm/exclusive_monitor.h"
8#include "core/memory.h" 8#include "core/memory.h"
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 7ba704f18..b74fd0a58 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -54,10 +54,10 @@
54#include "video_core/renderer_base.h" 54#include "video_core/renderer_base.h"
55#include "video_core/video_core.h" 55#include "video_core/video_core.h"
56 56
57MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU0, "ARM JIT", "Dynarmic CPU 0", MP_RGB(255, 64, 64)); 57MICROPROFILE_DEFINE(ARM_CPU0, "ARM", "CPU 0", MP_RGB(255, 64, 64));
58MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU1, "ARM JIT", "Dynarmic CPU 1", MP_RGB(255, 64, 64)); 58MICROPROFILE_DEFINE(ARM_CPU1, "ARM", "CPU 1", MP_RGB(255, 64, 64));
59MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU2, "ARM JIT", "Dynarmic CPU 2", MP_RGB(255, 64, 64)); 59MICROPROFILE_DEFINE(ARM_CPU2, "ARM", "CPU 2", MP_RGB(255, 64, 64));
60MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU3, "ARM JIT", "Dynarmic CPU 3", MP_RGB(255, 64, 64)); 60MICROPROFILE_DEFINE(ARM_CPU3, "ARM", "CPU 3", MP_RGB(255, 64, 64));
61 61
62namespace Core { 62namespace Core {
63 63
@@ -259,10 +259,10 @@ struct System::Impl {
259 is_powered_on = true; 259 is_powered_on = true;
260 exit_lock = false; 260 exit_lock = false;
261 261
262 microprofile_dynarmic[0] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU0); 262 microprofile_cpu[0] = MICROPROFILE_TOKEN(ARM_CPU0);
263 microprofile_dynarmic[1] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU1); 263 microprofile_cpu[1] = MICROPROFILE_TOKEN(ARM_CPU1);
264 microprofile_dynarmic[2] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU2); 264 microprofile_cpu[2] = MICROPROFILE_TOKEN(ARM_CPU2);
265 microprofile_dynarmic[3] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU3); 265 microprofile_cpu[3] = MICROPROFILE_TOKEN(ARM_CPU3);
266 266
267 LOG_DEBUG(Core, "Initialized OK"); 267 LOG_DEBUG(Core, "Initialized OK");
268 268
@@ -539,7 +539,7 @@ struct System::Impl {
539 ExitCallback exit_callback; 539 ExitCallback exit_callback;
540 540
541 std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{}; 541 std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{};
542 std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_dynarmic{}; 542 std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_cpu{};
543}; 543};
544 544
545System::System() : impl{std::make_unique<Impl>(*this)} {} 545System::System() : impl{std::make_unique<Impl>(*this)} {}
@@ -927,14 +927,14 @@ void System::RegisterHostThread() {
927 impl->kernel.RegisterHostThread(); 927 impl->kernel.RegisterHostThread();
928} 928}
929 929
930void System::EnterDynarmicProfile() { 930void System::EnterCPUProfile() {
931 std::size_t core = impl->kernel.GetCurrentHostThreadID(); 931 std::size_t core = impl->kernel.GetCurrentHostThreadID();
932 impl->dynarmic_ticks[core] = MicroProfileEnter(impl->microprofile_dynarmic[core]); 932 impl->dynarmic_ticks[core] = MicroProfileEnter(impl->microprofile_cpu[core]);
933} 933}
934 934
935void System::ExitDynarmicProfile() { 935void System::ExitCPUProfile() {
936 std::size_t core = impl->kernel.GetCurrentHostThreadID(); 936 std::size_t core = impl->kernel.GetCurrentHostThreadID();
937 MicroProfileLeave(impl->microprofile_dynarmic[core], impl->dynarmic_ticks[core]); 937 MicroProfileLeave(impl->microprofile_cpu[core], impl->dynarmic_ticks[core]);
938} 938}
939 939
940bool System::IsMulticore() const { 940bool System::IsMulticore() const {
diff --git a/src/core/core.h b/src/core/core.h
index ff2e4bd30..93afc9303 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -412,11 +412,11 @@ public:
412 /// Register a host thread as an auxiliary thread. 412 /// Register a host thread as an auxiliary thread.
413 void RegisterHostThread(); 413 void RegisterHostThread();
414 414
415 /// Enter Dynarmic Microprofile 415 /// Enter CPU Microprofile
416 void EnterDynarmicProfile(); 416 void EnterCPUProfile();
417 417
418 /// Exit Dynarmic Microprofile 418 /// Exit CPU Microprofile
419 void ExitDynarmicProfile(); 419 void ExitCPUProfile();
420 420
421 /// Tells if system is running on multicore. 421 /// Tells if system is running on multicore.
422 [[nodiscard]] bool IsMulticore() const; 422 [[nodiscard]] bool IsMulticore() const;