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