xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.h (revision fe6060f10f634930ff71b7c50291ddc610da2475)
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:
33d409305fSDimitry Andric   class Factory : public NativeProcessProtocol::Factory {
34d409305fSDimitry Andric   public:
35d409305fSDimitry Andric     llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
36d409305fSDimitry Andric     Launch(ProcessLaunchInfo &launch_info, NativeDelegate &native_delegate,
37d409305fSDimitry Andric            MainLoop &mainloop) const override;
38d409305fSDimitry Andric 
39d409305fSDimitry Andric     llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
40d409305fSDimitry Andric     Attach(lldb::pid_t pid, NativeDelegate &native_delegate,
41d409305fSDimitry Andric            MainLoop &mainloop) const override;
42*fe6060f1SDimitry Andric 
43*fe6060f1SDimitry Andric     Extension GetSupportedExtensions() const override;
44d409305fSDimitry Andric   };
45d409305fSDimitry Andric 
46d409305fSDimitry Andric   // NativeProcessProtocol Interface
47d409305fSDimitry Andric   Status Resume(const ResumeActionList &resume_actions) override;
48d409305fSDimitry Andric 
49d409305fSDimitry Andric   Status Halt() override;
50d409305fSDimitry Andric 
51d409305fSDimitry Andric   Status Detach() override;
52d409305fSDimitry Andric 
53d409305fSDimitry Andric   Status Signal(int signo) override;
54d409305fSDimitry Andric 
55d409305fSDimitry Andric   Status Interrupt() override;
56d409305fSDimitry Andric 
57d409305fSDimitry Andric   Status Kill() override;
58d409305fSDimitry Andric 
59d409305fSDimitry Andric   Status GetMemoryRegionInfo(lldb::addr_t load_addr,
60d409305fSDimitry Andric                              MemoryRegionInfo &range_info) override;
61d409305fSDimitry Andric 
62d409305fSDimitry Andric   Status ReadMemory(lldb::addr_t addr, void *buf, size_t size,
63d409305fSDimitry Andric                     size_t &bytes_read) override;
64d409305fSDimitry Andric 
65d409305fSDimitry Andric   Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size,
66d409305fSDimitry Andric                      size_t &bytes_written) override;
67d409305fSDimitry Andric 
68d409305fSDimitry Andric   size_t UpdateThreads() override;
69d409305fSDimitry Andric 
70d409305fSDimitry Andric   const ArchSpec &GetArchitecture() const override { return m_arch; }
71d409305fSDimitry Andric 
72d409305fSDimitry Andric   Status SetBreakpoint(lldb::addr_t addr, uint32_t size,
73d409305fSDimitry Andric                        bool hardware) override;
74d409305fSDimitry Andric 
75d409305fSDimitry Andric   // The two following methods are probably not necessary and probably
76d409305fSDimitry Andric   // will never be called.  Nevertheless, we implement them right now
77d409305fSDimitry Andric   // to reduce the differences between different platforms and reduce
78d409305fSDimitry Andric   // the risk of the lack of implementation actually breaking something,
79d409305fSDimitry Andric   // at least for the time being.
80d409305fSDimitry Andric   Status GetLoadedModuleFileSpec(const char *module_path,
81d409305fSDimitry Andric                                  FileSpec &file_spec) override;
82d409305fSDimitry Andric   Status GetFileLoadAddress(const llvm::StringRef &file_name,
83d409305fSDimitry Andric                             lldb::addr_t &load_addr) override;
84d409305fSDimitry Andric 
85d409305fSDimitry Andric   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
86d409305fSDimitry Andric   GetAuxvData() const override;
87d409305fSDimitry Andric 
88d409305fSDimitry Andric   // Interface used by NativeRegisterContext-derived classes.
89d409305fSDimitry Andric   static Status PtraceWrapper(int req, lldb::pid_t pid, void *addr = nullptr,
90d409305fSDimitry Andric                               int data = 0, int *result = nullptr);
91d409305fSDimitry Andric 
92d409305fSDimitry Andric   bool SupportHardwareSingleStepping() const;
93d409305fSDimitry Andric 
94d409305fSDimitry Andric protected:
95d409305fSDimitry Andric   llvm::Expected<llvm::ArrayRef<uint8_t>>
96d409305fSDimitry Andric   GetSoftwareBreakpointTrapOpcode(size_t size_hint) override;
97d409305fSDimitry Andric 
98d409305fSDimitry Andric private:
99d409305fSDimitry Andric   MainLoop::SignalHandleUP m_sigchld_handle;
100d409305fSDimitry Andric   ArchSpec m_arch;
101*fe6060f1SDimitry Andric   MainLoop& m_main_loop;
102d409305fSDimitry Andric   LazyBool m_supports_mem_region = eLazyBoolCalculate;
103d409305fSDimitry Andric   std::vector<std::pair<MemoryRegionInfo, FileSpec>> m_mem_region_cache;
104d409305fSDimitry Andric 
105d409305fSDimitry Andric   // Private Instance Methods
106d409305fSDimitry Andric   NativeProcessFreeBSD(::pid_t pid, int terminal_fd, NativeDelegate &delegate,
107d409305fSDimitry Andric                        const ArchSpec &arch, MainLoop &mainloop);
108d409305fSDimitry Andric 
109d409305fSDimitry Andric   bool HasThreadNoLock(lldb::tid_t thread_id);
110d409305fSDimitry Andric 
111d409305fSDimitry Andric   NativeThreadFreeBSD &AddThread(lldb::tid_t thread_id);
112d409305fSDimitry Andric   void RemoveThread(lldb::tid_t thread_id);
113d409305fSDimitry Andric 
114d409305fSDimitry Andric   void MonitorCallback(lldb::pid_t pid, int signal);
115d409305fSDimitry Andric   void MonitorExited(lldb::pid_t pid, WaitStatus status);
116d409305fSDimitry Andric   void MonitorSIGSTOP(lldb::pid_t pid);
117d409305fSDimitry Andric   void MonitorSIGTRAP(lldb::pid_t pid);
118d409305fSDimitry Andric   void MonitorSignal(lldb::pid_t pid, int signal);
119*fe6060f1SDimitry Andric   void MonitorClone(::pid_t child_pid, bool is_vfork,
120*fe6060f1SDimitry Andric                     NativeThreadFreeBSD &parent_thread);
121d409305fSDimitry Andric 
122d409305fSDimitry Andric   Status PopulateMemoryRegionCache();
123d409305fSDimitry Andric   void SigchldHandler();
124d409305fSDimitry Andric 
125d409305fSDimitry Andric   Status Attach();
126d409305fSDimitry Andric   Status SetupTrace();
127d409305fSDimitry Andric   Status ReinitializeThreads();
128d409305fSDimitry Andric };
129d409305fSDimitry Andric 
130d409305fSDimitry Andric } // namespace process_freebsd
131d409305fSDimitry Andric } // namespace lldb_private
132d409305fSDimitry Andric 
133d409305fSDimitry Andric #endif // #ifndef liblldb_NativeProcessFreeBSD_H_
134