xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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