10b57cec5SDimitry Andric //===-- RegisterContextMinidump_x86_32.h ------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 95ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_X86_32_H 105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_X86_32_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "MinidumpTypes.h" 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #include "Plugins/Process/Utility/RegisterInfoInterface.h" 150b57cec5SDimitry Andric #include "Plugins/Process/Utility/lldb-x86-register-enums.h" 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric #include "lldb/Target/RegisterContext.h" 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h" 200b57cec5SDimitry Andric #include "llvm/ADT/BitmaskEnum.h" 210b57cec5SDimitry Andric #include "llvm/Support/Endian.h" 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric // C includes 240b57cec5SDimitry Andric // C++ includes 250b57cec5SDimitry Andric 260b57cec5SDimitry Andric namespace lldb_private { 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric namespace minidump { 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric // This function receives an ArrayRef pointing to the bytes of the Minidump 310b57cec5SDimitry Andric // register context and returns a DataBuffer that's ordered by the offsets 320b57cec5SDimitry Andric // specified in the RegisterInfoInterface argument 330b57cec5SDimitry Andric // This way we can reuse the already existing register contexts 340b57cec5SDimitry Andric lldb::DataBufferSP 350b57cec5SDimitry Andric ConvertMinidumpContext_x86_32(llvm::ArrayRef<uint8_t> source_data, 360b57cec5SDimitry Andric RegisterInfoInterface *target_reg_interface); 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric // Reference: see breakpad/crashpad source or WinNT.h 390b57cec5SDimitry Andric struct MinidumpFloatingSaveAreaX86 { 400b57cec5SDimitry Andric llvm::support::ulittle32_t control_word; 410b57cec5SDimitry Andric llvm::support::ulittle32_t status_word; 420b57cec5SDimitry Andric llvm::support::ulittle32_t tag_word; 430b57cec5SDimitry Andric llvm::support::ulittle32_t error_offset; 440b57cec5SDimitry Andric llvm::support::ulittle32_t error_selector; 450b57cec5SDimitry Andric llvm::support::ulittle32_t data_offset; 460b57cec5SDimitry Andric llvm::support::ulittle32_t data_selector; 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric enum { 490b57cec5SDimitry Andric RegisterAreaSize = 80, 500b57cec5SDimitry Andric }; 510b57cec5SDimitry Andric // register_area contains eight 80-bit (x87 "long double") quantities for 520b57cec5SDimitry Andric // floating-point registers %st0 (%mm0) through %st7 (%mm7). 530b57cec5SDimitry Andric uint8_t register_area[RegisterAreaSize]; 540b57cec5SDimitry Andric llvm::support::ulittle32_t cr0_npx_state; 550b57cec5SDimitry Andric }; 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric struct MinidumpContext_x86_32 { 580b57cec5SDimitry Andric // The context_flags field determines which parts 590b57cec5SDimitry Andric // of the structure are populated (have valid values) 600b57cec5SDimitry Andric llvm::support::ulittle32_t context_flags; 610b57cec5SDimitry Andric 620b57cec5SDimitry Andric // The next 6 registers are included with 630b57cec5SDimitry Andric // MinidumpContext_x86_32_Flags::DebugRegisters 640b57cec5SDimitry Andric llvm::support::ulittle32_t dr0; 650b57cec5SDimitry Andric llvm::support::ulittle32_t dr1; 660b57cec5SDimitry Andric llvm::support::ulittle32_t dr2; 670b57cec5SDimitry Andric llvm::support::ulittle32_t dr3; 680b57cec5SDimitry Andric llvm::support::ulittle32_t dr6; 690b57cec5SDimitry Andric llvm::support::ulittle32_t dr7; 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric // The next field is included with 720b57cec5SDimitry Andric // MinidumpContext_x86_32_Flags::FloatingPoint 730b57cec5SDimitry Andric MinidumpFloatingSaveAreaX86 float_save; 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric // The next 4 registers are included with 760b57cec5SDimitry Andric // MinidumpContext_x86_32_Flags::Segments 770b57cec5SDimitry Andric llvm::support::ulittle32_t gs; 780b57cec5SDimitry Andric llvm::support::ulittle32_t fs; 790b57cec5SDimitry Andric llvm::support::ulittle32_t es; 800b57cec5SDimitry Andric llvm::support::ulittle32_t ds; 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric // The next 6 registers are included with 830b57cec5SDimitry Andric // MinidumpContext_x86_32_Flags::Integer 840b57cec5SDimitry Andric llvm::support::ulittle32_t edi; 850b57cec5SDimitry Andric llvm::support::ulittle32_t esi; 860b57cec5SDimitry Andric llvm::support::ulittle32_t ebx; 870b57cec5SDimitry Andric llvm::support::ulittle32_t edx; 880b57cec5SDimitry Andric llvm::support::ulittle32_t ecx; 890b57cec5SDimitry Andric llvm::support::ulittle32_t eax; 900b57cec5SDimitry Andric 910b57cec5SDimitry Andric // The next 6 registers are included with 920b57cec5SDimitry Andric // MinidumpContext_x86_32_Flags::Control 930b57cec5SDimitry Andric llvm::support::ulittle32_t ebp; 940b57cec5SDimitry Andric llvm::support::ulittle32_t eip; 950b57cec5SDimitry Andric llvm::support::ulittle32_t cs; // WinNT.h says "must be sanitized" 960b57cec5SDimitry Andric llvm::support::ulittle32_t eflags; // WinNT.h says "must be sanitized" 970b57cec5SDimitry Andric llvm::support::ulittle32_t esp; 980b57cec5SDimitry Andric llvm::support::ulittle32_t ss; 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andric // The next field is included with 1010b57cec5SDimitry Andric // MinidumpContext_x86_32_Flags::ExtendedRegisters 1025f757f3fSDimitry Andric // It contains vector (MMX/SSE) registers. It is laid out in the 1030b57cec5SDimitry Andric // format used by the fxsave and fsrstor instructions, so it includes 1040b57cec5SDimitry Andric // a copy of the x87 floating-point registers as well. See FXSAVE in 1050b57cec5SDimitry Andric // "Intel Architecture Software Developer's Manual, Volume 2." 1060b57cec5SDimitry Andric enum { 1070b57cec5SDimitry Andric ExtendedRegistersSize = 512, 1080b57cec5SDimitry Andric }; 1090b57cec5SDimitry Andric uint8_t extended_registers[ExtendedRegistersSize]; 1100b57cec5SDimitry Andric }; 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric // For context_flags. These values indicate the type of 1150b57cec5SDimitry Andric // context stored in the structure. The high 24 bits identify the CPU, the 1160b57cec5SDimitry Andric // low 8 bits identify the type of context saved. 1170b57cec5SDimitry Andric enum class MinidumpContext_x86_32_Flags : uint32_t { 1180b57cec5SDimitry Andric x86_32_Flag = 0x00010000, // CONTEXT_i386, CONTEXT_i486 1190b57cec5SDimitry Andric Control = x86_32_Flag | 0x00000001, 1200b57cec5SDimitry Andric Integer = x86_32_Flag | 0x00000002, 1210b57cec5SDimitry Andric Segments = x86_32_Flag | 0x00000004, 1220b57cec5SDimitry Andric FloatingPoint = x86_32_Flag | 0x00000008, 1230b57cec5SDimitry Andric DebugRegisters = x86_32_Flag | 0x00000010, 1240b57cec5SDimitry Andric ExtendedRegisters = x86_32_Flag | 0x00000020, 1250b57cec5SDimitry Andric XState = x86_32_Flag | 0x00000040, 1260b57cec5SDimitry Andric 1270b57cec5SDimitry Andric Full = Control | Integer | Segments, 1280b57cec5SDimitry Andric All = Full | FloatingPoint | DebugRegisters | ExtendedRegisters, 1290b57cec5SDimitry Andric 1300b57cec5SDimitry Andric LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ All) 1310b57cec5SDimitry Andric }; 1320b57cec5SDimitry Andric 1330b57cec5SDimitry Andric } // end namespace minidump 1340b57cec5SDimitry Andric } // end namespace lldb_private 1355ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_X86_32_H 136