| // Copyright 2014 The Crashpad Authors | 
 | // | 
 | // 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 "base/compiler_specific.h" | 
 | #include "snapshot/cpu_context.h" | 
 | #include "util/numeric/int128.h" | 
 |  | 
 | namespace crashpad { | 
 |  | 
 | //! \brief Architecture-independent flags for `context_flags` fields in Minidump | 
 | //!    context structures. | 
 | // | 
 | // https://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 | 
 |   //! ::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 `fsave` field is valid. The `float_save` field is included in this | 
 |   //! definition, but its members have no practical use asdie from `fsave`. | 
 |   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. | 
 |   //!     (`CONTEXT_FULL`). | 
 |   kMinidumpContextX86Full = kMinidumpContextX86Control | | 
 |                             kMinidumpContextX86Integer | | 
 |                             kMinidumpContextX86Segment, | 
 |  | 
 |   //! \brief Indicates the validity of all registers except `xsave` data. | 
 |   //!     (`CONTEXT_ALL`). | 
 |   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, and the `WOW64_CONTEXT` structure when targeting an x86-family | 
 | //! CPU, either 32- or 64-bit. This structure is used instead of `CONTEXT` or | 
 | //! `WOW64_CONTEXT` to make it available when targeting other architectures. | 
 | //! | 
 | //! \note This structure doesn’t carry `dr4` or `dr5`, which are obsolete and | 
 | //!     normally alias `dr6` and `dr7`, respectively. See Intel Software | 
 | //!     Developer’s Manual, Volume 3B: System Programming, Part 2 (253669-052), | 
 | //!     17.2.2 “Debug Registers DR4 and DR5”. | 
 | 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; | 
 |  | 
 |   // CPUContextX86::Fsave has identical layout to what the x86 CONTEXT structure | 
 |   // places here. | 
 |   CPUContextX86::Fsave fsave; | 
 |   union { | 
 |     uint32_t spare_0;  // As in the native x86 CONTEXT structure since Windows 8 | 
 |     uint32_t cr0_npx_state;  // As in WOW64_CONTEXT and older SDKs’ x86 CONTEXT | 
 |   } 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; | 
 |  | 
 |   // CPUContextX86::Fxsave has identical layout to what the x86 CONTEXT | 
 |   // structure places here. | 
 |   CPUContextX86::Fxsave fxsave; | 
 | }; | 
 |  | 
 | //! \brief x86_64-specific 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 which is partly implemented for CET state only. | 
 |   kMinidumpContextAMD64Xstate = kMinidumpContextAMD64 | 0x00000040, | 
 |  | 
 |   //! \brief Indicates the validity of control, integer, and floating-point | 
 |   //!     registers (`CONTEXT_FULL`). | 
 |   kMinidumpContextAMD64Full = kMinidumpContextAMD64Control | | 
 |                               kMinidumpContextAMD64Integer | | 
 |                               kMinidumpContextAMD64FloatingPoint, | 
 |  | 
 |   //! \brief Indicates the validity of all registers except `xsave` data | 
 |   //!     (`CONTEXT_ALL`). | 
 |   kMinidumpContextAMD64All = kMinidumpContextAMD64Full | | 
 |                              kMinidumpContextAMD64Segment | | 
 |                              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. | 
 | //! | 
 | //! \note This structure doesn’t carry `dr4` or `dr5`, which are obsolete and | 
 | //!     normally alias `dr6` and `dr7`, respectively. See Intel Software | 
 | //!     Developer’s Manual, Volume 3B: System Programming, Part 2 (253669-052), | 
 | //!     17.2.2 “Debug Registers DR4 and DR5”. | 
 | struct alignas(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; | 
 |  | 
 |   // CPUContextX86_64::Fxsave has identical layout to what the x86_64 CONTEXT | 
 |   // structure places here. | 
 |   CPUContextX86_64::Fxsave fxsave; | 
 |  | 
 |   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; | 
 |   //! \} | 
 | }; | 
 |  | 
 | //! \brief 32-bit ARM-specifc flags for MinidumpContextARM::context_flags. | 
 | enum MinidumpContextARMFlags : uint32_t { | 
 |   //! \brief Identifies the context structure as 32-bit ARM. | 
 |   kMinidumpContextARM = 0x40000000, | 
 |  | 
 |   //! \brief Indicates the validity of integer regsiters. | 
 |   //! | 
 |   //! Regsiters `r0`-`r15` and `cpsr` are valid. | 
 |   kMinidumpContextARMInteger = kMinidumpContextARM | 0x00000002, | 
 |  | 
 |   //! \brief Inidicates the validity of VFP regsiters. | 
 |   //! | 
 |   //! Registers `d0`-`d31` and `fpscr` are valid. | 
 |   kMinidumpContextARMVFP = kMinidumpContextARM | 0x00000004, | 
 |  | 
 |   //! \brief Indicates the validity of all registers. | 
 |   kMinidumpContextARMAll = kMinidumpContextARMInteger | kMinidumpContextARMVFP, | 
 | }; | 
 |  | 
 | //! \brief A 32-bit ARM CPU context (register state) carried in a minidump file. | 
 | struct MinidumpContextARM { | 
 |   //! \brief A bitfield composed of values of #MinidumpContextFlags and | 
 |   //!     #MinidumpContextARMFlags. | 
 |   //! | 
 |   //! This field identifies the context structure as a 32-bit ARM CPU context, | 
 |   //! and indicates which other fields in the structure are valid. | 
 |   uint32_t context_flags; | 
 |  | 
 |   //! \brief General-purpose registers `r0`-`r15`. | 
 |   uint32_t regs[11]; | 
 |   uint32_t fp;  // r11 | 
 |   uint32_t ip;  // r12 | 
 |   uint32_t sp;  // r13 | 
 |   uint32_t lr;  // r14 | 
 |   uint32_t pc;  // r15 | 
 |  | 
 |   //! \brief Current program status register. | 
 |   uint32_t cpsr; | 
 |  | 
 |   //! \brief Floating-point status and control register. | 
 |   uint32_t fpscr; | 
 |  | 
 |   //! \brief VFP registers `d0`-`d31`. | 
 |   uint64_t vfp[32]; | 
 |  | 
 |   //! \brief This space is unused. It is included for compatibility with | 
 |   //!     breakpad (which also doesn't use it). | 
 |   uint32_t extra[8]; | 
 | }; | 
 |  | 
 | //! \brief CONTEXT_CHUNK | 
 | struct MinidumpContextChunk { | 
 |   int32_t offset; | 
 |   uint32_t size; | 
 | }; | 
 |  | 
 | //! \brief CONTEXT_EX | 
 | struct MinidumpContextExHeader { | 
 |   MinidumpContextChunk all; | 
 |   MinidumpContextChunk legacy; | 
 |   MinidumpContextChunk xstate; | 
 | }; | 
 |  | 
 | //! \brief XSAVE_AREA_HEADER | 
 | struct MinidumpXSaveAreaHeader { | 
 |   uint64_t mask; | 
 |   uint64_t compaction_mask; | 
 |   uint64_t xsave_header_reserved[6]; | 
 | }; | 
 |  | 
 | //! \brief Offset of first xsave feature in the full extended context. | 
 | //! | 
 | //! This is used to calculate the final size of the extended context, and | 
 | //! can be validated by calling InitializeContext2 with one XSTATE feature, | 
 | //! and LocateXStateFeature to determine the first offset. | 
 | //! Also see “MANAGING STATE USING THE XSAVE FEATURE SET”, Ch. 13, Intel SDM. | 
 | constexpr uint32_t kMinidumpAMD64XSaveOffset = 0x550; | 
 |  | 
 | //! \brief Offset of first xsave feature within the extended context area. | 
 | //! | 
 | //! 0x240 is the size of the legacy area (512) + the xsave header(64 bytes) | 
 | //! Intel SDM 13.4.1. This is not where the item is in the extended compacted | 
 | //! context, but is the offset recorded in the minidump. It needs to be correct | 
 | //! there. See https://windows-internals.com/cet-on-windows/ for some discussion | 
 | //! “CONTEXT_XSTATE: Extended processor state chunk. The state is stored in the | 
 | //! same format the XSAVE operation stores it with exception of the first 512 | 
 | //! bytes, i.e. starting from XSAVE_AREA_HEADER.” This may vary by cpuid. | 
 | constexpr uint32_t kXSaveAreaFirstOffset = 0x240; | 
 |  | 
 | //! \brief XSAVE_CET_U_FORMAT | 
 | struct MinidumpAMD64XSaveFormatCetU { | 
 |   uint64_t cetmsr; | 
 |   uint64_t ssp; | 
 | }; | 
 |  | 
 | //! \brief 64-bit ARM-specifc flags for MinidumpContextARM64::context_flags. | 
 | enum MinidumpContextARM64Flags : uint32_t { | 
 |   //! \brief Identifies the context structure as 64-bit ARM. | 
 |   kMinidumpContextARM64 = 0x00400000, | 
 |  | 
 |   //! \brief Indicates the validity of control registers. | 
 |   //! | 
 |   //! Registers `fp`, `lr`, `sp`, `pc`, and `cpsr`. | 
 |   kMinidumpContextARM64Control = kMinidumpContextARM64 | 0x00000001, | 
 |  | 
 |   //! \brief Indicates the validty of integer registers. | 
 |   //! | 
 |   //! Registers `x0`-`x28`. | 
 |   kMinidumpContextARM64Integer = kMinidumpContextARM64 | 0x00000002, | 
 |  | 
 |   //! \brief Indicates the validity of fpsimd registers. | 
 |   //! | 
 |   //! Registers `v0`-`v31`, `fpsr`, and `fpcr` are valid. | 
 |   kMinidumpContextARM64Fpsimd = kMinidumpContextARM64 | 0x00000004, | 
 |  | 
 |   //! \brief Indicates the validity of debug registers. | 
 |   //! | 
 |   //! `bcr`, `bvr`, `wcr`, and `wvr` are valid. | 
 |   kMinidumpContextARM64Debug = kMinidumpContextARM64 | 0x00000008, | 
 |  | 
 |   //! \brief Indicates the validity of control, integer and floating point | 
 |   //!     registers. | 
 |   kMinidumpContextARM64Full = kMinidumpContextARM64Control | | 
 |                               kMinidumpContextARM64Integer | | 
 |                               kMinidumpContextARM64Fpsimd, | 
 |  | 
 |   //! \brief Indicates the validity of all registers. | 
 |   kMinidumpContextARM64All = | 
 |       kMinidumpContextARM64Full | kMinidumpContextARM64Debug, | 
 | }; | 
 |  | 
 | //! \brief A 64-bit ARM CPU context (register state) carried in a minidump file. | 
 | struct MinidumpContextARM64 { | 
 |   uint32_t context_flags; | 
 |  | 
 |   //! \brief Current program status register. | 
 |   uint32_t cpsr; | 
 |  | 
 |   //! \brief General-purpose registers `x0`-`x28`. | 
 |   uint64_t regs[29]; | 
 |  | 
 |   //! \brief Frame pointer or `x29`. | 
 |   uint64_t fp; | 
 |  | 
 |   //! \brief Link register or `x30`. | 
 |   uint64_t lr; | 
 |  | 
 |   //! \brief Stack pointer or `x31`. | 
 |   uint64_t sp; | 
 |  | 
 |   //! \brief Program counter. | 
 |   uint64_t pc; | 
 |  | 
 |   //! \brief NEON registers `v0`-`v31`. | 
 |   uint128_struct fpsimd[32]; | 
 |  | 
 |   //! \brief Floating-point control register. | 
 |   uint32_t fpcr; | 
 |  | 
 |   //! \brief Floating-point status register. | 
 |   uint32_t fpsr; | 
 |  | 
 |   //! \brief Debug registers. | 
 |   uint32_t bcr[8]; | 
 |   uint64_t bvr[8]; | 
 |   uint32_t wcr[2]; | 
 |   uint64_t wvr[2]; | 
 | }; | 
 |  | 
 | //! \brief 32bit MIPS-specifc flags for MinidumpContextMIPS::context_flags. | 
 | //! Based on minidump_cpu_mips.h from breakpad | 
 | enum MinidumpContextMIPSFlags : uint32_t { | 
 |   //! \brief Identifies the context structure as MIPSEL. | 
 |   kMinidumpContextMIPS = 0x00040000, | 
 |  | 
 |   //! \brief Indicates the validity of integer registers. | 
 |   //! | 
 |   //! Registers `0`-`31`, `mdhi`, `mdlo`, `epc`, `badvaddr`, `status` and | 
 |   //! `cause` are valid. | 
 |   kMinidumpContextMIPSInteger = kMinidumpContextMIPS | 0x00000002, | 
 |  | 
 |   //! \brief Indicates the validity of floating point registers. | 
 |   //! | 
 |   //! Floating point registers `0`-`31`, `fpcsr` and `fir` are valid | 
 |   kMinidumpContextMIPSFloatingPoint = kMinidumpContextMIPS | 0x00000004, | 
 |  | 
 |   //! \brief Indicates the validity of DSP registers. | 
 |   //! | 
 |   //! Registers `hi0`-`hi2`, `lo0`-`lo2` and `dsp_control` are valid | 
 |   kMinidumpContextMIPSDSP = kMinidumpContextMIPS | 0x00000008, | 
 |  | 
 |   //! \brief Indicates the validity of all registers. | 
 |   kMinidumpContextMIPSAll = kMinidumpContextMIPSInteger | | 
 |                             kMinidumpContextMIPSFloatingPoint | | 
 |                             kMinidumpContextMIPSDSP, | 
 | }; | 
 |  | 
 | //! \brief A 32bit MIPS CPU context (register state) carried in a minidump file. | 
 | struct MinidumpContextMIPS { | 
 |   uint32_t context_flags; | 
 |  | 
 |   //! \brief This padding field is included for breakpad compatibility. | 
 |   uint32_t _pad0; | 
 |   //! \brief General purpose registers `0`-`31`. | 
 |   uint64_t regs[32]; | 
 |  | 
 |   //! \brief Multiply/divide result. | 
 |   uint64_t mdhi, mdlo; | 
 |  | 
 |   //! \brief DSP registers. | 
 |   uint32_t hi[3]; | 
 |   uint32_t lo[3]; | 
 |   uint32_t dsp_control; | 
 |   //! \brief This padding field is included for breakpad compatibility. | 
 |   uint32_t _pad1; | 
 |  | 
 |   // \brief cp0 registers. | 
 |   uint64_t epc; | 
 |   uint64_t badvaddr; | 
 |   uint32_t status; | 
 |   uint32_t cause; | 
 |  | 
 |   //! \brief FPU registers. | 
 |   union { | 
 |     struct { | 
 |       float _fp_fregs; | 
 |       uint32_t _fp_pad; | 
 |     } fregs[32]; | 
 |     double dregs[32]; | 
 |   } fpregs; | 
 |  | 
 |   //! \brief FPU status register. | 
 |   uint32_t fpcsr; | 
 |   //! \brief FPU implementation register. | 
 |   uint32_t fir; | 
 | }; | 
 |  | 
 | //! \brief 64bit MIPS-specifc flags for MinidumpContextMIPS64::context_flags. | 
 | //! Based on minidump_cpu_mips.h from breakpad | 
 | enum MinidumpContextMIPS64Flags : uint32_t { | 
 |   //! \brief Identifies the context structure as MIPS64EL. | 
 |   kMinidumpContextMIPS64 = 0x00080000, | 
 |  | 
 |   //! \brief Indicates the validity of integer registers. | 
 |   //! | 
 |   //! Registers `0`-`31`, `mdhi`, `mdlo`, `epc`, `badvaddr`, `status` and | 
 |   //! `cause` are valid. | 
 |   kMinidumpContextMIPS64Integer = kMinidumpContextMIPS64 | 0x00000002, | 
 |  | 
 |   //! \brief Indicates the validity of floating point registers. | 
 |   //! | 
 |   //! Floating point registers `0`-`31`, `fpcsr` and `fir` are valid | 
 |   kMinidumpContextMIPS64FloatingPoint = kMinidumpContextMIPS64 | 0x00000004, | 
 |  | 
 |   //! \brief Indicates the validity of DSP registers. | 
 |   //! | 
 |   //! Registers `hi0`-`hi2`, `lo0`-`lo2` and `dsp_control` are valid. | 
 |   kMinidumpContextMIPS64DSP = kMinidumpContextMIPS64 | 0x00000008, | 
 |  | 
 |   //! \brief Indicates the validity of all registers. | 
 |   kMinidumpContextMIPS64All = kMinidumpContextMIPS64Integer | | 
 |                               kMinidumpContextMIPS64FloatingPoint | | 
 |                               kMinidumpContextMIPS64DSP, | 
 | }; | 
 |  | 
 | //! \brief A 32bit MIPS CPU context (register state) carried in a minidump file. | 
 | struct MinidumpContextMIPS64 { | 
 |   uint64_t context_flags; | 
 |  | 
 |   //! \brief General purpose registers. | 
 |   uint64_t regs[32]; | 
 |  | 
 |   //! \brief Multiply/divide result. | 
 |   uint64_t mdhi, mdlo; | 
 |  | 
 |   //! \brief DSP registers. | 
 |   uint64_t hi[3]; | 
 |   uint64_t lo[3]; | 
 |   uint64_t dsp_control; | 
 |  | 
 |   //! \brief cp0 registers. | 
 |   uint64_t epc; | 
 |   uint64_t badvaddr; | 
 |   uint64_t status; | 
 |   uint64_t cause; | 
 |  | 
 |   //! \brief FPU registers. | 
 |   union { | 
 |     struct { | 
 |       float _fp_fregs; | 
 |       uint32_t _fp_pad; | 
 |     } fregs[32]; | 
 |     double dregs[32]; | 
 |   } fpregs; | 
 |  | 
 |   //! \brief FPU status register. | 
 |   uint64_t fpcsr; | 
 |   //! \brief FPU implementation register. | 
 |   uint64_t fir; | 
 | }; | 
 |  | 
 | //! \brief 64-bit RISCV-specific flags for | 
 | //! MinidumpContextRISCV64::context_flags. | 
 | enum MinidumpContextRISCV64Flags : uint32_t { | 
 |   //! \brief Identifies the context structure as RISCV64. | 
 |   kMinidumpContextRISCV64 = 0x08000000, | 
 |  | 
 |   //! \brief Indicates the validity of integer registers. | 
 |   //! | 
 |   //! Registers 'pc' and `x1`-`x31` are valid. | 
 |   kMinidumpContextRISCV64Integer = kMinidumpContextRISCV64 | 0x00000001, | 
 |  | 
 |   //! \brief Indicates the validity of floating point registers. | 
 |   //! | 
 |   //! Floating point registers `f0`-`f31` are valid. | 
 |   kMinidumpContextRISCV64FloatingPoint = kMinidumpContextRISCV64 | 0x00000002, | 
 |  | 
 |   //! \brief Indicates the validity of all registers. | 
 |   kMinidumpContextRISCV64All = kMinidumpContextRISCV64Integer | | 
 |                                kMinidumpContextRISCV64FloatingPoint, | 
 | }; | 
 |  | 
 | //! \brief A 64-bit RISC-V CPU context (register state) carried in a minidump | 
 | //! file. | 
 | //! | 
 | //! This structure is versioned. Increment |kVersion| when changing this | 
 | //! structure. | 
 | struct MinidumpContextRISCV64 { | 
 |  | 
 |   //! \brief The structure’s currently-defined version number. | 
 |   static constexpr uint32_t kVersion = 1; | 
 |  | 
 |   //! \brief Indicates the validity of fields in this structure. | 
 |   uint32_t context_flags; | 
 |  | 
 |   //! \brief The structure’s version number. | 
 |   uint32_t version; | 
 |  | 
 |   //! \brief The program counter register. | 
 |   uint64_t pc; | 
 |  | 
 |   //! \brief The integer registers, x1 through x31. | 
 |   uint64_t regs[31]; | 
 |  | 
 |   //! \brief The floating point registers. | 
 |   uint64_t fpregs[32]; | 
 |  | 
 |   //! \brief The floating point control and status register. | 
 |   uint32_t fcsr; | 
 | }; | 
 |  | 
 | }  // namespace crashpad | 
 |  | 
 | #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_ |