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