summaryrefslogblamecommitdiffstats
path: root/src/core/debugger/gdbstub.h
blob: b93a3a511ed340bcb47a96728bde5f52f9d06c0f (plain) (tree)














































                                                                                       
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#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 Core {

class System;

class GDBStub : public DebuggerFrontend {
public:
    explicit GDBStub(DebuggerBackend& backend, Core::System& system);
    ~GDBStub();

    void Connected() override;
    void Stopped(Kernel::KThread* thread) 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 HandleQuery(std::string_view command);
    std::vector<char>::const_iterator CommandEnd() const;
    std::optional<std::string> DetachCommand();
    Kernel::KThread* GetThreadByID(u64 thread_id);

    static u8 CalculateChecksum(std::string_view data);
    void SendReply(std::string_view data);
    void SendStatus(char status);

private:
    Core::System& system;
    std::unique_ptr<GDBStubArch> arch;
    std::vector<char> current_command;
    std::map<VAddr, u32> replaced_instructions;
};

} // namespace Core