xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/Process/NetBSD/NativeProcessNetBSD.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric //===-- NativeProcessNetBSD.h --------------------------------- -*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #ifndef liblldb_NativeProcessNetBSD_H_
100b57cec5SDimitry Andric #define liblldb_NativeProcessNetBSD_H_
110b57cec5SDimitry Andric 
129dba64beSDimitry Andric #include "Plugins/Process/POSIX/NativeProcessELF.h"
130b57cec5SDimitry Andric #include "lldb/Target/MemoryRegionInfo.h"
140b57cec5SDimitry Andric #include "lldb/Utility/ArchSpec.h"
150b57cec5SDimitry Andric #include "lldb/Utility/FileSpec.h"
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric #include "NativeThreadNetBSD.h"
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric namespace lldb_private {
200b57cec5SDimitry Andric namespace process_netbsd {
210b57cec5SDimitry Andric /// \class NativeProcessNetBSD
220b57cec5SDimitry Andric /// Manages communication with the inferior (debugee) process.
230b57cec5SDimitry Andric ///
240b57cec5SDimitry Andric /// Upon construction, this class prepares and launches an inferior process
250b57cec5SDimitry Andric /// for debugging.
260b57cec5SDimitry Andric ///
270b57cec5SDimitry Andric /// Changes in the inferior process state are broadcasted.
289dba64beSDimitry Andric class NativeProcessNetBSD : public NativeProcessELF {
290b57cec5SDimitry Andric public:
3006c3fb27SDimitry Andric   class Manager : public NativeProcessProtocol::Manager {
310b57cec5SDimitry Andric   public:
3206c3fb27SDimitry Andric     using NativeProcessProtocol::Manager::Manager;
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric     llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
3506c3fb27SDimitry Andric     Launch(ProcessLaunchInfo &launch_info,
3606c3fb27SDimitry Andric            NativeDelegate &native_delegate) override;
3706c3fb27SDimitry Andric 
3806c3fb27SDimitry Andric     llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
3906c3fb27SDimitry Andric     Attach(lldb::pid_t pid, NativeDelegate &native_delegate) override;
40fe6060f1SDimitry Andric 
41fe6060f1SDimitry Andric     Extension GetSupportedExtensions() const override;
420b57cec5SDimitry Andric   };
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric   // NativeProcessProtocol Interface
450b57cec5SDimitry Andric   Status Resume(const ResumeActionList &resume_actions) override;
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric   Status Halt() override;
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric   Status Detach() override;
500b57cec5SDimitry Andric 
510b57cec5SDimitry Andric   Status Signal(int signo) override;
520b57cec5SDimitry Andric 
53480093f4SDimitry Andric   Status Interrupt() override;
54480093f4SDimitry Andric 
550b57cec5SDimitry Andric   Status Kill() override;
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric   Status GetMemoryRegionInfo(lldb::addr_t load_addr,
580b57cec5SDimitry Andric                              MemoryRegionInfo &range_info) override;
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric   Status ReadMemory(lldb::addr_t addr, void *buf, size_t size,
610b57cec5SDimitry Andric                     size_t &bytes_read) override;
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size,
640b57cec5SDimitry Andric                      size_t &bytes_written) override;
650b57cec5SDimitry Andric 
660b57cec5SDimitry Andric   lldb::addr_t GetSharedLibraryInfoAddress() override;
670b57cec5SDimitry Andric 
680b57cec5SDimitry Andric   size_t UpdateThreads() override;
690b57cec5SDimitry Andric 
GetArchitecture()700b57cec5SDimitry Andric   const ArchSpec &GetArchitecture() const override { return m_arch; }
710b57cec5SDimitry Andric 
720b57cec5SDimitry Andric   Status SetBreakpoint(lldb::addr_t addr, uint32_t size,
730b57cec5SDimitry Andric                        bool hardware) override;
740b57cec5SDimitry Andric 
75e8d8bef9SDimitry Andric   // The two following methods are probably not necessary and probably
76e8d8bef9SDimitry Andric   // will never be called.  Nevertheless, we implement them right now
77e8d8bef9SDimitry Andric   // to reduce the differences between different platforms and reduce
78e8d8bef9SDimitry Andric   // the risk of the lack of implementation actually breaking something,
79e8d8bef9SDimitry Andric   // at least for the time being.
800b57cec5SDimitry Andric   Status GetLoadedModuleFileSpec(const char *module_path,
810b57cec5SDimitry Andric                                  FileSpec &file_spec) override;
820b57cec5SDimitry Andric   Status GetFileLoadAddress(const llvm::StringRef &file_name,
830b57cec5SDimitry Andric                             lldb::addr_t &load_addr) override;
840b57cec5SDimitry Andric 
850b57cec5SDimitry Andric   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
860b57cec5SDimitry Andric   GetAuxvData() const override;
870b57cec5SDimitry Andric 
880b57cec5SDimitry Andric   // Interface used by NativeRegisterContext-derived classes.
890b57cec5SDimitry Andric   static Status PtraceWrapper(int req, lldb::pid_t pid, void *addr = nullptr,
900b57cec5SDimitry Andric                               int data = 0, int *result = nullptr);
91*5f757f3fSDimitry Andric   static Status StopProcess(lldb::pid_t pid);
920b57cec5SDimitry Andric 
93349cc55cSDimitry Andric   llvm::Expected<std::string> SaveCore(llvm::StringRef path_hint) override;
94349cc55cSDimitry Andric 
950b57cec5SDimitry Andric private:
960b57cec5SDimitry Andric   MainLoop::SignalHandleUP m_sigchld_handle;
970b57cec5SDimitry Andric   ArchSpec m_arch;
98fe6060f1SDimitry Andric   MainLoop& m_main_loop;
990b57cec5SDimitry Andric   LazyBool m_supports_mem_region = eLazyBoolCalculate;
1000b57cec5SDimitry Andric   std::vector<std::pair<MemoryRegionInfo, FileSpec>> m_mem_region_cache;
1010b57cec5SDimitry Andric 
1020b57cec5SDimitry Andric   // Private Instance Methods
1030b57cec5SDimitry Andric   NativeProcessNetBSD(::pid_t pid, int terminal_fd, NativeDelegate &delegate,
1040b57cec5SDimitry Andric                       const ArchSpec &arch, MainLoop &mainloop);
1050b57cec5SDimitry Andric 
1060b57cec5SDimitry Andric   bool HasThreadNoLock(lldb::tid_t thread_id);
1070b57cec5SDimitry Andric 
1080b57cec5SDimitry Andric   NativeThreadNetBSD &AddThread(lldb::tid_t thread_id);
109480093f4SDimitry Andric   void RemoveThread(lldb::tid_t thread_id);
1100b57cec5SDimitry Andric 
1110b57cec5SDimitry Andric   void MonitorCallback(lldb::pid_t pid, int signal);
1120b57cec5SDimitry Andric   void MonitorExited(lldb::pid_t pid, WaitStatus status);
1130b57cec5SDimitry Andric   void MonitorSIGSTOP(lldb::pid_t pid);
1140b57cec5SDimitry Andric   void MonitorSIGTRAP(lldb::pid_t pid);
1150b57cec5SDimitry Andric   void MonitorSignal(lldb::pid_t pid, int signal);
116fe6060f1SDimitry Andric   void MonitorClone(::pid_t child_pid, bool is_vfork,
117fe6060f1SDimitry Andric                     NativeThreadNetBSD &parent_thread);
1180b57cec5SDimitry Andric 
1190b57cec5SDimitry Andric   Status PopulateMemoryRegionCache();
1200b57cec5SDimitry Andric   void SigchldHandler();
1210b57cec5SDimitry Andric 
1220b57cec5SDimitry Andric   Status Attach();
123e8d8bef9SDimitry Andric   Status SetupTrace();
1240b57cec5SDimitry Andric   Status ReinitializeThreads();
1250b57cec5SDimitry Andric };
1260b57cec5SDimitry Andric 
1270b57cec5SDimitry Andric } // namespace process_netbsd
1280b57cec5SDimitry Andric } // namespace lldb_private
1290b57cec5SDimitry Andric 
1300b57cec5SDimitry Andric #endif // #ifndef liblldb_NativeProcessNetBSD_H_
131