Index: src/google_breakpad/common/minidump_format.h |
diff --git a/src/google_breakpad/common/minidump_format.h b/src/google_breakpad/common/minidump_format.h |
index 645c56c529495e55dc2b3861408ad3d4d420bd4d..251e503df953dc2588d3ad5b9eef91c964ee929e 100644 |
--- a/src/google_breakpad/common/minidump_format.h |
+++ b/src/google_breakpad/common/minidump_format.h |
@@ -716,16 +716,51 @@ typedef struct { |
/* The bias value to be used during local time translations that occur during |
* daylight saving time. */ |
int32_t daylight_bias; |
} MDTimeZoneInformation; /* TIME_ZONE_INFORMATION */ |
/* MAX_PATH from windef.h */ |
#define MD_MAX_PATH 260 |
+/* For MDXStateConfigFeatureMscInfo.features */ |
+typedef struct { |
+ uint32_t offset; |
+ uint32_t size; |
+} MDXStateFeature; |
+ |
+/* For MDXStateConfigFeatureMscInfo.enabled_features from winnt.h */ |
+typedef enum { |
+ MD_XSTATE_LEGACY_FLOATING_POINT = 0, /* XSTATE_LEGACY_FLOATING_POINT */ |
+ MD_XSTATE_LEGACY_SSE = 1, /* XSTATE_LEGACY_SSE */ |
+ MD_XSTATE_GSSE = 2, /* XSTATE_GSSE */ |
+ MD_XSTATE_AVX = MD_XSTATE_GSSE, /* XSTATE_AVX */ |
+ MD_XSTATE_MPX_BNDREGS = 3, /* XSTATE_MPX_BNDREGS */ |
+ MD_XSTATE_MPX_BNDCSR = 4, /* XSTATE_MPX_BNDCSR */ |
+ MD_XSTATE_AVX512_KMASK = 5, /* XSTATE_AVX512_KMASK */ |
+ MD_XSTATE_AVX512_ZMM_H = 6, /* XSTATE_AVX512_ZMM_H */ |
+ MD_XSTATE_AVX512_ZMM = 7, /* XSTATE_AVX512_ZMM */ |
+ MD_XSTATE_IPT = 8, /* XSTATE_IPT */ |
+ MD_XSTATE_LWP = 62 /* XSTATE_LWP */ |
+} MDXStateFeatureFlag; |
+ |
+/* MAXIMUM_XSTATE_FEATURES from winnt.h */ |
+#define MD_MAXIMUM_XSTATE_FEATURES 64 |
+ |
+/* For MDRawMiscInfo.xstate_data */ |
+typedef struct { |
+ uint32_t size_of_info; |
+ uint32_t context_size; |
+ /* An entry in the features array is valid only if the corresponding bit in |
+ * the enabled_features flag is set. */ |
+ uint64_t enabled_features; |
+ MDXStateFeature features[MD_MAXIMUM_XSTATE_FEATURES]; |
+} MDXStateConfigFeatureMscInfo; |
+ |
+ |
/* The miscellaneous information stream contains a variety |
* of small pieces of information. A member is valid if |
* it's within the available size and its corresponding |
* bit is set. */ |
typedef struct { |
uint32_t size_of_info; /* Length of entire MDRawMiscInfo structure. */ |
uint32_t flags1; |
@@ -776,27 +811,47 @@ typedef struct { |
* in MINIDUMP_MISC_INFO_4. When this struct is populated, these values |
* may not be set. Use flags1 and size_of_info to determine whether these |
* values are present. */ |
/* The following 2 fields are only valid if flags1 contains |
* MD_MISCINFO_FLAGS1_BUILDSTRING. */ |
uint16_t build_string[MD_MAX_PATH]; /* UTF-16-encoded, 0-terminated */ |
uint16_t dbg_bld_str[40]; /* UTF-16-encoded, 0-terminated */ |
+ |
+ /* The following fields are not present in MINIDUMP_MISC_INFO_4 but are |
+ * in MINIDUMP_MISC_INFO_5. When this struct is populated, these values |
+ * may not be set. Use flags1 and size_of_info to determine whether these |
+ * values are present. */ |
+ |
+ /* The following field has its own flags for establishing the validity of |
+ * the structure's contents.*/ |
+ MDXStateConfigFeatureMscInfo xstate_data; |
+ |
+ /* The following field is only valid if flags1 contains |
+ * MD_MISCINFO_FLAGS1_PROCESS_COOKIE. */ |
+ uint32_t process_cookie; |
} MDRawMiscInfo; /* MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2, |
* MINIDUMP_MISC_INFO_3, MINIDUMP_MISC_INFO_4, |
- * MINIDUMP_MISC_INFO_N */ |
+ * MINIDUMP_MISC_INFO_5, MINIDUMP_MISC_INFO_N */ |
static const size_t MD_MISCINFO_SIZE = |
offsetof(MDRawMiscInfo, processor_max_mhz); |
static const size_t MD_MISCINFO2_SIZE = |
offsetof(MDRawMiscInfo, process_integrity_level); |
static const size_t MD_MISCINFO3_SIZE = |
offsetof(MDRawMiscInfo, build_string[0]); |
-static const size_t MD_MISCINFO4_SIZE = sizeof(MDRawMiscInfo); |
+static const size_t MD_MISCINFO4_SIZE = |
+ offsetof(MDRawMiscInfo, xstate_data); |
+/* Version 5 of the MDRawMiscInfo structure is not a multiple of 8 in size and |
+ * yet it contains some 8-bytes sized fields. This causes many compilers to |
+ * round the structure size up to a multiple of 8 by adding padding at the end. |
+ * The following hack is thus required for matching the proper on-disk size. */ |
+static const size_t MD_MISCINFO5_SIZE = |
+ offsetof(MDRawMiscInfo, process_cookie) + sizeof(uint32_t); |
/* For (MDRawMiscInfo).flags1. These values indicate which fields in the |
* MDRawMiscInfoStructure are valid. */ |
typedef enum { |
MD_MISCINFO_FLAGS1_PROCESS_ID = 0x00000001, |
/* MINIDUMP_MISC1_PROCESS_ID */ |
MD_MISCINFO_FLAGS1_PROCESS_TIMES = 0x00000002, |
/* MINIDUMP_MISC1_PROCESS_TIMES */ |
@@ -807,16 +862,18 @@ typedef enum { |
MD_MISCINFO_FLAGS1_PROCESS_EXECUTE_FLAGS = 0x00000020, |
/* MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS */ |
MD_MISCINFO_FLAGS1_TIMEZONE = 0x00000040, |
/* MINIDUMP_MISC3_TIMEZONE */ |
MD_MISCINFO_FLAGS1_PROTECTED_PROCESS = 0x00000080, |
/* MINIDUMP_MISC3_PROTECTED_PROCESS */ |
MD_MISCINFO_FLAGS1_BUILDSTRING = 0x00000100, |
/* MINIDUMP_MISC4_BUILDSTRING */ |
+ MD_MISCINFO_FLAGS1_PROCESS_COOKIE = 0x00000200, |
+ /* MINIDUMP_MISC5_PROCESS_COOKIE */ |
} MDMiscInfoFlags1; |
/* |
* Around DbgHelp version 6.0, the style of new LIST structures changed |
* from including an array of length 1 at the end of the struct to |
* represent the variable-length data to including explicit |
* "size of header", "size of entry" and "number of entries" fields |
* in the header, presumably to allow backwards-compatibly-extending |