]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - source/Plugins/Process/minidump/RegisterContextMinidump_x86_64.h
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / source / Plugins / Process / minidump / RegisterContextMinidump_x86_64.h
1 //===-- RegisterContextMinidump_x86_64.h ------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef liblldb_RegisterContextMinidump_h_
11 #define liblldb_RegisterContextMinidump_h_
12
13 // Project includes
14 #include "MinidumpTypes.h"
15
16 // Other libraries and framework includes
17 #include "Plugins/Process/Utility/RegisterInfoInterface.h"
18 #include "Plugins/Process/Utility/lldb-x86-register-enums.h"
19
20 #include "lldb/Target/RegisterContext.h"
21
22 #include "llvm/ADT/ArrayRef.h"
23 #include "llvm/ADT/BitmaskEnum.h"
24 #include "llvm/Support/Endian.h"
25
26 // C includes
27 // C++ includes
28
29 namespace lldb_private {
30
31 namespace minidump {
32
33 // This function receives an ArrayRef pointing to the bytes of the Minidump
34 // register context and returns a DataBuffer that's ordered by the offsets
35 // specified in the RegisterInfoInterface argument
36 // This way we can reuse the already existing register contexts
37 lldb::DataBufferSP
38 ConvertMinidumpContext_x86_64(llvm::ArrayRef<uint8_t> source_data,
39                               RegisterInfoInterface *target_reg_interface);
40
41 struct Uint128 {
42   llvm::support::ulittle64_t high;
43   llvm::support::ulittle64_t low;
44 };
45
46 // Reference: see breakpad/crashpad source or WinNT.h
47 struct MinidumpXMMSaveArea32AMD64 {
48   llvm::support::ulittle16_t control_word;
49   llvm::support::ulittle16_t status_word;
50   uint8_t tag_word;
51   uint8_t reserved1;
52   llvm::support::ulittle16_t error_opcode;
53   llvm::support::ulittle32_t error_offset;
54   llvm::support::ulittle16_t error_selector;
55   llvm::support::ulittle16_t reserved2;
56   llvm::support::ulittle32_t data_offset;
57   llvm::support::ulittle16_t data_selector;
58   llvm::support::ulittle16_t reserved3;
59   llvm::support::ulittle32_t mx_csr;
60   llvm::support::ulittle32_t mx_csr_mask;
61   Uint128 float_registers[8];
62   Uint128 xmm_registers[16];
63   uint8_t reserved4[96];
64 };
65
66 struct MinidumpContext_x86_64 {
67   // Register parameter home addresses.
68   llvm::support::ulittle64_t p1_home;
69   llvm::support::ulittle64_t p2_home;
70   llvm::support::ulittle64_t p3_home;
71   llvm::support::ulittle64_t p4_home;
72   llvm::support::ulittle64_t p5_home;
73   llvm::support::ulittle64_t p6_home;
74
75   // The context_flags field determines which parts
76   // of the structure are populated (have valid values)
77   llvm::support::ulittle32_t context_flags;
78   llvm::support::ulittle32_t mx_csr;
79
80   // The next register is included with
81   // MinidumpContext_x86_64_Flags::Control
82   llvm::support::ulittle16_t cs;
83
84   // The next 4 registers are included with
85   // MinidumpContext_x86_64_Flags::Segments
86   llvm::support::ulittle16_t ds;
87   llvm::support::ulittle16_t es;
88   llvm::support::ulittle16_t fs;
89   llvm::support::ulittle16_t gs;
90
91   // The next 2 registers are included with
92   // MinidumpContext_x86_64_Flags::Control
93   llvm::support::ulittle16_t ss;
94   llvm::support::ulittle32_t eflags;
95
96   // The next 6 registers are included with
97   // MinidumpContext_x86_64_Flags::DebugRegisters
98   llvm::support::ulittle64_t dr0;
99   llvm::support::ulittle64_t dr1;
100   llvm::support::ulittle64_t dr2;
101   llvm::support::ulittle64_t dr3;
102   llvm::support::ulittle64_t dr6;
103   llvm::support::ulittle64_t dr7;
104
105   // The next 4 registers are included with
106   // MinidumpContext_x86_64_Flags::Integer
107   llvm::support::ulittle64_t rax;
108   llvm::support::ulittle64_t rcx;
109   llvm::support::ulittle64_t rdx;
110   llvm::support::ulittle64_t rbx;
111
112   // The next register is included with
113   // MinidumpContext_x86_64_Flags::Control
114   llvm::support::ulittle64_t rsp;
115
116   // The next 11 registers are included with
117   // MinidumpContext_x86_64_Flags::Integer
118   llvm::support::ulittle64_t rbp;
119   llvm::support::ulittle64_t rsi;
120   llvm::support::ulittle64_t rdi;
121   llvm::support::ulittle64_t r8;
122   llvm::support::ulittle64_t r9;
123   llvm::support::ulittle64_t r10;
124   llvm::support::ulittle64_t r11;
125   llvm::support::ulittle64_t r12;
126   llvm::support::ulittle64_t r13;
127   llvm::support::ulittle64_t r14;
128   llvm::support::ulittle64_t r15;
129
130   // The next register is included with
131   // MinidumpContext_x86_64_Flags::Control
132   llvm::support::ulittle64_t rip;
133
134   // The next set of registers are included with
135   // MinidumpContext_x86_64_Flags:FloatingPoint
136   union FPR {
137     MinidumpXMMSaveArea32AMD64 flt_save;
138     struct {
139       Uint128 header[2];
140       Uint128 legacy[8];
141       Uint128 xmm[16];
142     } sse_registers;
143   };
144
145   enum {
146     VRCount = 26,
147   };
148
149   Uint128 vector_register[VRCount];
150   llvm::support::ulittle64_t vector_control;
151
152   // The next 5 registers are included with
153   // MinidumpContext_x86_64_Flags::DebugRegisters
154   llvm::support::ulittle64_t debug_control;
155   llvm::support::ulittle64_t last_branch_to_rip;
156   llvm::support::ulittle64_t last_branch_from_rip;
157   llvm::support::ulittle64_t last_exception_to_rip;
158   llvm::support::ulittle64_t last_exception_from_rip;
159 };
160
161 // For context_flags. These values indicate the type of
162 // context stored in the structure. The high 24 bits identify the CPU, the
163 // low 8 bits identify the type of context saved.
164 LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
165
166 enum class MinidumpContext_x86_64_Flags : uint32_t {
167   x86_64_Flag = 0x00100000,
168   Control = x86_64_Flag | 0x00000001,
169   Integer = x86_64_Flag | 0x00000002,
170   Segments = x86_64_Flag | 0x00000004,
171   FloatingPoint = x86_64_Flag | 0x00000008,
172   DebugRegisters = x86_64_Flag | 0x00000010,
173   XState = x86_64_Flag | 0x00000040,
174
175   Full = Control | Integer | FloatingPoint,
176   All = Full | Segments | DebugRegisters,
177
178   LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ All)
179 };
180
181 } // end namespace minidump
182 } // end namespace lldb_private
183 #endif // liblldb_RegisterContextMinidump_h_