| Index: minidump/minidump_context.h
|
| diff --git a/minidump/minidump_context.h b/minidump/minidump_context.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0c65216e82da2eeafafc33f84eca76b02b25028b
|
| --- /dev/null
|
| +++ b/minidump/minidump_context.h
|
| @@ -0,0 +1,363 @@
|
| +// Copyright 2014 The Crashpad Authors. All rights reserved.
|
| +//
|
| +// Licensed under the Apache License, Version 2.0 (the "License");
|
| +// you may not use this file except in compliance with the License.
|
| +// You may obtain a copy of the License at
|
| +//
|
| +// http://www.apache.org/licenses/LICENSE-2.0
|
| +//
|
| +// Unless required by applicable law or agreed to in writing, software
|
| +// distributed under the License is distributed on an "AS IS" BASIS,
|
| +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +// See the License for the specific language governing permissions and
|
| +// limitations under the License.
|
| +
|
| +#ifndef CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_
|
| +#define CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_
|
| +
|
| +#include <stdint.h>
|
| +
|
| +#include "util/numeric/int128.h"
|
| +
|
| +namespace crashpad {
|
| +
|
| +//! \brief Architecture-independent flags for `context_flags` fields in Minidump
|
| +//! context structures.
|
| +//
|
| +// http://zachsaw.blogspot.com/2010/11/wow64-bug-getthreadcontext-may-return.html#c5639760895973344002
|
| +enum MinidumpContextFlags : uint32_t {
|
| + //! \brief The thread was executing a trap handler in kernel mode
|
| + //! (`CONTEXT_EXCEPTION_ACTIVE`).
|
| + //!
|
| + //! If this bit is set, it indicates that the context is from a thread that
|
| + //! was executing a trap handler in the kernel. This bit is only valid when
|
| + //! ::kMinidumpContextExceptionReporting is also set. This bit is only used on
|
| + //! Windows.
|
| + kMinidumpContextExceptionActive = 0x08000000,
|
| +
|
| + //! \brief The thread was executing a system call in kernel mode
|
| + //! (`CONTEXT_SERVICE_ACTIVE`).
|
| + //!
|
| + //! If this bit is set, it indicates that the context is from a thread that
|
| + //! was executing a system call in the kernel. This bit is only valid when
|
| + //! ::kMinidumpContextExceptionReporting is also set. This bit is only used on
|
| + //! Windows.
|
| + kMinidumpContextServiceActive = 0x10000000,
|
| +
|
| + //! \brief Kernel-mode state reporting is desired
|
| + //! (`CONTEXT_EXCEPTION_REQUEST`).
|
| + //!
|
| + //! This bit is not used in context structures containing snapshots of thread
|
| + //! CPU context. It used when calling `GetThreadContext()` on Windows to
|
| + //! specify that kernel-mode state reporting
|
| + //! (::kMinidumpContextExceptionReporting) is desired in the returned context
|
| + //! structure.
|
| + kMinidumpContextExceptionRequest = 0x40000000,
|
| +
|
| + //! \brief Kernel-mode state reporting is provided
|
| + //! (`CONTEXT_EXCEPTION_REPORTING`).
|
| + //!
|
| + //! If this bit is set, it indicates that the bits indicating how the thread
|
| + //! had entered kernel mode (::kMinidumpContextExceptionActive and
|
| + //! and ::kMinidumpContextServiceActive) are valid. This bit is only used on
|
| + //! Windows.
|
| + kMinidumpContextExceptionReporting = 0x80000000,
|
| +};
|
| +
|
| +//! \brief 32-bit x86-specifc flags for MinidumpContextX86::context_flags.
|
| +enum MinidumpContextX86Flags : uint32_t {
|
| + //! \brief Identifies the context structure as 32-bit x86. This is the same as
|
| + //! `CONTEXT_i386` and `CONTEXT_i486` on Windows for this architecture.
|
| + kMinidumpContextX86 = 0x00010000,
|
| +
|
| + //! \brief Indicates the validity of control registers (`CONTEXT_CONTROL`).
|
| + //!
|
| + //! The `ebp`, `eip`, `cs`, `eflags`, `esp`, and `ss` fields are valid.
|
| + kMinidumpContextX86Control = kMinidumpContextX86 | 0x00000001,
|
| +
|
| + //! \brief Indicates the validity of non-control integer registers
|
| + //! (`CONTEXT_INTEGER`).
|
| + //!
|
| + //! The `edi`, `esi`, `ebx`, `edx`, `ecx, and `eax` fields are valid.
|
| + kMinidumpContextX86Integer = kMinidumpContextX86 | 0x00000002,
|
| +
|
| + //! \brief Indicates the validity of non-control segment registers
|
| + //! (`CONTEXT_SEGMENTS`).
|
| + //!
|
| + //! The `gs`, `fs`, `es`, and `ds` fields are valid.
|
| + kMinidumpContextX86Segment = kMinidumpContextX86 | 0x00000004,
|
| +
|
| + //! \brief Indicates the validity of floating-point state
|
| + //! (`CONTEXT_FLOATING_POINT`).
|
| + //!
|
| + //! The `float_save` field is valid.
|
| + kMinidumpContextX86FloatingPoint = kMinidumpContextX86 | 0x00000008,
|
| +
|
| + //! \brief Indicates the validity of debug registers
|
| + //! (`CONTEXT_DEBUG_REGISTERS`).
|
| + //!
|
| + //! The `dr0` through `dr3`, `dr6`, and `dr7` fields are valid.
|
| + kMinidumpContextX86Debug = kMinidumpContextX86 | 0x00000010,
|
| +
|
| + //! \brief Indicates the validity of extended registers in `fxsave` format
|
| + //! (`CONTEXT_EXTENDED_REGISTERS`).
|
| + //!
|
| + //! The `extended_registers` field is valid and contains `fxsave` data.
|
| + kMinidumpContextX86Extended = kMinidumpContextX86 | 0x00000020,
|
| +
|
| + //! \brief Indicates the validity of `xsave` data (`CONTEXT_XSTATE`).
|
| + //!
|
| + //! The context contains `xsave` data. This is used with an extended context
|
| + //! structure not currently defined here.
|
| + kMinidumpContextX86Xstate = kMinidumpContextX86 | 0x00000040,
|
| +
|
| + //! \brief Indicates the validity of control, integer, and segment registers.
|
| + kMinidumpContextX86Full = kMinidumpContextX86Control |
|
| + kMinidumpContextX86Integer |
|
| + kMinidumpContextX86Segment,
|
| +
|
| + //! \brief Indicates the validity of all registers except `xsave` data.
|
| + kMinidumpContextX86All = kMinidumpContextX86Full |
|
| + kMinidumpContextX86FloatingPoint |
|
| + kMinidumpContextX86Debug |
|
| + kMinidumpContextX86Extended,
|
| +};
|
| +
|
| +//! \brief A 32-bit x86 CPU context (register state) carried in a minidump file.
|
| +//!
|
| +//! This is analogous to the `CONTEXT` structure on Windows when targeting
|
| +//! 32-bit x86. This structure is used instead of `CONTEXT` to make it available
|
| +//! when targeting other architectures.
|
| +struct MinidumpContextX86 {
|
| + //! \brief A bitfield composed of values of #MinidumpContextFlags and
|
| + //! #MinidumpContextX86Flags.
|
| + //!
|
| + //! This field identifies the context structure as a 32-bit x86 CPU context,
|
| + //! and indicates which other fields in the structure are valid.
|
| + uint32_t context_flags;
|
| +
|
| + uint32_t dr0;
|
| + uint32_t dr1;
|
| + uint32_t dr2;
|
| + uint32_t dr3;
|
| + uint32_t dr6;
|
| + uint32_t dr7;
|
| +
|
| + struct {
|
| + uint32_t control_word;
|
| + uint32_t status_word;
|
| + uint32_t tag_word;
|
| + uint32_t error_offset;
|
| + uint32_t error_selector;
|
| + uint32_t data_offset;
|
| + uint32_t data_selector;
|
| + uint8_t register_area[80];
|
| + uint32_t spare_0;
|
| + } float_save;
|
| +
|
| + uint32_t gs;
|
| + uint32_t fs;
|
| + uint32_t es;
|
| + uint32_t ds;
|
| +
|
| + uint32_t edi;
|
| + uint32_t esi;
|
| + uint32_t ebx;
|
| + uint32_t edx;
|
| + uint32_t ecx;
|
| + uint32_t eax;
|
| +
|
| + uint32_t ebp;
|
| + uint32_t eip;
|
| + uint32_t cs;
|
| + uint32_t eflags;
|
| + uint32_t esp;
|
| + uint32_t ss;
|
| +
|
| + uint8_t extended_registers[512];
|
| +};
|
| +
|
| +//! \brief x86_64-specifc flags for MinidumpContextAMD64::context_flags.
|
| +enum MinidumpContextAMD64Flags : uint32_t {
|
| + //! \brief Identifies the context structure as x86_64. This is the same as
|
| + //! `CONTEXT_AMD64` on Windows for this architecture.
|
| + kMinidumpContextAMD64 = 0x00100000,
|
| +
|
| + //! \brief Indicates the validity of control registers (`CONTEXT_CONTROL`).
|
| + //!
|
| + //! The `cs`, `ss`, `eflags`, `rsp`, and `rip` fields are valid.
|
| + kMinidumpContextAMD64Control = kMinidumpContextAMD64 | 0x00000001,
|
| +
|
| + //! \brief Indicates the validity of non-control integer registers
|
| + //! (`CONTEXT_INTEGER`).
|
| + //!
|
| + //! The `rax`, `rcx`, `rdx`, `rbx`, `rbp`, `rsi`, `rdi`, and `r8` through
|
| + //! `r15` fields are valid.
|
| + kMinidumpContextAMD64Integer = kMinidumpContextAMD64 | 0x00000002,
|
| +
|
| + //! \brief Indicates the validity of non-control segment registers
|
| + //! (`CONTEXT_SEGMENTS`).
|
| + //!
|
| + //! The `ds`, `es`, `fs`, and `gs` fields are valid.
|
| + kMinidumpContextAMD64Segment = kMinidumpContextAMD64 | 0x00000004,
|
| +
|
| + //! \brief Indicates the validity of floating-point state
|
| + //! (`CONTEXT_FLOATING_POINT`).
|
| + //!
|
| + //! The `xmm0` through `xmm15` fields are valid.
|
| + kMinidumpContextAMD64FloatingPoint = kMinidumpContextAMD64 | 0x00000008,
|
| +
|
| + //! \brief Indicates the validity of debug registers
|
| + //! (`CONTEXT_DEBUG_REGISTERS`).
|
| + //!
|
| + //! The `dr0` through `dr3`, `dr6`, and `dr7` fields are valid.
|
| + kMinidumpContextAMD64Debug = kMinidumpContextAMD64 | 0x00000010,
|
| +
|
| + //! \brief Indicates the validity of `xsave` data (`CONTEXT_XSTATE`).
|
| + //!
|
| + //! The context contains `xsave` data. This is used with an extended context
|
| + //! structure not currently defined here.
|
| + kMinidumpContextX86Xstate = kMinidumpContextAMD64 | 0x00000040,
|
| +
|
| + //! \brief Indicates the validity of control, integer, and segment registers.
|
| + kMinidumpContextAMD64Full = kMinidumpContextAMD64Control |
|
| + kMinidumpContextAMD64Integer |
|
| + kMinidumpContextAMD64Segment,
|
| +
|
| + //! \brief Indicates the validity of all registers except `xsave` data.
|
| + kMinidumpContextAMD64All = kMinidumpContextAMD64Full |
|
| + kMinidumpContextAMD64FloatingPoint |
|
| + kMinidumpContextAMD64Debug,
|
| +};
|
| +
|
| +//! \brief An x86_64 (AMD64) CPU context (register state) carried in a minidump
|
| +//! file.
|
| +//!
|
| +//! This is analogous to the `CONTEXT` structure on Windows when targeting
|
| +//! x86_64. This structure is used instead of `CONTEXT` to make it available
|
| +//! when targeting other architectures.
|
| +struct __attribute__((aligned(16))) MinidumpContextAMD64 {
|
| + //! \brief Register parameter home address.
|
| + //!
|
| + //! On Windows, this field may contain the “home” address (on-stack, in the
|
| + //! shadow area) of a parameter passed by register. This field is present for
|
| + //! convenience but is not necessarily populated, even if a corresponding
|
| + //! parameter was passed by register.
|
| + //!
|
| + //! \{
|
| + uint64_t p1_home;
|
| + uint64_t p2_home;
|
| + uint64_t p3_home;
|
| + uint64_t p4_home;
|
| + uint64_t p5_home;
|
| + uint64_t p6_home;
|
| + //! \}
|
| +
|
| + //! \brief A bitfield composed of values of #MinidumpContextFlags and
|
| + //! #MinidumpContextAMD64Flags.
|
| + //!
|
| + //! This field identifies the context structure as an x86_64 CPU context, and
|
| + //! indicates which other fields in the structure are valid.
|
| + uint32_t context_flags;
|
| +
|
| + uint32_t mx_csr;
|
| +
|
| + uint16_t cs;
|
| + uint16_t ds;
|
| + uint16_t es;
|
| + uint16_t fs;
|
| + uint16_t gs;
|
| + uint16_t ss;
|
| +
|
| + uint32_t eflags;
|
| +
|
| + uint64_t dr0;
|
| + uint64_t dr1;
|
| + uint64_t dr2;
|
| + uint64_t dr3;
|
| + uint64_t dr6;
|
| + uint64_t dr7;
|
| +
|
| + uint64_t rax;
|
| + uint64_t rcx;
|
| + uint64_t rdx;
|
| + uint64_t rbx;
|
| + uint64_t rsp;
|
| + uint64_t rbp;
|
| + uint64_t rsi;
|
| + uint64_t rdi;
|
| + uint64_t r8;
|
| + uint64_t r9;
|
| + uint64_t r10;
|
| + uint64_t r11;
|
| + uint64_t r12;
|
| + uint64_t r13;
|
| + uint64_t r14;
|
| + uint64_t r15;
|
| +
|
| + uint64_t rip;
|
| +
|
| + union {
|
| + struct {
|
| + uint16_t control_word;
|
| + uint16_t status_word;
|
| + uint8_t tag_word;
|
| + uint8_t reserved_1;
|
| + uint16_t error_opcode;
|
| + uint32_t error_offset;
|
| + uint16_t error_selector;
|
| + uint16_t reserved_2;
|
| + uint32_t data_offset;
|
| + uint16_t data_selector;
|
| + uint16_t reserved_3;
|
| + uint32_t mx_csr;
|
| + uint32_t mx_csr_mask;
|
| + uint128_struct float_registers[8];
|
| + uint128_struct xmm_registers[16];
|
| + uint8_t reserved_4[96];
|
| + } float_save;
|
| + struct {
|
| + uint128_struct header[2];
|
| + uint128_struct legacy[8];
|
| + uint128_struct xmm0;
|
| + uint128_struct xmm1;
|
| + uint128_struct xmm2;
|
| + uint128_struct xmm3;
|
| + uint128_struct xmm4;
|
| + uint128_struct xmm5;
|
| + uint128_struct xmm6;
|
| + uint128_struct xmm7;
|
| + uint128_struct xmm8;
|
| + uint128_struct xmm9;
|
| + uint128_struct xmm10;
|
| + uint128_struct xmm11;
|
| + uint128_struct xmm12;
|
| + uint128_struct xmm13;
|
| + uint128_struct xmm14;
|
| + uint128_struct xmm15;
|
| + };
|
| + };
|
| +
|
| + uint128_struct vector_register[26];
|
| + uint64_t vector_control;
|
| +
|
| + //! \brief Model-specific debug extension register.
|
| + //!
|
| + //! See Intel Software Developer’s Manual, Volume 3B: System Programming, Part
|
| + //! 2 (253669-051), 17.4 “Last Branch, Interrupt, and Exception Recording
|
| + //! Overview”, and AMD Architecture Programmer’s Manual, Volume 2:
|
| + //! System Programming (24593-3.24), 13.1.6 “Control-Transfer Breakpoint
|
| + //! Features”.
|
| + //!
|
| + //! \{
|
| + uint64_t debug_control;
|
| + uint64_t last_branch_to_rip;
|
| + uint64_t last_branch_from_rip;
|
| + uint64_t last_exception_to_rip;
|
| + uint64_t last_exception_from_rip;
|
| + //! \}
|
| +};
|
| +
|
| +} // namespace crashpad
|
| +
|
| +#endif // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_
|
|
|