summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar David Marcec2018-12-19 14:10:51 +1100
committerGravatar David Marcec2018-12-19 14:10:51 +1100
commit08d5663cb8989f6e57cc28e02c572367685d69fd (patch)
treeea69bc539f01e2a2b7b99168b4fcb2834027f5ec /src
parentMoved backtrace to ArmInterface (diff)
downloadyuzu-08d5663cb8989f6e57cc28e02c572367685d69fd.tar.gz
yuzu-08d5663cb8989f6e57cc28e02c572367685d69fd.tar.xz
yuzu-08d5663cb8989f6e57cc28e02c572367685d69fd.zip
Moved backtrace to ArmInterface
Diffstat (limited to 'src')
-rw-r--r--src/core/arm/arm_interface.h18
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.cpp16
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.h2
-rw-r--r--src/core/arm/unicorn/arm_unicorn.cpp16
-rw-r--r--src/core/arm/unicorn/arm_unicorn.h1
-rw-r--r--src/core/hle/kernel/svc.cpp5
-rw-r--r--src/core/hle/kernel/thread.cpp4
-rw-r--r--src/core/hle/kernel/thread.h5
8 files changed, 20 insertions, 47 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h
index 26fe68a2e..b0472d55d 100644
--- a/src/core/arm/arm_interface.h
+++ b/src/core/arm/arm_interface.h
@@ -6,6 +6,8 @@
6 6
7#include <array> 7#include <array>
8#include "common/common_types.h" 8#include "common/common_types.h"
9#include "common/logging/log.h"
10#include "core/memory.h"
9 11
10namespace Kernel { 12namespace Kernel {
11enum class VMAPermission : u8; 13enum class VMAPermission : u8;
@@ -142,7 +144,21 @@ public:
142 /// Prepare core for thread reschedule (if needed to correctly handle state) 144 /// Prepare core for thread reschedule (if needed to correctly handle state)
143 virtual void PrepareReschedule() = 0; 145 virtual void PrepareReschedule() = 0;
144 146
145 virtual void LogBacktrace() = 0; 147 void LogBacktrace() {
148 VAddr fp = GetReg(29);
149 VAddr lr = GetReg(30);
150 VAddr sp = GetReg(13);
151 VAddr pc = GetPC();
152 LOG_ERROR(Core_ARM, "Backtrace, sp={:016X}, pc={:016X}", sp, pc);
153 for (;;) {
154 LOG_ERROR(Core_ARM, "{:016X}", lr);
155 if (!fp) {
156 break;
157 }
158 lr = Memory::Read64(fp + 8) - 4;
159 fp = Memory::Read64(fp);
160 }
161 }
146}; 162};
147 163
148} // namespace Core 164} // namespace Core
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp
index 47dadba91..4d2491870 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic.cpp
@@ -278,22 +278,6 @@ void ARM_Dynarmic::PageTableChanged() {
278 current_page_table = Memory::GetCurrentPageTable(); 278 current_page_table = Memory::GetCurrentPageTable();
279} 279}
280 280
281void ARM_Dynarmic::LogBacktrace() {
282 VAddr fp = GetReg(29);
283 VAddr lr = GetReg(30);
284 VAddr sp = GetReg(13);
285 VAddr pc = GetPC();
286 LOG_ERROR(Core_ARM, "Backtrace, sp={:016X}, pc={:016X}", sp, pc);
287 for (;;) {
288 LOG_ERROR(Core_ARM, "{:016X}", lr);
289 if (!fp) {
290 break;
291 }
292 lr = Memory::Read64(fp + 8) - 4;
293 fp = Memory::Read64(fp);
294 }
295}
296
297DynarmicExclusiveMonitor::DynarmicExclusiveMonitor(std::size_t core_count) : monitor(core_count) {} 281DynarmicExclusiveMonitor::DynarmicExclusiveMonitor(std::size_t core_count) : monitor(core_count) {}
298DynarmicExclusiveMonitor::~DynarmicExclusiveMonitor() = default; 282DynarmicExclusiveMonitor::~DynarmicExclusiveMonitor() = default;
299 283
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h
index 791653233..512bf8ce9 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.h
+++ b/src/core/arm/dynarmic/arm_dynarmic.h
@@ -53,8 +53,6 @@ public:
53 void ClearInstructionCache() override; 53 void ClearInstructionCache() override;
54 void PageTableChanged() override; 54 void PageTableChanged() override;
55 55
56 void LogBacktrace() override;
57
58private: 56private:
59 std::unique_ptr<Dynarmic::A64::Jit> MakeJit() const; 57 std::unique_ptr<Dynarmic::A64::Jit> MakeJit() const;
60 58
diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp
index c9495124e..c455c81fb 100644
--- a/src/core/arm/unicorn/arm_unicorn.cpp
+++ b/src/core/arm/unicorn/arm_unicorn.cpp
@@ -267,22 +267,6 @@ void ARM_Unicorn::ClearExclusiveState() {}
267 267
268void ARM_Unicorn::ClearInstructionCache() {} 268void ARM_Unicorn::ClearInstructionCache() {}
269 269
270void ARM_Unicorn::LogBacktrace() {
271 VAddr fp = GetReg(29);
272 VAddr lr = GetReg(30);
273 VAddr sp = GetReg(13);
274 VAddr pc = GetPC();
275 LOG_ERROR(Core_ARM, "Backtrace, sp={:016X}, pc={:016X}", sp, pc);
276 for (;;) {
277 LOG_ERROR(Core_ARM, "{:016X}", lr);
278 if (!fp) {
279 break;
280 }
281 lr = Memory::Read64(fp + 8) - 4;
282 fp = Memory::Read64(fp);
283 }
284}
285
286void ARM_Unicorn::RecordBreak(GDBStub::BreakpointAddress bkpt) { 270void ARM_Unicorn::RecordBreak(GDBStub::BreakpointAddress bkpt) {
287 last_bkpt = bkpt; 271 last_bkpt = bkpt;
288 last_bkpt_hit = true; 272 last_bkpt_hit = true;
diff --git a/src/core/arm/unicorn/arm_unicorn.h b/src/core/arm/unicorn/arm_unicorn.h
index 41da6a73c..75761950b 100644
--- a/src/core/arm/unicorn/arm_unicorn.h
+++ b/src/core/arm/unicorn/arm_unicorn.h
@@ -40,7 +40,6 @@ public:
40 void ClearInstructionCache() override; 40 void ClearInstructionCache() override;
41 void PageTableChanged() override{}; 41 void PageTableChanged() override{};
42 void RecordBreak(GDBStub::BreakpointAddress bkpt); 42 void RecordBreak(GDBStub::BreakpointAddress bkpt);
43 void LogBacktrace() override;
44 43
45private: 44private:
46 uc_engine* uc{}; 45 uc_engine* uc{};
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 2273f0bcf..290670e78 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -625,8 +625,9 @@ static void Break(u32 reason, u64 info1, u64 info2) {
625 "Emulated program broke execution! reason=0x{:016X}, info1=0x{:016X}, info2=0x{:016X}", 625 "Emulated program broke execution! reason=0x{:016X}, info1=0x{:016X}, info2=0x{:016X}",
626 reason, info1, info2); 626 reason, info1, info2);
627 handle_debug_buffer(info1, info2); 627 handle_debug_buffer(info1, info2);
628 GetCurrentThread()->LogBacktrace(); 628 Core::System::GetInstance()
629 629 .ArmInterface(static_cast<std::size_t>(GetCurrentThread()->GetProcessorID()))
630 .LogBacktrace();
630 ASSERT(false); 631 ASSERT(false);
631 632
632 Core::CurrentProcess()->PrepareForTermination(); 633 Core::CurrentProcess()->PrepareForTermination();
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index a276812f0..4ffb76818 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -388,10 +388,6 @@ bool Thread::InvokeWakeupCallback(ThreadWakeupReason reason, SharedPtr<Thread> t
388 return wakeup_callback(reason, std::move(thread), std::move(object), index); 388 return wakeup_callback(reason, std::move(thread), std::move(object), index);
389} 389}
390 390
391void Thread::LogBacktrace() {
392 Core::System::GetInstance().ArmInterface(processor_id).LogBacktrace();
393}
394
395//////////////////////////////////////////////////////////////////////////////////////////////////// 391////////////////////////////////////////////////////////////////////////////////////////////////////
396 392
397/** 393/**
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h
index 469f8a56d..d384d50db 100644
--- a/src/core/hle/kernel/thread.h
+++ b/src/core/hle/kernel/thread.h
@@ -240,11 +240,6 @@ public:
240 return status == ThreadStatus::WaitSynchAll; 240 return status == ThreadStatus::WaitSynchAll;
241 } 241 }
242 242
243 /**
244 * Logs the backtrace for the current thread
245 */
246 void LogBacktrace();
247
248 ThreadContext& GetContext() { 243 ThreadContext& GetContext() {
249 return context; 244 return context;
250 } 245 }