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