1 | //===-- RegisterContextOpenBSD_i386.cpp -----------------------------------===// |
---|---|
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-exception |
6 | // |
7 | //===---------------------------------------------------------------------===// |
8 | |
9 | #include "RegisterContextOpenBSD_i386.h" |
10 | #include "RegisterContextPOSIX_x86.h" |
11 | |
12 | using namespace lldb_private; |
13 | using namespace lldb; |
14 | |
15 | // /usr/include/machine/reg.h |
16 | struct 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 | |
35 | struct dbreg { |
36 | uint32_t dr[8]; /* debug registers */ |
37 | /* Index 0-3: debug address registers */ |
38 | /* Index 4-5: reserved */ |
39 | /* Index 6: debug status */ |
40 | /* Index 7: debug control */ |
41 | }; |
42 | |
43 | using FPR_i386 = FXSAVE; |
44 | |
45 | struct UserArea { |
46 | GPR gpr; |
47 | FPR_i386 i387; |
48 | }; |
49 | |
50 | #define DR_SIZE sizeof(uint32_t) |
51 | #define DR_OFFSET(reg_index) (LLVM_EXTENSION offsetof(dbreg, dr[reg_index])) |
52 | |
53 | // Include RegisterInfos_i386 to declare our g_register_infos_i386 structure. |
54 | #define DECLARE_REGISTER_INFOS_I386_STRUCT |
55 | #include "RegisterInfos_i386.h" |
56 | #undef DECLARE_REGISTER_INFOS_I386_STRUCT |
57 | |
58 | RegisterContextOpenBSD_i386::RegisterContextOpenBSD_i386( |
59 | const ArchSpec &target_arch) |
60 | : RegisterInfoInterface(target_arch) {} |
61 | |
62 | size_t RegisterContextOpenBSD_i386::GetGPRSize() const { return sizeof(GPR); } |
63 | |
64 | const RegisterInfo *RegisterContextOpenBSD_i386::GetRegisterInfo() const { |
65 | switch (GetTargetArchitecture().GetMachine()) { |
66 | case llvm::Triple::x86: |
67 | return g_register_infos_i386; |
68 | default: |
69 | assert(false && "Unhandled target architecture."); |
70 | return nullptr; |
71 | } |
72 | } |
73 | |
74 | uint32_t RegisterContextOpenBSD_i386::GetRegisterCount() const { |
75 | return static_cast<uint32_t>(sizeof(g_register_infos_i386) / |
76 | sizeof(g_register_infos_i386[0])); |
77 | } |
78 |