1*f678e45dSDimitry Andric //===-- RegisterContextOpenBSD_i386.cpp ------------------------*- C++ -*-===//
2*f678e45dSDimitry Andric //
3*f678e45dSDimitry Andric //                     The LLVM Compiler Infrastructure
4*f678e45dSDimitry Andric //
5*f678e45dSDimitry Andric // This file is distributed under the University of Illinois Open Source
6*f678e45dSDimitry Andric // License. See LICENSE.TXT for details.
7*f678e45dSDimitry Andric //
8*f678e45dSDimitry Andric //===---------------------------------------------------------------------===//
9*f678e45dSDimitry Andric 
10*f678e45dSDimitry Andric #include "RegisterContextOpenBSD_i386.h"
11*f678e45dSDimitry Andric #include "RegisterContextPOSIX_x86.h"
12*f678e45dSDimitry Andric 
13*f678e45dSDimitry Andric using namespace lldb_private;
14*f678e45dSDimitry Andric using namespace lldb;
15*f678e45dSDimitry Andric 
16*f678e45dSDimitry Andric // /usr/include/machine/reg.h
17*f678e45dSDimitry Andric struct GPR {
18*f678e45dSDimitry Andric   uint32_t eax;
19*f678e45dSDimitry Andric   uint32_t ecx;
20*f678e45dSDimitry Andric   uint32_t edx;
21*f678e45dSDimitry Andric   uint32_t ebx;
22*f678e45dSDimitry Andric   uint32_t esp;
23*f678e45dSDimitry Andric   uint32_t ebp;
24*f678e45dSDimitry Andric   uint32_t esi;
25*f678e45dSDimitry Andric   uint32_t edi;
26*f678e45dSDimitry Andric   uint32_t eip;
27*f678e45dSDimitry Andric   uint32_t eflags;
28*f678e45dSDimitry Andric   uint32_t cs;
29*f678e45dSDimitry Andric   uint32_t ss;
30*f678e45dSDimitry Andric   uint32_t ds;
31*f678e45dSDimitry Andric   uint32_t es;
32*f678e45dSDimitry Andric   uint32_t fs;
33*f678e45dSDimitry Andric   uint32_t gs;
34*f678e45dSDimitry Andric };
35*f678e45dSDimitry Andric 
36*f678e45dSDimitry Andric struct dbreg {
37*f678e45dSDimitry Andric   uint32_t dr[8]; /* debug registers */
38*f678e45dSDimitry Andric                   /* Index 0-3: debug address registers */
39*f678e45dSDimitry Andric                   /* Index 4-5: reserved */
40*f678e45dSDimitry Andric                   /* Index 6: debug status */
41*f678e45dSDimitry Andric                   /* Index 7: debug control */
42*f678e45dSDimitry Andric };
43*f678e45dSDimitry Andric 
44*f678e45dSDimitry Andric using FPR_i386 = FXSAVE;
45*f678e45dSDimitry Andric 
46*f678e45dSDimitry Andric struct UserArea {
47*f678e45dSDimitry Andric   GPR gpr;
48*f678e45dSDimitry Andric   FPR_i386 i387;
49*f678e45dSDimitry Andric };
50*f678e45dSDimitry Andric 
51*f678e45dSDimitry Andric #define DR_SIZE sizeof(uint32_t)
52*f678e45dSDimitry Andric #define DR_OFFSET(reg_index) (LLVM_EXTENSION offsetof(dbreg, dr[reg_index]))
53*f678e45dSDimitry Andric 
54*f678e45dSDimitry Andric //---------------------------------------------------------------------------
55*f678e45dSDimitry Andric // Include RegisterInfos_i386 to declare our g_register_infos_i386 structure.
56*f678e45dSDimitry Andric //---------------------------------------------------------------------------
57*f678e45dSDimitry Andric #define DECLARE_REGISTER_INFOS_I386_STRUCT
58*f678e45dSDimitry Andric #include "RegisterInfos_i386.h"
59*f678e45dSDimitry Andric #undef DECLARE_REGISTER_INFOS_I386_STRUCT
60*f678e45dSDimitry Andric 
RegisterContextOpenBSD_i386(const ArchSpec & target_arch)61*f678e45dSDimitry Andric RegisterContextOpenBSD_i386::RegisterContextOpenBSD_i386(
62*f678e45dSDimitry Andric     const ArchSpec &target_arch)
63*f678e45dSDimitry Andric     : RegisterInfoInterface(target_arch) {}
64*f678e45dSDimitry Andric 
GetGPRSize() const65*f678e45dSDimitry Andric size_t RegisterContextOpenBSD_i386::GetGPRSize() const { return sizeof(GPR); }
66*f678e45dSDimitry Andric 
GetRegisterInfo() const67*f678e45dSDimitry Andric const RegisterInfo *RegisterContextOpenBSD_i386::GetRegisterInfo() const {
68*f678e45dSDimitry Andric   switch (m_target_arch.GetMachine()) {
69*f678e45dSDimitry Andric   case llvm::Triple::x86:
70*f678e45dSDimitry Andric     return g_register_infos_i386;
71*f678e45dSDimitry Andric   default:
72*f678e45dSDimitry Andric     assert(false && "Unhandled target architecture.");
73*f678e45dSDimitry Andric     return NULL;
74*f678e45dSDimitry Andric   }
75*f678e45dSDimitry Andric }
76*f678e45dSDimitry Andric 
GetRegisterCount() const77*f678e45dSDimitry Andric uint32_t RegisterContextOpenBSD_i386::GetRegisterCount() const {
78*f678e45dSDimitry Andric   return static_cast<uint32_t>(sizeof(g_register_infos_i386) /
79*f678e45dSDimitry Andric                                sizeof(g_register_infos_i386[0]));
80*f678e45dSDimitry Andric }
81