1 //===-- RegisterContextOpenBSD_x86_64.cpp ----------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===---------------------------------------------------------------------===// 9 10 #include "RegisterContextOpenBSD_x86_64.h" 11 #include "RegisterContextPOSIX_x86.h" 12 #include <vector> 13 14 using namespace lldb_private; 15 using namespace lldb; 16 17 // /usr/include/machine/reg.h 18 typedef struct _GPR { 19 uint64_t rdi; 20 uint64_t rsi; 21 uint64_t rdx; 22 uint64_t rcx; 23 uint64_t r8; 24 uint64_t r9; 25 uint64_t r10; 26 uint64_t r11; 27 uint64_t r12; 28 uint64_t r13; 29 uint64_t r14; 30 uint64_t r15; 31 uint64_t rbp; 32 uint64_t rbx; 33 uint64_t rax; 34 uint64_t rsp; 35 uint64_t rip; 36 uint64_t rflags; 37 uint64_t cs; 38 uint64_t ss; 39 uint64_t ds; 40 uint64_t es; 41 uint64_t fs; 42 uint64_t gs; 43 } GPR; 44 45 struct DBG { 46 uint64_t dr[16]; /* debug registers */ 47 /* Index 0-3: debug address registers */ 48 /* Index 4-5: reserved */ 49 /* Index 6: debug status */ 50 /* Index 7: debug control */ 51 /* Index 8-15: reserved */ 52 }; 53 54 struct UserArea { 55 GPR gpr; 56 FPR fpr; 57 DBG dbg; 58 }; 59 60 #define DR_OFFSET(reg_index) (LLVM_EXTENSION offsetof(DBG, dr[reg_index])) 61 62 //--------------------------------------------------------------------------- 63 // Include RegisterInfos_x86_64 to declare our g_register_infos_x86_64 64 // structure. 65 //--------------------------------------------------------------------------- 66 #define DECLARE_REGISTER_INFOS_X86_64_STRUCT 67 #include "RegisterInfos_x86_64.h" 68 #undef DECLARE_REGISTER_INFOS_X86_64_STRUCT 69 70 static std::vector<lldb_private::RegisterInfo> &GetSharedRegisterInfoVector() { 71 static std::vector<lldb_private::RegisterInfo> register_infos; 72 return register_infos; 73 } 74 75 static const RegisterInfo * 76 PrivateGetRegisterInfoPtr(const lldb_private::ArchSpec &target_arch) { 77 switch (target_arch.GetMachine()) { 78 case llvm::Triple::x86_64: 79 return g_register_infos_x86_64; 80 default: 81 assert(false && "Unhandled target architecture."); 82 return nullptr; 83 } 84 } 85 86 static uint32_t 87 PrivateGetRegisterCount(const lldb_private::ArchSpec &target_arch) { 88 switch (target_arch.GetMachine()) { 89 case llvm::Triple::x86_64: 90 return static_cast<uint32_t>(sizeof(g_register_infos_x86_64) / 91 sizeof(g_register_infos_x86_64[0])); 92 default: 93 assert(false && "Unhandled target architecture."); 94 return 0; 95 } 96 } 97 98 RegisterContextOpenBSD_x86_64::RegisterContextOpenBSD_x86_64( 99 const ArchSpec &target_arch) 100 : lldb_private::RegisterInfoInterface(target_arch), 101 m_register_info_p(PrivateGetRegisterInfoPtr(target_arch)), 102 m_register_count(PrivateGetRegisterCount(target_arch)) {} 103 104 size_t RegisterContextOpenBSD_x86_64::GetGPRSize() const { return sizeof(GPR); } 105 106 const RegisterInfo *RegisterContextOpenBSD_x86_64::GetRegisterInfo() const { 107 return m_register_info_p; 108 } 109 110 uint32_t RegisterContextOpenBSD_x86_64::GetRegisterCount() const { 111 return m_register_count; 112 } 113