180814287SRaphael Isemann //===-- RegisterContextWindows_x86_64.cpp ---------------------------------===//
25146a9eaSAaron Smith //
35146a9eaSAaron Smith // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45146a9eaSAaron Smith // See https://llvm.org/LICENSE.txt for license information.
55146a9eaSAaron Smith // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65146a9eaSAaron Smith //
75146a9eaSAaron Smith //===----------------------------------------------------------------------===//
85146a9eaSAaron Smith 
95146a9eaSAaron Smith #include "RegisterContextWindows_x86_64.h"
105146a9eaSAaron Smith #include "RegisterContext_x86.h"
115146a9eaSAaron Smith #include "lldb-x86-register-enums.h"
125146a9eaSAaron Smith 
135146a9eaSAaron Smith #include <vector>
145146a9eaSAaron Smith 
155146a9eaSAaron Smith using namespace lldb_private;
165146a9eaSAaron Smith using namespace lldb;
175146a9eaSAaron Smith 
185146a9eaSAaron Smith namespace {
195146a9eaSAaron Smith typedef struct _GPR {
205146a9eaSAaron Smith   uint64_t rax;
215146a9eaSAaron Smith   uint64_t rcx;
225146a9eaSAaron Smith   uint64_t rdx;
235146a9eaSAaron Smith   uint64_t rbx;
245146a9eaSAaron Smith   uint64_t rsp;
255146a9eaSAaron Smith   uint64_t rbp;
265146a9eaSAaron Smith   uint64_t rsi;
275146a9eaSAaron Smith   uint64_t rdi;
285146a9eaSAaron Smith   uint64_t r8;
295146a9eaSAaron Smith   uint64_t r9;
305146a9eaSAaron Smith   uint64_t r10;
315146a9eaSAaron Smith   uint64_t r11;
325146a9eaSAaron Smith   uint64_t r12;
335146a9eaSAaron Smith   uint64_t r13;
345146a9eaSAaron Smith   uint64_t r14;
355146a9eaSAaron Smith   uint64_t r15;
365146a9eaSAaron Smith   uint64_t rip;
375146a9eaSAaron Smith   uint64_t rflags;
385146a9eaSAaron Smith   uint16_t cs;
395146a9eaSAaron Smith   uint16_t fs;
405146a9eaSAaron Smith   uint16_t gs;
415146a9eaSAaron Smith   uint16_t ss;
425146a9eaSAaron Smith   uint16_t ds;
435146a9eaSAaron Smith   uint16_t es;
445146a9eaSAaron Smith } GPR;
455146a9eaSAaron Smith 
465146a9eaSAaron Smith #define GPR_OFFSET(regname) (LLVM_EXTENSION offsetof(GPR, regname))
475146a9eaSAaron Smith #define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4)                       \
485146a9eaSAaron Smith   {                                                                            \
495146a9eaSAaron Smith #reg, alt, sizeof(((GPR *)nullptr)->reg), GPR_OFFSET(reg), eEncodingUint,  \
505146a9eaSAaron Smith         eFormatHex,                                                            \
515146a9eaSAaron Smith         {kind1, kind2, kind3, kind4, lldb_##reg##_x86_64 }, nullptr, nullptr,  \
525146a9eaSAaron Smith   }
535146a9eaSAaron Smith 
545146a9eaSAaron Smith typedef struct _FPReg {
555146a9eaSAaron Smith   XMMReg xmm0;
565146a9eaSAaron Smith   XMMReg xmm1;
575146a9eaSAaron Smith   XMMReg xmm2;
585146a9eaSAaron Smith   XMMReg xmm3;
595146a9eaSAaron Smith   XMMReg xmm4;
605146a9eaSAaron Smith   XMMReg xmm5;
615146a9eaSAaron Smith   XMMReg xmm6;
625146a9eaSAaron Smith   XMMReg xmm7;
635146a9eaSAaron Smith   XMMReg xmm8;
645146a9eaSAaron Smith   XMMReg xmm9;
655146a9eaSAaron Smith   XMMReg xmm10;
665146a9eaSAaron Smith   XMMReg xmm11;
675146a9eaSAaron Smith   XMMReg xmm12;
685146a9eaSAaron Smith   XMMReg xmm13;
695146a9eaSAaron Smith   XMMReg xmm14;
705146a9eaSAaron Smith   XMMReg xmm15;
715146a9eaSAaron Smith } FPReg;
725146a9eaSAaron Smith 
735146a9eaSAaron Smith #define FPR_OFFSET(regname)                                                    \
745146a9eaSAaron Smith   (sizeof(GPR) + LLVM_EXTENSION offsetof(FPReg, regname))
755146a9eaSAaron Smith 
765146a9eaSAaron Smith #define DEFINE_XMM(reg)                                                        \
77b6946a2dSJonas Devlieghere   {                                                                            \
78b6946a2dSJonas Devlieghere #reg, NULL, sizeof(((FPReg *)nullptr)->reg), FPR_OFFSET(reg),              \
79b6946a2dSJonas Devlieghere         eEncodingUint, eFormatVectorOfUInt64,                                  \
805146a9eaSAaron Smith         {dwarf_##reg##_x86_64, dwarf_##reg##_x86_64, LLDB_INVALID_REGNUM,      \
815146a9eaSAaron Smith          LLDB_INVALID_REGNUM, lldb_##reg##_x86_64 },                           \
82202af507SPavel Labath          nullptr, nullptr,                                                     \
83b6946a2dSJonas Devlieghere   }
845146a9eaSAaron Smith 
855146a9eaSAaron Smith // clang-format off
865146a9eaSAaron Smith static RegisterInfo g_register_infos_x86_64[] = {
875146a9eaSAaron Smith // General purpose registers     EH_Frame              DWARF                 Generic                     Process Plugin
885146a9eaSAaron Smith //  ===========================  ==================    ================      =========================   ====================
895146a9eaSAaron Smith     DEFINE_GPR(rax,    nullptr,  dwarf_rax_x86_64,     dwarf_rax_x86_64,     LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
905146a9eaSAaron Smith     DEFINE_GPR(rbx,    nullptr,  dwarf_rbx_x86_64,     dwarf_rbx_x86_64,     LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
91e3d878bdSMichał Górny     DEFINE_GPR(rcx,    nullptr,  dwarf_rcx_x86_64,     dwarf_rcx_x86_64,     LLDB_REGNUM_GENERIC_ARG4,   LLDB_INVALID_REGNUM),
92e3d878bdSMichał Górny     DEFINE_GPR(rdx,    nullptr,  dwarf_rdx_x86_64,     dwarf_rdx_x86_64,     LLDB_REGNUM_GENERIC_ARG3,   LLDB_INVALID_REGNUM),
93e3d878bdSMichał Górny     DEFINE_GPR(rdi,    nullptr,  dwarf_rdi_x86_64,     dwarf_rdi_x86_64,     LLDB_REGNUM_GENERIC_ARG1,   LLDB_INVALID_REGNUM),
94e3d878bdSMichał Górny     DEFINE_GPR(rsi,    nullptr,  dwarf_rsi_x86_64,     dwarf_rsi_x86_64,     LLDB_REGNUM_GENERIC_ARG2,   LLDB_INVALID_REGNUM),
95e3d878bdSMichał Górny     DEFINE_GPR(rbp,    nullptr,  dwarf_rbp_x86_64,     dwarf_rbp_x86_64,     LLDB_REGNUM_GENERIC_FP,     LLDB_INVALID_REGNUM),
96e3d878bdSMichał Górny     DEFINE_GPR(rsp,    nullptr,  dwarf_rsp_x86_64,     dwarf_rsp_x86_64,     LLDB_REGNUM_GENERIC_SP,     LLDB_INVALID_REGNUM),
97e3d878bdSMichał Górny     DEFINE_GPR(r8,     nullptr,  dwarf_r8_x86_64,      dwarf_r8_x86_64,      LLDB_REGNUM_GENERIC_ARG5,   LLDB_INVALID_REGNUM),
98e3d878bdSMichał Górny     DEFINE_GPR(r9,     nullptr,  dwarf_r9_x86_64,      dwarf_r9_x86_64,      LLDB_REGNUM_GENERIC_ARG6,   LLDB_INVALID_REGNUM),
995146a9eaSAaron Smith     DEFINE_GPR(r10,    nullptr,  dwarf_r10_x86_64,     dwarf_r10_x86_64,     LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
1005146a9eaSAaron Smith     DEFINE_GPR(r11,    nullptr,  dwarf_r11_x86_64,     dwarf_r11_x86_64,     LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
1015146a9eaSAaron Smith     DEFINE_GPR(r12,    nullptr,  dwarf_r12_x86_64,     dwarf_r12_x86_64,     LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
1025146a9eaSAaron Smith     DEFINE_GPR(r13,    nullptr,  dwarf_r13_x86_64,     dwarf_r13_x86_64,     LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
1035146a9eaSAaron Smith     DEFINE_GPR(r14,    nullptr,  dwarf_r14_x86_64,     dwarf_r14_x86_64,     LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
1045146a9eaSAaron Smith     DEFINE_GPR(r15,    nullptr,  dwarf_r15_x86_64,     dwarf_r15_x86_64,     LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
105e3d878bdSMichał Górny     DEFINE_GPR(rip,    nullptr,  dwarf_rip_x86_64,     dwarf_rip_x86_64,     LLDB_REGNUM_GENERIC_PC,     LLDB_INVALID_REGNUM),
106e3d878bdSMichał Górny     DEFINE_GPR(rflags, nullptr,  dwarf_rflags_x86_64,  dwarf_rflags_x86_64,  LLDB_REGNUM_GENERIC_FLAGS,  LLDB_INVALID_REGNUM),
1075146a9eaSAaron Smith     DEFINE_GPR(cs,     nullptr,  dwarf_cs_x86_64,      dwarf_cs_x86_64,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
1085146a9eaSAaron Smith     DEFINE_GPR(fs,     nullptr,  dwarf_fs_x86_64,      dwarf_fs_x86_64,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
1095146a9eaSAaron Smith     DEFINE_GPR(gs,     nullptr,  dwarf_gs_x86_64,      dwarf_gs_x86_64,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
1105146a9eaSAaron Smith     DEFINE_GPR(ss,     nullptr,  dwarf_ss_x86_64,      dwarf_ss_x86_64,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
1115146a9eaSAaron Smith     DEFINE_GPR(ds,     nullptr,  dwarf_ds_x86_64,      dwarf_ds_x86_64,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
1125146a9eaSAaron Smith     DEFINE_GPR(es,     nullptr,  dwarf_es_x86_64,      dwarf_es_x86_64,      LLDB_INVALID_REGNUM,        LLDB_INVALID_REGNUM),
1135146a9eaSAaron Smith     DEFINE_XMM(xmm0),
1145146a9eaSAaron Smith     DEFINE_XMM(xmm1),
1155146a9eaSAaron Smith     DEFINE_XMM(xmm2),
1165146a9eaSAaron Smith     DEFINE_XMM(xmm3),
1175146a9eaSAaron Smith     DEFINE_XMM(xmm4),
1185146a9eaSAaron Smith     DEFINE_XMM(xmm5),
1195146a9eaSAaron Smith     DEFINE_XMM(xmm6),
1205146a9eaSAaron Smith     DEFINE_XMM(xmm7),
1215146a9eaSAaron Smith     DEFINE_XMM(xmm8),
1225146a9eaSAaron Smith     DEFINE_XMM(xmm9),
1235146a9eaSAaron Smith     DEFINE_XMM(xmm10),
1245146a9eaSAaron Smith     DEFINE_XMM(xmm11),
1255146a9eaSAaron Smith     DEFINE_XMM(xmm12),
1265146a9eaSAaron Smith     DEFINE_XMM(xmm13),
1275146a9eaSAaron Smith     DEFINE_XMM(xmm14),
1285146a9eaSAaron Smith     DEFINE_XMM(xmm15)
1295146a9eaSAaron Smith };
1305146a9eaSAaron Smith // clang-format on
1315146a9eaSAaron Smith } // namespace
1325146a9eaSAaron Smith 
RegisterContextWindows_x86_64(const ArchSpec & target_arch)1335146a9eaSAaron Smith RegisterContextWindows_x86_64::RegisterContextWindows_x86_64(
1345146a9eaSAaron Smith     const ArchSpec &target_arch)
1355146a9eaSAaron Smith     : lldb_private::RegisterInfoInterface(target_arch) {
1365146a9eaSAaron Smith   assert(target_arch.GetMachine() == llvm::Triple::x86_64);
1375146a9eaSAaron Smith }
1385146a9eaSAaron Smith 
GetRegisterInfo() const1395146a9eaSAaron Smith const RegisterInfo *RegisterContextWindows_x86_64::GetRegisterInfo() const {
1405146a9eaSAaron Smith   return g_register_infos_x86_64;
1415146a9eaSAaron Smith }
1425146a9eaSAaron Smith 
GetRegisterCount() const1435146a9eaSAaron Smith uint32_t RegisterContextWindows_x86_64::GetRegisterCount() const {
144*f15014ffSBenjamin Kramer   return llvm::array_lengthof(g_register_infos_x86_64);
1455146a9eaSAaron Smith }
1465146a9eaSAaron Smith 
GetUserRegisterCount() const1475146a9eaSAaron Smith uint32_t RegisterContextWindows_x86_64::GetUserRegisterCount() const {
148*f15014ffSBenjamin Kramer   return llvm::array_lengthof(g_register_infos_x86_64);
1495146a9eaSAaron Smith }
1505146a9eaSAaron Smith 
GetGPRSize() const1515146a9eaSAaron Smith size_t RegisterContextWindows_x86_64::GetGPRSize() const { return sizeof(GPR); }
152