xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1d409305fSDimitry Andric //===-- NativeProcessFreeBSD.h -------------------------------- -*- C++ -*-===//
2d409305fSDimitry Andric //
3d409305fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d409305fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5d409305fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d409305fSDimitry Andric //
7d409305fSDimitry Andric //===----------------------------------------------------------------------===//
8d409305fSDimitry Andric 
9d409305fSDimitry Andric #ifndef liblldb_NativeProcessFreeBSD_H_
10d409305fSDimitry Andric #define liblldb_NativeProcessFreeBSD_H_
11d409305fSDimitry Andric 
12d409305fSDimitry Andric #include "Plugins/Process/POSIX/NativeProcessELF.h"
13d409305fSDimitry Andric #include "Plugins/Process/Utility/NativeProcessSoftwareSingleStep.h"
14d409305fSDimitry Andric 
15d409305fSDimitry Andric #include "lldb/Target/MemoryRegionInfo.h"
16d409305fSDimitry Andric #include "lldb/Utility/ArchSpec.h"
17d409305fSDimitry Andric #include "lldb/Utility/FileSpec.h"
18d409305fSDimitry Andric 
19d409305fSDimitry Andric #include "NativeThreadFreeBSD.h"
20d409305fSDimitry Andric 
21d409305fSDimitry Andric namespace lldb_private {
22d409305fSDimitry Andric namespace process_freebsd {
23d409305fSDimitry Andric /// \class NativeProcessFreeBSD
24d409305fSDimitry Andric /// Manages communication with the inferior (debugee) process.
25d409305fSDimitry Andric ///
26d409305fSDimitry Andric /// Upon construction, this class prepares and launches an inferior process
27d409305fSDimitry Andric /// for debugging.
28d409305fSDimitry Andric ///
29d409305fSDimitry Andric /// Changes in the inferior process state are broadcasted.
30d409305fSDimitry Andric class NativeProcessFreeBSD : public NativeProcessELF,
31d409305fSDimitry Andric                              private NativeProcessSoftwareSingleStep {
32d409305fSDimitry Andric public:
33*06c3fb27SDimitry Andric   class Manager : public NativeProcessProtocol::Manager {
34d409305fSDimitry Andric   public:
35*06c3fb27SDimitry Andric     using NativeProcessProtocol::Manager::Manager;
36d409305fSDimitry Andric 
37d409305fSDimitry Andric     llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
38*06c3fb27SDimitry Andric     Launch(ProcessLaunchInfo &launch_info,
39*06c3fb27SDimitry Andric            NativeDelegate &native_delegate) override;
40*06c3fb27SDimitry Andric 
41*06c3fb27SDimitry Andric     llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
42*06c3fb27SDimitry Andric     Attach(lldb::pid_t pid, NativeDelegate &native_delegate) override;
43fe6060f1SDimitry Andric 
44fe6060f1SDimitry Andric     Extension GetSupportedExtensions() const override;
45d409305fSDimitry Andric   };
46d409305fSDimitry Andric 
47d409305fSDimitry Andric   // NativeProcessProtocol Interface
48d409305fSDimitry Andric   Status Resume(const ResumeActionList &resume_actions) override;
49d409305fSDimitry Andric 
50d409305fSDimitry Andric   Status Halt() override;
51d409305fSDimitry Andric 
52d409305fSDimitry Andric   Status Detach() override;
53d409305fSDimitry Andric 
54d409305fSDimitry Andric   Status Signal(int signo) override;
55d409305fSDimitry Andric 
56d409305fSDimitry Andric   Status Interrupt() override;
57d409305fSDimitry Andric 
58d409305fSDimitry Andric   Status Kill() override;
59d409305fSDimitry Andric 
60d409305fSDimitry Andric   Status GetMemoryRegionInfo(lldb::addr_t load_addr,
61d409305fSDimitry Andric                              MemoryRegionInfo &range_info) override;
62d409305fSDimitry Andric 
63d409305fSDimitry Andric   Status ReadMemory(lldb::addr_t addr, void *buf, size_t size,
64d409305fSDimitry Andric                     size_t &bytes_read) override;
65d409305fSDimitry Andric 
66d409305fSDimitry Andric   Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size,
67d409305fSDimitry Andric                      size_t &bytes_written) override;
68d409305fSDimitry Andric 
69d409305fSDimitry Andric   size_t UpdateThreads() override;
70d409305fSDimitry Andric 
GetArchitecture()71d409305fSDimitry Andric   const ArchSpec &GetArchitecture() const override { return m_arch; }
72d409305fSDimitry Andric 
73d409305fSDimitry Andric   Status SetBreakpoint(lldb::addr_t addr, uint32_t size,
74d409305fSDimitry Andric                        bool hardware) override;
75d409305fSDimitry Andric 
76d409305fSDimitry Andric   // The two following methods are probably not necessary and probably
77d409305fSDimitry Andric   // will never be called.  Nevertheless, we implement them right now
78d409305fSDimitry Andric   // to reduce the differences between different platforms and reduce
79d409305fSDimitry Andric   // the risk of the lack of implementation actually breaking something,
80d409305fSDimitry Andric   // at least for the time being.
81d409305fSDimitry Andric   Status GetLoadedModuleFileSpec(const char *module_path,
82d409305fSDimitry Andric                                  FileSpec &file_spec) override;
83d409305fSDimitry Andric   Status GetFileLoadAddress(const llvm::StringRef &file_name,
84d409305fSDimitry Andric                             lldb::addr_t &load_addr) override;
85d409305fSDimitry Andric 
86d409305fSDimitry Andric   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
87d409305fSDimitry Andric   GetAuxvData() const override;
88d409305fSDimitry Andric 
89d409305fSDimitry Andric   // Interface used by NativeRegisterContext-derived classes.
90d409305fSDimitry Andric   static Status PtraceWrapper(int req, lldb::pid_t pid, void *addr = nullptr,
91d409305fSDimitry Andric                               int data = 0, int *result = nullptr);
92d409305fSDimitry Andric 
93d409305fSDimitry Andric   bool SupportHardwareSingleStepping() const;
94d409305fSDimitry Andric 
95349cc55cSDimitry Andric   llvm::Expected<std::string> SaveCore(llvm::StringRef path_hint) override;
96349cc55cSDimitry Andric 
97d409305fSDimitry Andric protected:
98d409305fSDimitry Andric   llvm::Expected<llvm::ArrayRef<uint8_t>>
99d409305fSDimitry Andric   GetSoftwareBreakpointTrapOpcode(size_t size_hint) override;
100d409305fSDimitry Andric 
101d409305fSDimitry Andric private:
102d409305fSDimitry Andric   MainLoop::SignalHandleUP m_sigchld_handle;
103d409305fSDimitry Andric   ArchSpec m_arch;
104fe6060f1SDimitry Andric   MainLoop& m_main_loop;
105d409305fSDimitry Andric   LazyBool m_supports_mem_region = eLazyBoolCalculate;
106d409305fSDimitry Andric   std::vector<std::pair<MemoryRegionInfo, FileSpec>> m_mem_region_cache;
107d409305fSDimitry Andric 
108d409305fSDimitry Andric   // Private Instance Methods
109d409305fSDimitry Andric   NativeProcessFreeBSD(::pid_t pid, int terminal_fd, NativeDelegate &delegate,
110d409305fSDimitry Andric                        const ArchSpec &arch, MainLoop &mainloop);
111d409305fSDimitry Andric 
112d409305fSDimitry Andric   bool HasThreadNoLock(lldb::tid_t thread_id);
113d409305fSDimitry Andric 
114d409305fSDimitry Andric   NativeThreadFreeBSD &AddThread(lldb::tid_t thread_id);
115d409305fSDimitry Andric   void RemoveThread(lldb::tid_t thread_id);
116d409305fSDimitry Andric 
117d409305fSDimitry Andric   void MonitorCallback(lldb::pid_t pid, int signal);
118d409305fSDimitry Andric   void MonitorExited(lldb::pid_t pid, WaitStatus status);
119d409305fSDimitry Andric   void MonitorSIGSTOP(lldb::pid_t pid);
120d409305fSDimitry Andric   void MonitorSIGTRAP(lldb::pid_t pid);
121d409305fSDimitry Andric   void MonitorSignal(lldb::pid_t pid, int signal);
122fe6060f1SDimitry Andric   void MonitorClone(::pid_t child_pid, bool is_vfork,
123fe6060f1SDimitry Andric                     NativeThreadFreeBSD &parent_thread);
124d409305fSDimitry Andric 
125d409305fSDimitry Andric   Status PopulateMemoryRegionCache();
126d409305fSDimitry Andric   void SigchldHandler();
127d409305fSDimitry Andric 
128d409305fSDimitry Andric   Status Attach();
129d409305fSDimitry Andric   Status SetupTrace();
130d409305fSDimitry Andric   Status ReinitializeThreads();
131d409305fSDimitry Andric };
132d409305fSDimitry Andric 
133d409305fSDimitry Andric } // namespace process_freebsd
134d409305fSDimitry Andric } // namespace lldb_private
135d409305fSDimitry Andric 
136d409305fSDimitry Andric #endif // #ifndef liblldb_NativeProcessFreeBSD_H_
137