xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Process/OpenBSD/NativeProcessOpenBSD.h (revision a0747c9f67a4ae71ccb71e62a28d1ea19e06a63c)
1061da546Spatrick //===-- NativeProcessOpenBSD.h --------------------------------- -*- C++ -*-===//
2061da546Spatrick //
3061da546Spatrick //                     The LLVM Compiler Infrastructure
4061da546Spatrick //
5061da546Spatrick // This file is distributed under the University of Illinois Open Source
6061da546Spatrick // License. See LICENSE.TXT for details.
7061da546Spatrick //
8061da546Spatrick //===----------------------------------------------------------------------===//
9061da546Spatrick 
10061da546Spatrick #ifndef liblldb_NativeProcessOpenBSD_H_
11061da546Spatrick #define liblldb_NativeProcessOpenBSD_H_
12061da546Spatrick 
13061da546Spatrick #include "lldb/Target/MemoryRegionInfo.h"
14061da546Spatrick #include "lldb/Utility/ArchSpec.h"
15061da546Spatrick #include "lldb/Utility/FileSpec.h"
16061da546Spatrick 
17061da546Spatrick #include "NativeThreadOpenBSD.h"
18061da546Spatrick #include "lldb/Host/common/NativeProcessProtocol.h"
19061da546Spatrick 
20061da546Spatrick namespace lldb_private {
21061da546Spatrick namespace process_openbsd {
22061da546Spatrick /// @class NativeProcessOpenBSD
23061da546Spatrick /// Manages communication with the inferior (debugee) process.
24061da546Spatrick ///
25061da546Spatrick /// Upon construction, this class prepares and launches an inferior process
26061da546Spatrick /// for debugging.
27061da546Spatrick ///
28061da546Spatrick /// Changes in the inferior process state are broadcasted.
29061da546Spatrick class NativeProcessOpenBSD : public NativeProcessProtocol {
30061da546Spatrick public:
31061da546Spatrick   class Factory : public NativeProcessProtocol::Factory {
32061da546Spatrick   public:
33061da546Spatrick     llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
34061da546Spatrick     Launch(ProcessLaunchInfo &launch_info, NativeDelegate &native_delegate,
35061da546Spatrick            MainLoop &mainloop) const override;
36061da546Spatrick 
37061da546Spatrick     llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
38061da546Spatrick     Attach(lldb::pid_t pid, NativeDelegate &native_delegate,
39061da546Spatrick            MainLoop &mainloop) const override;
40*a0747c9fSpatrick 
41*a0747c9fSpatrick     Extension GetSupportedExtensions() const override;
42061da546Spatrick   };
43061da546Spatrick 
44061da546Spatrick   // ---------------------------------------------------------------------
45061da546Spatrick   // NativeProcessProtocol Interface
46061da546Spatrick   // ---------------------------------------------------------------------
47061da546Spatrick   Status Resume(const ResumeActionList &resume_actions) override;
48061da546Spatrick 
49061da546Spatrick   Status Halt() override;
50061da546Spatrick 
51061da546Spatrick   Status Detach() override;
52061da546Spatrick 
53061da546Spatrick   Status Signal(int signo) override;
54061da546Spatrick 
55061da546Spatrick   Status Kill() override;
56061da546Spatrick 
57061da546Spatrick   Status GetMemoryRegionInfo(lldb::addr_t load_addr,
58061da546Spatrick                              MemoryRegionInfo &range_info) override;
59061da546Spatrick 
60061da546Spatrick   Status ReadMemory(lldb::addr_t addr, void *buf, size_t size,
61061da546Spatrick                     size_t &bytes_read) override;
62061da546Spatrick 
63061da546Spatrick   Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size,
64061da546Spatrick                      size_t &bytes_written) override;
65061da546Spatrick 
66*a0747c9fSpatrick   llvm::Expected<lldb::addr_t> AllocateMemory(size_t size, uint32_t permissions) override;
67061da546Spatrick 
68*a0747c9fSpatrick   llvm::Error DeallocateMemory(lldb::addr_t addr) override;
69061da546Spatrick 
70061da546Spatrick   lldb::addr_t GetSharedLibraryInfoAddress() override;
71061da546Spatrick 
72061da546Spatrick   size_t UpdateThreads() override;
73061da546Spatrick 
GetArchitecture()74061da546Spatrick   const ArchSpec &GetArchitecture() const override { return m_arch; }
75061da546Spatrick 
76061da546Spatrick   Status SetBreakpoint(lldb::addr_t addr, uint32_t size,
77061da546Spatrick                        bool hardware) override;
78061da546Spatrick 
79061da546Spatrick   Status GetLoadedModuleFileSpec(const char *module_path,
80061da546Spatrick                                  FileSpec &file_spec) override;
81061da546Spatrick 
82061da546Spatrick   Status GetFileLoadAddress(const llvm::StringRef &file_name,
83061da546Spatrick                             lldb::addr_t &load_addr) override;
84061da546Spatrick 
85061da546Spatrick   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
86061da546Spatrick   GetAuxvData() const override;
87061da546Spatrick 
88061da546Spatrick   // ---------------------------------------------------------------------
89061da546Spatrick   // Interface used by NativeRegisterContext-derived classes.
90061da546Spatrick   // ---------------------------------------------------------------------
91061da546Spatrick   static Status PtraceWrapper(int req, lldb::pid_t pid, void *addr = nullptr,
92061da546Spatrick                               int data = 0, int *result = nullptr);
93061da546Spatrick 
94061da546Spatrick private:
95061da546Spatrick   MainLoop::SignalHandleUP m_sigchld_handle;
96061da546Spatrick   ArchSpec m_arch;
97061da546Spatrick   std::vector<std::pair<MemoryRegionInfo, FileSpec>> m_mem_region_cache;
98061da546Spatrick 
99061da546Spatrick   // ---------------------------------------------------------------------
100061da546Spatrick   // Private Instance Methods
101061da546Spatrick   // ---------------------------------------------------------------------
102061da546Spatrick   NativeProcessOpenBSD(::pid_t pid, int terminal_fd, NativeDelegate &delegate,
103061da546Spatrick                       const ArchSpec &arch, MainLoop &mainloop);
104061da546Spatrick 
105061da546Spatrick   bool HasThreadNoLock(lldb::tid_t thread_id);
106061da546Spatrick 
107061da546Spatrick   NativeThreadOpenBSD &AddThread(lldb::tid_t thread_id);
108061da546Spatrick 
109061da546Spatrick   void MonitorCallback(lldb::pid_t pid, int signal);
110061da546Spatrick   void MonitorExited(lldb::pid_t pid, WaitStatus status);
111061da546Spatrick   void MonitorSIGTRAP(lldb::pid_t pid);
112061da546Spatrick   void MonitorSignal(lldb::pid_t pid, int signal);
113061da546Spatrick 
114061da546Spatrick   Status PopulateMemoryRegionCache();
115061da546Spatrick   void SigchldHandler();
116061da546Spatrick 
117061da546Spatrick   Status Attach();
118061da546Spatrick   Status ReinitializeThreads();
119061da546Spatrick };
120061da546Spatrick 
121061da546Spatrick } // namespace process_openbsd
122061da546Spatrick } // namespace lldb_private
123061da546Spatrick 
124061da546Spatrick #endif // #ifndef liblldb_NativeProcessOpenBSD_H_
125