1 //===-- RegisterContextMinidump_x86_32.h ------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_X86_32_H
10 #define LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_X86_32_H
12 #include "MinidumpTypes.h"
14 #include "Plugins/Process/Utility/RegisterInfoInterface.h"
15 #include "Plugins/Process/Utility/lldb-x86-register-enums.h"
17 #include "lldb/Target/RegisterContext.h"
19 #include "llvm/ADT/ArrayRef.h"
20 #include "llvm/ADT/BitmaskEnum.h"
21 #include "llvm/Support/Endian.h"
26 namespace lldb_private
{
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
35 ConvertMinidumpContext_x86_32(llvm::ArrayRef
<uint8_t> source_data
,
36 RegisterInfoInterface
*target_reg_interface
);
38 // Reference: see breakpad/crashpad source or WinNT.h
39 struct MinidumpFloatingSaveAreaX86
{
40 llvm::support::ulittle32_t control_word
;
41 llvm::support::ulittle32_t status_word
;
42 llvm::support::ulittle32_t tag_word
;
43 llvm::support::ulittle32_t error_offset
;
44 llvm::support::ulittle32_t error_selector
;
45 llvm::support::ulittle32_t data_offset
;
46 llvm::support::ulittle32_t data_selector
;
49 RegisterAreaSize
= 80,
51 // register_area contains eight 80-bit (x87 "long double") quantities for
52 // floating-point registers %st0 (%mm0) through %st7 (%mm7).
53 uint8_t register_area
[RegisterAreaSize
];
54 llvm::support::ulittle32_t cr0_npx_state
;
57 struct MinidumpContext_x86_32
{
58 // The context_flags field determines which parts
59 // of the structure are populated (have valid values)
60 llvm::support::ulittle32_t context_flags
;
62 // The next 6 registers are included with
63 // MinidumpContext_x86_32_Flags::DebugRegisters
64 llvm::support::ulittle32_t dr0
;
65 llvm::support::ulittle32_t dr1
;
66 llvm::support::ulittle32_t dr2
;
67 llvm::support::ulittle32_t dr3
;
68 llvm::support::ulittle32_t dr6
;
69 llvm::support::ulittle32_t dr7
;
71 // The next field is included with
72 // MinidumpContext_x86_32_Flags::FloatingPoint
73 MinidumpFloatingSaveAreaX86 float_save
;
75 // The next 4 registers are included with
76 // MinidumpContext_x86_32_Flags::Segments
77 llvm::support::ulittle32_t gs
;
78 llvm::support::ulittle32_t fs
;
79 llvm::support::ulittle32_t es
;
80 llvm::support::ulittle32_t ds
;
82 // The next 6 registers are included with
83 // MinidumpContext_x86_32_Flags::Integer
84 llvm::support::ulittle32_t edi
;
85 llvm::support::ulittle32_t esi
;
86 llvm::support::ulittle32_t ebx
;
87 llvm::support::ulittle32_t edx
;
88 llvm::support::ulittle32_t ecx
;
89 llvm::support::ulittle32_t eax
;
91 // The next 6 registers are included with
92 // MinidumpContext_x86_32_Flags::Control
93 llvm::support::ulittle32_t ebp
;
94 llvm::support::ulittle32_t eip
;
95 llvm::support::ulittle32_t cs
; // WinNT.h says "must be sanitized"
96 llvm::support::ulittle32_t eflags
; // WinNT.h says "must be sanitized"
97 llvm::support::ulittle32_t esp
;
98 llvm::support::ulittle32_t ss
;
100 // The next field is included with
101 // MinidumpContext_x86_32_Flags::ExtendedRegisters
102 // It contains vector (MMX/SSE) registers. It is laid out in the
103 // format used by the fxsave and fsrstor instructions, so it includes
104 // a copy of the x87 floating-point registers as well. See FXSAVE in
105 // "Intel Architecture Software Developer's Manual, Volume 2."
107 ExtendedRegistersSize
= 512,
109 uint8_t extended_registers
[ExtendedRegistersSize
];
112 LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
114 // For context_flags. These values indicate the type of
115 // context stored in the structure. The high 24 bits identify the CPU, the
116 // low 8 bits identify the type of context saved.
117 enum class MinidumpContext_x86_32_Flags
: uint32_t {
118 x86_32_Flag
= 0x00010000, // CONTEXT_i386, CONTEXT_i486
119 Control
= x86_32_Flag
| 0x00000001,
120 Integer
= x86_32_Flag
| 0x00000002,
121 Segments
= x86_32_Flag
| 0x00000004,
122 FloatingPoint
= x86_32_Flag
| 0x00000008,
123 DebugRegisters
= x86_32_Flag
| 0x00000010,
124 ExtendedRegisters
= x86_32_Flag
| 0x00000020,
125 XState
= x86_32_Flag
| 0x00000040,
127 Full
= Control
| Integer
| Segments
,
128 All
= Full
| FloatingPoint
| DebugRegisters
| ExtendedRegisters
,
130 LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ All
)
133 } // end namespace minidump
134 } // end namespace lldb_private
135 #endif // LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_X86_32_H