Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(670)

Unified Diff: minidump/minidump_context.h

Issue 593583004: Add MinidumpContext (X86 and AMD64 variants) and their writers (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: minidump/minidump_context.h
diff --git a/minidump/minidump_context.h b/minidump/minidump_context.h
new file mode 100644
index 0000000000000000000000000000000000000000..448fea00be4afc1bab814b71173f91665f4e0c2f
--- /dev/null
+++ b/minidump/minidump_context.h
@@ -0,0 +1,317 @@
+// 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.
+enum MinidumpContextFlags : uint32_t {
+ //! \brief `CONTEXT_EXCEPTION_ACTIVE`.
+ kMinidumpContextExceptionActive = 0x08000000,
+
+ //! \brief `CONTEXT_SERVICE_ACTIVE`.
Robert Sesek 2014/09/24 15:42:15 Am I supposed to know what these mean?
+ kMinidumpContextServiceActive = 0x10000000,
+
+ //! \brief `CONTEXT_EXCEPTION_REQUEST`.
+ kMinidumpContextExceptionRequest = 0x40000000,
+
+ //! \brief `CONTEXT_EXCEPTION_REPORTING`.
+ 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 {
+ uint64_t p1_home;
Robert Sesek 2014/09/24 15:42:15 What are these used for?
+ 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;
+
+ 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_

Powered by Google App Engine
This is Rietveld 408576698