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