1 //===-- NativeRegisterContextLinux.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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef lldb_NativeRegisterContextLinux_h 10 #define lldb_NativeRegisterContextLinux_h 11 12 #include "Plugins/Process/Utility/NativeRegisterContextRegisterInfo.h" 13 #include "lldb/Host/common/NativeThreadProtocol.h" 14 15 namespace lldb_private { 16 namespace process_linux { 17 18 class NativeRegisterContextLinux 19 : public virtual NativeRegisterContextRegisterInfo { 20 public: 21 // This function is implemented in the NativeRegisterContextLinux_* subclasses 22 // to create a new instance of the host specific NativeRegisterContextLinux. 23 // The implementations can't collide as only one NativeRegisterContextLinux_* 24 // variant should be compiled into the final executable. 25 static std::unique_ptr<NativeRegisterContextLinux> 26 CreateHostNativeRegisterContextLinux(const ArchSpec &target_arch, 27 NativeThreadProtocol &native_thread); 28 29 // Invalidates cached values in register context data structures InvalidateAllRegisters()30 virtual void InvalidateAllRegisters(){} 31 32 struct SyscallData { 33 /// The syscall instruction. If the architecture uses software 34 /// single-stepping, the instruction should also be followed by a trap to 35 /// ensure the process is stopped after the syscall. 36 llvm::ArrayRef<uint8_t> Insn; 37 38 /// Registers used for syscall arguments. The first register is used to 39 /// store the syscall number. 40 llvm::ArrayRef<uint32_t> Args; 41 42 uint32_t Result; ///< Register containing the syscall result. 43 }; 44 /// Return architecture-specific data needed to make inferior syscalls, if 45 /// they are supported. GetSyscallData()46 virtual llvm::Optional<SyscallData> GetSyscallData() { return llvm::None; } 47 48 struct MmapData { 49 // Syscall numbers can be found (e.g.) in /usr/include/asm/unistd.h for the 50 // relevant architecture. 51 unsigned SysMmap; ///< mmap syscall number. 52 unsigned SysMunmap; ///< munmap syscall number 53 }; 54 /// Return the architecture-specific data needed to make mmap syscalls, if 55 /// they are supported. GetMmapData()56 virtual llvm::Optional<MmapData> GetMmapData() { return llvm::None; } 57 58 protected: 59 lldb::ByteOrder GetByteOrder() const; 60 61 virtual Status ReadRegisterRaw(uint32_t reg_index, RegisterValue ®_value); 62 63 virtual Status WriteRegisterRaw(uint32_t reg_index, 64 const RegisterValue ®_value); 65 66 virtual Status ReadRegisterSet(void *buf, size_t buf_size, 67 unsigned int regset); 68 69 virtual Status WriteRegisterSet(void *buf, size_t buf_size, 70 unsigned int regset); 71 72 virtual Status ReadGPR(); 73 74 virtual Status WriteGPR(); 75 76 virtual Status ReadFPR(); 77 78 virtual Status WriteFPR(); 79 80 virtual void *GetGPRBuffer() = 0; 81 GetGPRSize()82 virtual size_t GetGPRSize() const { 83 return GetRegisterInfoInterface().GetGPRSize(); 84 } 85 86 virtual void *GetFPRBuffer() = 0; 87 88 virtual size_t GetFPRSize() = 0; 89 GetPtraceOffset(uint32_t reg_index)90 virtual uint32_t GetPtraceOffset(uint32_t reg_index) { 91 return GetRegisterInfoAtIndex(reg_index)->byte_offset; 92 } 93 94 // The Do*** functions are executed on the privileged thread and can perform 95 // ptrace 96 // operations directly. 97 virtual Status DoReadRegisterValue(uint32_t offset, const char *reg_name, 98 uint32_t size, RegisterValue &value); 99 100 virtual Status DoWriteRegisterValue(uint32_t offset, const char *reg_name, 101 const RegisterValue &value); 102 }; 103 104 } // namespace process_linux 105 } // namespace lldb_private 106 107 #endif // #ifndef lldb_NativeRegisterContextLinux_h 108