1061da546Spatrick //===-- NativeProcessOpenBSD.h --------------------------------- -*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // The LLVM Compiler Infrastructure 4061da546Spatrick // 5061da546Spatrick // This file is distributed under the University of Illinois Open Source 6061da546Spatrick // License. See LICENSE.TXT for details. 7061da546Spatrick // 8061da546Spatrick //===----------------------------------------------------------------------===// 9061da546Spatrick 10061da546Spatrick #ifndef liblldb_NativeProcessOpenBSD_H_ 11061da546Spatrick #define liblldb_NativeProcessOpenBSD_H_ 12061da546Spatrick 13061da546Spatrick #include "lldb/Target/MemoryRegionInfo.h" 14061da546Spatrick #include "lldb/Utility/ArchSpec.h" 15061da546Spatrick #include "lldb/Utility/FileSpec.h" 16061da546Spatrick 17061da546Spatrick #include "NativeThreadOpenBSD.h" 18061da546Spatrick #include "lldb/Host/common/NativeProcessProtocol.h" 19061da546Spatrick 20061da546Spatrick namespace lldb_private { 21061da546Spatrick namespace process_openbsd { 22061da546Spatrick /// @class NativeProcessOpenBSD 23061da546Spatrick /// Manages communication with the inferior (debugee) process. 24061da546Spatrick /// 25061da546Spatrick /// Upon construction, this class prepares and launches an inferior process 26061da546Spatrick /// for debugging. 27061da546Spatrick /// 28061da546Spatrick /// Changes in the inferior process state are broadcasted. 29061da546Spatrick class NativeProcessOpenBSD : public NativeProcessProtocol { 30061da546Spatrick public: 31061da546Spatrick class Factory : public NativeProcessProtocol::Factory { 32061da546Spatrick public: 33061da546Spatrick llvm::Expected<std::unique_ptr<NativeProcessProtocol>> 34061da546Spatrick Launch(ProcessLaunchInfo &launch_info, NativeDelegate &native_delegate, 35061da546Spatrick MainLoop &mainloop) const override; 36061da546Spatrick 37061da546Spatrick llvm::Expected<std::unique_ptr<NativeProcessProtocol>> 38061da546Spatrick Attach(lldb::pid_t pid, NativeDelegate &native_delegate, 39061da546Spatrick MainLoop &mainloop) const override; 40*a0747c9fSpatrick 41*a0747c9fSpatrick Extension GetSupportedExtensions() const override; 42061da546Spatrick }; 43061da546Spatrick 44061da546Spatrick // --------------------------------------------------------------------- 45061da546Spatrick // NativeProcessProtocol Interface 46061da546Spatrick // --------------------------------------------------------------------- 47061da546Spatrick Status Resume(const ResumeActionList &resume_actions) override; 48061da546Spatrick 49061da546Spatrick Status Halt() override; 50061da546Spatrick 51061da546Spatrick Status Detach() override; 52061da546Spatrick 53061da546Spatrick Status Signal(int signo) override; 54061da546Spatrick 55061da546Spatrick Status Kill() override; 56061da546Spatrick 57061da546Spatrick Status GetMemoryRegionInfo(lldb::addr_t load_addr, 58061da546Spatrick MemoryRegionInfo &range_info) override; 59061da546Spatrick 60061da546Spatrick Status ReadMemory(lldb::addr_t addr, void *buf, size_t size, 61061da546Spatrick size_t &bytes_read) override; 62061da546Spatrick 63061da546Spatrick Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size, 64061da546Spatrick size_t &bytes_written) override; 65061da546Spatrick 66*a0747c9fSpatrick llvm::Expected<lldb::addr_t> AllocateMemory(size_t size, uint32_t permissions) override; 67061da546Spatrick 68*a0747c9fSpatrick llvm::Error DeallocateMemory(lldb::addr_t addr) override; 69061da546Spatrick 70061da546Spatrick lldb::addr_t GetSharedLibraryInfoAddress() override; 71061da546Spatrick 72061da546Spatrick size_t UpdateThreads() override; 73061da546Spatrick GetArchitecture()74061da546Spatrick const ArchSpec &GetArchitecture() const override { return m_arch; } 75061da546Spatrick 76061da546Spatrick Status SetBreakpoint(lldb::addr_t addr, uint32_t size, 77061da546Spatrick bool hardware) override; 78061da546Spatrick 79061da546Spatrick Status GetLoadedModuleFileSpec(const char *module_path, 80061da546Spatrick FileSpec &file_spec) override; 81061da546Spatrick 82061da546Spatrick Status GetFileLoadAddress(const llvm::StringRef &file_name, 83061da546Spatrick lldb::addr_t &load_addr) override; 84061da546Spatrick 85061da546Spatrick llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> 86061da546Spatrick GetAuxvData() const override; 87061da546Spatrick 88061da546Spatrick // --------------------------------------------------------------------- 89061da546Spatrick // Interface used by NativeRegisterContext-derived classes. 90061da546Spatrick // --------------------------------------------------------------------- 91061da546Spatrick static Status PtraceWrapper(int req, lldb::pid_t pid, void *addr = nullptr, 92061da546Spatrick int data = 0, int *result = nullptr); 93061da546Spatrick 94061da546Spatrick private: 95061da546Spatrick MainLoop::SignalHandleUP m_sigchld_handle; 96061da546Spatrick ArchSpec m_arch; 97061da546Spatrick std::vector<std::pair<MemoryRegionInfo, FileSpec>> m_mem_region_cache; 98061da546Spatrick 99061da546Spatrick // --------------------------------------------------------------------- 100061da546Spatrick // Private Instance Methods 101061da546Spatrick // --------------------------------------------------------------------- 102061da546Spatrick NativeProcessOpenBSD(::pid_t pid, int terminal_fd, NativeDelegate &delegate, 103061da546Spatrick const ArchSpec &arch, MainLoop &mainloop); 104061da546Spatrick 105061da546Spatrick bool HasThreadNoLock(lldb::tid_t thread_id); 106061da546Spatrick 107061da546Spatrick NativeThreadOpenBSD &AddThread(lldb::tid_t thread_id); 108061da546Spatrick 109061da546Spatrick void MonitorCallback(lldb::pid_t pid, int signal); 110061da546Spatrick void MonitorExited(lldb::pid_t pid, WaitStatus status); 111061da546Spatrick void MonitorSIGTRAP(lldb::pid_t pid); 112061da546Spatrick void MonitorSignal(lldb::pid_t pid, int signal); 113061da546Spatrick 114061da546Spatrick Status PopulateMemoryRegionCache(); 115061da546Spatrick void SigchldHandler(); 116061da546Spatrick 117061da546Spatrick Status Attach(); 118061da546Spatrick Status ReinitializeThreads(); 119061da546Spatrick }; 120061da546Spatrick 121061da546Spatrick } // namespace process_openbsd 122061da546Spatrick } // namespace lldb_private 123061da546Spatrick 124061da546Spatrick #endif // #ifndef liblldb_NativeProcessOpenBSD_H_ 125