LLDB mainline
NativeRegisterContextLinux_x86_64.h
Go to the documentation of this file.
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-exception
6//
7//===----------------------------------------------------------------------===//
8
9#if defined(__i386__) || defined(__x86_64__)
10
11#ifndef lldb_NativeRegisterContextLinux_x86_64_h
12#define lldb_NativeRegisterContextLinux_x86_64_h
13
19#include <optional>
20#include <sys/uio.h>
21
22namespace lldb_private {
23namespace process_linux {
24
25class NativeProcessLinux;
26
27class NativeRegisterContextLinux_x86_64
28 : 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 &reg_value) override;
42
43 Status WriteRegister(const RegisterInfo *reg_info,
44 const RegisterValue &reg_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_linux
144} // namespace lldb_private
145
146#endif // #ifndef lldb_NativeRegisterContextLinux_x86_64_h
147
148#endif // defined(__i386__) || defined(__x86_64__)
#define YMM(n)
Definition: ABIX86.cpp:166
A class that represents a running process on the host machine.
Definition: SBAttachInfo.h:14
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
Definition: lldb-forward.h:328
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
Definition: lldb-forward.h:329