xpmgr/BuildTools/Include/cper.h

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_