1 //===-- RegisterContextFreeBSD_i386.cpp -----------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===---------------------------------------------------------------------===// 8 9 #include "RegisterContextFreeBSD_i386.h" 10 #include "RegisterContextPOSIX_x86.h" 11 12 using namespace lldb_private; 13 using namespace lldb; 14 15 // http://svnweb.freebsd.org/base/head/sys/x86/include/reg.h 16 struct GPR { 17 uint32_t fs; 18 uint32_t es; 19 uint32_t ds; 20 uint32_t edi; 21 uint32_t esi; 22 uint32_t ebp; 23 uint32_t isp; 24 uint32_t ebx; 25 uint32_t edx; 26 uint32_t ecx; 27 uint32_t eax; 28 uint32_t trapno; 29 uint32_t err; 30 uint32_t eip; 31 uint32_t cs; 32 uint32_t eflags; 33 uint32_t esp; 34 uint32_t ss; 35 uint32_t gs; 36 }; 37 38 struct DBG { 39 uint32_t dr[8]; /* debug registers */ 40 /* Index 0-3: debug address registers */ 41 /* Index 4-5: reserved */ 42 /* Index 6: debug status */ 43 /* Index 7: debug control */ 44 }; 45 46 using FPR_i386 = FXSAVE; 47 48 struct UserArea { 49 GPR gpr; 50 FPR_i386 i387; 51 DBG dbg; 52 }; 53 54 #define DR_SIZE sizeof(uint32_t) 55 #define DR_OFFSET(reg_index) \ 56 (LLVM_EXTENSION offsetof(UserArea, dbg) + \ 57 LLVM_EXTENSION offsetof(DBG, dr[reg_index])) 58 59 // Include RegisterInfos_i386 to declare our g_register_infos_i386 structure. 60 #define DECLARE_REGISTER_INFOS_I386_STRUCT 61 #include "RegisterInfos_i386.h" 62 #undef DECLARE_REGISTER_INFOS_I386_STRUCT 63 RegisterContextFreeBSD_i386(const ArchSpec & target_arch)64RegisterContextFreeBSD_i386::RegisterContextFreeBSD_i386( 65 const ArchSpec &target_arch) 66 : RegisterInfoInterface(target_arch) {} 67 GetGPRSize() const68size_t RegisterContextFreeBSD_i386::GetGPRSize() const { return sizeof(GPR); } 69 GetRegisterInfo() const70const RegisterInfo *RegisterContextFreeBSD_i386::GetRegisterInfo() const { 71 switch (GetTargetArchitecture().GetMachine()) { 72 case llvm::Triple::x86: 73 return g_register_infos_i386; 74 default: 75 assert(false && "Unhandled target architecture."); 76 return nullptr; 77 } 78 } 79 GetRegisterCount() const80uint32_t RegisterContextFreeBSD_i386::GetRegisterCount() const { 81 return static_cast<uint32_t>(sizeof(g_register_infos_i386) / 82 sizeof(g_register_infos_i386[0])); 83 } 84