1 //===-- PlatformRemoteGDBServer.h ----------------------------------------*- C++
2 //-*-===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLDB_SOURCE_PLUGINS_PLATFORM_GDB_SERVER_PLATFORMREMOTEGDBSERVER_H
11 #define LLDB_SOURCE_PLUGINS_PLATFORM_GDB_SERVER_PLATFORMREMOTEGDBSERVER_H
12 
13 #include <string>
14 
15 #include "Plugins/Process/Utility/GDBRemoteSignals.h"
16 #include "Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h"
17 #include "Plugins/Process/gdb-remote/GDBRemoteCommunicationReplayServer.h"
18 #include "lldb/Target/Platform.h"
19 
20 namespace lldb_private {
21 namespace platform_gdb_server {
22 
23 class PlatformRemoteGDBServer : public Platform, private UserIDResolver {
24 public:
25   static void Initialize();
26 
27   static void Terminate();
28 
29   static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch);
30 
31   static ConstString GetPluginNameStatic();
32 
33   static const char *GetDescriptionStatic();
34 
35   PlatformRemoteGDBServer();
36 
37   ~PlatformRemoteGDBServer() override;
38 
39   // lldb_private::PluginInterface functions
40   ConstString GetPluginName() override { return GetPluginNameStatic(); }
41 
42   uint32_t GetPluginVersion() override { return 1; }
43 
44   // lldb_private::Platform functions
45   Status
46   ResolveExecutable(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp,
47                     const FileSpecList *module_search_paths_ptr) override;
48 
49   bool GetModuleSpec(const FileSpec &module_file_spec, const ArchSpec &arch,
50                      ModuleSpec &module_spec) override;
51 
52   const char *GetDescription() override;
53 
54   Status GetFileWithUUID(const FileSpec &platform_file, const UUID *uuid_ptr,
55                          FileSpec &local_file) override;
56 
57   bool GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &proc_info) override;
58 
59   uint32_t FindProcesses(const ProcessInstanceInfoMatch &match_info,
60                          ProcessInstanceInfoList &process_infos) override;
61 
62   Status LaunchProcess(ProcessLaunchInfo &launch_info) override;
63 
64   Status KillProcess(const lldb::pid_t pid) override;
65 
66   lldb::ProcessSP DebugProcess(ProcessLaunchInfo &launch_info,
67                                Debugger &debugger,
68                                Target *target, // Can be NULL, if NULL create a
69                                                // new target, else use existing
70                                                // one
71                                Status &error) override;
72 
73   lldb::ProcessSP Attach(ProcessAttachInfo &attach_info, Debugger &debugger,
74                          Target *target, // Can be NULL, if NULL create a new
75                                          // target, else use existing one
76                          Status &error) override;
77 
78   bool GetSupportedArchitectureAtIndex(uint32_t idx, ArchSpec &arch) override;
79 
80   size_t GetSoftwareBreakpointTrapOpcode(Target &target,
81                                          BreakpointSite *bp_site) override;
82 
83   bool GetRemoteOSVersion() override;
84 
85   bool GetRemoteOSBuildString(std::string &s) override;
86 
87   bool GetRemoteOSKernelDescription(std::string &s) override;
88 
89   // Remote Platform subclasses need to override this function
90   ArchSpec GetRemoteSystemArchitecture() override;
91 
92   FileSpec GetRemoteWorkingDirectory() override;
93 
94   bool SetRemoteWorkingDirectory(const FileSpec &working_dir) override;
95 
96   // Remote subclasses should override this and return a valid instance
97   // name if connected.
98   const char *GetHostname() override;
99 
100   UserIDResolver &GetUserIDResolver() override { return *this; }
101 
102   bool IsConnected() const override;
103 
104   Status ConnectRemote(Args &args) override;
105 
106   Status DisconnectRemote() override;
107 
108   Status MakeDirectory(const FileSpec &file_spec,
109                        uint32_t file_permissions) override;
110 
111   Status GetFilePermissions(const FileSpec &file_spec,
112                             uint32_t &file_permissions) override;
113 
114   Status SetFilePermissions(const FileSpec &file_spec,
115                             uint32_t file_permissions) override;
116 
117   lldb::user_id_t OpenFile(const FileSpec &file_spec, File::OpenOptions flags,
118                            uint32_t mode, Status &error) override;
119 
120   bool CloseFile(lldb::user_id_t fd, Status &error) override;
121 
122   uint64_t ReadFile(lldb::user_id_t fd, uint64_t offset, void *data_ptr,
123                     uint64_t len, Status &error) override;
124 
125   uint64_t WriteFile(lldb::user_id_t fd, uint64_t offset, const void *data,
126                      uint64_t len, Status &error) override;
127 
128   lldb::user_id_t GetFileSize(const FileSpec &file_spec) override;
129 
130   Status PutFile(const FileSpec &source, const FileSpec &destination,
131                  uint32_t uid = UINT32_MAX, uint32_t gid = UINT32_MAX) override;
132 
133   Status CreateSymlink(const FileSpec &src, const FileSpec &dst) override;
134 
135   bool GetFileExists(const FileSpec &file_spec) override;
136 
137   Status Unlink(const FileSpec &path) override;
138 
139   Status RunShellCommand(
140       const char *command,         // Shouldn't be NULL
141       const FileSpec &working_dir, // Pass empty FileSpec to use the current
142                                    // working directory
143       int *status_ptr, // Pass NULL if you don't want the process exit status
144       int *signo_ptr,  // Pass NULL if you don't want the signal that caused the
145                        // process to exit
146       std::string
147           *command_output, // Pass NULL if you don't want the command output
148       const lldb_private::Timeout<std::micro> &timeout) override;
149 
150   void CalculateTrapHandlerSymbolNames() override;
151 
152   const lldb::UnixSignalsSP &GetRemoteUnixSignals() override;
153 
154   lldb::ProcessSP ConnectProcess(llvm::StringRef connect_url,
155                                  llvm::StringRef plugin_name,
156                                  lldb_private::Debugger &debugger,
157                                  lldb_private::Target *target,
158                                  lldb_private::Status &error) override;
159 
160   size_t ConnectToWaitingProcesses(lldb_private::Debugger &debugger,
161                                    lldb_private::Status &error) override;
162 
163   virtual size_t
164   GetPendingGdbServerList(std::vector<std::string> &connection_urls);
165 
166 protected:
167   process_gdb_remote::GDBRemoteCommunicationClient m_gdb_client;
168   process_gdb_remote::GDBRemoteCommunicationReplayServer m_gdb_replay_server;
169   std::string m_platform_description; // After we connect we can get a more
170                                       // complete description of what we are
171                                       // connected to
172   std::string m_platform_scheme;
173   std::string m_platform_hostname;
174 
175   lldb::UnixSignalsSP m_remote_signals_sp;
176 
177   // Launch the debug server on the remote host - caller connects to launched
178   // debug server using connect_url.
179   // Subclasses should override this method if they want to do extra actions
180   // before or
181   // after launching the debug server.
182   virtual bool LaunchGDBServer(lldb::pid_t &pid, std::string &connect_url);
183 
184   virtual bool KillSpawnedProcess(lldb::pid_t pid);
185 
186   virtual std::string MakeUrl(const char *scheme, const char *hostname,
187                               uint16_t port, const char *path);
188 
189 private:
190   std::string MakeGdbServerUrl(const std::string &platform_scheme,
191                                const std::string &platform_hostname,
192                                uint16_t port, const char *socket_name);
193 
194   llvm::Optional<std::string> DoGetUserName(UserIDResolver::id_t uid) override;
195   llvm::Optional<std::string> DoGetGroupName(UserIDResolver::id_t uid) override;
196 
197   PlatformRemoteGDBServer(const PlatformRemoteGDBServer &) = delete;
198   const PlatformRemoteGDBServer &
199   operator=(const PlatformRemoteGDBServer &) = delete;
200 };
201 
202 } // namespace platform_gdb_server
203 } // namespace lldb_private
204 
205 #endif // LLDB_SOURCE_PLUGINS_PLATFORM_GDB_SERVER_PLATFORMREMOTEGDBSERVER_H
206