xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Process/Utility/RegisterContextNetBSD_i386.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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)76dda28197Spatrick RegisterContextNetBSD_i386::RegisterContextNetBSD_i386(
77dda28197Spatrick     const ArchSpec &target_arch)
78dda28197Spatrick     : RegisterInfoInterface(target_arch) {}
79dda28197Spatrick 
GetGPRSize() const80dda28197Spatrick size_t RegisterContextNetBSD_i386::GetGPRSize() const { return sizeof(GPR); }
81dda28197Spatrick 
GetRegisterInfo() const82dda28197Spatrick const 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() const93dda28197Spatrick uint32_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