| /** @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.<BR> |
| 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 |