1//===-- RegisterContextMinidump_x86_32.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 LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_X86_32_H
10#define LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_X86_32_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_32(llvm::ArrayRef<uint8_t> source_data,
36                              RegisterInfoInterface *target_reg_interface);
37
38// Reference: see breakpad/crashpad source or WinNT.h
39struct 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;
47
48  enum {
49    RegisterAreaSize = 80,
50  };
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;
55};
56
57struct 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;
61
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;
70
71  // The next field is included with
72  // MinidumpContext_x86_32_Flags::FloatingPoint
73  MinidumpFloatingSaveAreaX86 float_save;
74
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;
81
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;
90
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;
99
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."
106  enum {
107    ExtendedRegistersSize = 512,
108  };
109  uint8_t extended_registers[ExtendedRegistersSize];
110};
111
112LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
113
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.
117enum 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,
126
127  Full = Control | Integer | Segments,
128  All = Full | FloatingPoint | DebugRegisters | ExtendedRegisters,
129
130  LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ All)
131};
132
133} // end namespace minidump
134} // end namespace lldb_private
135#endif // LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_X86_32_H
136