149 lines · c
1//===-- NativeRegisterContextLinux_x86_64.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#if defined(__i386__) || defined(__x86_64__)10 11#ifndef lldb_NativeRegisterContextLinux_x86_64_h12#define lldb_NativeRegisterContextLinux_x86_64_h13 14#include "Plugins/Process/Linux/NativeRegisterContextLinux.h"15#include "Plugins/Process/Utility/NativeRegisterContextDBReg_x86.h"16#include "Plugins/Process/Utility/RegisterContextLinux_x86.h"17#include "Plugins/Process/Utility/RegisterContext_x86.h"18#include "Plugins/Process/Utility/lldb-x86-register-enums.h"19#include <optional>20#include <sys/uio.h>21 22namespace lldb_private {23namespace process_linux {24 25class NativeProcessLinux;26 27class NativeRegisterContextLinux_x86_6428 : public NativeRegisterContextLinux,29 public NativeRegisterContextDBReg_x86 {30public:31 NativeRegisterContextLinux_x86_64(const ArchSpec &target_arch,32 NativeThreadProtocol &native_thread);33 34 uint32_t GetRegisterSetCount() const override;35 36 const RegisterSet *GetRegisterSet(uint32_t set_index) const override;37 38 uint32_t GetUserRegisterCount() const override;39 40 Status ReadRegister(const RegisterInfo *reg_info,41 RegisterValue ®_value) override;42 43 Status WriteRegister(const RegisterInfo *reg_info,44 const RegisterValue ®_value) override;45 46 Status ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override;47 48 Status WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;49 50 std::optional<SyscallData> GetSyscallData() override;51 52 std::optional<MmapData> GetMmapData() override;53 54 const RegisterInfo *GetDR(int num) const override;55 56protected:57 void *GetGPRBuffer() override { return &m_gpr_x86_64; }58 59 void *GetFPRBuffer() override;60 61 size_t GetFPRSize() override;62 63 Status ReadFPR() override;64 65 Status WriteFPR() override;66 67 uint32_t GetPtraceOffset(uint32_t reg_index) override;68 69private:70 // Private member types.71 enum class XStateType { Invalid, FXSAVE, XSAVE };72 enum class RegSet { gpr, fpu, avx, mpx };73 74 // Info about register ranges.75 struct RegInfo {76 uint32_t num_registers;77 uint32_t num_gpr_registers;78 uint32_t num_fpr_registers;79 uint32_t num_avx_registers;80 uint32_t num_mpx_registers;81 uint32_t last_gpr;82 uint32_t first_fpr;83 uint32_t last_fpr;84 uint32_t first_st;85 uint32_t last_st;86 uint32_t first_mm;87 uint32_t last_mm;88 uint32_t first_xmm;89 uint32_t last_xmm;90 uint32_t first_ymm;91 uint32_t last_ymm;92 uint32_t first_mpxr;93 uint32_t last_mpxr;94 uint32_t first_mpxc;95 uint32_t last_mpxc;96 uint32_t first_dr;97 uint32_t last_dr;98 uint32_t gpr_flags;99 };100 101 // Private member variables.102 mutable XStateType m_xstate_type;103 std::unique_ptr<FPR, llvm::FreeDeleter>104 m_xstate; // Extended States Area, named FPR for historical reasons.105 struct iovec m_iovec;106 YMM m_ymm_set;107 MPX m_mpx_set;108 RegInfo m_reg_info;109 uint64_t m_gpr_x86_64[x86_64_with_base::k_num_gpr_registers];110 uint32_t m_fctrl_offset_in_userarea;111 112 // Private member methods.113 bool IsCPUFeatureAvailable(RegSet feature_code) const;114 115 bool IsRegisterSetAvailable(uint32_t set_index) const;116 117 bool IsGPR(uint32_t reg_index) const;118 119 bool IsFPR(uint32_t reg_index) const;120 121 bool IsDR(uint32_t reg_index) const;122 123 bool CopyXSTATEtoYMM(uint32_t reg_index, lldb::ByteOrder byte_order);124 125 bool CopyYMMtoXSTATE(uint32_t reg, lldb::ByteOrder byte_order);126 127 bool IsAVX(uint32_t reg_index) const;128 129 bool CopyXSTATEtoMPX(uint32_t reg);130 131 bool CopyMPXtoXSTATE(uint32_t reg);132 133 bool IsMPX(uint32_t reg_index) const;134 135 void UpdateXSTATEforWrite(uint32_t reg_index);136 137 RegisterContextLinux_x86 &GetRegisterInfo() const {138 return static_cast<RegisterContextLinux_x86 &>(139 *m_register_info_interface_up);140 }141};142 143} // namespace process_linux144} // namespace lldb_private145 146#endif // #ifndef lldb_NativeRegisterContextLinux_x86_64_h147 148#endif // defined(__i386__) || defined(__x86_64__)149