diff options
| author | Mai M <mathew1800@gmail.com> | 2022-06-05 18:23:29 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-05 18:23:29 -0400 | 
| commit | cad53179edb94426e06c4d2bdafbcb47fcfa605b (patch) | |
| tree | 6bb26b6c0725c9fce988b14c70dbedd6fc788070 | |
| parent | 45bdbf538c72f838de7afc4ead84af579f4b2a2f (diff) | |
| parent | 2f2e443858c2450704ba7343b8fc78a790467c7a (diff) | |
Merge pull request #8419 from liamwhite/library-list
gdbstub: add missing library list query
| -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")) { | 
