Skip to content
Snippets Groups Projects
Commit 5102c912 authored by David Marcec's avatar David Marcec
Browse files

Moved backtrace to ArmInterface

Added to both dynarmic and unicorn
parent 71493327
No related branches found
No related tags found
No related merge requests found
......@@ -141,6 +141,8 @@ public:
/// Prepare core for thread reschedule (if needed to correctly handle state)
virtual void PrepareReschedule() = 0;
virtual void LogBacktrace() = 0;
};
} // namespace Core
......@@ -278,6 +278,22 @@ void ARM_Dynarmic::PageTableChanged() {
current_page_table = Memory::GetCurrentPageTable();
}
void ARM_Dynarmic::LogBacktrace() {
VAddr fp = GetReg(29);
VAddr lr = GetReg(30);
VAddr sp = GetReg(13);
VAddr pc = GetPC();
LOG_ERROR(Core_ARM, "Backtrace, sp={:016X}, pc={:016X}", sp, pc);
for (;;) {
LOG_ERROR(Core_ARM, "{:016X}", lr);
if (!fp) {
break;
}
lr = Memory::Read64(fp + 8) - 4;
fp = Memory::Read64(fp);
}
}
DynarmicExclusiveMonitor::DynarmicExclusiveMonitor(std::size_t core_count) : monitor(core_count) {}
DynarmicExclusiveMonitor::~DynarmicExclusiveMonitor() = default;
......
......@@ -53,6 +53,8 @@ public:
void ClearInstructionCache() override;
void PageTableChanged() override;
void LogBacktrace() override;
private:
std::unique_ptr<Dynarmic::A64::Jit> MakeJit() const;
......
......@@ -10,6 +10,7 @@
#include "core/core.h"
#include "core/core_timing.h"
#include "core/hle/kernel/svc.h"
#include "core/memory.h"
namespace Core {
......@@ -266,6 +267,22 @@ void ARM_Unicorn::ClearExclusiveState() {}
void ARM_Unicorn::ClearInstructionCache() {}
void ARM_Unicorn::LogBacktrace() {
VAddr fp = GetReg(29);
VAddr lr = GetReg(30);
VAddr sp = GetReg(13);
VAddr pc = GetPC();
LOG_ERROR(Core_ARM, "Backtrace, sp={:016X}, pc={:016X}", sp, pc);
for (;;) {
LOG_ERROR(Core_ARM, "{:016X}", lr);
if (!fp) {
break;
}
lr = Memory::Read64(fp + 8) - 4;
fp = Memory::Read64(fp);
}
}
void ARM_Unicorn::RecordBreak(GDBStub::BreakpointAddress bkpt) {
last_bkpt = bkpt;
last_bkpt_hit = true;
......
......@@ -40,6 +40,7 @@ public:
void ClearInstructionCache() override;
void PageTableChanged() override{};
void RecordBreak(GDBStub::BreakpointAddress bkpt);
void LogBacktrace() override;
private:
uc_engine* uc{};
......
......@@ -389,20 +389,7 @@ bool Thread::InvokeWakeupCallback(ThreadWakeupReason reason, SharedPtr<Thread> t
}
void Thread::LogBacktrace() {
auto& system = Core::System::GetInstance();
VAddr fp = system.ArmInterface(processor_id).GetReg(29);
VAddr lr = system.ArmInterface(processor_id).GetReg(30);
VAddr sp = system.ArmInterface(processor_id).GetReg(13);
VAddr pc = system.ArmInterface(processor_id).GetPC();
LOG_ERROR(Debug, "Backtrace, sp={:016X}, pc={:016X}", sp, pc);
for (std::size_t i = 0; i < 256; i++) {
LOG_ERROR(Debug, "{:016X}", lr - 4);
if (!fp) {
break;
}
lr = Memory::Read64(fp + 8);
fp = Memory::Read64(fp);
}
Core::System::GetInstance().ArmInterface(processor_id).LogBacktrace();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment