1*f678e45dSDimitry Andric //===-- RegisterContextOpenBSD_i386.cpp ------------------------*- C++ -*-===// 2*f678e45dSDimitry Andric // 3*f678e45dSDimitry Andric // The LLVM Compiler Infrastructure 4*f678e45dSDimitry Andric // 5*f678e45dSDimitry Andric // This file is distributed under the University of Illinois Open Source 6*f678e45dSDimitry Andric // License. See LICENSE.TXT for details. 7*f678e45dSDimitry Andric // 8*f678e45dSDimitry Andric //===---------------------------------------------------------------------===// 9*f678e45dSDimitry Andric 10*f678e45dSDimitry Andric #include "RegisterContextOpenBSD_i386.h" 11*f678e45dSDimitry Andric #include "RegisterContextPOSIX_x86.h" 12*f678e45dSDimitry Andric 13*f678e45dSDimitry Andric using namespace lldb_private; 14*f678e45dSDimitry Andric using namespace lldb; 15*f678e45dSDimitry Andric 16*f678e45dSDimitry Andric // /usr/include/machine/reg.h 17*f678e45dSDimitry Andric struct GPR { 18*f678e45dSDimitry Andric uint32_t eax; 19*f678e45dSDimitry Andric uint32_t ecx; 20*f678e45dSDimitry Andric uint32_t edx; 21*f678e45dSDimitry Andric uint32_t ebx; 22*f678e45dSDimitry Andric uint32_t esp; 23*f678e45dSDimitry Andric uint32_t ebp; 24*f678e45dSDimitry Andric uint32_t esi; 25*f678e45dSDimitry Andric uint32_t edi; 26*f678e45dSDimitry Andric uint32_t eip; 27*f678e45dSDimitry Andric uint32_t eflags; 28*f678e45dSDimitry Andric uint32_t cs; 29*f678e45dSDimitry Andric uint32_t ss; 30*f678e45dSDimitry Andric uint32_t ds; 31*f678e45dSDimitry Andric uint32_t es; 32*f678e45dSDimitry Andric uint32_t fs; 33*f678e45dSDimitry Andric uint32_t gs; 34*f678e45dSDimitry Andric }; 35*f678e45dSDimitry Andric 36*f678e45dSDimitry Andric struct dbreg { 37*f678e45dSDimitry Andric uint32_t dr[8]; /* debug registers */ 38*f678e45dSDimitry Andric /* Index 0-3: debug address registers */ 39*f678e45dSDimitry Andric /* Index 4-5: reserved */ 40*f678e45dSDimitry Andric /* Index 6: debug status */ 41*f678e45dSDimitry Andric /* Index 7: debug control */ 42*f678e45dSDimitry Andric }; 43*f678e45dSDimitry Andric 44*f678e45dSDimitry Andric using FPR_i386 = FXSAVE; 45*f678e45dSDimitry Andric 46*f678e45dSDimitry Andric struct UserArea { 47*f678e45dSDimitry Andric GPR gpr; 48*f678e45dSDimitry Andric FPR_i386 i387; 49*f678e45dSDimitry Andric }; 50*f678e45dSDimitry Andric 51*f678e45dSDimitry Andric #define DR_SIZE sizeof(uint32_t) 52*f678e45dSDimitry Andric #define DR_OFFSET(reg_index) (LLVM_EXTENSION offsetof(dbreg, dr[reg_index])) 53*f678e45dSDimitry Andric 54*f678e45dSDimitry Andric //--------------------------------------------------------------------------- 55*f678e45dSDimitry Andric // Include RegisterInfos_i386 to declare our g_register_infos_i386 structure. 56*f678e45dSDimitry Andric //--------------------------------------------------------------------------- 57*f678e45dSDimitry Andric #define DECLARE_REGISTER_INFOS_I386_STRUCT 58*f678e45dSDimitry Andric #include "RegisterInfos_i386.h" 59*f678e45dSDimitry Andric #undef DECLARE_REGISTER_INFOS_I386_STRUCT 60*f678e45dSDimitry Andric RegisterContextOpenBSD_i386(const ArchSpec & target_arch)61*f678e45dSDimitry AndricRegisterContextOpenBSD_i386::RegisterContextOpenBSD_i386( 62*f678e45dSDimitry Andric const ArchSpec &target_arch) 63*f678e45dSDimitry Andric : RegisterInfoInterface(target_arch) {} 64*f678e45dSDimitry Andric GetGPRSize() const65*f678e45dSDimitry Andricsize_t RegisterContextOpenBSD_i386::GetGPRSize() const { return sizeof(GPR); } 66*f678e45dSDimitry Andric GetRegisterInfo() const67*f678e45dSDimitry Andricconst RegisterInfo *RegisterContextOpenBSD_i386::GetRegisterInfo() const { 68*f678e45dSDimitry Andric switch (m_target_arch.GetMachine()) { 69*f678e45dSDimitry Andric case llvm::Triple::x86: 70*f678e45dSDimitry Andric return g_register_infos_i386; 71*f678e45dSDimitry Andric default: 72*f678e45dSDimitry Andric assert(false && "Unhandled target architecture."); 73*f678e45dSDimitry Andric return NULL; 74*f678e45dSDimitry Andric } 75*f678e45dSDimitry Andric } 76*f678e45dSDimitry Andric GetRegisterCount() const77*f678e45dSDimitry Andricuint32_t RegisterContextOpenBSD_i386::GetRegisterCount() const { 78*f678e45dSDimitry Andric return static_cast<uint32_t>(sizeof(g_register_infos_i386) / 79*f678e45dSDimitry Andric sizeof(g_register_infos_i386[0])); 80*f678e45dSDimitry Andric } 81