1257752Semaste//===-- RegisterContextPOSIX_x86.h ------------------------------*- C++ -*-===// 2257752Semaste// 3257752Semaste// The LLVM Compiler Infrastructure 4257752Semaste// 5257752Semaste// This file is distributed under the University of Illinois Open Source 6257752Semaste// License. See LICENSE.TXT for details. 7257752Semaste// 8257752Semaste//===----------------------------------------------------------------------===// 9257752Semaste 10257752Semaste#ifndef liblldb_RegisterContextPOSIX_x86_H_ 11257752Semaste#define liblldb_RegisterContextPOSIX_x86_H_ 12257752Semaste 13257752Semaste#include "lldb/Core/Log.h" 14257752Semaste#include "RegisterContextPOSIX.h" 15257752Semaste#include "RegisterContext_x86.h" 16257752Semaste 17257752Semasteclass ProcessMonitor; 18257752Semaste 19257752Semaste//--------------------------------------------------------------------------- 20257752Semaste// Internal codes for all i386 registers. 21257752Semaste//--------------------------------------------------------------------------- 22257752Semasteenum 23257752Semaste{ 24257752Semaste k_first_gpr_i386, 25257752Semaste gpr_eax_i386 = k_first_gpr_i386, 26257752Semaste gpr_ebx_i386, 27257752Semaste gpr_ecx_i386, 28257752Semaste gpr_edx_i386, 29257752Semaste gpr_edi_i386, 30257752Semaste gpr_esi_i386, 31257752Semaste gpr_ebp_i386, 32257752Semaste gpr_esp_i386, 33257752Semaste gpr_eip_i386, 34257752Semaste gpr_eflags_i386, 35257752Semaste gpr_cs_i386, 36257752Semaste gpr_fs_i386, 37257752Semaste gpr_gs_i386, 38257752Semaste gpr_ss_i386, 39257752Semaste gpr_ds_i386, 40257752Semaste gpr_es_i386, 41257752Semaste 42257752Semaste k_first_alias_i386, 43257752Semaste gpr_ax_i386 = k_first_alias_i386, 44257752Semaste gpr_bx_i386, 45257752Semaste gpr_cx_i386, 46257752Semaste gpr_dx_i386, 47257752Semaste gpr_di_i386, 48257752Semaste gpr_si_i386, 49257752Semaste gpr_bp_i386, 50257752Semaste gpr_sp_i386, 51257752Semaste gpr_ah_i386, 52257752Semaste gpr_bh_i386, 53257752Semaste gpr_ch_i386, 54257752Semaste gpr_dh_i386, 55257752Semaste gpr_al_i386, 56257752Semaste gpr_bl_i386, 57257752Semaste gpr_cl_i386, 58257752Semaste gpr_dl_i386, 59257752Semaste k_last_alias_i386 = gpr_dl_i386, 60257752Semaste 61257752Semaste k_last_gpr_i386 = k_last_alias_i386, 62257752Semaste 63257752Semaste k_first_fpr_i386, 64257752Semaste fpu_fctrl_i386 = k_first_fpr_i386, 65257752Semaste fpu_fstat_i386, 66257752Semaste fpu_ftag_i386, 67257752Semaste fpu_fop_i386, 68257752Semaste fpu_fiseg_i386, 69257752Semaste fpu_fioff_i386, 70257752Semaste fpu_foseg_i386, 71257752Semaste fpu_fooff_i386, 72257752Semaste fpu_mxcsr_i386, 73257752Semaste fpu_mxcsrmask_i386, 74257752Semaste fpu_st0_i386, 75257752Semaste fpu_st1_i386, 76257752Semaste fpu_st2_i386, 77257752Semaste fpu_st3_i386, 78257752Semaste fpu_st4_i386, 79257752Semaste fpu_st5_i386, 80257752Semaste fpu_st6_i386, 81257752Semaste fpu_st7_i386, 82257752Semaste fpu_mm0_i386, 83257752Semaste fpu_mm1_i386, 84257752Semaste fpu_mm2_i386, 85257752Semaste fpu_mm3_i386, 86257752Semaste fpu_mm4_i386, 87257752Semaste fpu_mm5_i386, 88257752Semaste fpu_mm6_i386, 89257752Semaste fpu_mm7_i386, 90257752Semaste fpu_xmm0_i386, 91257752Semaste fpu_xmm1_i386, 92257752Semaste fpu_xmm2_i386, 93257752Semaste fpu_xmm3_i386, 94257752Semaste fpu_xmm4_i386, 95257752Semaste fpu_xmm5_i386, 96257752Semaste fpu_xmm6_i386, 97257752Semaste fpu_xmm7_i386, 98257752Semaste k_last_fpr_i386 = fpu_xmm7_i386, 99257752Semaste 100257752Semaste k_first_avx_i386, 101257752Semaste fpu_ymm0_i386 = k_first_avx_i386, 102257752Semaste fpu_ymm1_i386, 103257752Semaste fpu_ymm2_i386, 104257752Semaste fpu_ymm3_i386, 105257752Semaste fpu_ymm4_i386, 106257752Semaste fpu_ymm5_i386, 107257752Semaste fpu_ymm6_i386, 108257752Semaste fpu_ymm7_i386, 109257752Semaste k_last_avx_i386 = fpu_ymm7_i386, 110257752Semaste 111257752Semaste dr0_i386, 112257752Semaste dr1_i386, 113257752Semaste dr2_i386, 114257752Semaste dr3_i386, 115257752Semaste dr4_i386, 116257752Semaste dr5_i386, 117257752Semaste dr6_i386, 118257752Semaste dr7_i386, 119257752Semaste 120257752Semaste k_num_registers_i386, 121257752Semaste k_num_gpr_registers_i386 = k_last_gpr_i386 - k_first_gpr_i386 + 1, 122257752Semaste k_num_fpr_registers_i386 = k_last_fpr_i386 - k_first_fpr_i386 + 1, 123257752Semaste k_num_avx_registers_i386 = k_last_avx_i386 - k_first_avx_i386 + 1 124257752Semaste}; 125257752Semaste 126257752Semaste//--------------------------------------------------------------------------- 127257752Semaste// Internal codes for all x86_64 registers. 128257752Semaste//--------------------------------------------------------------------------- 129257752Semasteenum 130257752Semaste{ 131257752Semaste k_first_gpr_x86_64, 132257752Semaste gpr_rax_x86_64 = k_first_gpr_x86_64, 133257752Semaste gpr_rbx_x86_64, 134257752Semaste gpr_rcx_x86_64, 135257752Semaste gpr_rdx_x86_64, 136257752Semaste gpr_rdi_x86_64, 137257752Semaste gpr_rsi_x86_64, 138257752Semaste gpr_rbp_x86_64, 139257752Semaste gpr_rsp_x86_64, 140257752Semaste gpr_r8_x86_64, 141257752Semaste gpr_r9_x86_64, 142257752Semaste gpr_r10_x86_64, 143257752Semaste gpr_r11_x86_64, 144257752Semaste gpr_r12_x86_64, 145257752Semaste gpr_r13_x86_64, 146257752Semaste gpr_r14_x86_64, 147257752Semaste gpr_r15_x86_64, 148257752Semaste gpr_rip_x86_64, 149257752Semaste gpr_rflags_x86_64, 150257752Semaste gpr_cs_x86_64, 151257752Semaste gpr_fs_x86_64, 152257752Semaste gpr_gs_x86_64, 153257752Semaste gpr_ss_x86_64, 154257752Semaste gpr_ds_x86_64, 155257752Semaste gpr_es_x86_64, 156257752Semaste 157257752Semaste k_first_alias_x86_64, 158257752Semaste gpr_eax_x86_64 = k_first_alias_x86_64, 159257752Semaste gpr_ebx_x86_64, 160257752Semaste gpr_ecx_x86_64, 161257752Semaste gpr_edx_x86_64, 162257752Semaste gpr_edi_x86_64, 163257752Semaste gpr_esi_x86_64, 164257752Semaste gpr_ebp_x86_64, 165257752Semaste gpr_esp_x86_64, 166257752Semaste gpr_r8d_x86_64, // Low 32 bits of r8 167257752Semaste gpr_r9d_x86_64, // Low 32 bits of r9 168257752Semaste gpr_r10d_x86_64, // Low 32 bits of r10 169257752Semaste gpr_r11d_x86_64, // Low 32 bits of r11 170257752Semaste gpr_r12d_x86_64, // Low 32 bits of r12 171257752Semaste gpr_r13d_x86_64, // Low 32 bits of r13 172257752Semaste gpr_r14d_x86_64, // Low 32 bits of r14 173257752Semaste gpr_r15d_x86_64, // Low 32 bits of r15 174257752Semaste gpr_ax_x86_64, 175257752Semaste gpr_bx_x86_64, 176257752Semaste gpr_cx_x86_64, 177257752Semaste gpr_dx_x86_64, 178257752Semaste gpr_di_x86_64, 179257752Semaste gpr_si_x86_64, 180257752Semaste gpr_bp_x86_64, 181257752Semaste gpr_sp_x86_64, 182257752Semaste gpr_r8w_x86_64, // Low 16 bits of r8 183257752Semaste gpr_r9w_x86_64, // Low 16 bits of r9 184257752Semaste gpr_r10w_x86_64, // Low 16 bits of r10 185257752Semaste gpr_r11w_x86_64, // Low 16 bits of r11 186257752Semaste gpr_r12w_x86_64, // Low 16 bits of r12 187257752Semaste gpr_r13w_x86_64, // Low 16 bits of r13 188257752Semaste gpr_r14w_x86_64, // Low 16 bits of r14 189257752Semaste gpr_r15w_x86_64, // Low 16 bits of r15 190257752Semaste gpr_ah_x86_64, 191257752Semaste gpr_bh_x86_64, 192257752Semaste gpr_ch_x86_64, 193257752Semaste gpr_dh_x86_64, 194257752Semaste gpr_al_x86_64, 195257752Semaste gpr_bl_x86_64, 196257752Semaste gpr_cl_x86_64, 197257752Semaste gpr_dl_x86_64, 198257752Semaste gpr_dil_x86_64, 199257752Semaste gpr_sil_x86_64, 200257752Semaste gpr_bpl_x86_64, 201257752Semaste gpr_spl_x86_64, 202257752Semaste gpr_r8l_x86_64, // Low 8 bits of r8 203257752Semaste gpr_r9l_x86_64, // Low 8 bits of r9 204257752Semaste gpr_r10l_x86_64, // Low 8 bits of r10 205257752Semaste gpr_r11l_x86_64, // Low 8 bits of r11 206257752Semaste gpr_r12l_x86_64, // Low 8 bits of r12 207257752Semaste gpr_r13l_x86_64, // Low 8 bits of r13 208257752Semaste gpr_r14l_x86_64, // Low 8 bits of r14 209257752Semaste gpr_r15l_x86_64, // Low 8 bits of r15 210257752Semaste k_last_alias_x86_64 = gpr_r15l_x86_64, 211257752Semaste 212257752Semaste k_last_gpr_x86_64 = k_last_alias_x86_64, 213257752Semaste 214257752Semaste k_first_fpr_x86_64, 215257752Semaste fpu_fctrl_x86_64 = k_first_fpr_x86_64, 216257752Semaste fpu_fstat_x86_64, 217257752Semaste fpu_ftag_x86_64, 218257752Semaste fpu_fop_x86_64, 219257752Semaste fpu_fiseg_x86_64, 220257752Semaste fpu_fioff_x86_64, 221257752Semaste fpu_foseg_x86_64, 222257752Semaste fpu_fooff_x86_64, 223257752Semaste fpu_mxcsr_x86_64, 224257752Semaste fpu_mxcsrmask_x86_64, 225257752Semaste fpu_st0_x86_64, 226257752Semaste fpu_st1_x86_64, 227257752Semaste fpu_st2_x86_64, 228257752Semaste fpu_st3_x86_64, 229257752Semaste fpu_st4_x86_64, 230257752Semaste fpu_st5_x86_64, 231257752Semaste fpu_st6_x86_64, 232257752Semaste fpu_st7_x86_64, 233257752Semaste fpu_mm0_x86_64, 234257752Semaste fpu_mm1_x86_64, 235257752Semaste fpu_mm2_x86_64, 236257752Semaste fpu_mm3_x86_64, 237257752Semaste fpu_mm4_x86_64, 238257752Semaste fpu_mm5_x86_64, 239257752Semaste fpu_mm6_x86_64, 240257752Semaste fpu_mm7_x86_64, 241257752Semaste fpu_xmm0_x86_64, 242257752Semaste fpu_xmm1_x86_64, 243257752Semaste fpu_xmm2_x86_64, 244257752Semaste fpu_xmm3_x86_64, 245257752Semaste fpu_xmm4_x86_64, 246257752Semaste fpu_xmm5_x86_64, 247257752Semaste fpu_xmm6_x86_64, 248257752Semaste fpu_xmm7_x86_64, 249257752Semaste fpu_xmm8_x86_64, 250257752Semaste fpu_xmm9_x86_64, 251257752Semaste fpu_xmm10_x86_64, 252257752Semaste fpu_xmm11_x86_64, 253257752Semaste fpu_xmm12_x86_64, 254257752Semaste fpu_xmm13_x86_64, 255257752Semaste fpu_xmm14_x86_64, 256257752Semaste fpu_xmm15_x86_64, 257257752Semaste k_last_fpr_x86_64 = fpu_xmm15_x86_64, 258257752Semaste 259257752Semaste k_first_avx_x86_64, 260257752Semaste fpu_ymm0_x86_64 = k_first_avx_x86_64, 261257752Semaste fpu_ymm1_x86_64, 262257752Semaste fpu_ymm2_x86_64, 263257752Semaste fpu_ymm3_x86_64, 264257752Semaste fpu_ymm4_x86_64, 265257752Semaste fpu_ymm5_x86_64, 266257752Semaste fpu_ymm6_x86_64, 267257752Semaste fpu_ymm7_x86_64, 268257752Semaste fpu_ymm8_x86_64, 269257752Semaste fpu_ymm9_x86_64, 270257752Semaste fpu_ymm10_x86_64, 271257752Semaste fpu_ymm11_x86_64, 272257752Semaste fpu_ymm12_x86_64, 273257752Semaste fpu_ymm13_x86_64, 274257752Semaste fpu_ymm14_x86_64, 275257752Semaste fpu_ymm15_x86_64, 276257752Semaste k_last_avx_x86_64 = fpu_ymm15_x86_64, 277257752Semaste 278257752Semaste dr0_x86_64, 279257752Semaste dr1_x86_64, 280257752Semaste dr2_x86_64, 281257752Semaste dr3_x86_64, 282257752Semaste dr4_x86_64, 283257752Semaste dr5_x86_64, 284257752Semaste dr6_x86_64, 285257752Semaste dr7_x86_64, 286257752Semaste 287257752Semaste k_num_registers_x86_64, 288257752Semaste k_num_gpr_registers_x86_64 = k_last_gpr_x86_64 - k_first_gpr_x86_64 + 1, 289257752Semaste k_num_fpr_registers_x86_64 = k_last_fpr_x86_64 - k_first_fpr_x86_64 + 1, 290257752Semaste k_num_avx_registers_x86_64 = k_last_avx_x86_64 - k_first_avx_x86_64 + 1 291257752Semaste}; 292257752Semaste 293257752Semasteclass RegisterContextPOSIX_x86 294257752Semaste : public lldb_private::RegisterContext 295257752Semaste{ 296257752Semastepublic: 297257752Semaste RegisterContextPOSIX_x86 (lldb_private::Thread &thread, 298257752Semaste uint32_t concrete_frame_idx, 299257752Semaste RegisterInfoInterface *register_info); 300257752Semaste 301257752Semaste ~RegisterContextPOSIX_x86(); 302257752Semaste 303257752Semaste void 304257752Semaste Invalidate(); 305257752Semaste 306257752Semaste void 307257752Semaste InvalidateAllRegisters(); 308257752Semaste 309257752Semaste size_t 310257752Semaste GetRegisterCount(); 311257752Semaste 312257752Semaste virtual size_t 313257752Semaste GetGPRSize(); 314257752Semaste 315257752Semaste virtual unsigned 316257752Semaste GetRegisterSize(unsigned reg); 317257752Semaste 318257752Semaste virtual unsigned 319257752Semaste GetRegisterOffset(unsigned reg); 320257752Semaste 321257752Semaste const lldb_private::RegisterInfo * 322257752Semaste GetRegisterInfoAtIndex(size_t reg); 323257752Semaste 324257752Semaste size_t 325257752Semaste GetRegisterSetCount(); 326257752Semaste 327257752Semaste const lldb_private::RegisterSet * 328257752Semaste GetRegisterSet(size_t set); 329257752Semaste 330257752Semaste const char * 331257752Semaste GetRegisterName(unsigned reg); 332257752Semaste 333257752Semaste uint32_t 334257752Semaste ConvertRegisterKindToRegisterNumber(uint32_t kind, uint32_t num); 335257752Semaste 336257752Semaste //--------------------------------------------------------------------------- 337257752Semaste // Note: prefer kernel definitions over user-land 338257752Semaste //--------------------------------------------------------------------------- 339257752Semaste enum FPRType 340257752Semaste { 341257752Semaste eNotValid = 0, 342257752Semaste eFSAVE, // TODO 343257752Semaste eFXSAVE, 344257752Semaste eSOFT, // TODO 345257752Semaste eXSAVE 346257752Semaste }; 347257752Semaste 348257752Semaste static uint32_t g_contained_eax[]; 349257752Semaste static uint32_t g_contained_ebx[]; 350257752Semaste static uint32_t g_contained_ecx[]; 351257752Semaste static uint32_t g_contained_edx[]; 352257752Semaste static uint32_t g_contained_edi[]; 353257752Semaste static uint32_t g_contained_esi[]; 354257752Semaste static uint32_t g_contained_ebp[]; 355257752Semaste static uint32_t g_contained_esp[]; 356257752Semaste 357257752Semaste static uint32_t g_invalidate_eax[]; 358257752Semaste static uint32_t g_invalidate_ebx[]; 359257752Semaste static uint32_t g_invalidate_ecx[]; 360257752Semaste static uint32_t g_invalidate_edx[]; 361257752Semaste static uint32_t g_invalidate_edi[]; 362257752Semaste static uint32_t g_invalidate_esi[]; 363257752Semaste static uint32_t g_invalidate_ebp[]; 364257752Semaste static uint32_t g_invalidate_esp[]; 365257752Semaste 366257752Semaste static uint32_t g_contained_rax[]; 367257752Semaste static uint32_t g_contained_rbx[]; 368257752Semaste static uint32_t g_contained_rcx[]; 369257752Semaste static uint32_t g_contained_rdx[]; 370257752Semaste static uint32_t g_contained_rdi[]; 371257752Semaste static uint32_t g_contained_rsi[]; 372257752Semaste static uint32_t g_contained_rbp[]; 373257752Semaste static uint32_t g_contained_rsp[]; 374257752Semaste static uint32_t g_contained_r8[]; 375257752Semaste static uint32_t g_contained_r9[]; 376257752Semaste static uint32_t g_contained_r10[]; 377257752Semaste static uint32_t g_contained_r11[]; 378257752Semaste static uint32_t g_contained_r12[]; 379257752Semaste static uint32_t g_contained_r13[]; 380257752Semaste static uint32_t g_contained_r14[]; 381257752Semaste static uint32_t g_contained_r15[]; 382257752Semaste 383257752Semaste static uint32_t g_invalidate_rax[]; 384257752Semaste static uint32_t g_invalidate_rbx[]; 385257752Semaste static uint32_t g_invalidate_rcx[]; 386257752Semaste static uint32_t g_invalidate_rdx[]; 387257752Semaste static uint32_t g_invalidate_rdi[]; 388257752Semaste static uint32_t g_invalidate_rsi[]; 389257752Semaste static uint32_t g_invalidate_rbp[]; 390257752Semaste static uint32_t g_invalidate_rsp[]; 391257752Semaste static uint32_t g_invalidate_r8[]; 392257752Semaste static uint32_t g_invalidate_r9[]; 393257752Semaste static uint32_t g_invalidate_r10[]; 394257752Semaste static uint32_t g_invalidate_r11[]; 395257752Semaste static uint32_t g_invalidate_r12[]; 396257752Semaste static uint32_t g_invalidate_r13[]; 397257752Semaste static uint32_t g_invalidate_r14[]; 398257752Semaste static uint32_t g_invalidate_r15[]; 399257752Semaste 400257752Semasteprotected: 401257752Semaste struct RegInfo 402257752Semaste { 403257752Semaste uint32_t num_registers; 404257752Semaste uint32_t num_gpr_registers; 405257752Semaste uint32_t num_fpr_registers; 406257752Semaste uint32_t num_avx_registers; 407257752Semaste 408257752Semaste uint32_t last_gpr; 409257752Semaste uint32_t first_fpr; 410257752Semaste uint32_t last_fpr; 411257752Semaste 412257752Semaste uint32_t first_st; 413257752Semaste uint32_t last_st; 414257752Semaste uint32_t first_mm; 415257752Semaste uint32_t last_mm; 416257752Semaste uint32_t first_xmm; 417257752Semaste uint32_t last_xmm; 418257752Semaste uint32_t first_ymm; 419257752Semaste uint32_t last_ymm; 420257752Semaste 421257752Semaste uint32_t first_dr; 422257752Semaste uint32_t gpr_flags; 423257752Semaste }; 424257752Semaste 425257752Semaste uint64_t m_gpr_x86_64[k_num_gpr_registers_x86_64]; // 64-bit general purpose registers. 426257752Semaste RegInfo m_reg_info; 427257752Semaste FPRType m_fpr_type; // determines the type of data stored by union FPR, if any. 428257752Semaste FPR m_fpr; // floating-point registers including extended register sets. 429257752Semaste IOVEC m_iovec; // wrapper for xsave. 430257752Semaste YMM m_ymm_set; // copy of ymmh and xmm register halves. 431257752Semaste std::unique_ptr<RegisterInfoInterface> m_register_info_ap; // Register Info Interface (FreeBSD or Linux) 432257752Semaste 433257752Semaste // Determines if an extended register set is supported on the processor running the inferior process. 434257752Semaste virtual bool 435257752Semaste IsRegisterSetAvailable(size_t set_index); 436257752Semaste 437257752Semaste virtual const lldb_private::RegisterInfo * 438257752Semaste GetRegisterInfo(); 439257752Semaste 440257752Semaste bool 441257752Semaste IsGPR(unsigned reg); 442257752Semaste 443257752Semaste bool 444257752Semaste IsFPR(unsigned reg); 445257752Semaste 446257752Semaste bool 447257752Semaste IsAVX(unsigned reg); 448257752Semaste 449257752Semaste lldb::ByteOrder GetByteOrder(); 450257752Semaste 451257752Semaste bool CopyXSTATEtoYMM(uint32_t reg, lldb::ByteOrder byte_order); 452257752Semaste bool CopyYMMtoXSTATE(uint32_t reg, lldb::ByteOrder byte_order); 453257752Semaste bool IsFPR(unsigned reg, FPRType fpr_type); 454257752Semaste FPRType GetFPRType(); 455257752Semaste 456257752Semaste virtual bool ReadGPR() = 0; 457257752Semaste virtual bool ReadFPR() = 0; 458257752Semaste virtual bool WriteGPR() = 0; 459257752Semaste virtual bool WriteFPR() = 0; 460257752Semaste}; 461257752Semaste 462257752Semaste#endif // #ifndef liblldb_RegisterContextPOSIX_x86_H_ 463