Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 The Crashpad Authors. All rights reserved. | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 | |
| 15 #ifndef CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_ | |
| 16 #define CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_ | |
| 17 | |
| 18 #include <stdint.h> | |
| 19 | |
| 20 #include "util/numeric/int128.h" | |
| 21 | |
| 22 namespace crashpad { | |
| 23 | |
| 24 //! \brief Architecture-independent flags for `context_flags` fields in Minidump | |
| 25 //! context structures. | |
| 26 enum MinidumpContextFlags : uint32_t { | |
| 27 //! \brief `CONTEXT_EXCEPTION_ACTIVE`. | |
| 28 kMinidumpContextExceptionActive = 0x08000000, | |
| 29 | |
| 30 //! \brief `CONTEXT_SERVICE_ACTIVE`. | |
|
Robert Sesek
2014/09/24 15:42:15
Am I supposed to know what these mean?
| |
| 31 kMinidumpContextServiceActive = 0x10000000, | |
| 32 | |
| 33 //! \brief `CONTEXT_EXCEPTION_REQUEST`. | |
| 34 kMinidumpContextExceptionRequest = 0x40000000, | |
| 35 | |
| 36 //! \brief `CONTEXT_EXCEPTION_REPORTING`. | |
| 37 kMinidumpContextExceptionReporting = 0x80000000, | |
| 38 }; | |
| 39 | |
| 40 //! \brief 32-bit x86-specifc flags for MinidumpContextX86::context_flags. | |
| 41 enum MinidumpContextX86Flags : uint32_t { | |
| 42 //! \brief Identifies the context structure as 32-bit x86. This is the same as | |
| 43 //! `CONTEXT_i386` and `CONTEXT_i486` on Windows for this architecture. | |
| 44 kMinidumpContextX86 = 0x00010000, | |
| 45 | |
| 46 //! \brief Indicates the validity of control registers (`CONTEXT_CONTROL`). | |
| 47 //! | |
| 48 //! The `ebp`, `eip`, `cs`, `eflags`, `esp`, and `ss` fields are valid. | |
| 49 kMinidumpContextX86Control = kMinidumpContextX86 | 0x00000001, | |
| 50 | |
| 51 //! \brief Indicates the validity of non-control integer registers | |
| 52 //! (`CONTEXT_INTEGER`). | |
| 53 //! | |
| 54 //! The `edi`, `esi`, `ebx`, `edx`, `ecx, and `eax` fields are valid. | |
| 55 kMinidumpContextX86Integer = kMinidumpContextX86 | 0x00000002, | |
| 56 | |
| 57 //! \brief Indicates the validity of non-control segment registers | |
| 58 //! (`CONTEXT_SEGMENTS`). | |
| 59 //! | |
| 60 //! The `gs`, `fs`, `es`, and `ds` fields are valid. | |
| 61 kMinidumpContextX86Segment = kMinidumpContextX86 | 0x00000004, | |
| 62 | |
| 63 //! \brief Indicates the validity of floating-point state | |
| 64 //! (`CONTEXT_FLOATING_POINT`). | |
| 65 //! | |
| 66 //! The `float_save` field is valid. | |
| 67 kMinidumpContextX86FloatingPoint = kMinidumpContextX86 | 0x00000008, | |
| 68 | |
| 69 //! \brief Indicates the validity of debug registers | |
| 70 //! (`CONTEXT_DEBUG_REGISTERS`). | |
| 71 //! | |
| 72 //! The `dr0` through `dr3`, `dr6`, and `dr7` fields are valid. | |
| 73 kMinidumpContextX86Debug = kMinidumpContextX86 | 0x00000010, | |
| 74 | |
| 75 //! \brief Indicates the validity of extended registers in `fxsave` format | |
| 76 //! (`CONTEXT_EXTENDED_REGISTERS`). | |
| 77 //! | |
| 78 //! The `extended_registers` field is valid and contains `fxsave` data. | |
| 79 kMinidumpContextX86Extended = kMinidumpContextX86 | 0x00000020, | |
| 80 | |
| 81 //! \brief Indicates the validity of `xsave` data (`CONTEXT_XSTATE`). | |
| 82 //! | |
| 83 //! The context contains `xsave` data. This is used with an extended context | |
| 84 //! structure not currently defined here. | |
| 85 kMinidumpContextX86Xstate = kMinidumpContextX86 | 0x00000040, | |
| 86 | |
| 87 //! \brief Indicates the validity of control, integer, and segment registers. | |
| 88 kMinidumpContextX86Full = kMinidumpContextX86Control | | |
| 89 kMinidumpContextX86Integer | | |
| 90 kMinidumpContextX86Segment, | |
| 91 | |
| 92 //! \brief Indicates the validity of all registers except `xsave` data. | |
| 93 kMinidumpContextX86All = kMinidumpContextX86Full | | |
| 94 kMinidumpContextX86FloatingPoint | | |
| 95 kMinidumpContextX86Debug | | |
| 96 kMinidumpContextX86Extended, | |
| 97 }; | |
| 98 | |
| 99 //! \brief A 32-bit x86 CPU context (register state) carried in a minidump file. | |
| 100 //! | |
| 101 //! This is analogous to the `CONTEXT` structure on Windows when targeting | |
| 102 //! 32-bit x86. This structure is used instead of `CONTEXT` to make it available | |
| 103 //! when targeting other architectures. | |
| 104 struct MinidumpContextX86 { | |
| 105 //! \brief A bitfield composed of values of #MinidumpContextFlags and | |
| 106 //! #MinidumpContextX86Flags. | |
| 107 //! | |
| 108 //! This field identifies the context structure as a 32-bit x86 CPU context, | |
| 109 //! and indicates which other fields in the structure are valid. | |
| 110 uint32_t context_flags; | |
| 111 | |
| 112 uint32_t dr0; | |
| 113 uint32_t dr1; | |
| 114 uint32_t dr2; | |
| 115 uint32_t dr3; | |
| 116 uint32_t dr6; | |
| 117 uint32_t dr7; | |
| 118 | |
| 119 struct { | |
| 120 uint32_t control_word; | |
| 121 uint32_t status_word; | |
| 122 uint32_t tag_word; | |
| 123 uint32_t error_offset; | |
| 124 uint32_t error_selector; | |
| 125 uint32_t data_offset; | |
| 126 uint32_t data_selector; | |
| 127 uint8_t register_area[80]; | |
| 128 uint32_t spare_0; | |
| 129 } float_save; | |
| 130 | |
| 131 uint32_t gs; | |
| 132 uint32_t fs; | |
| 133 uint32_t es; | |
| 134 uint32_t ds; | |
| 135 | |
| 136 uint32_t edi; | |
| 137 uint32_t esi; | |
| 138 uint32_t ebx; | |
| 139 uint32_t edx; | |
| 140 uint32_t ecx; | |
| 141 uint32_t eax; | |
| 142 | |
| 143 uint32_t ebp; | |
| 144 uint32_t eip; | |
| 145 uint32_t cs; | |
| 146 uint32_t eflags; | |
| 147 uint32_t esp; | |
| 148 uint32_t ss; | |
| 149 | |
| 150 uint8_t extended_registers[512]; | |
| 151 }; | |
| 152 | |
| 153 //! \brief x86_64-specifc flags for MinidumpContextAMD64::context_flags. | |
| 154 enum MinidumpContextAMD64Flags : uint32_t { | |
| 155 //! \brief Identifies the context structure as x86_64. This is the same as | |
| 156 //! `CONTEXT_AMD64` on Windows for this architecture. | |
| 157 kMinidumpContextAMD64 = 0x00100000, | |
| 158 | |
| 159 //! \brief Indicates the validity of control registers (`CONTEXT_CONTROL`). | |
| 160 //! | |
| 161 //! The `cs`, `ss`, `eflags`, `rsp`, and `rip` fields are valid. | |
| 162 kMinidumpContextAMD64Control = kMinidumpContextAMD64 | 0x00000001, | |
| 163 | |
| 164 //! \brief Indicates the validity of non-control integer registers | |
| 165 //! (`CONTEXT_INTEGER`). | |
| 166 //! | |
| 167 //! The `rax`, `rcx`, `rdx`, `rbx`, `rbp`, `rsi`, `rdi`, and `r8` through | |
| 168 //! `r15` fields are valid. | |
| 169 kMinidumpContextAMD64Integer = kMinidumpContextAMD64 | 0x00000002, | |
| 170 | |
| 171 //! \brief Indicates the validity of non-control segment registers | |
| 172 //! (`CONTEXT_SEGMENTS`). | |
| 173 //! | |
| 174 //! The `ds`, `es`, `fs`, and `gs` fields are valid. | |
| 175 kMinidumpContextAMD64Segment = kMinidumpContextAMD64 | 0x00000004, | |
| 176 | |
| 177 //! \brief Indicates the validity of floating-point state | |
| 178 //! (`CONTEXT_FLOATING_POINT`). | |
| 179 //! | |
| 180 //! The `xmm0` through `xmm15` fields are valid. | |
| 181 kMinidumpContextAMD64FloatingPoint = kMinidumpContextAMD64 | 0x00000008, | |
| 182 | |
| 183 //! \brief Indicates the validity of debug registers | |
| 184 //! (`CONTEXT_DEBUG_REGISTERS`). | |
| 185 //! | |
| 186 //! The `dr0` through `dr3`, `dr6`, and `dr7` fields are valid. | |
| 187 kMinidumpContextAMD64Debug = kMinidumpContextAMD64 | 0x00000010, | |
| 188 | |
| 189 //! \brief Indicates the validity of `xsave` data (`CONTEXT_XSTATE`). | |
| 190 //! | |
| 191 //! The context contains `xsave` data. This is used with an extended context | |
| 192 //! structure not currently defined here. | |
| 193 kMinidumpContextX86Xstate = kMinidumpContextAMD64 | 0x00000040, | |
| 194 | |
| 195 //! \brief Indicates the validity of control, integer, and segment registers. | |
| 196 kMinidumpContextAMD64Full = kMinidumpContextAMD64Control | | |
| 197 kMinidumpContextAMD64Integer | | |
| 198 kMinidumpContextAMD64Segment, | |
| 199 | |
| 200 //! \brief Indicates the validity of all registers except `xsave` data. | |
| 201 kMinidumpContextAMD64All = kMinidumpContextAMD64Full | | |
| 202 kMinidumpContextAMD64FloatingPoint | | |
| 203 kMinidumpContextAMD64Debug, | |
| 204 }; | |
| 205 | |
| 206 //! \brief An x86_64 (AMD64) CPU context (register state) carried in a minidump | |
| 207 //! file. | |
| 208 //! | |
| 209 //! This is analogous to the `CONTEXT` structure on Windows when targeting | |
| 210 //! x86_64. This structure is used instead of `CONTEXT` to make it available | |
| 211 //! when targeting other architectures. | |
| 212 struct __attribute__((aligned(16))) MinidumpContextAMD64 { | |
| 213 uint64_t p1_home; | |
|
Robert Sesek
2014/09/24 15:42:15
What are these used for?
| |
| 214 uint64_t p2_home; | |
| 215 uint64_t p3_home; | |
| 216 uint64_t p4_home; | |
| 217 uint64_t p5_home; | |
| 218 uint64_t p6_home; | |
| 219 | |
| 220 //! \brief A bitfield composed of values of #MinidumpContextFlags and | |
| 221 //! #MinidumpContextAMD64Flags. | |
| 222 //! | |
| 223 //! This field identifies the context structure as an x86_64 CPU context, and | |
| 224 //! indicates which other fields in the structure are valid. | |
| 225 uint32_t context_flags; | |
| 226 | |
| 227 uint32_t mx_csr; | |
| 228 | |
| 229 uint16_t cs; | |
| 230 uint16_t ds; | |
| 231 uint16_t es; | |
| 232 uint16_t fs; | |
| 233 uint16_t gs; | |
| 234 uint16_t ss; | |
| 235 | |
| 236 uint32_t eflags; | |
| 237 | |
| 238 uint64_t dr0; | |
| 239 uint64_t dr1; | |
| 240 uint64_t dr2; | |
| 241 uint64_t dr3; | |
| 242 uint64_t dr6; | |
| 243 uint64_t dr7; | |
| 244 | |
| 245 uint64_t rax; | |
| 246 uint64_t rcx; | |
| 247 uint64_t rdx; | |
| 248 uint64_t rbx; | |
| 249 uint64_t rsp; | |
| 250 uint64_t rbp; | |
| 251 uint64_t rsi; | |
| 252 uint64_t rdi; | |
| 253 uint64_t r8; | |
| 254 uint64_t r9; | |
| 255 uint64_t r10; | |
| 256 uint64_t r11; | |
| 257 uint64_t r12; | |
| 258 uint64_t r13; | |
| 259 uint64_t r14; | |
| 260 uint64_t r15; | |
| 261 | |
| 262 uint64_t rip; | |
| 263 | |
| 264 union { | |
| 265 struct { | |
| 266 uint16_t control_word; | |
| 267 uint16_t status_word; | |
| 268 uint8_t tag_word; | |
| 269 uint8_t reserved_1; | |
| 270 uint16_t error_opcode; | |
| 271 uint32_t error_offset; | |
| 272 uint16_t error_selector; | |
| 273 uint16_t reserved_2; | |
| 274 uint32_t data_offset; | |
| 275 uint16_t data_selector; | |
| 276 uint16_t reserved_3; | |
| 277 uint32_t mx_csr; | |
| 278 uint32_t mx_csr_mask; | |
| 279 uint128_struct float_registers[8]; | |
| 280 uint128_struct xmm_registers[16]; | |
| 281 uint8_t reserved_4[96]; | |
| 282 } float_save; | |
| 283 struct { | |
| 284 uint128_struct header[2]; | |
| 285 uint128_struct legacy[8]; | |
| 286 uint128_struct xmm0; | |
| 287 uint128_struct xmm1; | |
| 288 uint128_struct xmm2; | |
| 289 uint128_struct xmm3; | |
| 290 uint128_struct xmm4; | |
| 291 uint128_struct xmm5; | |
| 292 uint128_struct xmm6; | |
| 293 uint128_struct xmm7; | |
| 294 uint128_struct xmm8; | |
| 295 uint128_struct xmm9; | |
| 296 uint128_struct xmm10; | |
| 297 uint128_struct xmm11; | |
| 298 uint128_struct xmm12; | |
| 299 uint128_struct xmm13; | |
| 300 uint128_struct xmm14; | |
| 301 uint128_struct xmm15; | |
| 302 }; | |
| 303 }; | |
| 304 | |
| 305 uint128_struct vector_register[26]; | |
| 306 uint64_t vector_control; | |
| 307 | |
| 308 uint64_t debug_control; | |
| 309 uint64_t last_branch_to_rip; | |
| 310 uint64_t last_branch_from_rip; | |
| 311 uint64_t last_exception_to_rip; | |
| 312 uint64_t last_exception_from_rip; | |
| 313 }; | |
| 314 | |
| 315 } // namespace crashpad | |
| 316 | |
| 317 #endif // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_ | |
| OLD | NEW |