1*5146a9eaSAaron Smith //===-- RegisterContextWindows_x86_64.cpp -----------------------*- C++ -*-===// 2*5146a9eaSAaron Smith // 3*5146a9eaSAaron Smith // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*5146a9eaSAaron Smith // See https://llvm.org/LICENSE.txt for license information. 5*5146a9eaSAaron Smith // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*5146a9eaSAaron Smith // 7*5146a9eaSAaron Smith //===----------------------------------------------------------------------===// 8*5146a9eaSAaron Smith 9*5146a9eaSAaron Smith #include "RegisterContextWindows_x86_64.h" 10*5146a9eaSAaron Smith #include "RegisterContext_x86.h" 11*5146a9eaSAaron Smith #include "lldb-x86-register-enums.h" 12*5146a9eaSAaron Smith 13*5146a9eaSAaron Smith #include <vector> 14*5146a9eaSAaron Smith 15*5146a9eaSAaron Smith using namespace lldb_private; 16*5146a9eaSAaron Smith using namespace lldb; 17*5146a9eaSAaron Smith 18*5146a9eaSAaron Smith namespace { 19*5146a9eaSAaron Smith typedef struct _GPR { 20*5146a9eaSAaron Smith uint64_t rax; 21*5146a9eaSAaron Smith uint64_t rcx; 22*5146a9eaSAaron Smith uint64_t rdx; 23*5146a9eaSAaron Smith uint64_t rbx; 24*5146a9eaSAaron Smith uint64_t rsp; 25*5146a9eaSAaron Smith uint64_t rbp; 26*5146a9eaSAaron Smith uint64_t rsi; 27*5146a9eaSAaron Smith uint64_t rdi; 28*5146a9eaSAaron Smith uint64_t r8; 29*5146a9eaSAaron Smith uint64_t r9; 30*5146a9eaSAaron Smith uint64_t r10; 31*5146a9eaSAaron Smith uint64_t r11; 32*5146a9eaSAaron Smith uint64_t r12; 33*5146a9eaSAaron Smith uint64_t r13; 34*5146a9eaSAaron Smith uint64_t r14; 35*5146a9eaSAaron Smith uint64_t r15; 36*5146a9eaSAaron Smith uint64_t rip; 37*5146a9eaSAaron Smith uint64_t rflags; 38*5146a9eaSAaron Smith uint16_t cs; 39*5146a9eaSAaron Smith uint16_t fs; 40*5146a9eaSAaron Smith uint16_t gs; 41*5146a9eaSAaron Smith uint16_t ss; 42*5146a9eaSAaron Smith uint16_t ds; 43*5146a9eaSAaron Smith uint16_t es; 44*5146a9eaSAaron Smith } GPR; 45*5146a9eaSAaron Smith 46*5146a9eaSAaron Smith #define GPR_OFFSET(regname) (LLVM_EXTENSION offsetof(GPR, regname)) 47*5146a9eaSAaron Smith #define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4) \ 48*5146a9eaSAaron Smith { \ 49*5146a9eaSAaron Smith #reg, alt, sizeof(((GPR *)nullptr)->reg), GPR_OFFSET(reg), eEncodingUint, \ 50*5146a9eaSAaron Smith eFormatHex, \ 51*5146a9eaSAaron Smith {kind1, kind2, kind3, kind4, lldb_##reg##_x86_64 }, nullptr, nullptr, \ 52*5146a9eaSAaron Smith nullptr, 0 \ 53*5146a9eaSAaron Smith } 54*5146a9eaSAaron Smith 55*5146a9eaSAaron Smith typedef struct _FPReg { 56*5146a9eaSAaron Smith XMMReg xmm0; 57*5146a9eaSAaron Smith XMMReg xmm1; 58*5146a9eaSAaron Smith XMMReg xmm2; 59*5146a9eaSAaron Smith XMMReg xmm3; 60*5146a9eaSAaron Smith XMMReg xmm4; 61*5146a9eaSAaron Smith XMMReg xmm5; 62*5146a9eaSAaron Smith XMMReg xmm6; 63*5146a9eaSAaron Smith XMMReg xmm7; 64*5146a9eaSAaron Smith XMMReg xmm8; 65*5146a9eaSAaron Smith XMMReg xmm9; 66*5146a9eaSAaron Smith XMMReg xmm10; 67*5146a9eaSAaron Smith XMMReg xmm11; 68*5146a9eaSAaron Smith XMMReg xmm12; 69*5146a9eaSAaron Smith XMMReg xmm13; 70*5146a9eaSAaron Smith XMMReg xmm14; 71*5146a9eaSAaron Smith XMMReg xmm15; 72*5146a9eaSAaron Smith } FPReg; 73*5146a9eaSAaron Smith 74*5146a9eaSAaron Smith #define FPR_OFFSET(regname) \ 75*5146a9eaSAaron Smith (sizeof(GPR) + LLVM_EXTENSION offsetof(FPReg, regname)) 76*5146a9eaSAaron Smith 77*5146a9eaSAaron Smith #define DEFINE_XMM(reg) \ 78*5146a9eaSAaron Smith #reg, NULL, sizeof(((FPReg *)nullptr)->reg), FPR_OFFSET(reg), eEncodingUint, \ 79*5146a9eaSAaron Smith eFormatVectorOfUInt64, \ 80*5146a9eaSAaron Smith {dwarf_##reg##_x86_64, dwarf_##reg##_x86_64, LLDB_INVALID_REGNUM, \ 81*5146a9eaSAaron Smith LLDB_INVALID_REGNUM, lldb_##reg##_x86_64 }, \ 82*5146a9eaSAaron Smith nullptr, nullptr, nullptr, 0 83*5146a9eaSAaron Smith 84*5146a9eaSAaron Smith // clang-format off 85*5146a9eaSAaron Smith static RegisterInfo g_register_infos_x86_64[] = { 86*5146a9eaSAaron Smith // General purpose registers EH_Frame DWARF Generic Process Plugin 87*5146a9eaSAaron Smith // =========================== ================== ================ ========================= ==================== 88*5146a9eaSAaron Smith DEFINE_GPR(rax, nullptr, dwarf_rax_x86_64, dwarf_rax_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 89*5146a9eaSAaron Smith DEFINE_GPR(rbx, nullptr, dwarf_rbx_x86_64, dwarf_rbx_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 90*5146a9eaSAaron Smith DEFINE_GPR(rcx, "arg4", dwarf_rcx_x86_64, dwarf_rcx_x86_64, LLDB_REGNUM_GENERIC_ARG4, LLDB_INVALID_REGNUM), 91*5146a9eaSAaron Smith DEFINE_GPR(rdx, "arg3", dwarf_rdx_x86_64, dwarf_rdx_x86_64, LLDB_REGNUM_GENERIC_ARG3, LLDB_INVALID_REGNUM), 92*5146a9eaSAaron Smith DEFINE_GPR(rdi, "arg1", dwarf_rdi_x86_64, dwarf_rdi_x86_64, LLDB_REGNUM_GENERIC_ARG1, LLDB_INVALID_REGNUM), 93*5146a9eaSAaron Smith DEFINE_GPR(rsi, "arg2", dwarf_rsi_x86_64, dwarf_rsi_x86_64, LLDB_REGNUM_GENERIC_ARG2, LLDB_INVALID_REGNUM), 94*5146a9eaSAaron Smith DEFINE_GPR(rbp, "fp", dwarf_rbp_x86_64, dwarf_rbp_x86_64, LLDB_REGNUM_GENERIC_FP, LLDB_INVALID_REGNUM), 95*5146a9eaSAaron Smith DEFINE_GPR(rsp, "sp", dwarf_rsp_x86_64, dwarf_rsp_x86_64, LLDB_REGNUM_GENERIC_SP, LLDB_INVALID_REGNUM), 96*5146a9eaSAaron Smith DEFINE_GPR(r8, "arg5", dwarf_r8_x86_64, dwarf_r8_x86_64, LLDB_REGNUM_GENERIC_ARG5, LLDB_INVALID_REGNUM), 97*5146a9eaSAaron Smith DEFINE_GPR(r9, "arg6", dwarf_r9_x86_64, dwarf_r9_x86_64, LLDB_REGNUM_GENERIC_ARG6, LLDB_INVALID_REGNUM), 98*5146a9eaSAaron Smith DEFINE_GPR(r10, nullptr, dwarf_r10_x86_64, dwarf_r10_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 99*5146a9eaSAaron Smith DEFINE_GPR(r11, nullptr, dwarf_r11_x86_64, dwarf_r11_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 100*5146a9eaSAaron Smith DEFINE_GPR(r12, nullptr, dwarf_r12_x86_64, dwarf_r12_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 101*5146a9eaSAaron Smith DEFINE_GPR(r13, nullptr, dwarf_r13_x86_64, dwarf_r13_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 102*5146a9eaSAaron Smith DEFINE_GPR(r14, nullptr, dwarf_r14_x86_64, dwarf_r14_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 103*5146a9eaSAaron Smith DEFINE_GPR(r15, nullptr, dwarf_r15_x86_64, dwarf_r15_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 104*5146a9eaSAaron Smith DEFINE_GPR(rip, "pc", dwarf_rip_x86_64, dwarf_rip_x86_64, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM), 105*5146a9eaSAaron Smith DEFINE_GPR(rflags, "flags", dwarf_rflags_x86_64, dwarf_rflags_x86_64, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM), 106*5146a9eaSAaron Smith DEFINE_GPR(cs, nullptr, dwarf_cs_x86_64, dwarf_cs_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 107*5146a9eaSAaron Smith DEFINE_GPR(fs, nullptr, dwarf_fs_x86_64, dwarf_fs_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 108*5146a9eaSAaron Smith DEFINE_GPR(gs, nullptr, dwarf_gs_x86_64, dwarf_gs_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 109*5146a9eaSAaron Smith DEFINE_GPR(ss, nullptr, dwarf_ss_x86_64, dwarf_ss_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 110*5146a9eaSAaron Smith DEFINE_GPR(ds, nullptr, dwarf_ds_x86_64, dwarf_ds_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 111*5146a9eaSAaron Smith DEFINE_GPR(es, nullptr, dwarf_es_x86_64, dwarf_es_x86_64, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM), 112*5146a9eaSAaron Smith DEFINE_XMM(xmm0), 113*5146a9eaSAaron Smith DEFINE_XMM(xmm1), 114*5146a9eaSAaron Smith DEFINE_XMM(xmm2), 115*5146a9eaSAaron Smith DEFINE_XMM(xmm3), 116*5146a9eaSAaron Smith DEFINE_XMM(xmm4), 117*5146a9eaSAaron Smith DEFINE_XMM(xmm5), 118*5146a9eaSAaron Smith DEFINE_XMM(xmm6), 119*5146a9eaSAaron Smith DEFINE_XMM(xmm7), 120*5146a9eaSAaron Smith DEFINE_XMM(xmm8), 121*5146a9eaSAaron Smith DEFINE_XMM(xmm9), 122*5146a9eaSAaron Smith DEFINE_XMM(xmm10), 123*5146a9eaSAaron Smith DEFINE_XMM(xmm11), 124*5146a9eaSAaron Smith DEFINE_XMM(xmm12), 125*5146a9eaSAaron Smith DEFINE_XMM(xmm13), 126*5146a9eaSAaron Smith DEFINE_XMM(xmm14), 127*5146a9eaSAaron Smith DEFINE_XMM(xmm15) 128*5146a9eaSAaron Smith }; 129*5146a9eaSAaron Smith // clang-format on 130*5146a9eaSAaron Smith } // namespace 131*5146a9eaSAaron Smith 132*5146a9eaSAaron Smith RegisterContextWindows_x86_64::RegisterContextWindows_x86_64( 133*5146a9eaSAaron Smith const ArchSpec &target_arch) 134*5146a9eaSAaron Smith : lldb_private::RegisterInfoInterface(target_arch) { 135*5146a9eaSAaron Smith assert(target_arch.GetMachine() == llvm::Triple::x86_64); 136*5146a9eaSAaron Smith } 137*5146a9eaSAaron Smith 138*5146a9eaSAaron Smith const RegisterInfo *RegisterContextWindows_x86_64::GetRegisterInfo() const { 139*5146a9eaSAaron Smith return g_register_infos_x86_64; 140*5146a9eaSAaron Smith } 141*5146a9eaSAaron Smith 142*5146a9eaSAaron Smith uint32_t RegisterContextWindows_x86_64::GetRegisterCount() const { 143*5146a9eaSAaron Smith return llvm::array_lengthof(g_register_infos_x86_64); 144*5146a9eaSAaron Smith } 145*5146a9eaSAaron Smith 146*5146a9eaSAaron Smith uint32_t RegisterContextWindows_x86_64::GetUserRegisterCount() const { 147*5146a9eaSAaron Smith return llvm::array_lengthof(g_register_infos_x86_64); 148*5146a9eaSAaron Smith } 149*5146a9eaSAaron Smith 150*5146a9eaSAaron Smith size_t RegisterContextWindows_x86_64::GetGPRSize() const { return sizeof(GPR); } 151