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