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