1dda28197Spatrick //===-- RegisterContextNetBSD_i386.cpp -------------------------*- C++ -*-===// 2dda28197Spatrick // 3dda28197Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4dda28197Spatrick // See https://llvm.org/LICENSE.txt for license information. 5dda28197Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6dda28197Spatrick // 7dda28197Spatrick //===---------------------------------------------------------------------===// 8dda28197Spatrick 9dda28197Spatrick #include "RegisterContextNetBSD_i386.h" 10dda28197Spatrick #include "RegisterContextPOSIX_x86.h" 11dda28197Spatrick 12dda28197Spatrick using namespace lldb_private; 13dda28197Spatrick using namespace lldb; 14dda28197Spatrick 15dda28197Spatrick // this needs to match 'struct reg' 16dda28197Spatrick struct GPR { 17dda28197Spatrick uint32_t eax; 18dda28197Spatrick uint32_t ecx; 19dda28197Spatrick uint32_t edx; 20dda28197Spatrick uint32_t ebx; 21dda28197Spatrick uint32_t esp; 22dda28197Spatrick uint32_t ebp; 23dda28197Spatrick uint32_t esi; 24dda28197Spatrick uint32_t edi; 25dda28197Spatrick uint32_t eip; 26dda28197Spatrick uint32_t eflags; 27dda28197Spatrick uint32_t cs; 28dda28197Spatrick uint32_t ss; 29dda28197Spatrick uint32_t ds; 30dda28197Spatrick uint32_t es; 31dda28197Spatrick uint32_t fs; 32dda28197Spatrick uint32_t gs; 33dda28197Spatrick }; 34dda28197Spatrick 35dda28197Spatrick struct FPR_i386 { 36dda28197Spatrick uint16_t fctrl; // FPU Control Word (fcw) 37dda28197Spatrick uint16_t fstat; // FPU Status Word (fsw) 38dda28197Spatrick uint16_t ftag; // FPU Tag Word (ftw) 39dda28197Spatrick uint16_t fop; // Last Instruction Opcode (fop) 40dda28197Spatrick union { 41dda28197Spatrick struct { 42dda28197Spatrick uint64_t fip; // Instruction Pointer 43dda28197Spatrick uint64_t fdp; // Data Pointer 44dda28197Spatrick } x86_64; 45dda28197Spatrick struct { 46dda28197Spatrick uint32_t fioff; // FPU IP Offset (fip) 47dda28197Spatrick uint32_t fiseg; // FPU IP Selector (fcs) 48dda28197Spatrick uint32_t fooff; // FPU Operand Pointer Offset (foo) 49dda28197Spatrick uint32_t foseg; // FPU Operand Pointer Selector (fos) 50dda28197Spatrick } i386_; // Added _ in the end to avoid error with gcc defining i386 in some 51dda28197Spatrick // cases 52dda28197Spatrick } ptr; 53dda28197Spatrick uint32_t mxcsr; // MXCSR Register State 54dda28197Spatrick uint32_t mxcsrmask; // MXCSR Mask 55dda28197Spatrick MMSReg stmm[8]; // 8*16 bytes for each FP-reg = 128 bytes 56dda28197Spatrick XMMReg xmm[8]; // 8*16 bytes for each XMM-reg = 128 bytes 57dda28197Spatrick uint32_t padding[56]; 58dda28197Spatrick }; 59dda28197Spatrick 60dda28197Spatrick struct UserArea { 61dda28197Spatrick GPR gpr; 62dda28197Spatrick FPR_i386 i387; 63dda28197Spatrick uint32_t u_debugreg[8]; // Debug registers (DR0 - DR7). 64dda28197Spatrick uint32_t tlsbase; 65dda28197Spatrick }; 66dda28197Spatrick 67dda28197Spatrick #define DR_SIZE sizeof(((UserArea *)NULL)->u_debugreg[0]) 68dda28197Spatrick #define DR_OFFSET(reg_index) \ 69dda28197Spatrick (LLVM_EXTENSION offsetof(UserArea, u_debugreg[reg_index])) 70dda28197Spatrick 71dda28197Spatrick // Include RegisterInfos_i386 to declare our g_register_infos_i386 structure. 72dda28197Spatrick #define DECLARE_REGISTER_INFOS_I386_STRUCT 73dda28197Spatrick #include "RegisterInfos_i386.h" 74dda28197Spatrick #undef DECLARE_REGISTER_INFOS_I386_STRUCT 75dda28197Spatrick RegisterContextNetBSD_i386(const ArchSpec & target_arch)76dda28197SpatrickRegisterContextNetBSD_i386::RegisterContextNetBSD_i386( 77dda28197Spatrick const ArchSpec &target_arch) 78dda28197Spatrick : RegisterInfoInterface(target_arch) {} 79dda28197Spatrick GetGPRSize() const80dda28197Spatricksize_t RegisterContextNetBSD_i386::GetGPRSize() const { return sizeof(GPR); } 81dda28197Spatrick GetRegisterInfo() const82dda28197Spatrickconst RegisterInfo *RegisterContextNetBSD_i386::GetRegisterInfo() const { 83*f6aab3d8Srobert switch (GetTargetArchitecture().GetMachine()) { 84dda28197Spatrick case llvm::Triple::x86: 85dda28197Spatrick case llvm::Triple::x86_64: 86dda28197Spatrick return g_register_infos_i386; 87dda28197Spatrick default: 88dda28197Spatrick assert(false && "Unhandled target architecture."); 89dda28197Spatrick return nullptr; 90dda28197Spatrick } 91dda28197Spatrick } 92dda28197Spatrick GetRegisterCount() const93dda28197Spatrickuint32_t RegisterContextNetBSD_i386::GetRegisterCount() const { 94dda28197Spatrick return static_cast<uint32_t>(sizeof(g_register_infos_i386) / 95dda28197Spatrick sizeof(g_register_infos_i386[0])); 96dda28197Spatrick } 97