From c50393e06677e868d6a014d6ebe67057e8bdf9a7 Mon Sep 17 00:00:00 2001 From: Subv Date: Sat, 19 May 2018 16:52:49 -0500 Subject: Qt/WaitTree: Display the callstack for each thread in the wait tree widget. --- src/yuzu/debugger/wait_tree.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'src/yuzu/debugger/wait_tree.cpp') diff --git a/src/yuzu/debugger/wait_tree.cpp b/src/yuzu/debugger/wait_tree.cpp index 8b074db5a..017bef13c 100644 --- a/src/yuzu/debugger/wait_tree.cpp +++ b/src/yuzu/debugger/wait_tree.cpp @@ -98,6 +98,30 @@ std::vector> WaitTreeMutexInfo::GetChildren() cons return list; } +WaitTreeCallstack::WaitTreeCallstack(const Kernel::Thread& thread) : thread(thread) {} + +QString WaitTreeCallstack::GetText() const { + return tr("Call stack"); +} + +std::vector> WaitTreeCallstack::GetChildren() const { + std::vector> list; + + constexpr size_t BaseRegister = 29; + u64 base_pointer = thread.context.cpu_registers[BaseRegister]; + + while (base_pointer != 0) { + u64 lr = Memory::Read64(base_pointer + sizeof(u64)); + if (lr == 0) + break; + list.push_back( + std::make_unique(tr("0x%1").arg(lr - sizeof(u32), 16, 16, QChar('0')))); + base_pointer = Memory::Read64(base_pointer); + } + + return list; +} + WaitTreeWaitObject::WaitTreeWaitObject(const Kernel::WaitObject& o) : object(o) {} bool WaitTreeExpandableItem::IsExpandable() const { @@ -269,6 +293,8 @@ std::vector> WaitTreeThread::GetChildren() const { thread.IsSleepingOnWaitAll())); } + list.push_back(std::make_unique(thread)); + return list; } -- cgit v1.2.3