1 //===-- NativeRegisterContextOpenBSD_x86_64.h --------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef lldb_NativeRegisterContextOpenBSD_x86_64_h 11 #define lldb_NativeRegisterContextOpenBSD_x86_64_h 12 13 // clang-format off 14 #include <sys/types.h> 15 #include <machine/reg.h> 16 // clang-format on 17 18 #include <array> 19 #include <vector> 20 21 #include "Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD.h" 22 #include "Plugins/Process/Utility/RegisterContext_x86.h" 23 #include "Plugins/Process/Utility/lldb-x86-register-enums.h" 24 25 namespace lldb_private { 26 namespace process_openbsd { 27 28 class NativeProcessOpenBSD; 29 30 class NativeRegisterContextOpenBSD_x86_64 : public NativeRegisterContextOpenBSD { 31 public: 32 NativeRegisterContextOpenBSD_x86_64(const ArchSpec &target_arch, 33 NativeThreadProtocol &native_thread); GetGPRSize()34 size_t GetGPRSize() override { return sizeof(m_gpr); } GetFPRSize()35 size_t GetFPRSize() override { return sizeof(m_fpr); } 36 37 uint32_t GetUserRegisterCount() const override; 38 uint32_t GetRegisterSetCount() const override; 39 40 const RegisterSet *GetRegisterSet(uint32_t set_index) const override; 41 42 Status ReadRegister(const RegisterInfo *reg_info, 43 RegisterValue ®_value) override; 44 45 Status WriteRegister(const RegisterInfo *reg_info, 46 const RegisterValue ®_value) override; 47 48 Status ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override; 49 50 Status WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override; 51 52 protected: GetGPRBuffer()53 void *GetGPRBuffer() override { return &m_gpr; } GetFPRBuffer()54 void *GetFPRBuffer() override { return &m_fpr; } 55 56 private: 57 // Private member types. 58 enum { 59 GPRegSet, 60 FPRegSet, 61 YMMRegSet, 62 MaxRegSet = YMMRegSet, 63 }; 64 65 // Private member variables. 66 struct reg m_gpr; 67 struct fpreg m_fpr; 68 std::vector<uint8_t> m_xsave; 69 std::array<uint32_t, MaxRegSet + 1> m_xsave_offsets; 70 71 int GetSetForNativeRegNum(int reg_num) const; 72 73 int ReadRegisterSet(uint32_t set); 74 int WriteRegisterSet(uint32_t set); 75 76 struct YMMSplitPtr { 77 void *xmm; 78 void *ymm_hi; 79 }; 80 std::optional<YMMSplitPtr> GetYMMSplitReg(uint32_t reg); 81 }; 82 83 } // namespace process_openbsd 84 } // namespace lldb_private 85 86 #endif // #ifndef lldb_NativeRegisterContextOpenBSD_x86_64_h 87