/** @file Microcode Definitions. Microcode Definitions based on contents of the Intel(R) 64 and IA-32 Architectures Software Developer's Manual Volume 3A, Section 9.11 Microcode Definitions Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @par Specification Reference: Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 3A, June 2016, Chapter 9 Processor Management and Initialization, Section 9-11. **/ #ifndef __INTEL_MICROCODE_H__ #define __INTEL_MICROCODE_H__ /// /// CPU Microcode Date in BCD format /// typedef union { struct { UINT32 Year:16; UINT32 Day:8; UINT32 Month:8; } Bits; UINT32 Uint32; } CPU_MICROCODE_DATE; /// /// CPU Microcode Processor Signature format /// typedef union { struct { UINT32 Stepping:4; UINT32 Model:4; UINT32 Family:4; UINT32 Type:2; UINT32 Reserved1:2; UINT32 ExtendedModel:4; UINT32 ExtendedFamily:8; UINT32 Reserved2:4; } Bits; UINT32 Uint32; } CPU_MICROCODE_PROCESSOR_SIGNATURE; #pragma pack (1) /// /// Microcode Update Format definition /// typedef struct { /// /// Version number of the update header /// UINT32 HeaderVersion; /// /// Unique version number for the update, the basis for the update /// signature provided by the processor to indicate the current update /// functioning within the processor. Used by the BIOS to authenticate /// the update and verify that the processor loads successfully. The /// value in this field cannot be used for processor stepping identification /// alone. This is a signed 32-bit number. /// UINT32 UpdateRevision; /// /// Date of the update creation in binary format: mmddyyyy (e.g. /// 07/18/98 is 07181998H). /// CPU_MICROCODE_DATE Date; /// /// Extended family, extended model, type, family, model, and stepping /// of processor that requires this particular update revision (e.g., /// 00000650H). Each microcode update is designed specifically for a /// given extended family, extended model, type, family, model, and /// stepping of the processor. /// The BIOS uses the processor signature field in conjunction with the /// CPUID instruction to determine whether or not an update is /// appropriate to load on a processor. The information encoded within /// this field exactly corresponds to the bit representations returned by /// the CPUID instruction. /// CPU_MICROCODE_PROCESSOR_SIGNATURE ProcessorSignature; /// /// Checksum of Update Data and Header. Used to verify the integrity of /// the update header and data. Checksum is correct when the /// summation of all the DWORDs (including the extended Processor /// Signature Table) that comprise the microcode update result in /// 00000000H. /// UINT32 Checksum; /// /// Version number of the loader program needed to correctly load this /// update. The initial version is 00000001H /// UINT32 LoaderRevision; /// /// Platform type information is encoded in the lower 8 bits of this 4- /// byte field. Each bit represents a particular platform type for a given /// CPUID. The BIOS uses the processor flags field in conjunction with /// the platform Id bits in MSR (17H) to determine whether or not an /// update is appropriate to load on a processor. Multiple bits may be set /// representing support for multiple platform IDs. /// UINT32 ProcessorFlags; /// /// Specifies the size of the encrypted data in bytes, and must be a /// multiple of DWORDs. If this value is 00000000H, then the microcode /// update encrypted data is 2000 bytes (or 500 DWORDs). /// UINT32 DataSize; /// /// Specifies the total size of the microcode update in bytes. It is the /// summation of the header size, the encrypted data size and the size of /// the optional extended signature table. This value is always a multiple /// of 1024. /// UINT32 TotalSize; /// /// Reserved fields for future expansion. /// UINT8 Reserved[12]; } CPU_MICROCODE_HEADER; /// /// Extended Signature Table Header Field Definitions /// typedef struct { /// /// Specifies the number of extended signature structures (Processor /// Signature[n], processor flags[n] and checksum[n]) that exist in this /// microcode update /// UINT32 ExtendedSignatureCount; /// /// Checksum of update extended processor signature table. Used to /// verify the integrity of the extended processor signature table. /// Checksum is correct when the summation of the DWORDs that /// comprise the extended processor signature table results in /// 00000000H. /// UINT32 ExtendedChecksum; /// /// Reserved fields. /// UINT8 Reserved[12]; } CPU_MICROCODE_EXTENDED_TABLE_HEADER; /// /// Extended Signature Table Field Definitions /// typedef struct { /// /// Extended family, extended model, type, family, model, and stepping /// of processor that requires this particular update revision (e.g., /// 00000650H). Each microcode update is designed specifically for a /// given extended family, extended model, type, family, model, and /// stepping of the processor. /// The BIOS uses the processor signature field in conjunction with the /// CPUID instruction to determine whether or not an update is /// appropriate to load on a processor. The information encoded within /// this field exactly corresponds to the bit representations returned by /// the CPUID instruction. /// CPU_MICROCODE_PROCESSOR_SIGNATURE ProcessorSignature; /// /// Platform type information is encoded in the lower 8 bits of this 4- /// byte field. Each bit represents a particular platform type for a given /// CPUID. The BIOS uses the processor flags field in conjunction with /// the platform Id bits in MSR (17H) to determine whether or not an /// update is appropriate to load on a processor. Multiple bits may be set /// representing support for multiple platform IDs. /// UINT32 ProcessorFlag; /// /// Used by utility software to decompose a microcode update into /// multiple microcode updates where each of the new updates is /// constructed without the optional Extended Processor Signature /// Table. /// To calculate the Checksum, substitute the Primary Processor /// Signature entry and the Processor Flags entry with the /// corresponding Extended Patch entry. Delete the Extended Processor /// Signature Table entries. The Checksum is correct when the /// summation of all DWORDs that comprise the created Extended /// Processor Patch results in 00000000H. /// UINT32 Checksum; } CPU_MICROCODE_EXTENDED_TABLE; #pragma pack () #endif