mirror of https://github.com/UMSKT/xpmgr.git
1381 lines
48 KiB
C
1381 lines
48 KiB
C
/*++
|
|
|
|
Copyright (c) 2007 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
cper.h
|
|
|
|
Abstract:
|
|
|
|
This header file defines the structures used to represent the Common
|
|
Platform Error Record as defined in Appendix N of the Unified Extensible
|
|
Firmware Interface (UEFI) specification (revision 2.1).
|
|
|
|
This specification as well as any approved errata may be obtained from
|
|
http://www.uefi.org.
|
|
|
|
This header file also includes Microsoft specific extensions to the Common
|
|
Platform Error Record as allowed by Appendix N, Section 2.3 of the Unified
|
|
Extensible Firmware Interface specification (Non-standard Section Body).
|
|
|
|
--*/
|
|
|
|
#ifndef _CPER_H_
|
|
#define _CPER_H_
|
|
|
|
#include <cperguid.h>
|
|
|
|
#pragma warning(push)
|
|
#pragma warning(disable:4201)
|
|
#pragma warning(disable:4214)
|
|
|
|
#if defined(MCI_STATUS)
|
|
#undef MCI_STATUS
|
|
#endif
|
|
|
|
//
|
|
// The general format of the common platform error record is illustrated below.
|
|
// A record consists of a header; followed by one or more section descriptors;
|
|
// and for each descriptor, an associated section which may contain either error
|
|
// or informational data.
|
|
//
|
|
// The record may include extra buffer space to allow for the dynamic addition
|
|
// of error sections descriptors and bodies, as well as for dynamically
|
|
// increasing the size of existing sections.
|
|
//
|
|
// +---------------------------------------------+
|
|
// | Record Header |
|
|
// | SectionCount == N |
|
|
// +---------------------------------------------+
|
|
// | Section Descriptor 1 |
|
|
// | Offset, size | ---+
|
|
// +---------------------------------------------+ |
|
|
// | Section Descriptor 2 | |
|
|
// | Offset, size | ---+---+
|
|
// +---------------------------------------------+ | |
|
|
// | | | |
|
|
// | .... | | |
|
|
// | | | |
|
|
// +---------------------------------------------+ | |
|
|
// | Section Descriptor N | ---+---+---+
|
|
// | Offset, size | | | |
|
|
// +---------------------------------------------+ | | |
|
|
// | Buffer space for adding | | | |
|
|
// | more section descriptors. | | | |
|
|
// +---------------------------------------------| | | |
|
|
// | Section 1 | <--+ | |
|
|
// | | | |
|
|
// +---------------------------------------------+ | |
|
|
// | Section 2 | <------+ |
|
|
// | | |
|
|
// +---------------------------------------------+ |
|
|
// | | |
|
|
// | | |
|
|
// | .... | |
|
|
// | | |
|
|
// | | |
|
|
// +---------------------------------------------+ |
|
|
// | Section N | <----------+
|
|
// | |
|
|
// +---------------------------------------------+
|
|
// | |
|
|
// | |
|
|
// | |
|
|
// | Buffer space for adding |
|
|
// | more section bodies. |
|
|
// | |
|
|
// | |
|
|
// | |
|
|
// +---------------------------------------------+
|
|
//
|
|
|
|
// -------------------------------------------- Specification validation macros
|
|
|
|
//
|
|
// The following macro implements a compile-time check for the offset and length
|
|
// of the specified structure member. This can be used to validate the defined
|
|
// structures against the specification.
|
|
//
|
|
|
|
#define CPER_FIELD_CHECK(type, field, offset, length) \
|
|
C_ASSERT(((FIELD_OFFSET(type, field) == (offset)) && \
|
|
(RTL_FIELD_SIZE(type, field) == (length))))
|
|
|
|
#include <pshpack1.h>
|
|
|
|
//---------------------------------- Downlevel GUID variable name compatibility
|
|
|
|
#if WHEA_DOWNLEVEL_TYPE_NAMES
|
|
|
|
#define PROCESSOR_GENERIC_SECTION_GUID PROCESSOR_GENERIC_ERROR_SECTION_GUID
|
|
#define X86_PROCESSOR_SPECIFIC_SECTION_GUID XPF_PROCESSOR_ERROR_SECTION_GUID
|
|
#define IPF_PROCESSOR_SPECIFIC_SECTION_GUID IPF_PROCESSOR_ERROR_SECTION_GUID
|
|
#define PLATFORM_MEMORY_SECTION_GUID MEMORY_ERROR_SECTION_GUID
|
|
#define PCIEXPRESS_SECTION_GUID PCIEXPRESS_ERROR_SECTION_GUID
|
|
#define PCIX_BUS_SECTION_GUID PCIXBUS_ERROR_SECTION_GUID
|
|
#define PCIX_COMPONENT_SECTION_GUID PCIXDEVICE_ERROR_SECTION_GUID
|
|
#define IPF_SAL_RECORD_REFERENCE_SECTION_GUID FIRMWARE_ERROR_RECORD_REFERENCE_GUID
|
|
|
|
#endif
|
|
|
|
//------------------------------------------ Common Platform Error Record types
|
|
|
|
//
|
|
// These types are used in several of the common platform error record
|
|
// structures.
|
|
//
|
|
|
|
typedef union _WHEA_REVISION {
|
|
struct {
|
|
UCHAR MinorRevision;
|
|
UCHAR MajorRevision;
|
|
} DUMMYSTRUCTNAME;
|
|
USHORT AsUSHORT;
|
|
} WHEA_REVISION, *PWHEA_REVISION;
|
|
|
|
typedef enum _WHEA_ERROR_SEVERITY {
|
|
WheaErrSevRecoverable = 0,
|
|
WheaErrSevFatal = 1,
|
|
WheaErrSevCorrected = 2,
|
|
WheaErrSevInformational = 3
|
|
} WHEA_ERROR_SEVERITY, *PWHEA_ERROR_SEVERITY;
|
|
|
|
typedef union _WHEA_TIMESTAMP {
|
|
struct {
|
|
ULONGLONG Seconds:8;
|
|
ULONGLONG Minutes:8;
|
|
ULONGLONG Hours:8;
|
|
ULONGLONG Precise:1;
|
|
ULONGLONG Reserved:7;
|
|
ULONGLONG Day:8;
|
|
ULONGLONG Month:8;
|
|
ULONGLONG Year:8;
|
|
ULONGLONG Century:8;
|
|
} DUMMYSTRUCTNAME;
|
|
LARGE_INTEGER AsLARGE_INTEGER;
|
|
} WHEA_TIMESTAMP, *PWHEA_TIMESTAMP;
|
|
|
|
typedef union _WHEA_PERSISTENCE_INFO {
|
|
struct {
|
|
ULONGLONG Signature:16;
|
|
ULONGLONG Length:24;
|
|
ULONGLONG Identifier:16;
|
|
ULONGLONG Attributes:2;
|
|
ULONGLONG DoNotLog:1;
|
|
ULONGLONG Reserved:5;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG AsULONGLONG;
|
|
} WHEA_PERSISTENCE_INFO, *PWHEA_PERSISTENCE_INFO;
|
|
|
|
#define ERRTYP_INTERNAL 0x01 // 1
|
|
#define ERRTYP_BUS 0x10 // 16
|
|
#define ERRTYP_MEM 0x04 // 4
|
|
#define ERRTYP_TLB 0x05 // 5
|
|
#define ERRTYP_CACHE 0x06 // 6
|
|
#define ERRTYP_FUNCTION 0x07 // 7
|
|
#define ERRTYP_SELFTEST 0x08 // 8
|
|
#define ERRTYP_FLOW 0x09 // 9
|
|
#define ERRTYP_MAP 0x11 // 17
|
|
#define ERRTYP_IMPROPER 0x12 // 18
|
|
#define ERRTYP_UNIMPL 0x13 // 19
|
|
#define ERRTYP_LOSSOFLOCKSTEP 0x14 // 20
|
|
#define ERRTYP_RESPONSE 0x15 // 21
|
|
#define ERRTYP_PARITY 0x16 // 22
|
|
#define ERRTYP_PROTOCOL 0x17 // 23
|
|
#define ERRTYP_PATHERROR 0x18 // 24
|
|
#define ERRTYP_TIMEOUT 0x19 // 25
|
|
#define ERRTYP_POISONED 0x1A // 26
|
|
|
|
typedef union _WHEA_ERROR_STATUS {
|
|
ULONGLONG ErrorStatus;
|
|
struct {
|
|
ULONGLONG Reserved1:8;
|
|
ULONGLONG ErrorType:8;
|
|
ULONGLONG Address:1;
|
|
ULONGLONG Control:1;
|
|
ULONGLONG Data:1;
|
|
ULONGLONG Responder:1;
|
|
ULONGLONG Requester:1;
|
|
ULONGLONG FirstError:1;
|
|
ULONGLONG Overflow:1;
|
|
ULONGLONG Reserved2:41;
|
|
} DUMMYSTRUCTNAME;
|
|
} WHEA_ERROR_STATUS, *PWHEA_ERROR_STATUS;
|
|
|
|
//---------------------------------------------------- WHEA_ERROR_RECORD_HEADER
|
|
|
|
typedef union _WHEA_ERROR_RECORD_HEADER_VALIDBITS {
|
|
struct {
|
|
ULONG PlatformId:1;
|
|
ULONG Timestamp:1;
|
|
ULONG PartitionId:1;
|
|
ULONG Reserved:29;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONG AsULONG;
|
|
} WHEA_ERROR_RECORD_HEADER_VALIDBITS, *PWHEA_ERROR_RECORD_HEADER_VALIDBITS;
|
|
|
|
#define WHEA_ERROR_RECORD_VALID_PLATFORMID 0x00000001
|
|
#define WHEA_ERROR_RECORD_VALID_TIMESTAMP 0x00000002
|
|
#define WHEA_ERROR_RECORD_VALID_PARTITIONID 0x00000004
|
|
|
|
typedef union _WHEA_ERROR_RECORD_HEADER_FLAGS {
|
|
struct {
|
|
ULONG Recovered:1;
|
|
ULONG PreviousError:1;
|
|
ULONG Simulated:1;
|
|
ULONG Reserved:29;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONG AsULONG;
|
|
} WHEA_ERROR_RECORD_HEADER_FLAGS, *PWHEA_ERROR_RECORD_HEADER_FLAGS;
|
|
|
|
#define WHEA_ERROR_RECORD_FLAGS_RECOVERED 0x00000001
|
|
#define WHEA_ERROR_RECORD_FLAGS_PREVIOUSERROR 0x00000002
|
|
#define WHEA_ERROR_RECORD_FLAGS_SIMULATED 0x00000004
|
|
|
|
typedef struct _WHEA_ERROR_RECORD_HEADER {
|
|
ULONG Signature;
|
|
WHEA_REVISION Revision;
|
|
ULONG SignatureEnd;
|
|
USHORT SectionCount;
|
|
WHEA_ERROR_SEVERITY Severity;
|
|
WHEA_ERROR_RECORD_HEADER_VALIDBITS ValidBits;
|
|
ULONG Length;
|
|
WHEA_TIMESTAMP Timestamp;
|
|
GUID PlatformId;
|
|
GUID PartitionId;
|
|
GUID CreatorId;
|
|
GUID NotifyType;
|
|
ULONGLONG RecordId;
|
|
WHEA_ERROR_RECORD_HEADER_FLAGS Flags;
|
|
WHEA_PERSISTENCE_INFO PersistenceInfo;
|
|
UCHAR Reserved[12];
|
|
} WHEA_ERROR_RECORD_HEADER, *PWHEA_ERROR_RECORD_HEADER;
|
|
|
|
//
|
|
// Distinguished values used in the common platform error record header
|
|
// signature.
|
|
//
|
|
|
|
#define WHEA_ERROR_RECORD_SIGNATURE 'REPC'
|
|
#define WHEA_ERROR_RECORD_REVISION 0x0210
|
|
#define WHEA_ERROR_RECORD_SIGNATURE_END 0xFFFFFFFF
|
|
|
|
//
|
|
// Validate the error record header structure against the definitions in the
|
|
// UEFI specification.
|
|
//
|
|
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, Signature, 0, 4);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, Revision, 4, 2);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, SignatureEnd, 6, 4);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, SectionCount, 10, 2);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, Severity, 12, 4);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, ValidBits, 16, 4);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, Length, 20, 4);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, Timestamp, 24, 8);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, PlatformId, 32, 16);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, PartitionId, 48, 16);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, CreatorId, 64, 16);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, NotifyType, 80, 16);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, RecordId, 96, 8);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, Flags, 104, 4);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, PersistenceInfo, 108, 8);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_HEADER, Reserved, 116, 12);
|
|
|
|
//---------------------------------------- WHEA_ERROR_RECORD_SECTION_DESCRIPTOR
|
|
|
|
typedef union _WHEA_ERROR_RECORD_SECTION_DESCRIPTOR_FLAGS {
|
|
struct {
|
|
ULONG Primary:1;
|
|
ULONG ContainmentWarning:1;
|
|
ULONG Reset:1;
|
|
ULONG ThresholdExceeded:1;
|
|
ULONG ResourceNotAvailable:1;
|
|
ULONG LatentError:1;
|
|
ULONG Reserved:26;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONG AsULONG;
|
|
} WHEA_ERROR_RECORD_SECTION_DESCRIPTOR_FLAGS,
|
|
*PWHEA_ERROR_RECORD_SECTION_DESCRIPTOR_FLAGS;
|
|
|
|
#define WHEA_SECTION_DESCRIPTOR_FLAGS_PRIMARY 0x00000001
|
|
#define WHEA_SECTION_DESCRIPTOR_FLAGS_CONTAINMENTWRN 0x00000002
|
|
#define WHEA_SECTION_DESCRIPTOR_FLAGS_RESET 0x00000004
|
|
#define WHEA_SECTION_DESCRIPTOR_FLAGS_THRESHOLDEXCEEDED 0x00000008
|
|
#define WHEA_SECTION_DESCRIPTOR_FLAGS_RESOURCENA 0x00000010
|
|
#define WHEA_SECTION_DESCRIPTOR_FLAGS_LATENTERROR 0x00000020
|
|
|
|
typedef union _WHEA_ERROR_RECORD_SECTION_DESCRIPTOR_VALIDBITS {
|
|
struct {
|
|
UCHAR FRUId:1;
|
|
UCHAR FRUText:1;
|
|
UCHAR Reserved:6;
|
|
} DUMMYSTRUCTNAME;
|
|
UCHAR AsUCHAR;
|
|
} WHEA_ERROR_RECORD_SECTION_DESCRIPTOR_VALIDBITS,
|
|
*PWHEA_ERROR_RECORD_SECTION_DESCRIPTOR_VALIDBITS;
|
|
|
|
typedef struct _WHEA_ERROR_RECORD_SECTION_DESCRIPTOR {
|
|
ULONG SectionOffset;
|
|
ULONG SectionLength;
|
|
WHEA_REVISION Revision;
|
|
WHEA_ERROR_RECORD_SECTION_DESCRIPTOR_VALIDBITS ValidBits;
|
|
UCHAR Reserved;
|
|
WHEA_ERROR_RECORD_SECTION_DESCRIPTOR_FLAGS Flags;
|
|
GUID SectionType;
|
|
GUID FRUId;
|
|
WHEA_ERROR_SEVERITY SectionSeverity;
|
|
CCHAR FRUText[20];
|
|
} WHEA_ERROR_RECORD_SECTION_DESCRIPTOR, *PWHEA_ERROR_RECORD_SECTION_DESCRIPTOR;
|
|
|
|
#define WHEA_ERROR_RECORD_SECTION_DESCRIPTOR_REVISION 0x0201
|
|
|
|
#if WHEA_DOWNLEVEL_TYPE_NAMES
|
|
|
|
#define WHEA_SECTION_DESCRIPTOR_REVISION \
|
|
WHEA_ERROR_RECORD_SECTION_DESCRIPTOR_REVISION
|
|
|
|
#endif
|
|
|
|
//
|
|
// Validate the error record section descriptor structure against the
|
|
// definitions in the UEFI specification.
|
|
//
|
|
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_SECTION_DESCRIPTOR, SectionOffset, 0, 4);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_SECTION_DESCRIPTOR, SectionLength, 4, 4);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_SECTION_DESCRIPTOR, Revision, 8, 2);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_SECTION_DESCRIPTOR, ValidBits, 10, 1);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_SECTION_DESCRIPTOR, Reserved, 11, 1);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_SECTION_DESCRIPTOR, Flags, 12, 4);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_SECTION_DESCRIPTOR, SectionType, 16, 16);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_SECTION_DESCRIPTOR, FRUId, 32, 16);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_SECTION_DESCRIPTOR, SectionSeverity, 48, 4);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD_SECTION_DESCRIPTOR, FRUText, 52, 20);
|
|
|
|
//----------------------------------------------------------- WHEA_ERROR_RECORD
|
|
|
|
typedef struct _WHEA_ERROR_RECORD {
|
|
WHEA_ERROR_RECORD_HEADER Header;
|
|
WHEA_ERROR_RECORD_SECTION_DESCRIPTOR SectionDescriptor[ANYSIZE_ARRAY];
|
|
} WHEA_ERROR_RECORD, *PWHEA_ERROR_RECORD;
|
|
|
|
//
|
|
// Validate the error record structure against the definitions in the UEFI
|
|
// specification.
|
|
//
|
|
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD, Header, 0, 128);
|
|
CPER_FIELD_CHECK(WHEA_ERROR_RECORD, SectionDescriptor, 128, 72);
|
|
|
|
//---------------------------------------- WHEA_PROCESSOR_GENERIC_ERROR_SECTION
|
|
|
|
#define GENPROC_PROCTYPE_XPF 0
|
|
#define GENPROC_PROCTYPE_IPF 1
|
|
|
|
#define GENPROC_PROCISA_X86 0
|
|
#define GENPROC_PROCISA_IPF 1
|
|
#define GENPROC_PROCISA_X64 2
|
|
|
|
#define GENPROC_PROCERRTYPE_UNKNOWN 0
|
|
#define GENPROC_PROCERRTYPE_CACHE 1
|
|
#define GENPROC_PROCERRTYPE_TLB 2
|
|
#define GENPROC_PROCERRTYPE_BUS 4
|
|
#define GENPROC_PROCERRTYPE_MAE 8
|
|
|
|
#define GENPROC_OP_GENERIC 0
|
|
#define GENPROC_OP_DATAREAD 1
|
|
#define GENPROC_OP_DATAWRITE 2
|
|
#define GENPROC_OP_INSTRUCTIONEXE 3
|
|
|
|
#define GENPROC_FLAGS_RESTARTABLE 0x01
|
|
#define GENPROC_FLAGS_PRECISEIP 0x02
|
|
#define GENPROC_FLAGS_OVERFLOW 0x04
|
|
#define GENPROC_FLAGS_CORRECTED 0x08
|
|
|
|
typedef union _WHEA_PROCESSOR_FAMILY_INFO {
|
|
struct {
|
|
ULONG Stepping:4;
|
|
ULONG Model:4;
|
|
ULONG Family:4;
|
|
ULONG ProcessorType:2;
|
|
ULONG Reserved1:2;
|
|
ULONG ExtendedModel:4;
|
|
ULONG ExtendedFamily:8;
|
|
ULONG Reserved2:4;
|
|
ULONG Reserved3;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG AsULONGLONG;
|
|
} WHEA_PROCESSOR_FAMILY_INFO, *PWHEA_PROCESSOR_FAMILY_INFO;
|
|
|
|
typedef union _WHEA_PROCESSOR_GENERIC_ERROR_SECTION_VALIDBITS {
|
|
struct {
|
|
ULONGLONG ProcessorType:1;
|
|
ULONGLONG InstructionSet:1;
|
|
ULONGLONG ErrorType:1;
|
|
ULONGLONG Operation:1;
|
|
ULONGLONG Flags:1;
|
|
ULONGLONG Level:1;
|
|
ULONGLONG CPUVersion:1;
|
|
ULONGLONG CPUBrandString:1;
|
|
ULONGLONG ProcessorId:1;
|
|
ULONGLONG TargetAddress:1;
|
|
ULONGLONG RequesterId:1;
|
|
ULONGLONG ResponderId:1;
|
|
ULONGLONG InstructionPointer:1;
|
|
ULONGLONG Reserved:51;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG ValidBits;
|
|
} WHEA_PROCESSOR_GENERIC_ERROR_SECTION_VALIDBITS,
|
|
*PWHEA_PROCESSOR_GENERIC_ERROR_SECTION_VALIDBITS;
|
|
|
|
typedef struct _WHEA_PROCESSOR_GENERIC_ERROR_SECTION {
|
|
WHEA_PROCESSOR_GENERIC_ERROR_SECTION_VALIDBITS ValidBits;
|
|
UCHAR ProcessorType;
|
|
UCHAR InstructionSet;
|
|
UCHAR ErrorType;
|
|
UCHAR Operation;
|
|
UCHAR Flags;
|
|
UCHAR Level;
|
|
USHORT Reserved;
|
|
ULONGLONG CPUVersion;
|
|
UCHAR CPUBrandString[128];
|
|
ULONGLONG ProcessorId;
|
|
ULONGLONG TargetAddress;
|
|
ULONGLONG RequesterId;
|
|
ULONGLONG ResponderId;
|
|
ULONGLONG InstructionPointer;
|
|
} WHEA_PROCESSOR_GENERIC_ERROR_SECTION, *PWHEA_PROCESSOR_GENERIC_ERROR_SECTION;
|
|
|
|
//
|
|
// Define alternate type name for downlevel source compatibility.
|
|
//
|
|
|
|
#if WHEA_DOWNLEVEL_TYPE_NAMES
|
|
|
|
typedef WHEA_PROCESSOR_GENERIC_ERROR_SECTION_VALIDBITS
|
|
WHEA_GENERIC_PROCESSOR_ERROR_VALIDBITS,
|
|
*PWHEA_GENERIC_PROCESSOR_ERROR_VALIDBITS;
|
|
|
|
typedef WHEA_PROCESSOR_GENERIC_ERROR_SECTION
|
|
WHEA_GENERIC_PROCESSOR_ERROR, *PWHEA_GENERIC_PROCESSOR_ERROR;
|
|
|
|
#endif
|
|
|
|
//
|
|
// Validate the processor generic error section structure against the
|
|
// definitions in the UEFI specification.
|
|
//
|
|
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, ValidBits, 0, 8);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, ProcessorType, 8, 1);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, InstructionSet, 9, 1);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, ErrorType, 10, 1);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, Operation, 11, 1);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, Flags, 12, 1);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, Level, 13, 1);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, Reserved, 14, 2);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, CPUVersion, 16, 8);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, CPUBrandString, 24, 128);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, ProcessorId, 152, 8);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, TargetAddress, 160, 8);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, RequesterId, 168, 8);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, ResponderId, 176, 8);
|
|
CPER_FIELD_CHECK(WHEA_PROCESSOR_GENERIC_ERROR_SECTION, InstructionPointer, 184, 8);
|
|
|
|
//-------------------------------------------- WHEA_XPF_PROCESSOR_ERROR_SECTION
|
|
|
|
//
|
|
// x86/x64 cache check structure.
|
|
//
|
|
|
|
#define XPF_CACHE_CHECK_TRANSACTIONTYPE_INSTRUCTION 0
|
|
#define XPF_CACHE_CHECK_TRANSACTIONTYPE_DATAACCESS 1
|
|
#define XPF_CACHE_CHECK_TRANSACTIONTYPE_GENERIC 2
|
|
|
|
#define XPF_CACHE_CHECK_OPERATION_GENERIC 0
|
|
#define XPF_CACHE_CHECK_OPERATION_GENREAD 1
|
|
#define XPF_CACHE_CHECK_OPERATION_GENWRITE 2
|
|
#define XPF_CACHE_CHECK_OPERATION_DATAREAD 3
|
|
#define XPF_CACHE_CHECK_OPERATION_DATAWRITE 4
|
|
#define XPF_CACHE_CHECK_OPERATION_INSTRUCTIONFETCH 5
|
|
#define XPF_CACHE_CHECK_OPERATION_PREFETCH 6
|
|
#define XPF_CACHE_CHECK_OPERATION_EVICTION 7
|
|
#define XPF_CACHE_CHECK_OPERATION_SNOOP 8
|
|
|
|
typedef union _WHEA_XPF_CACHE_CHECK {
|
|
struct {
|
|
ULONGLONG TransactionTypeValid:1;
|
|
ULONGLONG OperationValid:1;
|
|
ULONGLONG LevelValid:1;
|
|
ULONGLONG ProcessorContextCorruptValid:1;
|
|
ULONGLONG UncorrectedValid:1;
|
|
ULONGLONG PreciseIPValid:1;
|
|
ULONGLONG RestartableIPValid:1;
|
|
ULONGLONG OverflowValid:1;
|
|
ULONGLONG ReservedValid:8;
|
|
|
|
ULONGLONG TransactionType:2;
|
|
ULONGLONG Operation:4;
|
|
ULONGLONG Level:3;
|
|
ULONGLONG ProcessorContextCorrupt:1;
|
|
ULONGLONG Uncorrected:1;
|
|
ULONGLONG PreciseIP:1;
|
|
ULONGLONG RestartableIP:1;
|
|
ULONGLONG Overflow:1;
|
|
|
|
ULONGLONG Reserved:34;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG XpfCacheCheck;
|
|
} WHEA_XPF_CACHE_CHECK, *PWHEA_XPF_CACHE_CHECK;
|
|
|
|
//
|
|
// x86/x64 TLB check structure.
|
|
//
|
|
|
|
#define XPF_TLB_CHECK_TRANSACTIONTYPE_INSTRUCTION 0
|
|
#define XPF_TLB_CHECK_TRANSACTIONTYPE_DATAACCESS 1
|
|
#define XPF_TLB_CHECK_TRANSACTIONTYPE_GENERIC 2
|
|
|
|
#define XPF_TLB_CHECK_OPERATION_GENERIC 0
|
|
#define XPF_TLB_CHECK_OPERATION_GENREAD 1
|
|
#define XPF_TLB_CHECK_OPERATION_GENWRITE 2
|
|
#define XPF_TLB_CHECK_OPERATION_DATAREAD 3
|
|
#define XPF_TLB_CHECK_OPERATION_DATAWRITE 4
|
|
#define XPF_TLB_CHECK_OPERATION_INSTRUCTIONFETCH 5
|
|
#define XPF_TLB_CHECK_OPERATION_PREFETCH 6
|
|
|
|
typedef union _WHEA_XPF_TLB_CHECK {
|
|
struct {
|
|
ULONGLONG TransactionTypeValid:1;
|
|
ULONGLONG OperationValid:1;
|
|
ULONGLONG LevelValid:1;
|
|
ULONGLONG ProcessorContextCorruptValid:1;
|
|
ULONGLONG UncorrectedValid:1;
|
|
ULONGLONG PreciseIPValid:1;
|
|
ULONGLONG RestartableIPValid:1;
|
|
ULONGLONG OverflowValid:1;
|
|
ULONGLONG ReservedValid:8;
|
|
|
|
ULONGLONG TransactionType:2;
|
|
ULONGLONG Operation:4;
|
|
ULONGLONG Level:3;
|
|
ULONGLONG ProcessorContextCorrupt:1;
|
|
ULONGLONG Uncorrected:1;
|
|
ULONGLONG PreciseIP:1;
|
|
ULONGLONG RestartableIP:1;
|
|
ULONGLONG Overflow:1;
|
|
ULONGLONG Reserved:34;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG XpfTLBCheck;
|
|
} WHEA_XPF_TLB_CHECK, *PWHEA_XPF_TLB_CHECK;
|
|
|
|
//
|
|
// x86/x64 bus check structure.
|
|
//
|
|
|
|
#define XPF_BUS_CHECK_TRANSACTIONTYPE_INSTRUCTION 0
|
|
#define XPF_BUS_CHECK_TRANSACTIONTYPE_DATAACCESS 1
|
|
#define XPF_BUS_CHECK_TRANSACTIONTYPE_GENERIC 2
|
|
|
|
#define XPF_BUS_CHECK_OPERATION_GENERIC 0
|
|
#define XPF_BUS_CHECK_OPERATION_GENREAD 1
|
|
#define XPF_BUS_CHECK_OPERATION_GENWRITE 2
|
|
#define XPF_BUS_CHECK_OPERATION_DATAREAD 3
|
|
#define XPF_BUS_CHECK_OPERATION_DATAWRITE 4
|
|
#define XPF_BUS_CHECK_OPERATION_INSTRUCTIONFETCH 5
|
|
#define XPF_BUS_CHECK_OPERATION_PREFETCH 6
|
|
|
|
#define XPF_BUS_CHECK_PARTICIPATION_PROCORIGINATED 0
|
|
#define XPF_BUS_CHECK_PARTICIPATION_PROCRESPONDED 1
|
|
#define XPF_BUS_CHECK_PARTICIPATION_PROCOBSERVED 2
|
|
#define XPF_BUS_CHECK_PARTICIPATION_GENERIC 3
|
|
|
|
#define XPF_BUS_CHECK_ADDRESS_MEMORY 0
|
|
#define XPF_BUS_CHECK_ADDRESS_RESERVED 1
|
|
#define XPF_BUS_CHECK_ADDRESS_IO 2
|
|
#define XPF_BUS_CHECK_ADDRESS_OTHER 3
|
|
|
|
typedef union _WHEA_XPF_BUS_CHECK {
|
|
struct {
|
|
ULONGLONG TransactionTypeValid:1;
|
|
ULONGLONG OperationValid:1;
|
|
ULONGLONG LevelValid:1;
|
|
ULONGLONG ProcessorContextCorruptValid:1;
|
|
ULONGLONG UncorrectedValid:1;
|
|
ULONGLONG PreciseIPValid:1;
|
|
ULONGLONG RestartableIPValid:1;
|
|
ULONGLONG OverflowValid:1;
|
|
ULONGLONG ParticipationValid:1;
|
|
ULONGLONG TimeoutValid:1;
|
|
ULONGLONG AddressSpaceValid:1;
|
|
ULONGLONG ReservedValid:5;
|
|
|
|
ULONGLONG TransactionType:2;
|
|
ULONGLONG Operation:4;
|
|
ULONGLONG Level:3;
|
|
ULONGLONG ProcessorContextCorrupt:1;
|
|
ULONGLONG Uncorrected:1;
|
|
ULONGLONG PreciseIP:1;
|
|
ULONGLONG RestartableIP:1;
|
|
ULONGLONG Overflow:1;
|
|
ULONGLONG Participation:2;
|
|
ULONGLONG Timeout:1;
|
|
ULONGLONG AddressSpace:2;
|
|
ULONGLONG Reserved:29;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG XpfBusCheck;
|
|
} WHEA_XPF_BUS_CHECK, *PWHEA_XPF_BUS_CHECK;
|
|
|
|
//
|
|
// x86/x64 micro-architecture specific check structure.
|
|
//
|
|
|
|
#define XPF_MS_CHECK_ERRORTYPE_NOERROR 0
|
|
#define XPF_MS_CHECK_ERRORTYPE_UNCLASSIFIED 1
|
|
#define XPF_MS_CHECK_ERRORTYPE_MCROMPARITY 2
|
|
#define XPF_MS_CHECK_ERRORTYPE_EXTERNAL 3
|
|
#define XPF_MS_CHECK_ERRORTYPE_FRC 4
|
|
#define XPF_MS_CHECK_ERRORTYPE_INTERNALUNCLASSIFIED 5
|
|
|
|
typedef union _WHEA_XPF_MS_CHECK {
|
|
struct {
|
|
ULONGLONG ErrorTypeValid:1;
|
|
ULONGLONG ProcessorContextCorruptValid:1;
|
|
ULONGLONG UncorrectedValid:1;
|
|
ULONGLONG PreciseIPValid:1;
|
|
ULONGLONG RestartableIPValid:1;
|
|
ULONGLONG OverflowValid:1;
|
|
ULONGLONG ReservedValue:10;
|
|
|
|
ULONGLONG ErrorType:3;
|
|
ULONGLONG ProcessorContextCorrupt:1;
|
|
ULONGLONG Uncorrected:1;
|
|
ULONGLONG PreciseIP:1;
|
|
ULONGLONG RestartableIP:1;
|
|
ULONGLONG Overflow:1;
|
|
ULONGLONG Reserved:40;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG XpfMsCheck;
|
|
} WHEA_XPF_MS_CHECK, *PWHEA_XPF_MS_CHECK;
|
|
|
|
//
|
|
// x86/x64 Processor Error Information Structure.
|
|
//
|
|
|
|
typedef union _WHEA_XPF_PROCINFO_VALIDBITS {
|
|
struct {
|
|
ULONGLONG CheckInfo:1;
|
|
ULONGLONG TargetId:1;
|
|
ULONGLONG RequesterId:1;
|
|
ULONGLONG ResponderId:1;
|
|
ULONGLONG InstructionPointer:1;
|
|
ULONGLONG Reserved:59;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG ValidBits;
|
|
} WHEA_XPF_PROCINFO_VALIDBITS, *PWHEA_XPF_PROCINFO_VALIDBITS;
|
|
|
|
typedef struct _WHEA_XPF_PROCINFO {
|
|
GUID CheckInfoId;
|
|
WHEA_XPF_PROCINFO_VALIDBITS ValidBits;
|
|
union {
|
|
WHEA_XPF_CACHE_CHECK CacheCheck;
|
|
WHEA_XPF_TLB_CHECK TlbCheck;
|
|
WHEA_XPF_BUS_CHECK BusCheck;
|
|
WHEA_XPF_MS_CHECK MsCheck;
|
|
ULONGLONG AsULONGLONG;
|
|
} CheckInfo;
|
|
ULONGLONG TargetId;
|
|
ULONGLONG RequesterId;
|
|
ULONGLONG ResponderId;
|
|
ULONGLONG InstructionPointer;
|
|
} WHEA_XPF_PROCINFO, *PWHEA_XPF_PROCINFO;
|
|
|
|
//
|
|
// x86/x64 Processor Context Information Structure.
|
|
//
|
|
|
|
typedef struct _WHEA_X86_REGISTER_STATE {
|
|
ULONG Eax;
|
|
ULONG Ebx;
|
|
ULONG Ecx;
|
|
ULONG Edx;
|
|
ULONG Esi;
|
|
ULONG Edi;
|
|
ULONG Ebp;
|
|
ULONG Esp;
|
|
USHORT Cs;
|
|
USHORT Ds;
|
|
USHORT Ss;
|
|
USHORT Es;
|
|
USHORT Fs;
|
|
USHORT Gs;
|
|
ULONG Eflags;
|
|
ULONG Eip;
|
|
ULONG Cr0;
|
|
ULONG Cr1;
|
|
ULONG Cr2;
|
|
ULONG Cr3;
|
|
ULONG Cr4;
|
|
ULONGLONG Gdtr;
|
|
ULONGLONG Idtr;
|
|
USHORT Ldtr;
|
|
USHORT Tr;
|
|
} WHEA_X86_REGISTER_STATE, *PWHEA_X86_REGISTER_STATE;
|
|
|
|
typedef struct DECLSPEC_ALIGN(16) _WHEA128A {
|
|
ULONGLONG Low;
|
|
LONGLONG High;
|
|
} WHEA128A, *PWHEA128A;
|
|
|
|
#if defined(_MSC_VER)
|
|
#if (_MSC_VER >= 1200)
|
|
#pragma warning(push)
|
|
#pragma warning(disable:4324) // structure padded due to __declspec(align())
|
|
#endif
|
|
#endif
|
|
|
|
typedef struct _WHEA_X64_REGISTER_STATE {
|
|
ULONGLONG Rax;
|
|
ULONGLONG Rbx;
|
|
ULONGLONG Rcx;
|
|
ULONGLONG Rdx;
|
|
ULONGLONG Rsi;
|
|
ULONGLONG Rdi;
|
|
ULONGLONG Rbp;
|
|
ULONGLONG Rsp;
|
|
ULONGLONG R8;
|
|
ULONGLONG R9;
|
|
ULONGLONG R10;
|
|
ULONGLONG R11;
|
|
ULONGLONG R12;
|
|
ULONGLONG R13;
|
|
ULONGLONG R14;
|
|
ULONGLONG R15;
|
|
USHORT Cs;
|
|
USHORT Ds;
|
|
USHORT Ss;
|
|
USHORT Es;
|
|
USHORT Fs;
|
|
USHORT Gs;
|
|
ULONG Reserved;
|
|
ULONGLONG Rflags;
|
|
ULONGLONG Eip;
|
|
ULONGLONG Cr0;
|
|
ULONGLONG Cr1;
|
|
ULONGLONG Cr2;
|
|
ULONGLONG Cr3;
|
|
ULONGLONG Cr4;
|
|
ULONGLONG Cr8;
|
|
WHEA128A Gdtr;
|
|
WHEA128A Idtr;
|
|
USHORT Ldtr;
|
|
USHORT Tr;
|
|
} WHEA_X64_REGISTER_STATE, *PWHEA_X64_REGISTER_STATE;
|
|
|
|
#if defined(_MSC_VER)
|
|
#if (_MSC_VER >= 1200)
|
|
#pragma warning(pop)
|
|
#endif
|
|
#endif
|
|
|
|
#define XPF_CONTEXT_INFO_UNCLASSIFIEDDATA 0
|
|
#define XPF_CONTEXT_INFO_MSRREGISTERS 1
|
|
#define XPF_CONTEXT_INFO_32BITCONTEXT 2
|
|
#define XPF_CONTEXT_INFO_64BITCONTEXT 3
|
|
#define XPF_CONTEXT_INFO_FXSAVE 4
|
|
#define XPF_CONTEXT_INFO_32BITDEBUGREGS 5
|
|
#define XPF_CONTEXT_INFO_64BITDEBUGREGS 6
|
|
#define XPF_CONTEXT_INFO_MMREGISTERS 7
|
|
|
|
typedef struct _WHEA_XPF_CONTEXT_INFO {
|
|
USHORT RegisterContextType;
|
|
USHORT RegisterDataSize;
|
|
ULONG MSRAddress;
|
|
ULONGLONG MmRegisterAddress;
|
|
|
|
//
|
|
// UCHAR RegisterData[ANYSIZE_ARRAY];
|
|
//
|
|
|
|
} WHEA_XPF_CONTEXT_INFO, *PWHEA_XPF_CONTEXT_INFO;
|
|
|
|
//
|
|
// x86/x64 Processor Error Section
|
|
//
|
|
|
|
typedef union _WHEA_XPF_PROCESSOR_ERROR_SECTION_VALIDBITS {
|
|
struct {
|
|
ULONGLONG LocalAPICId:1;
|
|
ULONGLONG CpuId:1;
|
|
ULONGLONG ProcInfoCount:6;
|
|
ULONGLONG ContextInfoCount:6;
|
|
ULONGLONG Reserved:50;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG ValidBits;
|
|
} WHEA_XPF_PROCESSOR_ERROR_SECTION_VALIDBITS,
|
|
*PWHEA_XPF_PROCESSOR_ERROR_SECTION_VALIDBITS;
|
|
|
|
typedef struct _WHEA_XPF_PROCESSOR_ERROR_SECTION {
|
|
WHEA_XPF_PROCESSOR_ERROR_SECTION_VALIDBITS ValidBits;
|
|
ULONGLONG LocalAPICId;
|
|
UCHAR CpuId[48];
|
|
|
|
//
|
|
// WHEA_XPF_PROCINFO ProcInfo[ANYSIZE_ARRAY];
|
|
// WHEA_XPF_CONTEXT_INFO ContextInfo[ANYSIZE_ARRAY];
|
|
//
|
|
|
|
UCHAR VariableInfo[ANYSIZE_ARRAY];
|
|
} WHEA_XPF_PROCESSOR_ERROR_SECTION, *PWHEA_XPF_PROCESSOR_ERROR_SECTION;
|
|
|
|
//
|
|
// Define alternate type names for downlevel source compatibility.
|
|
//
|
|
|
|
#if WHEA_DOWNLEVEL_TYPE_NAMES
|
|
|
|
typedef struct WHEA_XPF_PROCESSOR_ERROR_SECTION_VALIDBITS
|
|
WHEA_XPF_PROCESSOR_ERROR_VALIDBITS, *PWHEA_XPF_PROCESSOR_ERROR_VALIDBITS;
|
|
|
|
typedef struct WHEA_XPF_PROCESSOR_ERROR_SECTION
|
|
WHEA_XPF_PROCESSOR_ERROR, *PWHEA_XPF_PROCESSOR_ERROR;
|
|
|
|
#endif
|
|
|
|
//
|
|
// Validate the x86/x64 processor error section structures against the
|
|
// definitions in the UEFI specification.
|
|
//
|
|
|
|
CPER_FIELD_CHECK(WHEA_XPF_PROCINFO, CheckInfoId, 0, 16);
|
|
CPER_FIELD_CHECK(WHEA_XPF_PROCINFO, ValidBits, 16, 8);
|
|
CPER_FIELD_CHECK(WHEA_XPF_PROCINFO, CheckInfo, 24, 8);
|
|
CPER_FIELD_CHECK(WHEA_XPF_PROCINFO, TargetId, 32, 8);
|
|
CPER_FIELD_CHECK(WHEA_XPF_PROCINFO, RequesterId, 40, 8);
|
|
CPER_FIELD_CHECK(WHEA_XPF_PROCINFO, ResponderId, 48, 8);
|
|
CPER_FIELD_CHECK(WHEA_XPF_PROCINFO, InstructionPointer, 56, 8);
|
|
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Eax, 0, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Ebx, 4, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Ecx, 8, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Edx, 12, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Esi, 16, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Edi, 20, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Ebp, 24, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Esp, 28, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Cs, 32, 2);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Ds, 34, 2);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Ss, 36, 2);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Es, 38, 2);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Fs, 40, 2);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Gs, 42, 2);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Eflags, 44, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Eip, 48, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Cr0, 52, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Cr1, 56, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Cr2, 60, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Cr3, 64, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Cr4, 68, 4);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Gdtr, 72, 8);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Idtr, 80, 8);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Ldtr, 88, 2);
|
|
CPER_FIELD_CHECK(WHEA_X86_REGISTER_STATE, Tr, 90, 2);
|
|
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Rax, 0, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Rbx, 8, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Rcx, 16, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Rdx, 24, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Rsi, 32, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Rdi, 40, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Rbp, 48, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Rsp, 56, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, R8, 64, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, R9, 72, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, R10, 80, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, R11, 88, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, R12, 96, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, R13, 104, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, R14, 112, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, R15, 120, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Cs, 128, 2);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Ds, 130, 2);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Ss, 132, 2);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Es, 134, 2);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Fs, 136, 2);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Gs, 138, 2);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Reserved, 140, 4);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Rflags, 144, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Eip, 152, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Cr0, 160, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Cr1, 168, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Cr2, 176, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Cr3, 184, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Cr4, 192, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Cr8, 200, 8);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Gdtr, 208, 16);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Idtr, 224, 16);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Ldtr, 240, 2);
|
|
CPER_FIELD_CHECK(WHEA_X64_REGISTER_STATE, Tr, 242, 2);
|
|
|
|
CPER_FIELD_CHECK(WHEA_XPF_CONTEXT_INFO, RegisterContextType, 0, 2);
|
|
CPER_FIELD_CHECK(WHEA_XPF_CONTEXT_INFO, RegisterDataSize, 2, 2);
|
|
CPER_FIELD_CHECK(WHEA_XPF_CONTEXT_INFO, MSRAddress, 4, 4);
|
|
CPER_FIELD_CHECK(WHEA_XPF_CONTEXT_INFO, MmRegisterAddress, 8, 8);
|
|
|
|
CPER_FIELD_CHECK(WHEA_XPF_PROCESSOR_ERROR_SECTION, ValidBits, 0, 8);
|
|
CPER_FIELD_CHECK(WHEA_XPF_PROCESSOR_ERROR_SECTION, LocalAPICId, 8, 8);
|
|
CPER_FIELD_CHECK(WHEA_XPF_PROCESSOR_ERROR_SECTION, CpuId, 16, 48);
|
|
CPER_FIELD_CHECK(WHEA_XPF_PROCESSOR_ERROR_SECTION, VariableInfo, 64, ANYSIZE_ARRAY);
|
|
|
|
//--------------------------------------------------- WHEA_MEMORY_ERROR_SECTION
|
|
|
|
typedef union _WHEA_MEMORY_ERROR_SECTION_VALIDBITS {
|
|
struct {
|
|
ULONGLONG ErrorStatus:1;
|
|
ULONGLONG PhysicalAddress:1;
|
|
ULONGLONG PhysicalAddressMask:1;
|
|
ULONGLONG Node:1;
|
|
ULONGLONG Card:1;
|
|
ULONGLONG Module:1;
|
|
ULONGLONG Bank:1;
|
|
ULONGLONG Device:1;
|
|
ULONGLONG Row:1;
|
|
ULONGLONG Column:1;
|
|
ULONGLONG BitPosition:1;
|
|
ULONGLONG RequesterId:1;
|
|
ULONGLONG ResponderId:1;
|
|
ULONGLONG TargetId:1;
|
|
ULONGLONG ErrorType:1;
|
|
ULONGLONG Reserved:49;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG ValidBits;
|
|
} WHEA_MEMORY_ERROR_SECTION_VALIDBITS,
|
|
*PWHEA_MEMORY_ERROR_SECTION_VALIDBITS;
|
|
|
|
#define WHEA_MEMERRTYPE_UNKNOWN 0x00
|
|
#define WHEA_MEMERRTYPE_NOERROR 0x01
|
|
#define WHEA_MEMERRTYPE_SINGLEBITECC 0x02
|
|
#define WHEA_MEMERRTYPE_MULTIBITECC 0x03
|
|
#define WHEA_MEMERRTYPE_SINGLESYMCHIPKILL 0x04
|
|
#define WHEA_MEMERRTYPE_MULTISYMCHIPKILL 0x05
|
|
#define WHEA_MEMERRTYPE_MASTERABORT 0x06
|
|
#define WHEA_MEMERRTYPE_TARGETABORT 0x07
|
|
#define WHEA_MEMERRTYPE_PARITYERROR 0x08
|
|
#define WHEA_MEMERRTYPE_WATCHDOGTIMEOUT 0x09
|
|
#define WHEA_MEMERRTYPE_INVALIDADDRESS 0x0A
|
|
#define WHEA_MEMERRTYPE_MIRRORBROKEN 0x0B
|
|
#define WHEA_MEMERRTYPE_MEMORYSPARING 0x0C
|
|
|
|
typedef struct _WHEA_MEMORY_ERROR_SECTION {
|
|
WHEA_MEMORY_ERROR_SECTION_VALIDBITS ValidBits;
|
|
WHEA_ERROR_STATUS ErrorStatus;
|
|
ULONGLONG PhysicalAddress;
|
|
ULONGLONG PhysicalAddressMask;
|
|
USHORT Node;
|
|
USHORT Card;
|
|
USHORT Module;
|
|
USHORT Bank;
|
|
USHORT Device;
|
|
USHORT Row;
|
|
USHORT Column;
|
|
USHORT BitPosition;
|
|
ULONGLONG RequesterId;
|
|
ULONGLONG ResponderId;
|
|
ULONGLONG TargetId;
|
|
UCHAR ErrorType;
|
|
} WHEA_MEMORY_ERROR_SECTION, *PWHEA_MEMORY_ERROR_SECTION;
|
|
|
|
//
|
|
// Define alternate names allowing for downlevel source compatibility.
|
|
//
|
|
|
|
#if WHEA_DOWNLEVEL_TYPE_NAMES
|
|
|
|
typedef WHEA_MEMORY_ERROR_SECTION_VALIDBITS
|
|
WHEA_MEMORY_ERROR_VALIDBITS, *PWHEA_MEMORY_ERROR_VALIDBITS;
|
|
|
|
typedef WHEA_MEMORY_ERROR_SECTION
|
|
WHEA_MEMORY_ERROR, *PWHEA_MEMORY_ERROR;
|
|
|
|
#endif
|
|
|
|
//
|
|
// Validate the memory error section structures against the definitions in the
|
|
// UEFI specification.
|
|
//
|
|
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, ValidBits, 0, 8);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, ErrorStatus, 8, 8);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, PhysicalAddress, 16, 8);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, PhysicalAddressMask, 24, 8);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, Node, 32, 2);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, Card, 34, 2);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, Module, 36, 2);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, Bank, 38, 2);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, Device, 40, 2);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, Row, 42, 2);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, Column, 44, 2);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, BitPosition, 46, 2);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, RequesterId, 48, 8);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, ResponderId, 56, 8);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, TargetId, 64, 8);
|
|
CPER_FIELD_CHECK(WHEA_MEMORY_ERROR_SECTION, ErrorType, 72, 1);
|
|
|
|
//----------------------------------------------- WHEA_PCIEXPRESS_ERROR_SECTION
|
|
|
|
typedef union _WHEA_PCIEXPRESS_ERROR_SECTION_VALIDBITS {
|
|
struct {
|
|
ULONGLONG PortType:1;
|
|
ULONGLONG Version:1;
|
|
ULONGLONG CommandStatus:1;
|
|
ULONGLONG DeviceId:1;
|
|
ULONGLONG DeviceSerialNumber:1;
|
|
ULONGLONG BridgeControlStatus:1;
|
|
ULONGLONG ExpressCapability:1;
|
|
ULONGLONG AerInfo:1;
|
|
ULONGLONG Reserved:56;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG ValidBits;
|
|
} WHEA_PCIEXPRESS_ERROR_SECTION_VALIDBITS,
|
|
*PWHEA_PCIEXPRESS_ERROR_SECTION_VALIDBITS;
|
|
|
|
typedef struct _WHEA_PCIEXPRESS_DEVICE_ID {
|
|
USHORT VendorID;
|
|
USHORT DeviceID;
|
|
ULONG ClassCode:24;
|
|
ULONG FunctionNumber:8;
|
|
ULONG DeviceNumber:8;
|
|
ULONG Segment:16;
|
|
ULONG PrimaryBusNumber:8;
|
|
ULONG SecondaryBusNumber:8;
|
|
ULONG Reserved1:3;
|
|
ULONG SlotNumber:13;
|
|
ULONG Reserved2:8;
|
|
} WHEA_PCIEXPRESS_DEVICE_ID, *PWHEA_PCIEXPRESS_DEVICE_ID;
|
|
|
|
typedef union _WHEA_PCIEXPRESS_VERSION {
|
|
struct {
|
|
UCHAR MinorVersion;
|
|
UCHAR MajorVersion;
|
|
USHORT Reserved;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONG AsULONG;
|
|
} WHEA_PCIEXPRESS_VERSION, *PWHEA_PCIEXPRESS_VERSION;
|
|
|
|
typedef union _WHEA_PCIEXPRESS_COMMAND_STATUS {
|
|
struct {
|
|
USHORT Command;
|
|
USHORT Status;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONG AsULONG;
|
|
} WHEA_PCIEXPRESS_COMMAND_STATUS, *PWHEA_PCIEXPRESS_COMMAND_STATUS;
|
|
|
|
typedef union _WHEA_PCIEXPRESS_BRIDGE_CONTROL_STATUS {
|
|
struct {
|
|
USHORT BridgeSecondaryStatus;
|
|
USHORT BridgeControl;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONG AsULONG;
|
|
} WHEA_PCIEXPRESS_BRIDGE_CONTROL_STATUS,
|
|
*PWHEA_PCIEXPRESS_BRIDGE_CONTROL_STATUS;
|
|
|
|
typedef enum _WHEA_PCIEXPRESS_DEVICE_TYPE {
|
|
WheaPciExpressEndpoint = 0,
|
|
WheaPciExpressLegacyEndpoint,
|
|
WheaPciExpressRootPort = 4,
|
|
WheaPciExpressUpstreamSwitchPort,
|
|
WheaPciExpressDownstreamSwitchPort,
|
|
WheaPciExpressToPciXBridge,
|
|
WheaPciXToExpressBridge,
|
|
WheaPciExpressRootComplexIntegratedEndpoint,
|
|
WheaPciExpressRootComplexEventCollector
|
|
} WHEA_PCIEXPRESS_DEVICE_TYPE;
|
|
|
|
typedef struct _WHEA_PCIEXPRESS_ERROR_SECTION {
|
|
WHEA_PCIEXPRESS_ERROR_SECTION_VALIDBITS ValidBits;
|
|
WHEA_PCIEXPRESS_DEVICE_TYPE PortType;
|
|
WHEA_PCIEXPRESS_VERSION Version;
|
|
WHEA_PCIEXPRESS_COMMAND_STATUS CommandStatus;
|
|
ULONG Reserved;
|
|
WHEA_PCIEXPRESS_DEVICE_ID DeviceId;
|
|
ULONGLONG DeviceSerialNumber;
|
|
WHEA_PCIEXPRESS_BRIDGE_CONTROL_STATUS BridgeControlStatus;
|
|
UCHAR ExpressCapability[60];
|
|
UCHAR AerInfo[96];
|
|
} WHEA_PCIEXPRESS_ERROR_SECTION, *PWHEA_PCIEXPRESS_ERROR_SECTION;
|
|
|
|
#if WHEA_DOWNLEVEL_TYPE_NAMES
|
|
|
|
typedef WHEA_PCIEXPRESS_ERROR_SECTION_VALIDBITS
|
|
WHEA_PCIEXPRESS_ERROR_VALIDBITS,
|
|
*PWHEA_PCIEXPRESS_ERROR_VALIDBITS;
|
|
|
|
typedef WHEA_PCIEXPRESS_ERROR_SECTION
|
|
WHEA_PCIEXPRESS_ERROR, *PWHEA_PCIEXPRESS_ERROR;
|
|
|
|
#endif
|
|
|
|
//
|
|
// Validate the PCI Express error section structures against the definitions
|
|
// in the UEFI specification.
|
|
//
|
|
|
|
CPER_FIELD_CHECK(WHEA_PCIEXPRESS_ERROR_SECTION, ValidBits, 0, 8);
|
|
CPER_FIELD_CHECK(WHEA_PCIEXPRESS_ERROR_SECTION, PortType, 8, 4);
|
|
CPER_FIELD_CHECK(WHEA_PCIEXPRESS_ERROR_SECTION, Version, 12, 4);
|
|
CPER_FIELD_CHECK(WHEA_PCIEXPRESS_ERROR_SECTION, CommandStatus, 16, 4);
|
|
CPER_FIELD_CHECK(WHEA_PCIEXPRESS_ERROR_SECTION, Reserved, 20, 4);
|
|
CPER_FIELD_CHECK(WHEA_PCIEXPRESS_ERROR_SECTION, DeviceId, 24, 16);
|
|
CPER_FIELD_CHECK(WHEA_PCIEXPRESS_ERROR_SECTION, DeviceSerialNumber, 40, 8);
|
|
CPER_FIELD_CHECK(WHEA_PCIEXPRESS_ERROR_SECTION, BridgeControlStatus, 48, 4);
|
|
CPER_FIELD_CHECK(WHEA_PCIEXPRESS_ERROR_SECTION, ExpressCapability, 52, 60);
|
|
CPER_FIELD_CHECK(WHEA_PCIEXPRESS_ERROR_SECTION, AerInfo, 112, 96);
|
|
|
|
//-------------------------------------------------- WHEA_PCIXBUS_ERROR_SECTION
|
|
|
|
#define PCIXBUS_ERRTYPE_UNKNOWN 0x0000
|
|
#define PCIXBUS_ERRTYPE_DATAPARITY 0x0001
|
|
#define PCIXBUS_ERRTYPE_SYSTEM 0x0002
|
|
#define PCIXBUS_ERRTYPE_MASTERABORT 0x0003
|
|
#define PCIXBUS_ERRTYPE_BUSTIMEOUT 0x0004
|
|
#define PCIXBUS_ERRTYPE_MASTERDATAPARITY 0x0005
|
|
#define PCIXBUS_ERRTYPE_ADDRESSPARITY 0x0006
|
|
#define PCIXBUS_ERRTYPE_COMMANDPARITY 0x0007
|
|
|
|
typedef union _WHEA_PCIXBUS_ERROR_SECTION_VALIDBITS {
|
|
struct {
|
|
ULONGLONG ErrorStatus:1;
|
|
ULONGLONG ErrorType:1;
|
|
ULONGLONG BusId:1;
|
|
ULONGLONG BusAddress:1;
|
|
ULONGLONG BusData:1;
|
|
ULONGLONG BusCommand:1;
|
|
ULONGLONG RequesterId:1;
|
|
ULONGLONG CompleterId:1;
|
|
ULONGLONG TargetId:1;
|
|
ULONGLONG Reserved:55;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG ValidBits;
|
|
} WHEA_PCIXBUS_ERROR_SECTION_VALIDBITS, *PWHEA_PCIXBUS_ERROR_SECTION_VALIDBITS;
|
|
|
|
typedef union _WHEA_PCIXBUS_ID {
|
|
struct {
|
|
UCHAR BusNumber;
|
|
UCHAR BusSegment;
|
|
} DUMMYSTRUCTNAME;
|
|
USHORT AsUSHORT;
|
|
} WHEA_PCIXBUS_ID, *PWHEA_PCIXBUS_ID;
|
|
|
|
typedef union _WHEA_PCIXBUS_COMMAND {
|
|
struct {
|
|
ULONGLONG Command:56;
|
|
ULONGLONG PCIXCommand:1;
|
|
ULONGLONG Reserved:7;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG AsULONGLONG;
|
|
} WHEA_PCIXBUS_COMMAND, *PWHEA_PCIXBUS_COMMAND;
|
|
|
|
typedef struct _WHEA_PCIXBUS_ERROR_SECTION {
|
|
WHEA_PCIXBUS_ERROR_SECTION_VALIDBITS ValidBits;
|
|
WHEA_ERROR_STATUS ErrorStatus;
|
|
USHORT ErrorType;
|
|
WHEA_PCIXBUS_ID BusId;
|
|
ULONG Reserved;
|
|
ULONGLONG BusAddress;
|
|
ULONGLONG BusData;
|
|
WHEA_PCIXBUS_COMMAND BusCommand;
|
|
ULONGLONG RequesterId;
|
|
ULONGLONG CompleterId;
|
|
ULONGLONG TargetId;
|
|
} WHEA_PCIXBUS_ERROR_SECTION, *PWHEA_PCIXBUS_ERROR_SECTION;
|
|
|
|
#if WHEA_DOWNLEVEL_TYPE_NAMES
|
|
|
|
typedef WHEA_PCIXBUS_ERROR_SECTION_VALIDBITS
|
|
WHEA_PCIXBUS_ERROR_VALIDBITS,
|
|
*PWHEA_PCIXBUS_ERROR_VALIDBITS;
|
|
|
|
typedef WHEA_PCIXBUS_ERROR_SECTION
|
|
WHEA_PCIXBUS_ERROR, *PWHEA_PCIXBUS_ERROR;
|
|
|
|
#endif
|
|
|
|
CPER_FIELD_CHECK(WHEA_PCIXBUS_ERROR_SECTION, ValidBits, 0, 8);
|
|
CPER_FIELD_CHECK(WHEA_PCIXBUS_ERROR_SECTION, ErrorStatus, 8, 8);
|
|
CPER_FIELD_CHECK(WHEA_PCIXBUS_ERROR_SECTION, ErrorType, 16, 2);
|
|
CPER_FIELD_CHECK(WHEA_PCIXBUS_ERROR_SECTION, BusId, 18, 2);
|
|
CPER_FIELD_CHECK(WHEA_PCIXBUS_ERROR_SECTION, Reserved, 20, 4);
|
|
CPER_FIELD_CHECK(WHEA_PCIXBUS_ERROR_SECTION, BusAddress, 24, 8);
|
|
CPER_FIELD_CHECK(WHEA_PCIXBUS_ERROR_SECTION, BusData, 32, 8);
|
|
CPER_FIELD_CHECK(WHEA_PCIXBUS_ERROR_SECTION, BusCommand, 40, 8);
|
|
CPER_FIELD_CHECK(WHEA_PCIXBUS_ERROR_SECTION, RequesterId, 48, 8);
|
|
CPER_FIELD_CHECK(WHEA_PCIXBUS_ERROR_SECTION, CompleterId, 56, 8);
|
|
CPER_FIELD_CHECK(WHEA_PCIXBUS_ERROR_SECTION, TargetId, 64, 8);
|
|
|
|
//----------------------------------------------- WHEA_PCIXDEVICE_ERROR_SECTION
|
|
|
|
typedef union _WHEA_PCIXDEVICE_ERROR_SECTION_VALIDBITS {
|
|
struct {
|
|
ULONGLONG ErrorStatus:1;
|
|
ULONGLONG IdInfo:1;
|
|
ULONGLONG MemoryNumber:1;
|
|
ULONGLONG IoNumber:1;
|
|
ULONGLONG RegisterDataPairs:1;
|
|
ULONGLONG Reserved:59;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG ValidBits;
|
|
} WHEA_PCIXDEVICE_ERROR_SECTION_VALIDBITS,
|
|
*PWHEA_PCIXDEVICE_ERROR_SECTION_VALIDBITS;
|
|
|
|
typedef struct _WHEA_PCIXDEVICE_ID {
|
|
USHORT VendorId;
|
|
USHORT DeviceId;
|
|
ULONG ClassCode:24;
|
|
ULONG FunctionNumber:8;
|
|
ULONG DeviceNumber:8;
|
|
ULONG BusNumber:8;
|
|
ULONG SegmentNumber:8;
|
|
ULONG Reserved1:8;
|
|
ULONG Reserved2;
|
|
} WHEA_PCIXDEVICE_ID, *PWHEA_PCIXDEVICE_ID;
|
|
|
|
typedef struct WHEA_PCIXDEVICE_REGISTER_PAIR {
|
|
ULONGLONG Register;
|
|
ULONGLONG Data;
|
|
} WHEA_PCIXDEVICE_REGISTER_PAIR, *PWHEA_PCIXDEVICE_REGISTER_PAIR;
|
|
|
|
typedef struct _WHEA_PCIXDEVICE_ERROR_SECTION {
|
|
WHEA_PCIXDEVICE_ERROR_SECTION_VALIDBITS ValidBits;
|
|
WHEA_ERROR_STATUS ErrorStatus;
|
|
WHEA_PCIXDEVICE_ID IdInfo;
|
|
ULONG MemoryNumber;
|
|
ULONG IoNumber;
|
|
WHEA_PCIXDEVICE_REGISTER_PAIR RegisterDataPairs[ANYSIZE_ARRAY];
|
|
} WHEA_PCIXDEVICE_ERROR_SECTION, *PWHEA_PCIXDEVICE_ERROR_SECTION;
|
|
|
|
#if WHEA_DOWNLEVEL_TYPE_NAMES
|
|
|
|
typedef WHEA_PCIXDEVICE_ERROR_SECTION_VALIDBITS
|
|
WHEA_PCIXDEVICE_ERROR_VALIDBITS, *PWHEA_PCIXDEVICE_ERROR_VALIDBITS;
|
|
|
|
typedef WHEA_PCIXDEVICE_ERROR_SECTION
|
|
WHEA_PCIXDEVICE_ERROR, *PWHEA_PCIXDEVICE_ERROR;
|
|
|
|
#endif
|
|
|
|
CPER_FIELD_CHECK(WHEA_PCIXDEVICE_ERROR_SECTION, ValidBits, 0, 8);
|
|
CPER_FIELD_CHECK(WHEA_PCIXDEVICE_ERROR_SECTION, ErrorStatus, 8, 8);
|
|
CPER_FIELD_CHECK(WHEA_PCIXDEVICE_ERROR_SECTION, IdInfo, 16, 16);
|
|
CPER_FIELD_CHECK(WHEA_PCIXDEVICE_ERROR_SECTION, MemoryNumber, 32, 4);
|
|
CPER_FIELD_CHECK(WHEA_PCIXDEVICE_ERROR_SECTION, IoNumber, 36, 4);
|
|
CPER_FIELD_CHECK(WHEA_PCIXDEVICE_ERROR_SECTION, RegisterDataPairs, 40, 16);
|
|
|
|
//---------------------------------------- WHEA_FIRMWARE_ERROR_RECORD_REFERENCE
|
|
|
|
#define WHEA_FIRMWARE_RECORD_TYPE_IPFSAL 0
|
|
|
|
typedef struct _WHEA_FIRMWARE_ERROR_RECORD_REFERENCE {
|
|
UCHAR Type;
|
|
UCHAR Reserved[7];
|
|
ULONGLONG FirmwareRecordId;
|
|
} WHEA_FIRMWARE_ERROR_RECORD_REFERENCE, *PWHEA_FIRMWARE_ERROR_RECORD_REFERENCE;
|
|
|
|
#if WHEA_DOWNLEVEL_TYPE_NAMES
|
|
|
|
typedef WHEA_FIRMWARE_ERROR_RECORD_REFERENCE
|
|
WHEA_FIRMWARE_RECORD, *PWHEA_FIRMWARE_RECORD;
|
|
|
|
#endif
|
|
|
|
CPER_FIELD_CHECK(WHEA_FIRMWARE_ERROR_RECORD_REFERENCE, Type, 0, 1);
|
|
CPER_FIELD_CHECK(WHEA_FIRMWARE_ERROR_RECORD_REFERENCE, Reserved, 1, 7);
|
|
CPER_FIELD_CHECK(WHEA_FIRMWARE_ERROR_RECORD_REFERENCE, FirmwareRecordId, 8, 8);
|
|
|
|
//
|
|
// This is the start of the Microsoft specific extensions to the Common Platform
|
|
// Error Record specification. This is in accordance with Appendix N, section
|
|
// 2.3 of the Unified Extensible Firware Interface specification, which allows
|
|
// the specification of non-standard section bodies.
|
|
//
|
|
|
|
//------------------------------------------------------------- XPF_MCA_SECTION
|
|
|
|
typedef union _MCG_STATUS {
|
|
struct {
|
|
ULONG RestartIpValid:1;
|
|
ULONG ErrorIpValid:1;
|
|
ULONG MachineCheckInProgress:1;
|
|
ULONG Reserved1:29;
|
|
ULONG Reserved2;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONGLONG QuadPart;
|
|
} MCG_STATUS, *PMCG_STATUS;
|
|
|
|
typedef union _MCI_STATUS {
|
|
struct {
|
|
USHORT McaErrorCode;
|
|
USHORT ModelErrorCode;
|
|
ULONG OtherInformation : 23;
|
|
ULONG ActionRequired : 1;
|
|
ULONG Signalling : 1;
|
|
ULONG ContextCorrupt : 1;
|
|
ULONG AddressValid : 1;
|
|
ULONG MiscValid : 1;
|
|
ULONG ErrorEnabled : 1;
|
|
ULONG UncorrectedError : 1;
|
|
ULONG StatusOverFlow : 1;
|
|
ULONG Valid : 1;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONG64 QuadPart;
|
|
} MCI_STATUS, *PMCI_STATUS;
|
|
|
|
typedef enum _WHEA_CPU_VENDOR {
|
|
WheaCpuVendorOther = 0,
|
|
WheaCpuVendorIntel,
|
|
WheaCpuVendorAmd
|
|
} WHEA_CPU_VENDOR, *PWHEA_CPU_VENDOR;
|
|
|
|
#define WHEA_XPF_MCA_EXTREG_MAX_COUNT 24
|
|
#define WHEA_XPF_MCA_SECTION_VERSION 1
|
|
|
|
typedef struct _WHEA_XPF_MCA_SECTION {
|
|
ULONG VersionNumber;
|
|
WHEA_CPU_VENDOR CpuVendor;
|
|
LARGE_INTEGER Timestamp;
|
|
ULONG ProcessorNumber;
|
|
MCG_STATUS GlobalStatus;
|
|
ULONGLONG InstructionPointer;
|
|
ULONG BankNumber;
|
|
MCI_STATUS Status;
|
|
ULONGLONG Address;
|
|
ULONGLONG Misc;
|
|
ULONG ExtendedRegisterCount;
|
|
ULONG Reserved2;
|
|
ULONGLONG ExtendedRegisters[WHEA_XPF_MCA_EXTREG_MAX_COUNT];
|
|
} WHEA_XPF_MCA_SECTION, *PWHEA_XPF_MCA_SECTION;
|
|
|
|
//------------------------------------------------------ WHEA_NMI_ERROR_SECTION
|
|
|
|
typedef union _WHEA_NMI_ERROR_SECTION_FLAGS {
|
|
struct {
|
|
ULONG HypervisorError:1;
|
|
ULONG Reserved:31;
|
|
} DUMMYSTRUCTNAME;
|
|
ULONG AsULONG;
|
|
} WHEA_NMI_ERROR_SECTION_FLAGS, *PWHEA_NMI_ERROR_SECTION_FLAGS;
|
|
|
|
typedef struct _WHEA_NMI_ERROR_SECTION {
|
|
UCHAR Data[8];
|
|
WHEA_NMI_ERROR_SECTION_FLAGS Flags;
|
|
} WHEA_NMI_ERROR_SECTION, *PWHEA_NMI_ERROR_SECTION;
|
|
|
|
#include <poppack.h>
|
|
|
|
#pragma warning(pop)
|
|
|
|
#endif // #ifndef _CPER_H_
|
|
|
|
|