1 //===-- RegisterContextMinidump_x86_64.h ------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_RegisterContextMinidump_h_
11 #define liblldb_RegisterContextMinidump_h_
14 #include "MinidumpTypes.h"
16 // Other libraries and framework includes
17 #include "Plugins/Process/Utility/RegisterInfoInterface.h"
18 #include "Plugins/Process/Utility/lldb-x86-register-enums.h"
20 #include "lldb/Target/RegisterContext.h"
22 #include "llvm/ADT/ArrayRef.h"
23 #include "llvm/ADT/BitmaskEnum.h"
24 #include "llvm/Support/Endian.h"
29 namespace lldb_private {
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
38 ConvertMinidumpContext_x86_64(llvm::ArrayRef<uint8_t> source_data,
39 RegisterInfoInterface *target_reg_interface);
42 llvm::support::ulittle64_t high;
43 llvm::support::ulittle64_t low;
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;
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];
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;
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;
80 // The next register is included with
81 // MinidumpContext_x86_64_Flags::Control
82 llvm::support::ulittle16_t cs;
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;
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;
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;
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;
112 // The next register is included with
113 // MinidumpContext_x86_64_Flags::Control
114 llvm::support::ulittle64_t rsp;
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;
130 // The next register is included with
131 // MinidumpContext_x86_64_Flags::Control
132 llvm::support::ulittle64_t rip;
134 // The next set of registers are included with
135 // MinidumpContext_x86_64_Flags:FloatingPoint
137 MinidumpXMMSaveArea32AMD64 flt_save;
149 Uint128 vector_register[VRCount];
150 llvm::support::ulittle64_t vector_control;
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;
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();
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,
175 Full = Control | Integer | FloatingPoint,
176 All = Full | Segments | DebugRegisters,
178 LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ All)
181 } // end namespace minidump
182 } // end namespace lldb_private
183 #endif // liblldb_RegisterContextMinidump_h_