Files
FEX-Emu--FEX/Source/Tools/LinuxEmulation/LinuxSyscalls/GdbServer.h
T
Ryan Houdek 740ff60a71 GdbServer: Reorganize packet command handlers
Makes these consistent in the handling and documents the commands in a
way that is easier to parse while working on this.

NFC
2024-11-28 15:32:50 -08:00

122 lines
3.7 KiB
C++

// SPDX-License-Identifier: MIT
/*
$info$
tags: glue|gdbserver
$end_info$
*/
#pragma once
#include <FEXCore/Config/Config.h>
#include <FEXCore/Core/SignalDelegator.h>
#include <FEXCore/Utils/Event.h>
#include <FEXCore/Utils/Threads.h>
#include <FEXCore/fextl/memory.h>
#include <FEXCore/fextl/string.h>
#include <atomic>
#include <istream>
#include <memory>
#include <mutex>
#include <stdint.h>
#include "LinuxSyscalls/SignalDelegator.h"
namespace FEX {
class GdbServer {
public:
GdbServer(FEXCore::Context::Context* ctx, FEX::HLE::SignalDelegator* SignalDelegation, FEX::HLE::SyscallHandler* const SyscallHandler);
~GdbServer();
// Public for threading
void GdbServerLoop();
void AlertLibrariesChanged() {
LibraryMapChanged = true;
}
private:
void Break(int signal);
void OpenListenSocket();
void CloseListenSocket();
enum class WaitForConnectionResult {
CONNECTION,
ERROR,
};
WaitForConnectionResult WaitForConnection();
fextl::unique_ptr<std::iostream> OpenSocket();
void StartThread();
fextl::string ReadPacket(std::iostream& stream);
void SendPacket(std::ostream& stream, const fextl::string& packet);
void SendACK(std::ostream& stream, bool NACK);
Event ThreadBreakEvent {};
void WaitForThreadWakeup();
struct HandledPacketType {
fextl::string Response {};
enum ResponseType {
TYPE_NONE,
TYPE_UNKNOWN,
TYPE_ACK,
TYPE_NACK,
TYPE_ONLYACK,
TYPE_ONLYNACK,
};
ResponseType TypeResponse {};
};
void SendPacketPair(const HandledPacketType& packetPair);
HandledPacketType ProcessPacket(const fextl::string& packet);
HandledPacketType handleXfer(const fextl::string& packet);
HandledPacketType handleProgramOffsets();
HandledPacketType ThreadAction(char action, uint32_t tid);
// Command handlers
HandledPacketType CommandEnableExtendedMode(const fextl::string& packet);
HandledPacketType CommandQueryHalted(const fextl::string& packet);
HandledPacketType CommandContinue(const fextl::string& packet);
HandledPacketType CommandDetach(const fextl::string& packet);
HandledPacketType CommandReadRegisters(const fextl::string& packet);
HandledPacketType CommandThreadOp(const fextl::string& packet);
HandledPacketType CommandKill(const fextl::string& packet);
HandledPacketType CommandMemory(const fextl::string& packet);
HandledPacketType CommandReadReg(const fextl::string& packet);
HandledPacketType CommandQuery(const fextl::string& packet);
HandledPacketType CommandSingleStep(const fextl::string& packet);
HandledPacketType CommandQueryThreadAlive(const fextl::string& packet);
HandledPacketType CommandMultiLetterV(const fextl::string& packet);
HandledPacketType CommandBreakpoint(const fextl::string& packet);
HandledPacketType CommandUnknown(const fextl::string& packet);
fextl::string readRegs();
FEXCore::Context::Context* CTX;
FEX::HLE::SyscallHandler* const SyscallHandler;
fextl::unique_ptr<FEXCore::Threads::Thread> gdbServerThread;
fextl::unique_ptr<std::iostream> CommsStream;
std::mutex sendMutex;
bool SettingNoAckMode {false};
bool NoAckMode {false};
bool NonStopMode {false};
fextl::string ThreadString {};
fextl::string OSDataString {};
void buildLibraryMap();
std::atomic<bool> LibraryMapChanged = true;
std::atomic<bool> CoreShuttingDown {};
fextl::string LibraryMapString {};
// Used to keep track of which signals to pass to the guest
std::array<bool, FEX::HLE::SignalDelegator::MAX_SIGNALS + 1> PassSignals {};
uint32_t CurrentDebuggingThread {};
int ListenSocket {};
fextl::string GdbUnixSocketPath {};
FEX_CONFIG_OPT(Filename, APP_FILENAME);
FEX_CONFIG_OPT(Is64BitMode, IS64BIT_MODE);
};
} // namespace FEX