1*80814287SRaphael Isemann //===-- RegisterContextOpenBSD_i386.cpp -----------------------------------===//
212801f1eSKamil Rytarowski //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
612801f1eSKamil Rytarowski //
712801f1eSKamil Rytarowski //===---------------------------------------------------------------------===//
812801f1eSKamil Rytarowski 
912801f1eSKamil Rytarowski #include "RegisterContextOpenBSD_i386.h"
1012801f1eSKamil Rytarowski #include "RegisterContextPOSIX_x86.h"
1112801f1eSKamil Rytarowski 
1212801f1eSKamil Rytarowski using namespace lldb_private;
1312801f1eSKamil Rytarowski using namespace lldb;
1412801f1eSKamil Rytarowski 
1512801f1eSKamil Rytarowski // /usr/include/machine/reg.h
1612801f1eSKamil Rytarowski struct GPR {
1712801f1eSKamil Rytarowski   uint32_t eax;
1812801f1eSKamil Rytarowski   uint32_t ecx;
1912801f1eSKamil Rytarowski   uint32_t edx;
2012801f1eSKamil Rytarowski   uint32_t ebx;
2112801f1eSKamil Rytarowski   uint32_t esp;
2212801f1eSKamil Rytarowski   uint32_t ebp;
2312801f1eSKamil Rytarowski   uint32_t esi;
2412801f1eSKamil Rytarowski   uint32_t edi;
2512801f1eSKamil Rytarowski   uint32_t eip;
2612801f1eSKamil Rytarowski   uint32_t eflags;
2712801f1eSKamil Rytarowski   uint32_t cs;
2812801f1eSKamil Rytarowski   uint32_t ss;
2912801f1eSKamil Rytarowski   uint32_t ds;
3012801f1eSKamil Rytarowski   uint32_t es;
3112801f1eSKamil Rytarowski   uint32_t fs;
3212801f1eSKamil Rytarowski   uint32_t gs;
3312801f1eSKamil Rytarowski };
3412801f1eSKamil Rytarowski 
3512801f1eSKamil Rytarowski struct dbreg {
3612801f1eSKamil Rytarowski   uint32_t dr[8]; /* debug registers */
3712801f1eSKamil Rytarowski                   /* Index 0-3: debug address registers */
3812801f1eSKamil Rytarowski                   /* Index 4-5: reserved */
3912801f1eSKamil Rytarowski                   /* Index 6: debug status */
4012801f1eSKamil Rytarowski                   /* Index 7: debug control */
4112801f1eSKamil Rytarowski };
4212801f1eSKamil Rytarowski 
4312801f1eSKamil Rytarowski using FPR_i386 = FXSAVE;
4412801f1eSKamil Rytarowski 
4512801f1eSKamil Rytarowski struct UserArea {
4612801f1eSKamil Rytarowski   GPR gpr;
4712801f1eSKamil Rytarowski   FPR_i386 i387;
4812801f1eSKamil Rytarowski };
4912801f1eSKamil Rytarowski 
5012801f1eSKamil Rytarowski #define DR_SIZE sizeof(uint32_t)
5112801f1eSKamil Rytarowski #define DR_OFFSET(reg_index) (LLVM_EXTENSION offsetof(dbreg, dr[reg_index]))
5212801f1eSKamil Rytarowski 
5312801f1eSKamil Rytarowski // Include RegisterInfos_i386 to declare our g_register_infos_i386 structure.
5412801f1eSKamil Rytarowski #define DECLARE_REGISTER_INFOS_I386_STRUCT
5512801f1eSKamil Rytarowski #include "RegisterInfos_i386.h"
5612801f1eSKamil Rytarowski #undef DECLARE_REGISTER_INFOS_I386_STRUCT
5712801f1eSKamil Rytarowski 
RegisterContextOpenBSD_i386(const ArchSpec & target_arch)5812801f1eSKamil Rytarowski RegisterContextOpenBSD_i386::RegisterContextOpenBSD_i386(
5912801f1eSKamil Rytarowski     const ArchSpec &target_arch)
6012801f1eSKamil Rytarowski     : RegisterInfoInterface(target_arch) {}
6112801f1eSKamil Rytarowski 
GetGPRSize() const6212801f1eSKamil Rytarowski size_t RegisterContextOpenBSD_i386::GetGPRSize() const { return sizeof(GPR); }
6312801f1eSKamil Rytarowski 
GetRegisterInfo() const6412801f1eSKamil Rytarowski const RegisterInfo *RegisterContextOpenBSD_i386::GetRegisterInfo() const {
6512801f1eSKamil Rytarowski   switch (m_target_arch.GetMachine()) {
6612801f1eSKamil Rytarowski   case llvm::Triple::x86:
6712801f1eSKamil Rytarowski     return g_register_infos_i386;
6812801f1eSKamil Rytarowski   default:
6912801f1eSKamil Rytarowski     assert(false && "Unhandled target architecture.");
70248a1305SKonrad Kleine     return nullptr;
7112801f1eSKamil Rytarowski   }
7212801f1eSKamil Rytarowski }
7312801f1eSKamil Rytarowski 
GetRegisterCount() const7412801f1eSKamil Rytarowski uint32_t RegisterContextOpenBSD_i386::GetRegisterCount() const {
7512801f1eSKamil Rytarowski   return static_cast<uint32_t>(sizeof(g_register_infos_i386) /
7612801f1eSKamil Rytarowski                                sizeof(g_register_infos_i386[0]));
7712801f1eSKamil Rytarowski }
78