diff options
| author | 2023-10-21 16:47:43 -0400 | |
|---|---|---|
| committer | 2023-10-21 20:03:41 -0400 | |
| commit | 8c59543ee32c8bff575bab7ec1e70f76f8eda437 (patch) | |
| tree | afeee77ba66daf7ec6bff18515c8fbf1bb8468e0 /src/core/debugger | |
| parent | Merge pull request #11831 from liamwhite/hosversionbetween (diff) | |
| download | yuzu-8c59543ee32c8bff575bab7ec1e70f76f8eda437.tar.gz yuzu-8c59543ee32c8bff575bab7ec1e70f76f8eda437.tar.xz yuzu-8c59543ee32c8bff575bab7ec1e70f76f8eda437.zip | |
kernel: update KProcess
Diffstat (limited to 'src/core/debugger')
| -rw-r--r-- | src/core/debugger/debugger.cpp | 24 | ||||
| -rw-r--r-- | src/core/debugger/gdbstub.cpp | 42 |
2 files changed, 35 insertions, 31 deletions
diff --git a/src/core/debugger/debugger.cpp b/src/core/debugger/debugger.cpp index a1589fecb..0e270eb50 100644 --- a/src/core/debugger/debugger.cpp +++ b/src/core/debugger/debugger.cpp | |||
| @@ -258,20 +258,20 @@ private: | |||
| 258 | Kernel::KScopedSchedulerLock sl{system.Kernel()}; | 258 | Kernel::KScopedSchedulerLock sl{system.Kernel()}; |
| 259 | 259 | ||
| 260 | // Put all threads to sleep on next scheduler round. | 260 | // Put all threads to sleep on next scheduler round. |
| 261 | for (auto* thread : ThreadList()) { | 261 | for (auto& thread : ThreadList()) { |
| 262 | thread->RequestSuspend(Kernel::SuspendType::Debug); | 262 | thread.RequestSuspend(Kernel::SuspendType::Debug); |
| 263 | } | 263 | } |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | void ResumeEmulation(Kernel::KThread* except = nullptr) { | 266 | void ResumeEmulation(Kernel::KThread* except = nullptr) { |
| 267 | // Wake up all threads. | 267 | // Wake up all threads. |
| 268 | for (auto* thread : ThreadList()) { | 268 | for (auto& thread : ThreadList()) { |
| 269 | if (thread == except) { | 269 | if (std::addressof(thread) == except) { |
| 270 | continue; | 270 | continue; |
| 271 | } | 271 | } |
| 272 | 272 | ||
| 273 | thread->SetStepState(Kernel::StepState::NotStepping); | 273 | thread.SetStepState(Kernel::StepState::NotStepping); |
| 274 | thread->Resume(Kernel::SuspendType::Debug); | 274 | thread.Resume(Kernel::SuspendType::Debug); |
| 275 | } | 275 | } |
| 276 | } | 276 | } |
| 277 | 277 | ||
| @@ -283,13 +283,17 @@ private: | |||
| 283 | } | 283 | } |
| 284 | 284 | ||
| 285 | void UpdateActiveThread() { | 285 | void UpdateActiveThread() { |
| 286 | const auto& threads{ThreadList()}; | 286 | auto& threads{ThreadList()}; |
| 287 | if (std::find(threads.begin(), threads.end(), state->active_thread) == threads.end()) { | 287 | for (auto& thread : threads) { |
| 288 | state->active_thread = threads.front(); | 288 | if (std::addressof(thread) == state->active_thread) { |
| 289 | // Thread is still alive, no need to update. | ||
| 290 | return; | ||
| 291 | } | ||
| 289 | } | 292 | } |
| 293 | state->active_thread = std::addressof(threads.front()); | ||
| 290 | } | 294 | } |
| 291 | 295 | ||
| 292 | const std::list<Kernel::KThread*>& ThreadList() { | 296 | Kernel::KProcess::ThreadList& ThreadList() { |
| 293 | return system.ApplicationProcess()->GetThreadList(); | 297 | return system.ApplicationProcess()->GetThreadList(); |
| 294 | } | 298 | } |
| 295 | 299 | ||
diff --git a/src/core/debugger/gdbstub.cpp b/src/core/debugger/gdbstub.cpp index 2076aa8a2..6f5f5156b 100644 --- a/src/core/debugger/gdbstub.cpp +++ b/src/core/debugger/gdbstub.cpp | |||
| @@ -109,7 +109,7 @@ static std::string EscapeXML(std::string_view data) { | |||
| 109 | 109 | ||
| 110 | GDBStub::GDBStub(DebuggerBackend& backend_, Core::System& system_) | 110 | GDBStub::GDBStub(DebuggerBackend& backend_, Core::System& system_) |
| 111 | : DebuggerFrontend(backend_), system{system_} { | 111 | : DebuggerFrontend(backend_), system{system_} { |
| 112 | if (system.ApplicationProcess()->Is64BitProcess()) { | 112 | if (system.ApplicationProcess()->Is64Bit()) { |
| 113 | arch = std::make_unique<GDBStubA64>(); | 113 | arch = std::make_unique<GDBStubA64>(); |
| 114 | } else { | 114 | } else { |
| 115 | arch = std::make_unique<GDBStubA32>(); | 115 | arch = std::make_unique<GDBStubA32>(); |
| @@ -446,10 +446,10 @@ void GDBStub::HandleBreakpointRemove(std::string_view command) { | |||
| 446 | // See osdbg_thread_local_region.os.horizon.hpp and osdbg_thread_type.os.horizon.hpp | 446 | // See osdbg_thread_local_region.os.horizon.hpp and osdbg_thread_type.os.horizon.hpp |
| 447 | 447 | ||
| 448 | static std::optional<std::string> GetNameFromThreadType32(Core::Memory::Memory& memory, | 448 | static std::optional<std::string> GetNameFromThreadType32(Core::Memory::Memory& memory, |
| 449 | const Kernel::KThread* thread) { | 449 | const Kernel::KThread& thread) { |
| 450 | // Read thread type from TLS | 450 | // Read thread type from TLS |
| 451 | const VAddr tls_thread_type{memory.Read32(thread->GetTlsAddress() + 0x1fc)}; | 451 | const VAddr tls_thread_type{memory.Read32(thread.GetTlsAddress() + 0x1fc)}; |
| 452 | const VAddr argument_thread_type{thread->GetArgument()}; | 452 | const VAddr argument_thread_type{thread.GetArgument()}; |
| 453 | 453 | ||
| 454 | if (argument_thread_type && tls_thread_type != argument_thread_type) { | 454 | if (argument_thread_type && tls_thread_type != argument_thread_type) { |
| 455 | // Probably not created by nnsdk, no name available. | 455 | // Probably not created by nnsdk, no name available. |
| @@ -477,10 +477,10 @@ static std::optional<std::string> GetNameFromThreadType32(Core::Memory::Memory& | |||
| 477 | } | 477 | } |
| 478 | 478 | ||
| 479 | static std::optional<std::string> GetNameFromThreadType64(Core::Memory::Memory& memory, | 479 | static std::optional<std::string> GetNameFromThreadType64(Core::Memory::Memory& memory, |
| 480 | const Kernel::KThread* thread) { | 480 | const Kernel::KThread& thread) { |
| 481 | // Read thread type from TLS | 481 | // Read thread type from TLS |
| 482 | const VAddr tls_thread_type{memory.Read64(thread->GetTlsAddress() + 0x1f8)}; | 482 | const VAddr tls_thread_type{memory.Read64(thread.GetTlsAddress() + 0x1f8)}; |
| 483 | const VAddr argument_thread_type{thread->GetArgument()}; | 483 | const VAddr argument_thread_type{thread.GetArgument()}; |
| 484 | 484 | ||
| 485 | if (argument_thread_type && tls_thread_type != argument_thread_type) { | 485 | if (argument_thread_type && tls_thread_type != argument_thread_type) { |
| 486 | // Probably not created by nnsdk, no name available. | 486 | // Probably not created by nnsdk, no name available. |
| @@ -508,16 +508,16 @@ static std::optional<std::string> GetNameFromThreadType64(Core::Memory::Memory& | |||
| 508 | } | 508 | } |
| 509 | 509 | ||
| 510 | static std::optional<std::string> GetThreadName(Core::System& system, | 510 | static std::optional<std::string> GetThreadName(Core::System& system, |
| 511 | const Kernel::KThread* thread) { | 511 | const Kernel::KThread& thread) { |
| 512 | if (system.ApplicationProcess()->Is64BitProcess()) { | 512 | if (system.ApplicationProcess()->Is64Bit()) { |
| 513 | return GetNameFromThreadType64(system.ApplicationMemory(), thread); | 513 | return GetNameFromThreadType64(system.ApplicationMemory(), thread); |
| 514 | } else { | 514 | } else { |
| 515 | return GetNameFromThreadType32(system.ApplicationMemory(), thread); | 515 | return GetNameFromThreadType32(system.ApplicationMemory(), thread); |
| 516 | } | 516 | } |
| 517 | } | 517 | } |
| 518 | 518 | ||
| 519 | static std::string_view GetThreadWaitReason(const Kernel::KThread* thread) { | 519 | static std::string_view GetThreadWaitReason(const Kernel::KThread& thread) { |
| 520 | switch (thread->GetWaitReasonForDebugging()) { | 520 | switch (thread.GetWaitReasonForDebugging()) { |
| 521 | case Kernel::ThreadWaitReasonForDebugging::Sleep: | 521 | case Kernel::ThreadWaitReasonForDebugging::Sleep: |
| 522 | return "Sleep"; | 522 | return "Sleep"; |
| 523 | case Kernel::ThreadWaitReasonForDebugging::IPC: | 523 | case Kernel::ThreadWaitReasonForDebugging::IPC: |
| @@ -535,8 +535,8 @@ static std::string_view GetThreadWaitReason(const Kernel::KThread* thread) { | |||
| 535 | } | 535 | } |
| 536 | } | 536 | } |
| 537 | 537 | ||
| 538 | static std::string GetThreadState(const Kernel::KThread* thread) { | 538 | static std::string GetThreadState(const Kernel::KThread& thread) { |
| 539 | switch (thread->GetState()) { | 539 | switch (thread.GetState()) { |
| 540 | case Kernel::ThreadState::Initialized: | 540 | case Kernel::ThreadState::Initialized: |
| 541 | return "Initialized"; | 541 | return "Initialized"; |
| 542 | case Kernel::ThreadState::Waiting: | 542 | case Kernel::ThreadState::Waiting: |
| @@ -604,7 +604,7 @@ void GDBStub::HandleQuery(std::string_view command) { | |||
| 604 | const auto& threads = system.ApplicationProcess()->GetThreadList(); | 604 | const auto& threads = system.ApplicationProcess()->GetThreadList(); |
| 605 | std::vector<std::string> thread_ids; | 605 | std::vector<std::string> thread_ids; |
| 606 | for (const auto& thread : threads) { | 606 | for (const auto& thread : threads) { |
| 607 | thread_ids.push_back(fmt::format("{:x}", thread->GetThreadId())); | 607 | thread_ids.push_back(fmt::format("{:x}", thread.GetThreadId())); |
| 608 | } | 608 | } |
| 609 | SendReply(fmt::format("m{}", fmt::join(thread_ids, ","))); | 609 | SendReply(fmt::format("m{}", fmt::join(thread_ids, ","))); |
| 610 | } else if (command.starts_with("sThreadInfo")) { | 610 | } else if (command.starts_with("sThreadInfo")) { |
| @@ -616,14 +616,14 @@ void GDBStub::HandleQuery(std::string_view command) { | |||
| 616 | buffer += "<threads>"; | 616 | buffer += "<threads>"; |
| 617 | 617 | ||
| 618 | const auto& threads = system.ApplicationProcess()->GetThreadList(); | 618 | const auto& threads = system.ApplicationProcess()->GetThreadList(); |
| 619 | for (const auto* thread : threads) { | 619 | for (const auto& thread : threads) { |
| 620 | auto thread_name{GetThreadName(system, thread)}; | 620 | auto thread_name{GetThreadName(system, thread)}; |
| 621 | if (!thread_name) { | 621 | if (!thread_name) { |
| 622 | thread_name = fmt::format("Thread {:d}", thread->GetThreadId()); | 622 | thread_name = fmt::format("Thread {:d}", thread.GetThreadId()); |
| 623 | } | 623 | } |
| 624 | 624 | ||
| 625 | buffer += fmt::format(R"(<thread id="{:x}" core="{:d}" name="{}">{}</thread>)", | 625 | buffer += fmt::format(R"(<thread id="{:x}" core="{:d}" name="{}">{}</thread>)", |
| 626 | thread->GetThreadId(), thread->GetActiveCore(), | 626 | thread.GetThreadId(), thread.GetActiveCore(), |
| 627 | EscapeXML(*thread_name), GetThreadState(thread)); | 627 | EscapeXML(*thread_name), GetThreadState(thread)); |
| 628 | } | 628 | } |
| 629 | 629 | ||
| @@ -850,10 +850,10 @@ void GDBStub::HandleRcmd(const std::vector<u8>& command) { | |||
| 850 | } | 850 | } |
| 851 | 851 | ||
| 852 | Kernel::KThread* GDBStub::GetThreadByID(u64 thread_id) { | 852 | Kernel::KThread* GDBStub::GetThreadByID(u64 thread_id) { |
| 853 | const auto& threads{system.ApplicationProcess()->GetThreadList()}; | 853 | auto& threads{system.ApplicationProcess()->GetThreadList()}; |
| 854 | for (auto* thread : threads) { | 854 | for (auto& thread : threads) { |
| 855 | if (thread->GetThreadId() == thread_id) { | 855 | if (thread.GetThreadId() == thread_id) { |
| 856 | return thread; | 856 | return std::addressof(thread); |
| 857 | } | 857 | } |
| 858 | } | 858 | } |
| 859 | 859 | ||