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