137 lines · c
1//===-- NativeProcessFreeBSD.h -------------------------------- -*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef liblldb_NativeProcessFreeBSD_H_10#define liblldb_NativeProcessFreeBSD_H_11 12#include "Plugins/Process/POSIX/NativeProcessELF.h"13#include "Plugins/Process/Utility/NativeProcessSoftwareSingleStep.h"14 15#include "lldb/Target/MemoryRegionInfo.h"16#include "lldb/Utility/ArchSpec.h"17#include "lldb/Utility/FileSpec.h"18 19#include "NativeThreadFreeBSD.h"20 21namespace lldb_private {22namespace process_freebsd {23/// \class NativeProcessFreeBSD24/// Manages communication with the inferior (debugee) process.25///26/// Upon construction, this class prepares and launches an inferior process27/// for debugging.28///29/// Changes in the inferior process state are broadcasted.30class NativeProcessFreeBSD : public NativeProcessELF,31 private NativeProcessSoftwareSingleStep {32public:33 class Manager : public NativeProcessProtocol::Manager {34 public:35 using NativeProcessProtocol::Manager::Manager;36 37 llvm::Expected<std::unique_ptr<NativeProcessProtocol>>38 Launch(ProcessLaunchInfo &launch_info,39 NativeDelegate &native_delegate) override;40 41 llvm::Expected<std::unique_ptr<NativeProcessProtocol>>42 Attach(lldb::pid_t pid, NativeDelegate &native_delegate) override;43 44 Extension GetSupportedExtensions() const override;45 };46 47 // NativeProcessProtocol Interface48 Status Resume(const ResumeActionList &resume_actions) override;49 50 Status Halt() override;51 52 Status Detach() override;53 54 Status Signal(int signo) override;55 56 Status Interrupt() override;57 58 Status Kill() override;59 60 Status GetMemoryRegionInfo(lldb::addr_t load_addr,61 MemoryRegionInfo &range_info) override;62 63 Status ReadMemory(lldb::addr_t addr, void *buf, size_t size,64 size_t &bytes_read) override;65 66 Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size,67 size_t &bytes_written) override;68 69 size_t UpdateThreads() override;70 71 const ArchSpec &GetArchitecture() const override { return m_arch; }72 73 Status SetBreakpoint(lldb::addr_t addr, uint32_t size,74 bool hardware) override;75 76 // The two following methods are probably not necessary and probably77 // will never be called. Nevertheless, we implement them right now78 // to reduce the differences between different platforms and reduce79 // the risk of the lack of implementation actually breaking something,80 // at least for the time being.81 Status GetLoadedModuleFileSpec(const char *module_path,82 FileSpec &file_spec) override;83 Status GetFileLoadAddress(const llvm::StringRef &file_name,84 lldb::addr_t &load_addr) override;85 86 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>87 GetAuxvData() const override;88 89 // Interface used by NativeRegisterContext-derived classes.90 static Status PtraceWrapper(int req, lldb::pid_t pid, void *addr = nullptr,91 int data = 0, int *result = nullptr);92 93 bool SupportHardwareSingleStepping() const;94 95 llvm::Expected<std::string> SaveCore(llvm::StringRef path_hint) override;96 97protected:98 llvm::Expected<llvm::ArrayRef<uint8_t>>99 GetSoftwareBreakpointTrapOpcode(size_t size_hint) override;100 101private:102 MainLoop::SignalHandleUP m_sigchld_handle;103 ArchSpec m_arch;104 MainLoop& m_main_loop;105 LazyBool m_supports_mem_region = eLazyBoolCalculate;106 std::vector<std::pair<MemoryRegionInfo, FileSpec>> m_mem_region_cache;107 108 // Private Instance Methods109 NativeProcessFreeBSD(::pid_t pid, int terminal_fd, NativeDelegate &delegate,110 const ArchSpec &arch, MainLoop &mainloop);111 112 bool HasThreadNoLock(lldb::tid_t thread_id);113 114 NativeThreadFreeBSD &AddThread(lldb::tid_t thread_id);115 void RemoveThread(lldb::tid_t thread_id);116 117 void MonitorCallback(lldb::pid_t pid, int signal);118 void MonitorExited(lldb::pid_t pid, WaitStatus status);119 void MonitorSIGSTOP(lldb::pid_t pid);120 void MonitorSIGTRAP(lldb::pid_t pid);121 void MonitorSignal(lldb::pid_t pid, int signal);122 void MonitorClone(::pid_t child_pid, bool is_vfork,123 NativeThreadFreeBSD &parent_thread);124 125 Status PopulateMemoryRegionCache();126 void SigchldHandler();127 128 Status Attach();129 Status SetupTrace();130 Status ReinitializeThreads();131};132 133} // namespace process_freebsd134} // namespace lldb_private135 136#endif // #ifndef liblldb_NativeProcessFreeBSD_H_137