Index: third_party/crashpad/crashpad/snapshot/cpu_context.h |
diff --git a/third_party/crashpad/crashpad/snapshot/cpu_context.h b/third_party/crashpad/crashpad/snapshot/cpu_context.h |
index 67b298e8c264b44d32731e031f9a3fe3a052f537..ba3ac18156a5d073600f94ed73a3571a6ea31108 100644 |
--- a/third_party/crashpad/crashpad/snapshot/cpu_context.h |
+++ b/third_party/crashpad/crashpad/snapshot/cpu_context.h |
@@ -25,6 +25,22 @@ namespace crashpad { |
struct CPUContextX86 { |
using X87Register = uint8_t[10]; |
+ struct Fsave { |
+ uint16_t fcw; // FPU control word |
+ uint16_t reserved_1; |
+ uint16_t fsw; // FPU status word |
+ uint16_t reserved_2; |
+ uint16_t ftw; // full FPU tag word |
+ uint16_t reserved_3; |
+ uint32_t fpu_ip; // FPU instruction pointer offset |
+ uint16_t fpu_cs; // FPU instruction pointer segment selector |
+ uint16_t fop; // FPU opcode |
+ uint32_t fpu_dp; // FPU data pointer offset |
+ uint16_t fpu_ds; // FPU data pointer segment selector |
+ uint16_t reserved_4; |
+ X87Register st[8]; |
+ }; |
+ |
union X87OrMMXRegister { |
struct { |
X87Register st; |
@@ -58,14 +74,49 @@ struct CPUContextX86 { |
uint8_t available[48]; |
}; |
+ //! \brief Converts an `fxsave` area to an `fsave` area. |
+ //! |
+ //! `fsave` state is restricted to the x87 FPU, while `fxsave` state includes |
+ //! state related to the x87 FPU as well as state specific to SSE. |
+ //! |
+ //! As the `fxsave` format is a superset of the `fsave` format, this operation |
+ //! fully populates the `fsave` area. `fsave` uses the full 16-bit form for |
+ //! the x87 floating-point tag word, so FxsaveToFsaveTagWord() is used to |
+ //! derive Fsave::ftw from the abridged 8-bit form used by `fxsave`. Reserved |
+ //! fields in \a fsave are set to `0`. |
+ //! |
+ //! \param[in] fxsave The `fxsave` area to convert. |
+ //! \param[out] fsave The `fsave` area to populate. |
+ //! |
+ //! \sa FsaveToFxsave() |
+ static void FxsaveToFsave(const Fxsave& fxsave, Fsave* fsave); |
+ |
+ //! \brief Converts an `fsave` area to an `fxsave` area. |
+ //! |
+ //! `fsave` state is restricted to the x87 FPU, while `fxsave` state includes |
+ //! state related to the x87 FPU as well as state specific to SSE. |
+ //! |
+ //! As the `fsave` format is a subset of the `fxsave` format, this operation |
+ //! cannot fully populate the `fxsave` area. Fields in \a fxsave that have no |
+ //! equivalent in \a fsave are set to `0`, including Fxsave::mxcsr, |
+ //! Fxsave::mxcsr_mask, Fxsave::xmm, and Fxsave::available. |
+ //! FsaveToFxsaveTagWord() is used to derive Fxsave::ftw from the full 16-bit |
+ //! form used by `fsave`. Reserved fields in \a fxsave are set to `0`. |
+ //! |
+ //! \param[in] fsave The `fsave` area to convert. |
+ //! \param[out] fxsave The `fxsave` area to populate. |
+ //! |
+ //! \sa FxsaveToFsave() |
+ static void FsaveToFxsave(const Fsave& fsave, Fxsave* fxsave); |
+ |
//! \brief Converts x87 floating-point tag words from `fxsave` (abridged, |
//! 8-bit) to `fsave` (full, 16-bit) form. |
//! |
//! `fxsave` stores the x87 floating-point tag word in abridged 8-bit form, |
//! and `fsave` stores it in full 16-bit form. Some users, notably |
- //! MinidumpContextX86::float_save::tag_word, require the full 16-bit form, |
- //! where most other contemporary code uses `fxsave` and thus the abridged |
- //! 8-bit form found in CPUContextX86::Fxsave::ftw. |
+ //! CPUContextX86::Fsave::ftw, require the full 16-bit form, where most other |
+ //! contemporary code uses `fxsave` and thus the abridged 8-bit form found in |
+ //! CPUContextX86::Fxsave::ftw. |
//! |
//! This function converts an abridged tag word to the full version by using |
//! the abridged tag word and the contents of the registers it describes. See |
@@ -75,6 +126,8 @@ struct CPUContextX86 { |
//! Manual, Volume 2: System Programming (24593-3.24), “FXSAVE Format for x87 |
//! Tag Word”. |
//! |
+ //! \sa FsaveToFxsaveTagWord() |
+ //! |
//! \param[in] fsw The FPU status word, used to map logical \a st_mm registers |
//! to their physical counterparts. This can be taken from |
//! CPUContextX86::Fxsave::fsw. |
@@ -87,6 +140,16 @@ struct CPUContextX86 { |
static uint16_t FxsaveToFsaveTagWord( |
uint16_t fsw, uint8_t fxsave_tag, const X87OrMMXRegister st_mm[8]); |
+ //! \brief Converts x87 floating-point tag words from `fsave` (full, 16-bit) |
+ //! to `fxsave` (abridged, 8-bit) form. |
+ //! |
+ //! This function performs the inverse operation of FxsaveToFsaveTagWord(). |
+ //! |
+ //! \param[in] fsave_tag The full FPU tag word. |
+ //! |
+ //! \return The abridged FPU tag word. |
+ static uint8_t FsaveToFxsaveTagWord(uint16_t fsave_tag); |
+ |
// Integer registers. |
uint32_t eax; |
uint32_t ebx; |