10b57cec5SDimitry Andric //===-- NativeProcessNetBSD.h --------------------------------- -*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef liblldb_NativeProcessNetBSD_H_ 100b57cec5SDimitry Andric #define liblldb_NativeProcessNetBSD_H_ 110b57cec5SDimitry Andric 129dba64beSDimitry Andric #include "Plugins/Process/POSIX/NativeProcessELF.h" 130b57cec5SDimitry Andric #include "lldb/Target/MemoryRegionInfo.h" 140b57cec5SDimitry Andric #include "lldb/Utility/ArchSpec.h" 150b57cec5SDimitry Andric #include "lldb/Utility/FileSpec.h" 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric #include "NativeThreadNetBSD.h" 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric namespace lldb_private { 200b57cec5SDimitry Andric namespace process_netbsd { 210b57cec5SDimitry Andric /// \class NativeProcessNetBSD 220b57cec5SDimitry Andric /// Manages communication with the inferior (debugee) process. 230b57cec5SDimitry Andric /// 240b57cec5SDimitry Andric /// Upon construction, this class prepares and launches an inferior process 250b57cec5SDimitry Andric /// for debugging. 260b57cec5SDimitry Andric /// 270b57cec5SDimitry Andric /// Changes in the inferior process state are broadcasted. 289dba64beSDimitry Andric class NativeProcessNetBSD : public NativeProcessELF { 290b57cec5SDimitry Andric public: 3006c3fb27SDimitry Andric class Manager : public NativeProcessProtocol::Manager { 310b57cec5SDimitry Andric public: 3206c3fb27SDimitry Andric using NativeProcessProtocol::Manager::Manager; 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric llvm::Expected<std::unique_ptr<NativeProcessProtocol>> 3506c3fb27SDimitry Andric Launch(ProcessLaunchInfo &launch_info, 3606c3fb27SDimitry Andric NativeDelegate &native_delegate) override; 3706c3fb27SDimitry Andric 3806c3fb27SDimitry Andric llvm::Expected<std::unique_ptr<NativeProcessProtocol>> 3906c3fb27SDimitry Andric Attach(lldb::pid_t pid, NativeDelegate &native_delegate) override; 40fe6060f1SDimitry Andric 41fe6060f1SDimitry Andric Extension GetSupportedExtensions() const override; 420b57cec5SDimitry Andric }; 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric // NativeProcessProtocol Interface 450b57cec5SDimitry Andric Status Resume(const ResumeActionList &resume_actions) override; 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric Status Halt() override; 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric Status Detach() override; 500b57cec5SDimitry Andric 510b57cec5SDimitry Andric Status Signal(int signo) override; 520b57cec5SDimitry Andric 53480093f4SDimitry Andric Status Interrupt() override; 54480093f4SDimitry Andric 550b57cec5SDimitry Andric Status Kill() override; 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric Status GetMemoryRegionInfo(lldb::addr_t load_addr, 580b57cec5SDimitry Andric MemoryRegionInfo &range_info) override; 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric Status ReadMemory(lldb::addr_t addr, void *buf, size_t size, 610b57cec5SDimitry Andric size_t &bytes_read) override; 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size, 640b57cec5SDimitry Andric size_t &bytes_written) override; 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric lldb::addr_t GetSharedLibraryInfoAddress() override; 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric size_t UpdateThreads() override; 690b57cec5SDimitry Andric GetArchitecture()700b57cec5SDimitry Andric const ArchSpec &GetArchitecture() const override { return m_arch; } 710b57cec5SDimitry Andric 720b57cec5SDimitry Andric Status SetBreakpoint(lldb::addr_t addr, uint32_t size, 730b57cec5SDimitry Andric bool hardware) override; 740b57cec5SDimitry Andric 75e8d8bef9SDimitry Andric // The two following methods are probably not necessary and probably 76e8d8bef9SDimitry Andric // will never be called. Nevertheless, we implement them right now 77e8d8bef9SDimitry Andric // to reduce the differences between different platforms and reduce 78e8d8bef9SDimitry Andric // the risk of the lack of implementation actually breaking something, 79e8d8bef9SDimitry Andric // at least for the time being. 800b57cec5SDimitry Andric Status GetLoadedModuleFileSpec(const char *module_path, 810b57cec5SDimitry Andric FileSpec &file_spec) override; 820b57cec5SDimitry Andric Status GetFileLoadAddress(const llvm::StringRef &file_name, 830b57cec5SDimitry Andric lldb::addr_t &load_addr) override; 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> 860b57cec5SDimitry Andric GetAuxvData() const override; 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric // Interface used by NativeRegisterContext-derived classes. 890b57cec5SDimitry Andric static Status PtraceWrapper(int req, lldb::pid_t pid, void *addr = nullptr, 900b57cec5SDimitry Andric int data = 0, int *result = nullptr); 91*5f757f3fSDimitry Andric static Status StopProcess(lldb::pid_t pid); 920b57cec5SDimitry Andric 93349cc55cSDimitry Andric llvm::Expected<std::string> SaveCore(llvm::StringRef path_hint) override; 94349cc55cSDimitry Andric 950b57cec5SDimitry Andric private: 960b57cec5SDimitry Andric MainLoop::SignalHandleUP m_sigchld_handle; 970b57cec5SDimitry Andric ArchSpec m_arch; 98fe6060f1SDimitry Andric MainLoop& m_main_loop; 990b57cec5SDimitry Andric LazyBool m_supports_mem_region = eLazyBoolCalculate; 1000b57cec5SDimitry Andric std::vector<std::pair<MemoryRegionInfo, FileSpec>> m_mem_region_cache; 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andric // Private Instance Methods 1030b57cec5SDimitry Andric NativeProcessNetBSD(::pid_t pid, int terminal_fd, NativeDelegate &delegate, 1040b57cec5SDimitry Andric const ArchSpec &arch, MainLoop &mainloop); 1050b57cec5SDimitry Andric 1060b57cec5SDimitry Andric bool HasThreadNoLock(lldb::tid_t thread_id); 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric NativeThreadNetBSD &AddThread(lldb::tid_t thread_id); 109480093f4SDimitry Andric void RemoveThread(lldb::tid_t thread_id); 1100b57cec5SDimitry Andric 1110b57cec5SDimitry Andric void MonitorCallback(lldb::pid_t pid, int signal); 1120b57cec5SDimitry Andric void MonitorExited(lldb::pid_t pid, WaitStatus status); 1130b57cec5SDimitry Andric void MonitorSIGSTOP(lldb::pid_t pid); 1140b57cec5SDimitry Andric void MonitorSIGTRAP(lldb::pid_t pid); 1150b57cec5SDimitry Andric void MonitorSignal(lldb::pid_t pid, int signal); 116fe6060f1SDimitry Andric void MonitorClone(::pid_t child_pid, bool is_vfork, 117fe6060f1SDimitry Andric NativeThreadNetBSD &parent_thread); 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andric Status PopulateMemoryRegionCache(); 1200b57cec5SDimitry Andric void SigchldHandler(); 1210b57cec5SDimitry Andric 1220b57cec5SDimitry Andric Status Attach(); 123e8d8bef9SDimitry Andric Status SetupTrace(); 1240b57cec5SDimitry Andric Status ReinitializeThreads(); 1250b57cec5SDimitry Andric }; 1260b57cec5SDimitry Andric 1270b57cec5SDimitry Andric } // namespace process_netbsd 1280b57cec5SDimitry Andric } // namespace lldb_private 1290b57cec5SDimitry Andric 1300b57cec5SDimitry Andric #endif // #ifndef liblldb_NativeProcessNetBSD_H_ 131