brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · a160c87 Raw
97 lines · cpp
1//===-- RegisterContextNetBSD_i386.cpp --------------------------*- C++ -*-===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "RegisterContextNetBSD_i386.h"10#include "RegisterContextPOSIX_x86.h"11 12using namespace lldb_private;13using namespace lldb;14 15// this needs to match 'struct reg'16struct GPR {17  uint32_t eax;18  uint32_t ecx;19  uint32_t edx;20  uint32_t ebx;21  uint32_t esp;22  uint32_t ebp;23  uint32_t esi;24  uint32_t edi;25  uint32_t eip;26  uint32_t eflags;27  uint32_t cs;28  uint32_t ss;29  uint32_t ds;30  uint32_t es;31  uint32_t fs;32  uint32_t gs;33};34 35struct FPR_i386 {36  uint16_t fctrl;     // FPU Control Word (fcw)37  uint16_t fstat;     // FPU Status Word (fsw)38  uint16_t ftag;      // FPU Tag Word (ftw)39  uint16_t fop;       // Last Instruction Opcode (fop)40  union {41    struct {42      uint64_t fip; // Instruction Pointer43      uint64_t fdp; // Data Pointer44    } x86_64;45    struct {46      uint32_t fioff; // FPU IP Offset (fip)47      uint32_t fiseg; // FPU IP Selector (fcs)48      uint32_t fooff; // FPU Operand Pointer Offset (foo)49      uint32_t foseg; // FPU Operand Pointer Selector (fos)50    } i386_; // Added _ in the end to avoid error with gcc defining i386 in some51             // cases52  } ptr;53  uint32_t mxcsr;     // MXCSR Register State54  uint32_t mxcsrmask; // MXCSR Mask55  MMSReg stmm[8];     // 8*16 bytes for each FP-reg = 128 bytes56  XMMReg xmm[8];      // 8*16 bytes for each XMM-reg = 128 bytes57  uint32_t padding[56];58};59 60struct UserArea {61  GPR gpr;62  FPR_i386 i387;63  uint32_t u_debugreg[8]; // Debug registers (DR0 - DR7).64  uint32_t tlsbase;65};66 67#define DR_SIZE sizeof(((UserArea *)NULL)->u_debugreg[0])68#define DR_OFFSET(reg_index)                                                   \69  (LLVM_EXTENSION offsetof(UserArea, u_debugreg[reg_index]))70 71// Include RegisterInfos_i386 to declare our g_register_infos_i386 structure.72#define DECLARE_REGISTER_INFOS_I386_STRUCT73#include "RegisterInfos_i386.h"74#undef DECLARE_REGISTER_INFOS_I386_STRUCT75 76RegisterContextNetBSD_i386::RegisterContextNetBSD_i386(77    const ArchSpec &target_arch)78    : RegisterInfoInterface(target_arch) {}79 80size_t RegisterContextNetBSD_i386::GetGPRSize() const { return sizeof(GPR); }81 82const RegisterInfo *RegisterContextNetBSD_i386::GetRegisterInfo() const {83  switch (GetTargetArchitecture().GetMachine()) {84  case llvm::Triple::x86:85  case llvm::Triple::x86_64:86    return g_register_infos_i386;87  default:88    assert(false && "Unhandled target architecture.");89    return nullptr;90  }91}92 93uint32_t RegisterContextNetBSD_i386::GetRegisterCount() const {94  return static_cast<uint32_t>(sizeof(g_register_infos_i386) /95                               sizeof(g_register_infos_i386[0]));96}97