| |
| |
|
|
| #pragma once |
|
|
| #include <map> |
| #include <memory> |
| #include <optional> |
| #include <string_view> |
| #include <vector> |
|
|
| #include "core/debugger/debugger_interface.h" |
| #include "core/debugger/gdbstub_arch.h" |
|
|
| namespace Kernel { |
| class KProcess; |
| } |
|
|
| namespace Core::Memory { |
| class Memory; |
| } |
|
|
| namespace Core { |
|
|
| class System; |
|
|
| class GDBStub : public DebuggerFrontend { |
| public: |
| explicit GDBStub(DebuggerBackend& backend, Core::System& system, |
| Kernel::KProcess* debug_process); |
| ~GDBStub() override; |
|
|
| void Connected() override; |
| void Stopped(Kernel::KThread* thread) override; |
| void ShuttingDown() override; |
| void Watchpoint(Kernel::KThread* thread, const Kernel::DebugWatchpoint& watch) override; |
| std::vector<DebuggerAction> ClientData(std::span<const u8> data) override; |
|
|
| private: |
| void ProcessData(std::vector<DebuggerAction>& actions); |
| void ExecuteCommand(std::string_view packet, std::vector<DebuggerAction>& actions); |
| void HandleVCont(std::string_view command, std::vector<DebuggerAction>& actions); |
| void HandleQuery(std::string_view command); |
| void HandleRcmd(const std::vector<u8>& command); |
| void HandleBreakpointInsert(std::string_view command); |
| void HandleBreakpointRemove(std::string_view command); |
| std::vector<char>::const_iterator CommandEnd() const; |
| std::optional<std::string> DetachCommand(); |
| Kernel::KThread* GetThreadByID(u64 thread_id); |
|
|
| void SendReply(std::string_view data); |
| void SendStatus(char status); |
|
|
| Kernel::KProcess* GetProcess(); |
| Core::Memory::Memory& GetMemory(); |
|
|
| private: |
| Core::System& system; |
| Kernel::KProcess* debug_process; |
| std::unique_ptr<GDBStubArch> arch; |
| std::vector<char> current_command; |
| std::map<VAddr, u32> replaced_instructions; |
| bool no_ack{}; |
| }; |
|
|
| } |
|
|