diff options
author | Liam <byteslice@airmail.cc> | 2022-06-04 02:42:13 +0200 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2022-06-04 02:42:13 +0200 |
commit | 2f2e443858c2450704ba7343b8fc78a790467c7a (patch) | |
tree | f399ee1b997ed1da732665c17185fcea97da994e /src/core/debugger/gdbstub.cpp | |
parent | Merge pull request #8410 from liamwhite/thread-names (diff) | |
download | yuzu-2f2e443858c2450704ba7343b8fc78a790467c7a.tar yuzu-2f2e443858c2450704ba7343b8fc78a790467c7a.tar.gz yuzu-2f2e443858c2450704ba7343b8fc78a790467c7a.tar.bz2 yuzu-2f2e443858c2450704ba7343b8fc78a790467c7a.tar.lz yuzu-2f2e443858c2450704ba7343b8fc78a790467c7a.tar.xz yuzu-2f2e443858c2450704ba7343b8fc78a790467c7a.tar.zst yuzu-2f2e443858c2450704ba7343b8fc78a790467c7a.zip |
Diffstat (limited to '')
-rw-r--r-- | src/core/debugger/gdbstub.cpp | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/src/core/debugger/gdbstub.cpp b/src/core/debugger/gdbstub.cpp index 682651a86..f52d78829 100644 --- a/src/core/debugger/gdbstub.cpp +++ b/src/core/debugger/gdbstub.cpp @@ -422,6 +422,18 @@ static std::string GetThreadState(const Kernel::KThread* thread) { } } +static std::string PaginateBuffer(std::string_view buffer, std::string_view request) { + const auto amount{request.substr(request.find(',') + 1)}; + const auto offset_val{static_cast<u64>(strtoll(request.data(), nullptr, 16))}; + const auto amount_val{static_cast<u64>(strtoll(amount.data(), nullptr, 16))}; + + if (offset_val + amount_val > buffer.size()) { + return fmt::format("l{}", buffer.substr(offset_val)); + } else { + return fmt::format("m{}", buffer.substr(offset_val, amount_val)); + } +} + void GDBStub::HandleQuery(std::string_view command) { if (command.starts_with("TStatus")) { // no tracepoint support @@ -430,18 +442,8 @@ void GDBStub::HandleQuery(std::string_view command) { SendReply("PacketSize=4000;qXfer:features:read+;qXfer:threads:read+;qXfer:libraries:read+;" "vContSupported+;QStartNoAckMode+"); } else if (command.starts_with("Xfer:features:read:target.xml:")) { - const auto offset{command.substr(30)}; - const auto amount{command.substr(command.find(',') + 1)}; - - const auto offset_val{static_cast<u64>(strtoll(offset.data(), nullptr, 16))}; - const auto amount_val{static_cast<u64>(strtoll(amount.data(), nullptr, 16))}; const auto target_xml{arch->GetTargetXML()}; - - if (offset_val + amount_val > target_xml.size()) { - SendReply("l" + target_xml.substr(offset_val)); - } else { - SendReply("m" + target_xml.substr(offset_val, amount_val)); - } + SendReply(PaginateBuffer(target_xml, command.substr(30))); } else if (command.starts_with("Offsets")) { Loader::AppLoader::Modules modules; system.GetAppLoader().ReadNSOModules(modules); @@ -454,6 +456,20 @@ void GDBStub::HandleQuery(std::string_view command) { SendReply(fmt::format("TextSeg={:x}", system.CurrentProcess()->PageTable().GetCodeRegionStart())); } + } else if (command.starts_with("Xfer:libraries:read::")) { + Loader::AppLoader::Modules modules; + system.GetAppLoader().ReadNSOModules(modules); + + std::string buffer; + buffer += R"(<?xml version="1.0"?>)"; + buffer += "<library-list>"; + for (const auto& [base, name] : modules) { + buffer += fmt::format(R"(<library name="{}"><segment address="{:#x}"/></library>)", + EscapeXML(name), base); + } + buffer += "</library-list>"; + + SendReply(PaginateBuffer(buffer, command.substr(21))); } else if (command.starts_with("fThreadInfo")) { // beginning of list const auto& threads = system.GlobalSchedulerContext().GetThreadList(); @@ -484,17 +500,7 @@ void GDBStub::HandleQuery(std::string_view command) { buffer += "</threads>"; - const auto offset{command.substr(19)}; - const auto amount{command.substr(command.find(',') + 1)}; - - const auto offset_val{static_cast<u64>(strtoll(offset.data(), nullptr, 16))}; - const auto amount_val{static_cast<u64>(strtoll(amount.data(), nullptr, 16))}; - - if (offset_val + amount_val > buffer.size()) { - SendReply("l" + buffer.substr(offset_val)); - } else { - SendReply("m" + buffer.substr(offset_val, amount_val)); - } + SendReply(PaginateBuffer(buffer, command.substr(19))); } else if (command.starts_with("Attached")) { SendReply("0"); } else if (command.starts_with("StartNoAckMode")) { |