10b57cec5SDimitry Andric //===-- PlatformRemoteGDBServer.h ----------------------------------------*- C++ 20b57cec5SDimitry Andric //-*-===// 30b57cec5SDimitry Andric // 40b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 60b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70b57cec5SDimitry Andric // 80b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 105ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_PLATFORM_GDB_SERVER_PLATFORMREMOTEGDBSERVER_H 115ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_PLATFORM_GDB_SERVER_PLATFORMREMOTEGDBSERVER_H 120b57cec5SDimitry Andric 13bdd1243dSDimitry Andric #include <optional> 140b57cec5SDimitry Andric #include <string> 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #include "Plugins/Process/Utility/GDBRemoteSignals.h" 175ffd83dbSDimitry Andric #include "Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h" 180b57cec5SDimitry Andric #include "lldb/Target/Platform.h" 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric namespace lldb_private { 210b57cec5SDimitry Andric namespace platform_gdb_server { 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric class PlatformRemoteGDBServer : public Platform, private UserIDResolver { 240b57cec5SDimitry Andric public: 250b57cec5SDimitry Andric static void Initialize(); 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric static void Terminate(); 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); 300b57cec5SDimitry Andric 31349cc55cSDimitry Andric static llvm::StringRef GetPluginNameStatic() { return "remote-gdb-server"; } 320b57cec5SDimitry Andric 33349cc55cSDimitry Andric static llvm::StringRef GetDescriptionStatic(); 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric PlatformRemoteGDBServer(); 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric ~PlatformRemoteGDBServer() override; 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric // lldb_private::PluginInterface functions 40349cc55cSDimitry Andric llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric // lldb_private::Platform functions 430b57cec5SDimitry Andric bool GetModuleSpec(const FileSpec &module_file_spec, const ArchSpec &arch, 440b57cec5SDimitry Andric ModuleSpec &module_spec) override; 450b57cec5SDimitry Andric 46349cc55cSDimitry Andric llvm::StringRef GetDescription() override; 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric Status GetFileWithUUID(const FileSpec &platform_file, const UUID *uuid_ptr, 490b57cec5SDimitry Andric FileSpec &local_file) override; 500b57cec5SDimitry Andric 510b57cec5SDimitry Andric bool GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &proc_info) override; 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric uint32_t FindProcesses(const ProcessInstanceInfoMatch &match_info, 540b57cec5SDimitry Andric ProcessInstanceInfoList &process_infos) override; 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric Status LaunchProcess(ProcessLaunchInfo &launch_info) override; 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric Status KillProcess(const lldb::pid_t pid) override; 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric lldb::ProcessSP DebugProcess(ProcessLaunchInfo &launch_info, 61349cc55cSDimitry Andric Debugger &debugger, Target &target, 620b57cec5SDimitry Andric Status &error) override; 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric lldb::ProcessSP Attach(ProcessAttachInfo &attach_info, Debugger &debugger, 650b57cec5SDimitry Andric Target *target, // Can be NULL, if NULL create a new 660b57cec5SDimitry Andric // target, else use existing one 670b57cec5SDimitry Andric Status &error) override; 680b57cec5SDimitry Andric 6981ad6265SDimitry Andric std::vector<ArchSpec> 7081ad6265SDimitry Andric GetSupportedArchitectures(const ArchSpec &process_host_arch) override { 71349cc55cSDimitry Andric return m_supported_architectures; 72349cc55cSDimitry Andric } 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric size_t GetSoftwareBreakpointTrapOpcode(Target &target, 750b57cec5SDimitry Andric BreakpointSite *bp_site) override; 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric bool GetRemoteOSVersion() override; 780b57cec5SDimitry Andric 79bdd1243dSDimitry Andric std::optional<std::string> GetRemoteOSBuildString() override; 800b57cec5SDimitry Andric 81bdd1243dSDimitry Andric std::optional<std::string> GetRemoteOSKernelDescription() override; 820b57cec5SDimitry Andric 830b57cec5SDimitry Andric // Remote Platform subclasses need to override this function 840b57cec5SDimitry Andric ArchSpec GetRemoteSystemArchitecture() override; 850b57cec5SDimitry Andric 860b57cec5SDimitry Andric FileSpec GetRemoteWorkingDirectory() override; 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric bool SetRemoteWorkingDirectory(const FileSpec &working_dir) override; 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric // Remote subclasses should override this and return a valid instance 910b57cec5SDimitry Andric // name if connected. 920b57cec5SDimitry Andric const char *GetHostname() override; 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric UserIDResolver &GetUserIDResolver() override { return *this; } 950b57cec5SDimitry Andric 960b57cec5SDimitry Andric bool IsConnected() const override; 970b57cec5SDimitry Andric 980b57cec5SDimitry Andric Status ConnectRemote(Args &args) override; 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andric Status DisconnectRemote() override; 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andric Status MakeDirectory(const FileSpec &file_spec, 1030b57cec5SDimitry Andric uint32_t file_permissions) override; 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric Status GetFilePermissions(const FileSpec &file_spec, 1060b57cec5SDimitry Andric uint32_t &file_permissions) override; 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric Status SetFilePermissions(const FileSpec &file_spec, 1090b57cec5SDimitry Andric uint32_t file_permissions) override; 1100b57cec5SDimitry Andric 1119dba64beSDimitry Andric lldb::user_id_t OpenFile(const FileSpec &file_spec, File::OpenOptions flags, 1120b57cec5SDimitry Andric uint32_t mode, Status &error) override; 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric bool CloseFile(lldb::user_id_t fd, Status &error) override; 1150b57cec5SDimitry Andric 1160b57cec5SDimitry Andric uint64_t ReadFile(lldb::user_id_t fd, uint64_t offset, void *data_ptr, 1170b57cec5SDimitry Andric uint64_t len, Status &error) override; 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andric uint64_t WriteFile(lldb::user_id_t fd, uint64_t offset, const void *data, 1200b57cec5SDimitry Andric uint64_t len, Status &error) override; 1210b57cec5SDimitry Andric 1220b57cec5SDimitry Andric lldb::user_id_t GetFileSize(const FileSpec &file_spec) override; 1230b57cec5SDimitry Andric 124e8d8bef9SDimitry Andric void AutoCompleteDiskFileOrDirectory(CompletionRequest &request, 125e8d8bef9SDimitry Andric bool only_dir) override; 126e8d8bef9SDimitry Andric 1270b57cec5SDimitry Andric Status PutFile(const FileSpec &source, const FileSpec &destination, 1280b57cec5SDimitry Andric uint32_t uid = UINT32_MAX, uint32_t gid = UINT32_MAX) override; 1290b57cec5SDimitry Andric 1300b57cec5SDimitry Andric Status CreateSymlink(const FileSpec &src, const FileSpec &dst) override; 1310b57cec5SDimitry Andric 1320b57cec5SDimitry Andric bool GetFileExists(const FileSpec &file_spec) override; 1330b57cec5SDimitry Andric 1340b57cec5SDimitry Andric Status Unlink(const FileSpec &path) override; 1350b57cec5SDimitry Andric 1360b57cec5SDimitry Andric Status RunShellCommand( 137e8d8bef9SDimitry Andric llvm::StringRef shell, llvm::StringRef command, 1380b57cec5SDimitry Andric const FileSpec &working_dir, // Pass empty FileSpec to use the current 1390b57cec5SDimitry Andric // working directory 1400b57cec5SDimitry Andric int *status_ptr, // Pass NULL if you don't want the process exit status 1410b57cec5SDimitry Andric int *signo_ptr, // Pass NULL if you don't want the signal that caused the 1420b57cec5SDimitry Andric // process to exit 1430b57cec5SDimitry Andric std::string 1440b57cec5SDimitry Andric *command_output, // Pass NULL if you don't want the command output 1450b57cec5SDimitry Andric const lldb_private::Timeout<std::micro> &timeout) override; 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andric void CalculateTrapHandlerSymbolNames() override; 1480b57cec5SDimitry Andric 149*0fca6ea1SDimitry Andric llvm::ErrorOr<llvm::MD5::MD5Result> 150*0fca6ea1SDimitry Andric CalculateMD5(const FileSpec &file_spec) override; 151*0fca6ea1SDimitry Andric 1520b57cec5SDimitry Andric const lldb::UnixSignalsSP &GetRemoteUnixSignals() override; 1530b57cec5SDimitry Andric 1540b57cec5SDimitry Andric size_t ConnectToWaitingProcesses(lldb_private::Debugger &debugger, 1550b57cec5SDimitry Andric lldb_private::Status &error) override; 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andric virtual size_t 1580b57cec5SDimitry Andric GetPendingGdbServerList(std::vector<std::string> &connection_urls); 1590b57cec5SDimitry Andric 1600b57cec5SDimitry Andric protected: 16104eeddc0SDimitry Andric std::unique_ptr<process_gdb_remote::GDBRemoteCommunicationClient> 16204eeddc0SDimitry Andric m_gdb_client_up; 1630b57cec5SDimitry Andric std::string m_platform_description; // After we connect we can get a more 1640b57cec5SDimitry Andric // complete description of what we are 1650b57cec5SDimitry Andric // connected to 1660b57cec5SDimitry Andric std::string m_platform_scheme; 1670b57cec5SDimitry Andric std::string m_platform_hostname; 1680b57cec5SDimitry Andric 1690b57cec5SDimitry Andric lldb::UnixSignalsSP m_remote_signals_sp; 1700b57cec5SDimitry Andric 1710b57cec5SDimitry Andric // Launch the debug server on the remote host - caller connects to launched 1720b57cec5SDimitry Andric // debug server using connect_url. 1730b57cec5SDimitry Andric // Subclasses should override this method if they want to do extra actions 1740b57cec5SDimitry Andric // before or 1750b57cec5SDimitry Andric // after launching the debug server. 1760b57cec5SDimitry Andric virtual bool LaunchGDBServer(lldb::pid_t &pid, std::string &connect_url); 1770b57cec5SDimitry Andric 1780b57cec5SDimitry Andric virtual bool KillSpawnedProcess(lldb::pid_t pid); 1790b57cec5SDimitry Andric 1800b57cec5SDimitry Andric virtual std::string MakeUrl(const char *scheme, const char *hostname, 1810b57cec5SDimitry Andric uint16_t port, const char *path); 1820b57cec5SDimitry Andric 1830b57cec5SDimitry Andric private: 1840b57cec5SDimitry Andric std::string MakeGdbServerUrl(const std::string &platform_scheme, 1850b57cec5SDimitry Andric const std::string &platform_hostname, 1860b57cec5SDimitry Andric uint16_t port, const char *socket_name); 1870b57cec5SDimitry Andric 188bdd1243dSDimitry Andric std::optional<std::string> DoGetUserName(UserIDResolver::id_t uid) override; 189bdd1243dSDimitry Andric std::optional<std::string> DoGetGroupName(UserIDResolver::id_t uid) override; 1900b57cec5SDimitry Andric 191349cc55cSDimitry Andric std::vector<ArchSpec> m_supported_architectures; 192349cc55cSDimitry Andric 1935ffd83dbSDimitry Andric PlatformRemoteGDBServer(const PlatformRemoteGDBServer &) = delete; 1945ffd83dbSDimitry Andric const PlatformRemoteGDBServer & 1955ffd83dbSDimitry Andric operator=(const PlatformRemoteGDBServer &) = delete; 1960b57cec5SDimitry Andric }; 1970b57cec5SDimitry Andric 1980b57cec5SDimitry Andric } // namespace platform_gdb_server 1990b57cec5SDimitry Andric } // namespace lldb_private 2000b57cec5SDimitry Andric 2015ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_PLATFORM_GDB_SERVER_PLATFORMREMOTEGDBSERVER_H 202