1 | //===-- RegisterContextPOSIX_x86.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_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTPOSIX_X86_H |
10 | #define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTPOSIX_X86_H |
11 | |
12 | #include "RegisterContext_x86.h" |
13 | #include "RegisterInfoInterface.h" |
14 | #include "RegisterInfos_x86_64_with_base_shared.h" |
15 | #include "lldb-x86-register-enums.h" |
16 | #include "lldb/Target/RegisterContext.h" |
17 | #include "lldb/Utility/Log.h" |
18 | |
19 | class RegisterContextPOSIX_x86 : public lldb_private::RegisterContext { |
20 | public: |
21 | RegisterContextPOSIX_x86(lldb_private::Thread &thread, |
22 | uint32_t concrete_frame_idx, |
23 | lldb_private::RegisterInfoInterface *register_info); |
24 | |
25 | ~RegisterContextPOSIX_x86() override; |
26 | |
27 | void Invalidate(); |
28 | |
29 | void InvalidateAllRegisters() override; |
30 | |
31 | size_t GetRegisterCount() override; |
32 | |
33 | virtual size_t GetGPRSize(); |
34 | |
35 | virtual size_t GetFXSAVEOffset(); |
36 | |
37 | virtual unsigned GetRegisterSize(unsigned reg); |
38 | |
39 | virtual unsigned GetRegisterOffset(unsigned reg); |
40 | |
41 | const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override; |
42 | |
43 | size_t GetRegisterSetCount() override; |
44 | |
45 | const lldb_private::RegisterSet *GetRegisterSet(size_t set) override; |
46 | |
47 | const char *GetRegisterName(unsigned reg); |
48 | |
49 | // Note: prefer kernel definitions over user-land |
50 | enum FPRType { |
51 | eNotValid = 0, |
52 | eFSAVE, // TODO |
53 | eFXSAVE, |
54 | eSOFT, // TODO |
55 | eXSAVE |
56 | }; |
57 | |
58 | static uint32_t g_contained_eax[]; |
59 | static uint32_t g_contained_ebx[]; |
60 | static uint32_t g_contained_ecx[]; |
61 | static uint32_t g_contained_edx[]; |
62 | static uint32_t g_contained_edi[]; |
63 | static uint32_t g_contained_esi[]; |
64 | static uint32_t g_contained_ebp[]; |
65 | static uint32_t g_contained_esp[]; |
66 | |
67 | static uint32_t g_invalidate_eax[]; |
68 | static uint32_t g_invalidate_ebx[]; |
69 | static uint32_t g_invalidate_ecx[]; |
70 | static uint32_t g_invalidate_edx[]; |
71 | static uint32_t g_invalidate_edi[]; |
72 | static uint32_t g_invalidate_esi[]; |
73 | static uint32_t g_invalidate_ebp[]; |
74 | static uint32_t g_invalidate_esp[]; |
75 | |
76 | static uint32_t g_contained_rax[]; |
77 | static uint32_t g_contained_rbx[]; |
78 | static uint32_t g_contained_rcx[]; |
79 | static uint32_t g_contained_rdx[]; |
80 | static uint32_t g_contained_rdi[]; |
81 | static uint32_t g_contained_rsi[]; |
82 | static uint32_t g_contained_rbp[]; |
83 | static uint32_t g_contained_rsp[]; |
84 | static uint32_t g_contained_r8[]; |
85 | static uint32_t g_contained_r9[]; |
86 | static uint32_t g_contained_r10[]; |
87 | static uint32_t g_contained_r11[]; |
88 | static uint32_t g_contained_r12[]; |
89 | static uint32_t g_contained_r13[]; |
90 | static uint32_t g_contained_r14[]; |
91 | static uint32_t g_contained_r15[]; |
92 | |
93 | static uint32_t g_invalidate_rax[]; |
94 | static uint32_t g_invalidate_rbx[]; |
95 | static uint32_t g_invalidate_rcx[]; |
96 | static uint32_t g_invalidate_rdx[]; |
97 | static uint32_t g_invalidate_rdi[]; |
98 | static uint32_t g_invalidate_rsi[]; |
99 | static uint32_t g_invalidate_rbp[]; |
100 | static uint32_t g_invalidate_rsp[]; |
101 | static uint32_t g_invalidate_r8[]; |
102 | static uint32_t g_invalidate_r9[]; |
103 | static uint32_t g_invalidate_r10[]; |
104 | static uint32_t g_invalidate_r11[]; |
105 | static uint32_t g_invalidate_r12[]; |
106 | static uint32_t g_invalidate_r13[]; |
107 | static uint32_t g_invalidate_r14[]; |
108 | static uint32_t g_invalidate_r15[]; |
109 | |
110 | static uint32_t g_contained_fip[]; |
111 | static uint32_t g_contained_fdp[]; |
112 | |
113 | static uint32_t g_invalidate_fip[]; |
114 | static uint32_t g_invalidate_fdp[]; |
115 | |
116 | static uint32_t g_contained_st0_32[]; |
117 | static uint32_t g_contained_st1_32[]; |
118 | static uint32_t g_contained_st2_32[]; |
119 | static uint32_t g_contained_st3_32[]; |
120 | static uint32_t g_contained_st4_32[]; |
121 | static uint32_t g_contained_st5_32[]; |
122 | static uint32_t g_contained_st6_32[]; |
123 | static uint32_t g_contained_st7_32[]; |
124 | |
125 | static uint32_t g_invalidate_st0_32[]; |
126 | static uint32_t g_invalidate_st1_32[]; |
127 | static uint32_t g_invalidate_st2_32[]; |
128 | static uint32_t g_invalidate_st3_32[]; |
129 | static uint32_t g_invalidate_st4_32[]; |
130 | static uint32_t g_invalidate_st5_32[]; |
131 | static uint32_t g_invalidate_st6_32[]; |
132 | static uint32_t g_invalidate_st7_32[]; |
133 | |
134 | static uint32_t g_contained_st0_64[]; |
135 | static uint32_t g_contained_st1_64[]; |
136 | static uint32_t g_contained_st2_64[]; |
137 | static uint32_t g_contained_st3_64[]; |
138 | static uint32_t g_contained_st4_64[]; |
139 | static uint32_t g_contained_st5_64[]; |
140 | static uint32_t g_contained_st6_64[]; |
141 | static uint32_t g_contained_st7_64[]; |
142 | |
143 | static uint32_t g_invalidate_st0_64[]; |
144 | static uint32_t g_invalidate_st1_64[]; |
145 | static uint32_t g_invalidate_st2_64[]; |
146 | static uint32_t g_invalidate_st3_64[]; |
147 | static uint32_t g_invalidate_st4_64[]; |
148 | static uint32_t g_invalidate_st5_64[]; |
149 | static uint32_t g_invalidate_st6_64[]; |
150 | static uint32_t g_invalidate_st7_64[]; |
151 | |
152 | protected: |
153 | FPRType |
154 | m_fpr_type; // determines the type of data stored by union FPR, if any. |
155 | lldb_private::FPR m_fpr; // floating-point registers including extended |
156 | // register sets. |
157 | lldb_private::YMM m_ymm_set; // copy of ymmh and xmm register halves. |
158 | std::unique_ptr<lldb_private::RegisterInfoInterface> |
159 | m_register_info_up; // Register Info Interface (FreeBSD or Linux) |
160 | |
161 | // Determines if an extended register set is supported on the processor |
162 | // running the inferior process. |
163 | virtual bool IsRegisterSetAvailable(size_t set_index); |
164 | |
165 | virtual const lldb_private::RegisterInfo *GetRegisterInfo(); |
166 | |
167 | bool IsGPR(unsigned reg); |
168 | |
169 | bool IsFPR(unsigned reg); |
170 | |
171 | bool IsAVX(unsigned reg); |
172 | |
173 | bool CopyXSTATEtoYMM(uint32_t reg, lldb::ByteOrder byte_order); |
174 | bool CopyYMMtoXSTATE(uint32_t reg, lldb::ByteOrder byte_order); |
175 | bool IsFPR(unsigned reg, FPRType fpr_type); |
176 | FPRType GetFPRType(); |
177 | |
178 | virtual bool ReadGPR() = 0; |
179 | virtual bool ReadFPR() = 0; |
180 | virtual bool WriteGPR() = 0; |
181 | virtual bool WriteFPR() = 0; |
182 | virtual lldb_private::RegInfo &GetRegInfo(); |
183 | }; |
184 | |
185 | #endif // LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTPOSIX_X86_H |
186 | |