/** @file
  Intel CPUID leaf definitions.

  Provides defines for CPUID leaf indexes.  Data structures are provided for
  registers returned by a CPUID leaf that contain one or more bit fields.
  If a register returned is a single 32-bit value, then a data structure is
  not provided for that register.

  Copyright (c) 2015 - 2021, 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 2A,
  November 2018, CPUID instruction.

**/

#ifndef __INTEL_CPUID_H__
#define __INTEL_CPUID_H__

/**
  CPUID Signature Information

  @param   EAX  CPUID_SIGNATURE (0x00)

  @retval  EAX  Returns the highest value the CPUID instruction recognizes for
                returning basic processor information. The value is returned is
                processor specific.
  @retval  EBX  First 4 characters of a vendor identification string.
  @retval  ECX  Last 4 characters of a vendor identification string.
  @retval  EDX  Middle 4 characters of a vendor identification string.

  <b>Example usage</b>
  @code
  UINT32 Eax;
  UINT32 Ebx;
  UINT32 Ecx;
  UINT32 Edx;

  AsmCpuid (CPUID_SIGNATURE, &Eax, &Ebx, &Ecx, &Edx);
  @endcode
**/
#define CPUID_SIGNATURE                         0x00

///
/// @{ CPUID signature values returned by Intel processors
///
#define CPUID_SIGNATURE_GENUINE_INTEL_EBX  SIGNATURE_32 ('G', 'e', 'n', 'u')
#define CPUID_SIGNATURE_GENUINE_INTEL_EDX  SIGNATURE_32 ('i', 'n', 'e', 'I')
#define CPUID_SIGNATURE_GENUINE_INTEL_ECX  SIGNATURE_32 ('n', 't', 'e', 'l')
///
/// @}
///


/**
  CPUID Version Information

  @param   EAX  CPUID_VERSION_INFO (0x01)

  @retval  EAX  Returns Model, Family, Stepping Information described by the
                type CPUID_VERSION_INFO_EAX.
  @retval  EBX  Returns Brand, Cache Line Size, and Initial APIC ID described by
                the type CPUID_VERSION_INFO_EBX.
  @retval  ECX  CPU Feature Information described by the type
                CPUID_VERSION_INFO_ECX.
  @retval  EDX  CPU Feature Information described by the type
                CPUID_VERSION_INFO_EDX.

  <b>Example usage</b>
  @code
  CPUID_VERSION_INFO_EAX  Eax;
  CPUID_VERSION_INFO_EBX  Ebx;
  CPUID_VERSION_INFO_ECX  Ecx;
  CPUID_VERSION_INFO_EDX  Edx;

  AsmCpuid (CPUID_VERSION_INFO, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32);
  @endcode
**/
#define CPUID_VERSION_INFO                      0x01

/**
  CPUID Version Information returned in EAX for CPUID leaf
  #CPUID_VERSION_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    UINT32  SteppingId:4;        ///< [Bits   3:0] Stepping ID
    UINT32  Model:4;             ///< [Bits   7:4] Model
    UINT32  FamilyId:4;          ///< [Bits  11:8] Family
    UINT32  ProcessorType:2;     ///< [Bits 13:12] Processor Type
    UINT32  Reserved1:2;         ///< [Bits 15:14] Reserved
    UINT32  ExtendedModelId:4;   ///< [Bits 19:16] Extended Model ID
    UINT32  ExtendedFamilyId:8;  ///< [Bits 27:20] Extended Family ID
    UINT32  Reserved2:4;         ///< Reserved
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32    Uint32;
} CPUID_VERSION_INFO_EAX;

///
/// @{ Define value for bit field CPUID_VERSION_INFO_EAX.ProcessorType
///
#define CPUID_VERSION_INFO_EAX_PROCESSOR_TYPE_ORIGINAL_OEM_PROCESSOR     0x00
#define CPUID_VERSION_INFO_EAX_PROCESSOR_TYPE_INTEL_OVERDRIVE_PROCESSOR  0x01
#define CPUID_VERSION_INFO_EAX_PROCESSOR_TYPE_DUAL_PROCESSOR             0x02
///
/// @}
///

/**
  CPUID Version Information returned in EBX for CPUID leaf
  #CPUID_VERSION_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 7:0] Provides an entry into a brand string table that contains
    /// brand strings for IA-32 processors.
    ///
    UINT32  BrandIndex:8;
    ///
    /// [Bits 15:8] Indicates the size of the cache line flushed by the CLFLUSH
    /// and CLFLUSHOPT instructions in 8-byte increments. This field was
    /// introduced in the Pentium 4 processor.
    ///
    UINT32  CacheLineSize:8;
    ///
    /// [Bits 23:16] Maximum number of addressable IDs for logical processors
    /// in this physical package.
    ///
    /// @note
    /// The nearest power-of-2 integer that is not smaller than EBX[23:16] is
    /// the number of unique initial APICIDs reserved for addressing different
    /// logical processors in a physical package. This field is only valid if
    /// CPUID.1.EDX.HTT[bit 28]= 1.
    ///
    UINT32  MaximumAddressableIdsForLogicalProcessors:8;
    ///
    /// [Bits 31:24] The 8-bit ID that is assigned to the local APIC on the
    /// processor during power up. This field was introduced in the Pentium 4
    /// processor.
    ///
    UINT32  InitialLocalApicId:8;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32    Uint32;
} CPUID_VERSION_INFO_EBX;

/**
  CPUID Version Information returned in ECX for CPUID leaf
  #CPUID_VERSION_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] Streaming SIMD Extensions 3 (SSE3).  A value of 1 indicates the
    /// processor supports this technology
    ///
    UINT32  SSE3:1;
    ///
    /// [Bit 1] A value of 1 indicates the processor supports the PCLMULQDQ
    /// instruction.  Carryless Multiplication
    ///
    UINT32  PCLMULQDQ:1;
    ///
    /// [Bit 2] 64-bit DS Area.  A value of 1 indicates the processor supports
    /// DS area using 64-bit layout.
    ///
    UINT32  DTES64:1;
    ///
    /// [Bit 3] MONITOR/MWAIT.  A value of 1 indicates the processor supports
    /// this feature.
    ///
    UINT32  MONITOR:1;
    ///
    /// [Bit 4] CPL Qualified Debug Store.  A value of 1 indicates the processor
    /// supports the extensions to the Debug Store feature to allow for branch
    /// message storage qualified by CPL
    ///
    UINT32  DS_CPL:1;
    ///
    /// [Bit 5] Virtual Machine Extensions.  A value of 1 indicates that the
    /// processor supports this technology.
    ///
    UINT32  VMX:1;
    ///
    /// [Bit 6] Safer Mode Extensions. A value of 1 indicates that the processor
    /// supports this technology
    ///
    UINT32  SMX:1;
    ///
    /// [Bit 7] Enhanced Intel SpeedStep(R) technology.  A value of 1 indicates
    /// that the processor supports this technology
    ///
    UINT32  EIST:1;
    ///
    /// [Bit 8] Thermal Monitor 2.  A value of 1 indicates whether the processor
    /// supports this technology
    ///
    UINT32  TM2:1;
    ///
    /// [Bit 9] A value of 1 indicates the presence of the Supplemental Streaming
    /// SIMD Extensions 3 (SSSE3). A value of 0 indicates the instruction
    /// extensions are not present in the processor.
    ///
    UINT32  SSSE3:1;
    ///
    /// [Bit 10] L1 Context ID.  A value of 1 indicates the L1 data cache mode
    /// can be set to either adaptive mode or shared mode. A value of 0 indicates
    /// this feature is not supported. See definition of the IA32_MISC_ENABLE MSR
    /// Bit 24 (L1 Data Cache Context Mode) for details
    ///
    UINT32  CNXT_ID:1;
    ///
    /// [Bit 11] A value of 1 indicates the processor supports IA32_DEBUG_INTERFACE
    /// MSR for silicon debug
    ///
    UINT32  SDBG:1;
    ///
    /// [Bit 12] A value of 1 indicates the processor supports FMA (Fused Multiple
    ///  Add) extensions using YMM state.
    ///
    UINT32  FMA:1;
    ///
    /// [Bit 13] CMPXCHG16B Available.  A value of 1 indicates that the feature
    /// is available.
    ///
    UINT32  CMPXCHG16B:1;
    ///
    /// [Bit 14] xTPR Update Control.  A value of 1 indicates that the processor
    /// supports changing IA32_MISC_ENABLE[Bit 23].
    ///
    UINT32  xTPR_Update_Control:1;
    ///
    /// [Bit 15] Perfmon and Debug Capability:  A value of 1 indicates the
    /// processor supports the performance and debug feature indication MSR
    /// IA32_PERF_CAPABILITIES.
    ///
    UINT32  PDCM:1;
    UINT32  Reserved:1;
    ///
    /// [Bit 17] Process-context identifiers.  A value of 1 indicates that the
    /// processor supports PCIDs and that software may set CR4.PCIDE to 1.
    ///
    UINT32  PCID:1;
    ///
    /// [Bit 18] A value of 1 indicates the processor supports the ability to
    /// prefetch data from a memory mapped device.  Direct Cache Access.
    ///
    UINT32  DCA:1;
    ///
    /// [Bit 19] A value of 1 indicates that the processor supports SSE4.1.
    ///
    UINT32  SSE4_1:1;
    ///
    /// [Bit 20] A value of 1 indicates that the processor supports SSE4.2.
    ///
    UINT32  SSE4_2:1;
    ///
    /// [Bit 21] A value of 1 indicates that the processor supports x2APIC
    /// feature.
    ///
    UINT32  x2APIC:1;
    ///
    /// [Bit 22] A value of 1 indicates that the processor supports MOVBE
    /// instruction.
    ///
    UINT32  MOVBE:1;
    ///
    /// [Bit 23] A value of 1 indicates that the processor supports the POPCNT
    /// instruction.
    ///
    UINT32  POPCNT:1;
    ///
    /// [Bit 24] A value of 1 indicates that the processor's local APIC timer
    /// supports one-shot operation using a TSC deadline value.
    ///
    UINT32  TSC_Deadline:1;
    ///
    /// [Bit 25] A value of 1 indicates that the processor supports the AESNI
    /// instruction extensions.
    ///
    UINT32  AESNI:1;
    ///
    /// [Bit 26] A value of 1 indicates that the processor supports the
    /// XSAVE/XRSTOR processor extended states feature, the XSETBV/XGETBV
    /// instructions, and XCR0.
    ///
    UINT32  XSAVE:1;
    ///
    /// [Bit 27] A value of 1 indicates that the OS has set CR4.OSXSAVE[Bit 18]
    /// to enable XSETBV/XGETBV instructions to access XCR0 and to support
    /// processor extended state management using XSAVE/XRSTOR.
    ///
    UINT32  OSXSAVE:1;
    ///
    /// [Bit 28] A value of 1 indicates the processor supports the AVX instruction
    /// extensions.
    ///
    UINT32  AVX:1;
    ///
    /// [Bit 29] A value of 1 indicates that processor supports 16-bit
    /// floating-point conversion instructions.
    ///
    UINT32  F16C:1;
    ///
    /// [Bit 30] A value of 1 indicates that processor supports RDRAND instruction.
    ///
    UINT32  RDRAND:1;
    ///
    /// [Bit 31] Always returns 0.
    ///
    UINT32  NotUsed:1;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32    Uint32;
} CPUID_VERSION_INFO_ECX;

/**
  CPUID Version Information returned in EDX for CPUID leaf
  #CPUID_VERSION_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] Floating Point Unit On-Chip. The processor contains an x87 FPU.
    ///
    UINT32  FPU:1;
    ///
    /// [Bit 1] Virtual 8086 Mode Enhancements.  Virtual 8086 mode enhancements,
    /// including CR4.VME for controlling the feature, CR4.PVI for protected
    /// mode virtual interrupts, software interrupt indirection, expansion of
    /// the TSS with the software indirection bitmap, and EFLAGS.VIF and
    /// EFLAGS.VIP flags.
    ///
    UINT32  VME:1;
    ///
    /// [Bit 2] Debugging Extensions.  Support for I/O breakpoints, including
    /// CR4.DE for controlling the feature, and optional trapping of accesses to
    /// DR4 and DR5.
    ///
    UINT32  DE:1;
    ///
    /// [Bit 3] Page Size Extension.  Large pages of size 4 MByte are supported,
    /// including CR4.PSE for controlling the feature, the defined dirty bit in
    /// PDE (Page Directory Entries), optional reserved bit trapping in CR3,
    /// PDEs, and PTEs.
    ///
    UINT32  PSE:1;
    ///
    /// [Bit 4] Time Stamp Counter.  The RDTSC instruction is supported,
    /// including CR4.TSD for controlling privilege.
    ///
    UINT32  TSC:1;
    ///
    /// [Bit 5] Model Specific Registers RDMSR and WRMSR Instructions.  The
    /// RDMSR and WRMSR instructions are supported. Some of the MSRs are
    /// implementation dependent.
    ///
    UINT32  MSR:1;
    ///
    /// [Bit 6] Physical Address Extension.  Physical addresses greater than 32
    /// bits are supported: extended page table entry formats, an extra level in
    /// the page translation tables is defined, 2-MByte pages are supported
    /// instead of 4 Mbyte pages if PAE bit is 1.
    ///
    UINT32  PAE:1;
    ///
    /// [Bit 7] Machine Check Exception.  Exception 18 is defined for Machine
    /// Checks, including CR4.MCE for controlling the feature. This feature does
    /// not define the model-specific implementations of machine-check error
    /// logging, reporting, and processor shutdowns. Machine Check exception
    /// handlers may have to depend on processor version to do model specific
    /// processing of the exception, or test for the presence of the Machine
    /// Check feature.
    ///
    UINT32  MCE:1;
    ///
    /// [Bit 8] CMPXCHG8B Instruction.  The compare-and-exchange 8 bytes(64 bits)
    /// instruction is supported (implicitly locked and atomic).
    ///
    UINT32  CX8:1;
    ///
    /// [Bit 9] APIC On-Chip.  The processor contains an Advanced Programmable
    /// Interrupt Controller (APIC), responding to memory mapped commands in the
    /// physical address range FFFE0000H to FFFE0FFFH (by default - some
    /// processors permit the APIC to be relocated).
    ///
    UINT32  APIC:1;
    UINT32  Reserved1:1;
    ///
    /// [Bit 11] SYSENTER and SYSEXIT Instructions.  The SYSENTER and SYSEXIT
    /// and associated MSRs are supported.
    ///
    UINT32  SEP:1;
    ///
    /// [Bit 12] Memory Type Range Registers.  MTRRs are supported. The MTRRcap
    /// MSR contains feature bits that describe what memory types are supported,
    /// how many variable MTRRs are supported, and whether fixed MTRRs are
    /// supported.
    ///
    UINT32  MTRR:1;
    ///
    /// [Bit 13] Page Global Bit.  The global bit is supported in paging-structure
    /// entries that map a page, indicating TLB entries that are common to
    /// different processes and need not be flushed. The CR4.PGE bit controls
    /// this feature.
    ///
    UINT32  PGE:1;
    ///
    /// [Bit 14] Machine Check Architecture. A value of 1 indicates the Machine
    /// Check Architecture of reporting machine errors is supported. The MCG_CAP
    /// MSR contains feature bits describing how many banks of error reporting
    /// MSRs are supported.
    ///
    UINT32  MCA:1;
    ///
    /// [Bit 15] Conditional Move Instructions.  The conditional move instruction
    /// CMOV is supported. In addition, if x87 FPU is present as indicated by the
    /// CPUID.FPU feature bit, then the FCOMI and FCMOV instructions are supported.
    ///
    UINT32  CMOV:1;
    ///
    /// [Bit 16] Page Attribute Table.  Page Attribute Table is supported. This
    /// feature augments the Memory Type Range Registers (MTRRs), allowing an
    /// operating system to specify attributes of memory accessed through a
    /// linear address on a 4KB granularity.
    ///
    UINT32  PAT:1;
    ///
    /// [Bit 17] 36-Bit Page Size Extension.  4-MByte pages addressing physical
    /// memory beyond 4 GBytes are supported with 32-bit paging. This feature
    /// indicates that upper bits of the physical address of a 4-MByte page are
    /// encoded in bits 20:13 of the page-directory entry. Such physical
    /// addresses are limited by MAXPHYADDR and may be up to 40 bits in size.
    ///
    UINT32  PSE_36:1;
    ///
    /// [Bit 18] Processor Serial Number.  The processor supports the 96-bit
    /// processor identification number feature and the feature is enabled.
    ///
    UINT32  PSN:1;
    ///
    /// [Bit 19] CLFLUSH Instruction.  CLFLUSH Instruction is supported.
    ///
    UINT32  CLFSH:1;
    UINT32  Reserved2:1;
    ///
    /// [Bit 21] Debug Store.  The processor supports the ability to write debug
    /// information into a memory resident buffer.  This feature is used by the
    /// branch trace store (BTS) and precise event-based sampling (PEBS)
    /// facilities.
    ///
    UINT32  DS:1;
    ///
    /// [Bit 22] Thermal Monitor and Software Controlled Clock Facilities.  The
    /// processor implements internal MSRs that allow processor temperature to
    /// be monitored and processor performance to be modulated in predefined
    /// duty cycles under software control.
    ///
    UINT32  ACPI:1;
    ///
    /// [Bit 23] Intel MMX Technology.  The processor supports the Intel MMX
    /// technology.
    ///
    UINT32  MMX:1;
    ///
    /// [Bit 24] FXSAVE and FXRSTOR Instructions.  The FXSAVE and FXRSTOR
    /// instructions are supported for fast save and restore of the floating
    /// point context. Presence of this bit also indicates that CR4.OSFXSR is
    /// available for an operating system to indicate that it supports the
    /// FXSAVE and FXRSTOR instructions.
    ///
    UINT32  FXSR:1;
    ///
    /// [Bit 25] SSE.  The processor supports the SSE extensions.
    ///
    UINT32  SSE:1;
    ///
    /// [Bit 26] SSE2.  The processor supports the SSE2 extensions.
    ///
    UINT32  SSE2:1;
    ///
    /// [Bit 27] Self Snoop.  The processor supports the management of
    /// conflicting memory types by performing a snoop of its own cache
    /// structure for transactions issued to the bus.
    ///
    UINT32  SS:1;
    ///
    /// [Bit 28] Max APIC IDs reserved field is Valid.  A value of 0 for HTT
    /// indicates there is only a single logical processor in the package and
    /// software should assume only a single APIC ID is reserved. A value of 1
    /// for HTT indicates the value in CPUID.1.EBX[23:16] (the Maximum number of
    /// addressable IDs for logical processors in this package) is valid for the
    /// package.
    ///
    UINT32  HTT:1;
    ///
    /// [Bit 29] Thermal Monitor.  The processor implements the thermal monitor
    /// automatic thermal control circuitry (TCC).
    ///
    UINT32  TM:1;
    UINT32  Reserved3:1;
    ///
    /// [Bit 31] Pending Break Enable.  The processor supports the use of the
    /// FERR#/PBE# pin when the processor is in the stop-clock state (STPCLK# is
    /// asserted) to signal the processor that an interrupt is pending and that
    /// the processor should return to normal operation to handle the interrupt.
    /// Bit 10 (PBE enable) in the IA32_MISC_ENABLE MSR enables this capability.
    ///
    UINT32  PBE:1;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32    Uint32;
} CPUID_VERSION_INFO_EDX;


/**
  CPUID Cache and TLB Information

  @param   EAX  CPUID_CACHE_INFO (0x02)

  @retval  EAX  Cache and TLB Information described by the type
                CPUID_CACHE_INFO_CACHE_TLB.
                CPUID_CACHE_INFO_CACHE_TLB.CacheDescriptor[0] always returns
                0x01 and must be ignored.  Only valid if
                CPUID_CACHE_INFO_CACHE_TLB.Bits.NotValid is clear.
  @retval  EBX  Cache and TLB Information described by the type
                CPUID_CACHE_INFO_CACHE_TLB.  Only valid if
                CPUID_CACHE_INFO_CACHE_TLB.Bits.NotValid is clear.
  @retval  ECX  Cache and TLB Information described by the type
                CPUID_CACHE_INFO_CACHE_TLB.  Only valid if
                CPUID_CACHE_INFO_CACHE_TLB.Bits.NotValid is clear.
  @retval  EDX  Cache and TLB Information described by the type
                CPUID_CACHE_INFO_CACHE_TLB.  Only valid if
                CPUID_CACHE_INFO_CACHE_TLB.Bits.NotValid is clear.

  <b>Example usage</b>
  @code
  CPUID_CACHE_INFO_CACHE_TLB  Eax;
  CPUID_CACHE_INFO_CACHE_TLB  Ebx;
  CPUID_CACHE_INFO_CACHE_TLB  Ecx;
  CPUID_CACHE_INFO_CACHE_TLB  Edx;

  AsmCpuid (CPUID_CACHE_INFO, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32);
  @endcode

  <b>Cache Descriptor values</b>
  <table>
  <tr><th>Value </th><th> Type    </th><th> Description </th></tr>
  <tr><td> 0x00 </td><td> General </td><td> Null descriptor, this byte contains no information</td></tr>
  <tr><td> 0x01 </td><td> TLB     </td><td> Instruction TLB: 4 KByte pages, 4-way set associative, 32 entries</td></tr>
  <tr><td> 0x02 </td><td> TLB     </td><td> Instruction TLB: 4 MByte pages, fully associative, 2 entries</td></tr>
  <tr><td> 0x03 </td><td> TLB     </td><td> Data TLB: 4 KByte pages, 4-way set associative, 64 entries</td></tr>
  <tr><td> 0x04 </td><td> TLB     </td><td> Data TLB: 4 MByte pages, 4-way set associative, 8 entries</td></tr>
  <tr><td> 0x05 </td><td> TLB     </td><td> Data TLB1: 4 MByte pages, 4-way set associative, 32 entries</td></tr>
  <tr><td> 0x06 </td><td> Cache   </td><td> 1st-level instruction cache: 8 KBytes, 4-way set associative,
                                            32 byte line size</td></tr>
  <tr><td> 0x08 </td><td> Cache   </td><td> 1st-level instruction cache: 16 KBytes, 4-way set associative,
                                            32 byte line size</td></tr>
  <tr><td> 0x09 </td><td> Cache   </td><td> 1st-level instruction cache: 32KBytes, 4-way set associative,
                                            64 byte line size</td></tr>
  <tr><td> 0x0A </td><td> Cache   </td><td> 1st-level data cache: 8 KBytes, 2-way set associative, 32 byte line size</td></tr>
  <tr><td> 0x0B </td><td> TLB     </td><td> Instruction TLB: 4 MByte pages, 4-way set associative, 4 entries</td></tr>
  <tr><td> 0x0C </td><td> Cache   </td><td> 1st-level data cache: 16 KBytes, 4-way set associative, 32 byte line size</td></tr>
  <tr><td> 0x0D </td><td> Cache   </td><td> 1st-level data cache: 16 KBytes, 4-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x0E </td><td> Cache   </td><td> 1st-level data cache: 24 KBytes, 6-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x1D </td><td> Cache   </td><td> 2nd-level cache: 128 KBytes, 2-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x21 </td><td> Cache   </td><td> 2nd-level cache: 256 KBytes, 8-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x22 </td><td> Cache   </td><td> 3rd-level cache: 512 KBytes, 4-way set associative, 64 byte line size,
                                            2 lines per sector</td></tr>
  <tr><td> 0x23 </td><td> Cache   </td><td> 3rd-level cache: 1 MBytes, 8-way set associative, 64 byte line size,
                                            2 lines per sector</td></tr>
  <tr><td> 0x24 </td><td> Cache   </td><td> 2nd-level cache: 1 MBytes, 16-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x25 </td><td> Cache   </td><td> 3rd-level cache: 2 MBytes, 8-way set associative, 64 byte line size,
                                            2 lines per sector</td></tr>
  <tr><td> 0x29 </td><td> Cache   </td><td> 3rd-level cache: 4 MBytes, 8-way set associative, 64 byte line size,
                                            2 lines per sector</td></tr>
  <tr><td> 0x2C </td><td> Cache   </td><td> 1st-level data cache: 32 KBytes, 8-way set associative,
                                            64 byte line size</td></tr>
  <tr><td> 0x30 </td><td> Cache   </td><td> 1st-level instruction cache: 32 KBytes, 8-way set associative,
                                            64 byte line size</td></tr>
  <tr><td> 0x40 </td><td> Cache   </td><td> No 2nd-level cache or, if processor contains a valid 2nd-level cache,
                                            no 3rd-level cache</td></tr>
  <tr><td> 0x41 </td><td> Cache   </td><td> 2nd-level cache: 128 KBytes, 4-way set associative, 32 byte line size</td></tr>
  <tr><td> 0x42 </td><td> Cache   </td><td> 2nd-level cache: 256 KBytes, 4-way set associative, 32 byte line size</td></tr>
  <tr><td> 0x43 </td><td> Cache   </td><td> 2nd-level cache: 512 KBytes, 4-way set associative, 32 byte line size</td></tr>
  <tr><td> 0x44 </td><td> Cache   </td><td> 2nd-level cache: 1 MByte, 4-way set associative, 32 byte line size</td></tr>
  <tr><td> 0x45 </td><td> Cache   </td><td> 2nd-level cache: 2 MByte, 4-way set associative, 32 byte line size</td></tr>
  <tr><td> 0x46 </td><td> Cache   </td><td> 3rd-level cache: 4 MByte, 4-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x47 </td><td> Cache   </td><td> 3rd-level cache: 8 MByte, 8-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x48 </td><td> Cache   </td><td> 2nd-level cache: 3MByte, 12-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x49 </td><td> Cache   </td><td> 3rd-level cache: 4MB, 16-way set associative, 64-byte line size
                                            (Intel Xeon processor MP, Family 0FH, Model 06H)<BR>
                                            2nd-level cache: 4 MByte, 16-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x4A </td><td> Cache   </td><td> 3rd-level cache: 6MByte, 12-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x4B </td><td> Cache   </td><td> 3rd-level cache: 8MByte, 16-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x4C </td><td> Cache   </td><td> 3rd-level cache: 12MByte, 12-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x4D </td><td> Cache   </td><td> 3rd-level cache: 16MByte, 16-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x4E </td><td> Cache   </td><td> 2nd-level cache: 6MByte, 24-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x4F </td><td> TLB     </td><td> Instruction TLB: 4 KByte pages, 32 entries</td></tr>
  <tr><td> 0x50 </td><td> TLB     </td><td> Instruction TLB: 4 KByte and 2-MByte or 4-MByte pages, 64 entries</td></tr>
  <tr><td> 0x51 </td><td> TLB     </td><td> Instruction TLB: 4 KByte and 2-MByte or 4-MByte pages, 128 entries</td></tr>
  <tr><td> 0x52 </td><td> TLB     </td><td> Instruction TLB: 4 KByte and 2-MByte or 4-MByte pages, 256 entries</td></tr>
  <tr><td> 0x55 </td><td> TLB     </td><td> Instruction TLB: 2-MByte or 4-MByte pages, fully associative, 7 entries</td></tr>
  <tr><td> 0x56 </td><td> TLB     </td><td> Data TLB0: 4 MByte pages, 4-way set associative, 16 entries</td></tr>
  <tr><td> 0x57 </td><td> TLB     </td><td> Data TLB0: 4 KByte pages, 4-way associative, 16 entries</td></tr>
  <tr><td> 0x59 </td><td> TLB     </td><td> Data TLB0: 4 KByte pages, fully associative, 16 entries</td></tr>
  <tr><td> 0x5A </td><td> TLB     </td><td> Data TLB0: 2 MByte or 4 MByte pages, 4-way set associative, 32 entries</td></tr>
  <tr><td> 0x5B </td><td> TLB     </td><td> Data TLB: 4 KByte and 4 MByte pages, 64 entries</td></tr>
  <tr><td> 0x5C </td><td> TLB     </td><td> Data TLB: 4 KByte and 4 MByte pages,128 entries</td></tr>
  <tr><td> 0x5D </td><td> TLB     </td><td> Data TLB: 4 KByte and 4 MByte pages,256 entries</td></tr>
  <tr><td> 0x60 </td><td> Cache   </td><td> 1st-level data cache: 16 KByte, 8-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x61 </td><td> TLB     </td><td> Instruction TLB: 4 KByte pages, fully associative, 48 entries</td></tr>
  <tr><td> 0x63 </td><td> TLB     </td><td> Data TLB: 2 MByte or 4 MByte pages, 4-way set associative,
                                            32 entries and a separate array with 1 GByte pages, 4-way set associative,
                                            4 entries</td></tr>
  <tr><td> 0x64 </td><td> TLB     </td><td> Data TLB: 4 KByte pages, 4-way set associative, 512 entries</td></tr>
  <tr><td> 0x66 </td><td> Cache   </td><td> 1st-level data cache: 8 KByte, 4-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x67 </td><td> Cache   </td><td> 1st-level data cache: 16 KByte, 4-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x68 </td><td> Cache   </td><td> 1st-level data cache: 32 KByte, 4-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x6A </td><td> Cache   </td><td> uTLB: 4 KByte pages, 8-way set associative, 64 entries</td></tr>
  <tr><td> 0x6B </td><td> Cache   </td><td> DTLB: 4 KByte pages, 8-way set associative, 256 entries</td></tr>
  <tr><td> 0x6C </td><td> Cache   </td><td> DTLB: 2M/4M pages, 8-way set associative, 128 entries</td></tr>
  <tr><td> 0x6D </td><td> Cache   </td><td> DTLB: 1 GByte pages, fully associative, 16 entries</td></tr>
  <tr><td> 0x70 </td><td> Cache   </td><td> Trace cache: 12 K-uop, 8-way set associative</td></tr>
  <tr><td> 0x71 </td><td> Cache   </td><td> Trace cache: 16 K-uop, 8-way set associative</td></tr>
  <tr><td> 0x72 </td><td> Cache   </td><td> Trace cache: 32 K-uop, 8-way set associative</td></tr>
  <tr><td> 0x76 </td><td> TLB     </td><td> Instruction TLB: 2M/4M pages, fully associative, 8 entries</td></tr>
  <tr><td> 0x78 </td><td> Cache   </td><td> 2nd-level cache: 1 MByte, 4-way set associative, 64byte line size</td></tr>
  <tr><td> 0x79 </td><td> Cache   </td><td> 2nd-level cache: 128 KByte, 8-way set associative, 64 byte line size,
                                            2 lines per sector</td></tr>
  <tr><td> 0x7A </td><td> Cache   </td><td> 2nd-level cache: 256 KByte, 8-way set associative, 64 byte line size,
                                            2 lines per sector</td></tr>
  <tr><td> 0x7B </td><td> Cache   </td><td> 2nd-level cache: 512 KByte, 8-way set associative, 64 byte line size,
                                            2 lines per sector</td></tr>
  <tr><td> 0x7C </td><td> Cache   </td><td> 2nd-level cache: 1 MByte, 8-way set associative, 64 byte line size,
                                            2 lines per sector</td></tr>
  <tr><td> 0x7D </td><td> Cache   </td><td> 2nd-level cache: 2 MByte, 8-way set associative, 64byte line size</td></tr>
  <tr><td> 0x7F </td><td> Cache   </td><td> 2nd-level cache: 512 KByte, 2-way set associative, 64-byte line size</td></tr>
  <tr><td> 0x80 </td><td> Cache   </td><td> 2nd-level cache: 512 KByte, 8-way set associative, 64-byte line size</td></tr>
  <tr><td> 0x82 </td><td> Cache   </td><td> 2nd-level cache: 256 KByte, 8-way set associative, 32 byte line size</td></tr>
  <tr><td> 0x83 </td><td> Cache   </td><td> 2nd-level cache: 512 KByte, 8-way set associative, 32 byte line size</td></tr>
  <tr><td> 0x84 </td><td> Cache   </td><td> 2nd-level cache: 1 MByte, 8-way set associative, 32 byte line size</td></tr>
  <tr><td> 0x85 </td><td> Cache   </td><td> 2nd-level cache: 2 MByte, 8-way set associative, 32 byte line size</td></tr>
  <tr><td> 0x86 </td><td> Cache   </td><td> 2nd-level cache: 512 KByte, 4-way set associative, 64 byte line size</td></tr>
  <tr><td> 0x87 </td><td> Cache   </td><td> 2nd-level cache: 1 MByte, 8-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xA0 </td><td> DTLB    </td><td> DTLB: 4k pages, fully associative, 32 entries</td></tr>
  <tr><td> 0xB0 </td><td> TLB     </td><td> Instruction TLB: 4 KByte pages, 4-way set associative, 128 entries</td></tr>
  <tr><td> 0xB1 </td><td> TLB     </td><td> Instruction TLB: 2M pages, 4-way, 8 entries or 4M pages, 4-way, 4 entries</td></tr>
  <tr><td> 0xB2 </td><td> TLB     </td><td> Instruction TLB: 4KByte pages, 4-way set associative, 64 entries</td></tr>
  <tr><td> 0xB3 </td><td> TLB     </td><td> Data TLB: 4 KByte pages, 4-way set associative, 128 entries</td></tr>
  <tr><td> 0xB4 </td><td> TLB     </td><td> Data TLB1: 4 KByte pages, 4-way associative, 256 entries</td></tr>
  <tr><td> 0xB5 </td><td> TLB     </td><td> Instruction TLB: 4KByte pages, 8-way set associative, 64 entries</td></tr>
  <tr><td> 0xB6 </td><td> TLB     </td><td> Instruction TLB: 4KByte pages, 8-way set associative,
                                            128 entries</td></tr>
  <tr><td> 0xBA </td><td> TLB     </td><td> Data TLB1: 4 KByte pages, 4-way associative, 64 entries</td></tr>
  <tr><td> 0xC0 </td><td> TLB     </td><td> Data TLB: 4 KByte and 4 MByte pages, 4-way associative, 8 entries</td></tr>
  <tr><td> 0xC1 </td><td> STLB    </td><td> Shared 2nd-Level TLB: 4 KByte/2MByte pages, 8-way associative,
                                            1024 entries</td></tr>
  <tr><td> 0xC2 </td><td> DTLB    </td><td> DTLB: 4 KByte/2 MByte pages, 4-way associative, 16 entries</td></tr>
  <tr><td> 0xC3 </td><td> STLB    </td><td> Shared 2nd-Level TLB: 4 KByte /2 MByte pages, 6-way associative,
                                            1536 entries. Also 1GBbyte pages, 4-way, 16 entries.</td></tr>
  <tr><td> 0xC4 </td><td> DTLB    </td><td> DTLB: 2M/4M Byte pages, 4-way associative, 32 entries</td></tr>
  <tr><td> 0xCA </td><td> STLB    </td><td> Shared 2nd-Level TLB: 4 KByte pages, 4-way associative, 512 entries</td></tr>
  <tr><td> 0xD0 </td><td> Cache   </td><td> 3rd-level cache: 512 KByte, 4-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xD1 </td><td> Cache   </td><td> 3rd-level cache: 1 MByte, 4-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xD2 </td><td> Cache   </td><td> 3rd-level cache: 2 MByte, 4-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xD6 </td><td> Cache   </td><td> 3rd-level cache: 1 MByte, 8-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xD7 </td><td> Cache   </td><td> 3rd-level cache: 2 MByte, 8-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xD8 </td><td> Cache   </td><td> 3rd-level cache: 4 MByte, 8-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xDC </td><td> Cache   </td><td> 3rd-level cache: 1.5 MByte, 12-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xDD </td><td> Cache   </td><td> 3rd-level cache: 3 MByte, 12-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xDE </td><td> Cache   </td><td> 3rd-level cache: 6 MByte, 12-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xE2 </td><td> Cache   </td><td> 3rd-level cache: 2 MByte, 16-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xE3 </td><td> Cache   </td><td> 3rd-level cache: 4 MByte, 16-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xE4 </td><td> Cache   </td><td> 3rd-level cache: 8 MByte, 16-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xEA </td><td> Cache   </td><td> 3rd-level cache: 12MByte, 24-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xEB </td><td> Cache   </td><td> 3rd-level cache: 18MByte, 24-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xEC </td><td> Cache   </td><td> 3rd-level cache: 24MByte, 24-way set associative, 64 byte line size</td></tr>
  <tr><td> 0xF0 </td><td> Prefetch</td><td> 64-Byte prefetching</td></tr>
  <tr><td> 0xF1 </td><td> Prefetch</td><td> 128-Byte prefetching</td></tr>
  <tr><td> 0xFE </td><td> General </td><td> CPUID leaf 2 does not report TLB descriptor information; use CPUID
                                            leaf 18H to query TLB and other address translation parameters.</td></tr>
  <tr><td> 0xFF </td><td> General </td><td> CPUID leaf 2 does not report cache descriptor information,
                                            use CPUID leaf 4 to query cache parameters</td></tr>
  </table>
**/
#define CPUID_CACHE_INFO                        0x02

/**
  CPUID Cache and TLB Information returned in EAX, EBX, ECX, and EDX for CPUID
  leaf #CPUID_CACHE_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    UINT32  Reserved:31;
    ///
    /// [Bit 31] If 0, then the cache descriptor bytes in the register are valid.
    /// if 1, then none of the cache descriptor bytes in the register are valid.
    ///
    UINT32  NotValid:1;
  } Bits;
  ///
  /// Array of Cache and TLB descriptor bytes
  ///
  UINT8   CacheDescriptor[4];
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_CACHE_INFO_CACHE_TLB;


/**
  CPUID Processor Serial Number

  Processor serial number (PSN) is not supported in the Pentium 4 processor
  or later.  On all models, use the PSN flag (returned using CPUID) to check
  for PSN support before accessing the feature.

  @param   EAX  CPUID_SERIAL_NUMBER (0x03)

  @retval  EAX  Reserved.
  @retval  EBX  Reserved.
  @retval  ECX  Bits 31:0 of 96 bit processor serial number. (Available in
                Pentium III processor only; otherwise, the value in this
                register is reserved.)
  @retval  EDX  Bits 63:32 of 96 bit processor serial number. (Available in
                Pentium III processor only; otherwise, the value in this
                register is reserved.)

  <b>Example usage</b>
  @code
  UINT32  Ecx;
  UINT32  Edx;

  AsmCpuid (CPUID_SERIAL_NUMBER, NULL, NULL, &Ecx, &Edx);
  @endcode
**/
#define CPUID_SERIAL_NUMBER                     0x03


/**
  CPUID Cache Parameters

  @param   EAX  CPUID_CACHE_PARAMS (0x04)
  @param   ECX  Cache Level.  Valid values start at 0.  Software can enumerate
                the deterministic cache parameters for each level of the cache
                hierarchy starting with an index value of 0, until the
                parameters report the value associated with the CacheType
                field in CPUID_CACHE_PARAMS_EAX is 0.

  @retval  EAX  Returns cache type information described by the type
                CPUID_CACHE_PARAMS_EAX.
  @retval  EBX  Returns cache line and associativity information described by
                the type CPUID_CACHE_PARAMS_EBX.
  @retval  ECX  Returns the number of sets in the cache.
  @retval  EDX  Returns cache WINVD/INVD behavior described by the type
                CPUID_CACHE_PARAMS_EDX.

  <b>Example usage</b>
  @code
  UINT32                  CacheLevel;
  CPUID_CACHE_PARAMS_EAX  Eax;
  CPUID_CACHE_PARAMS_EBX  Ebx;
  UINT32                  Ecx;
  CPUID_CACHE_PARAMS_EDX  Edx;

  CacheLevel = 0;
  do {
    AsmCpuidEx (
      CPUID_CACHE_PARAMS, CacheLevel,
      &Eax.Uint32, &Ebx.Uint32, &Ecx, &Edx.Uint32
      );
    CacheLevel++;
  } while (Eax.Bits.CacheType != CPUID_CACHE_PARAMS_CACHE_TYPE_NULL);
  @endcode
**/
#define CPUID_CACHE_PARAMS                      0x04

/**
  CPUID Cache Parameters Information returned in EAX for CPUID leaf
  #CPUID_CACHE_PARAMS.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 4:0] Cache type field.  If #CPUID_CACHE_PARAMS_CACHE_TYPE_NULL,
    /// then there is no information for the requested cache level.
    ///
    UINT32  CacheType:5;
    ///
    /// [Bits 7:5] Cache level (Starts at 1).
    ///
    UINT32  CacheLevel:3;
    ///
    /// [Bit 8] Self Initializing cache level (does not need SW initialization).
    ///
    UINT32  SelfInitializingCache:1;
    ///
    /// [Bit 9] Fully Associative cache.
    ///
    UINT32  FullyAssociativeCache:1;
    ///
    /// [Bits 13:10] Reserved.
    ///
    UINT32  Reserved:4;
    ///
    /// [Bits 25:14] Maximum number of addressable IDs for logical processors
    /// sharing this cache.
    ///
    /// Add one to the return value to get the result.
    /// The nearest power-of-2 integer that is not smaller than (1 + EAX[25:14])
    /// is the number of unique initial APIC IDs reserved for addressing
    /// different logical processors sharing this cache.
    ///
    UINT32  MaximumAddressableIdsForLogicalProcessors:12;
    ///
    /// [Bits 31:26] Maximum number of addressable IDs for processor cores in
    /// the physical package.
    ///
    /// The nearest power-of-2 integer that is not smaller than (1 + EAX[31:26])
    /// is the number of unique Core_IDs reserved for addressing different
    /// processor cores in a physical package. Core ID is a subset of bits of
    /// the initial APIC ID.
    /// The returned value is constant for valid initial values in ECX. Valid
    /// ECX values start from 0.
    ///
    UINT32  MaximumAddressableIdsForProcessorCores:6;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_CACHE_PARAMS_EAX;

///
/// @{ Define value for bit field CPUID_CACHE_PARAMS_EAX.CacheType
///
#define CPUID_CACHE_PARAMS_CACHE_TYPE_NULL         0x00
#define CPUID_CACHE_PARAMS_CACHE_TYPE_DATA         0x01
#define CPUID_CACHE_PARAMS_CACHE_TYPE_INSTRUCTION  0x02
#define CPUID_CACHE_PARAMS_CACHE_TYPE_UNIFIED      0x03
///
/// @}
///

/**
  CPUID Cache Parameters Information returned in EBX for CPUID leaf
  #CPUID_CACHE_PARAMS.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 11:0] System Coherency Line Size.  Add one to the return value to
    /// get the result.
    ///
    UINT32  LineSize:12;
    ///
    /// [Bits 21:12] Physical Line Partitions.  Add one to the return value to
    /// get the result.
    ///
    UINT32  LinePartitions:10;
    ///
    /// [Bits 31:22] Ways of associativity.  Add one to the return value to get
    /// the result.
    ///
    UINT32  Ways:10;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_CACHE_PARAMS_EBX;

/**
  CPUID Cache Parameters Information returned in EDX for CPUID leaf
  #CPUID_CACHE_PARAMS.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] Write-Back Invalidate/Invalidate.
    /// 0 = WBINVD/INVD from threads sharing this cache acts upon lower level
    /// caches for threads sharing this cache.
    /// 1 = WBINVD/INVD is not guaranteed to act upon lower level caches of
    /// non-originating threads sharing this cache.
    ///
    UINT32  Invalidate:1;
    ///
    /// [Bit 1] Cache Inclusiveness.
    /// 0 = Cache is not inclusive of lower cache levels.
    /// 1 = Cache is inclusive of lower cache levels.
    ///
    UINT32  CacheInclusiveness:1;
    ///
    /// [Bit 2] Complex Cache Indexing.
    /// 0 = Direct mapped cache.
    /// 1 = A complex function is used to index the cache, potentially using all
    /// address bits.
    ///
    UINT32  ComplexCacheIndexing:1;
    UINT32  Reserved:29;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_CACHE_PARAMS_EDX;


/**
  CPUID MONITOR/MWAIT Information

  @param   EAX  CPUID_MONITOR_MWAIT (0x05)

  @retval  EAX  Smallest monitor-line size in bytes described by the type
                CPUID_MONITOR_MWAIT_EAX.
  @retval  EBX  Largest monitor-line size in bytes described by the type
                CPUID_MONITOR_MWAIT_EBX.
  @retval  ECX  Enumeration of Monitor-Mwait extensions support described by
                the type CPUID_MONITOR_MWAIT_ECX.
  @retval  EDX  Sub C-states supported described by the type
                CPUID_MONITOR_MWAIT_EDX.

  <b>Example usage</b>
  @code
  CPUID_MONITOR_MWAIT_EAX  Eax;
  CPUID_MONITOR_MWAIT_EBX  Ebx;
  CPUID_MONITOR_MWAIT_ECX  Ecx;
  CPUID_MONITOR_MWAIT_EDX  Edx;

  AsmCpuid (CPUID_MONITOR_MWAIT, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32);
  @endcode
**/
#define CPUID_MONITOR_MWAIT                     0x05

/**
  CPUID MONITOR/MWAIT Information returned in EAX for CPUID leaf
  #CPUID_MONITOR_MWAIT.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 15:0] Smallest monitor-line size in bytes (default is processor's
    /// monitor granularity).
    ///
    UINT32  SmallestMonitorLineSize:16;
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_MONITOR_MWAIT_EAX;

/**
  CPUID MONITOR/MWAIT Information returned in EBX for CPUID leaf
  #CPUID_MONITOR_MWAIT.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 15:0] Largest monitor-line size in bytes (default is processor's
    /// monitor granularity).
    ///
    UINT32  LargestMonitorLineSize:16;
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_MONITOR_MWAIT_EBX;

/**
  CPUID MONITOR/MWAIT Information returned in ECX for CPUID leaf
  #CPUID_MONITOR_MWAIT.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] If 0, then only EAX and EBX are valid.  If 1, then EAX, EBX, ECX,
    /// and EDX are valid.
    ///
    UINT32  ExtensionsSupported:1;
    ///
    /// [Bit 1] Supports treating interrupts as break-event for MWAIT, even when
    /// interrupts disabled.
    ///
    UINT32  InterruptAsBreak:1;
    UINT32  Reserved:30;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_MONITOR_MWAIT_ECX;

/**
  CPUID MONITOR/MWAIT Information returned in EDX for CPUID leaf
  #CPUID_MONITOR_MWAIT.

  @note
  The definition of C0 through C7 states for MWAIT extension are
  processor-specific C-states, not ACPI C-states.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 3:0] Number of C0 sub C-states supported using MWAIT.
    ///
    UINT32  C0States:4;
    ///
    /// [Bits 7:4] Number of C1 sub C-states supported using MWAIT.
    ///
    UINT32  C1States:4;
    ///
    /// [Bits 11:8] Number of C2 sub C-states supported using MWAIT.
    ///
    UINT32  C2States:4;
    ///
    /// [Bits 15:12] Number of C3 sub C-states supported using MWAIT.
    ///
    UINT32  C3States:4;
    ///
    /// [Bits 19:16] Number of C4 sub C-states supported using MWAIT.
    ///
    UINT32  C4States:4;
    ///
    /// [Bits 23:20] Number of C5 sub C-states supported using MWAIT.
    ///
    UINT32  C5States:4;
    ///
    /// [Bits 27:24] Number of C6 sub C-states supported using MWAIT.
    ///
    UINT32  C6States:4;
    ///
    /// [Bits 31:28] Number of C7 sub C-states supported using MWAIT.
    ///
    UINT32  C7States:4;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_MONITOR_MWAIT_EDX;


/**
  CPUID Thermal and Power Management

  @param   EAX  CPUID_THERMAL_POWER_MANAGEMENT (0x06)

  @retval  EAX  Thermal and power management features described by the type
                CPUID_THERMAL_POWER_MANAGEMENT_EAX.
  @retval  EBX  Number of Interrupt Thresholds in Digital Thermal Sensor
                described by the type CPUID_THERMAL_POWER_MANAGEMENT_EBX.
  @retval  ECX  Performance features described by the type
                CPUID_THERMAL_POWER_MANAGEMENT_ECX.
  @retval  EDX  Reserved.

  <b>Example usage</b>
  @code
  CPUID_THERMAL_POWER_MANAGEMENT_EAX  Eax;
  CPUID_THERMAL_POWER_MANAGEMENT_EBX  Ebx;
  CPUID_THERMAL_POWER_MANAGEMENT_ECX  Ecx;

  AsmCpuid (CPUID_THERMAL_POWER_MANAGEMENT, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, NULL);
  @endcode
**/
#define CPUID_THERMAL_POWER_MANAGEMENT          0x06

/**
  CPUID Thermal and Power Management Information returned in EAX for CPUID leaf
  #CPUID_THERMAL_POWER_MANAGEMENT.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] Digital temperature sensor is supported if set.
    ///
    UINT32  DigitalTemperatureSensor:1;
    ///
    /// [Bit 1] Intel Turbo Boost Technology Available (see IA32_MISC_ENABLE[38]).
    ///
    UINT32  TurboBoostTechnology:1;
    ///
    /// [Bit 2] APIC-Timer-always-running feature is supported if set.
    ///
    UINT32  ARAT:1;
    UINT32  Reserved1:1;
    ///
    /// [Bit 4] Power limit notification controls are supported if set.
    ///
    UINT32  PLN:1;
    ///
    /// [Bit 5] Clock modulation duty cycle extension is supported if set.
    ///
    UINT32  ECMD:1;
    ///
    /// [Bit 6] Package thermal management is supported if set.
    ///
    UINT32  PTM:1;
    ///
    /// [Bit 7] HWP base registers (IA32_PM_ENABLE[Bit 0], IA32_HWP_CAPABILITIES,
    /// IA32_HWP_REQUEST, IA32_HWP_STATUS) are supported if set.
    ///
    UINT32  HWP:1;
    ///
    /// [Bit 8] IA32_HWP_INTERRUPT MSR is supported if set.
    ///
    UINT32  HWP_Notification:1;
    ///
    /// [Bit 9] IA32_HWP_REQUEST[Bits 41:32] is supported if set.
    ///
    UINT32  HWP_Activity_Window:1;
    ///
    /// [Bit 10] IA32_HWP_REQUEST[Bits 31:24] is supported if set.
    ///
    UINT32  HWP_Energy_Performance_Preference:1;
    ///
    /// [Bit 11] IA32_HWP_REQUEST_PKG MSR is supported if set.
    ///
    UINT32  HWP_Package_Level_Request:1;
    UINT32  Reserved2:1;
    ///
    /// [Bit 13] HDC base registers IA32_PKG_HDC_CTL, IA32_PM_CTL1,
    /// IA32_THREAD_STALL MSRs are supported if set.
    ///
    UINT32  HDC:1;
    ///
    /// [Bit 14] Intel Turbo Boost Max Technology 3.0 available.
    ///
    UINT32  TurboBoostMaxTechnology30:1;
    ///
    /// [Bit 15] HWP Capabilities.
    /// Highest Performance change is supported if set.
    ///
    UINT32  HWPCapabilities:1;
    ///
    /// [Bit 16] HWP PECI override is supported if set.
    ///
    UINT32  HWPPECIOverride:1;
    ///
    /// [Bit 17] Flexible HWP is supported if set.
    ///
    UINT32  FlexibleHWP:1;
    ///
    /// [Bit 18] Fast access mode for the IA32_HWP_REQUEST MSR is supported if set.
    ///
    UINT32  FastAccessMode:1;
    UINT32  Reserved4:1;
    ///
    /// [Bit 20] Ignoring Idle Logical Processor HWP request is supported if set.
    ///
    UINT32  IgnoringIdleLogicalProcessorHWPRequest:1;
    UINT32  Reserved5:11;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_THERMAL_POWER_MANAGEMENT_EAX;

/**
  CPUID Thermal and Power Management Information returned in EBX for CPUID leaf
  #CPUID_THERMAL_POWER_MANAGEMENT.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// {Bits 3:0] Number of Interrupt Thresholds in Digital Thermal Sensor.
    ///
    UINT32  InterruptThresholds:4;
    UINT32  Reserved:28;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_THERMAL_POWER_MANAGEMENT_EBX;

/**
  CPUID Thermal and Power Management Information returned in ECX for CPUID leaf
  #CPUID_THERMAL_POWER_MANAGEMENT.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] Hardware Coordination Feedback Capability (Presence of IA32_MPERF
    /// and IA32_APERF). The capability to provide a measure of delivered
    /// processor performance (since last reset of the counters), as a percentage
    /// of the expected processor performance when running at the TSC frequency.
    ///
    UINT32  HardwareCoordinationFeedback:1;
    UINT32  Reserved1:2;
    ///
    /// [Bit 3] If this bit is set, then the processor supports performance-energy
    /// bias preference and the architectural MSR called IA32_ENERGY_PERF_BIAS
    /// (1B0H).
    ///
    UINT32  PerformanceEnergyBias:1;
    UINT32  Reserved2:28;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_THERMAL_POWER_MANAGEMENT_ECX;


/**
  CPUID Structured Extended Feature Flags Enumeration

  @param   EAX  CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS (0x07)
  @param   ECX  CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO (0x00).

  @note
  If ECX contains an invalid sub-leaf index, EAX/EBX/ECX/EDX return 0.  Sub-leaf
  index n is invalid if n exceeds the value that sub-leaf 0 returns in EAX.

  @retval  EAX  The maximum input value for ECX to retrieve sub-leaf information.
  @retval  EBX  Structured Extended Feature Flags described by the type
                CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX.
  @retval  ECX  Structured Extended Feature Flags described by the type
                CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_ECX.
  @retval  EDX  Reserved.

  <b>Example usage</b>
  @code
  UINT32                                       Eax;
  CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX  Ebx;
  CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_ECX  Ecx;
  UINT32                                       SubLeaf;

  AsmCpuidEx (
    CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS,
    CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO,
    &Eax, NULL, NULL, NULL
    );
  for (SubLeaf = 0; SubLeaf <= Eax; SubLeaf++) {
    AsmCpuidEx (
      CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS,
      SubLeaf,
      NULL, &Ebx.Uint32, &Ecx.Uint32, NULL
      );
  }
  @endcode
**/
#define CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS                0x07

///
/// CPUID Structured Extended Feature Flags Enumeration sub-leaf
///
#define CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO  0x00

/**
  CPUID Structured Extended Feature Flags Enumeration in EBX for CPUID leaf
  #CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS sub leaf
  #CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] Supports RDFSBASE/RDGSBASE/WRFSBASE/WRGSBASE if 1.
    ///
    UINT32  FSGSBASE:1;
    ///
    /// [Bit 1] IA32_TSC_ADJUST MSR is supported if 1.
    ///
    UINT32  IA32_TSC_ADJUST:1;
    ///
    /// [Bit 2] Intel SGX is supported if 1. See section 37.7 "DISCOVERING SUPPORT
    /// FOR INTEL(R) SGX AND ENABLING ENCLAVE INSTRUCTIONS".
    ///
    UINT32  SGX:1;
    ///
    /// [Bit 3] If 1 indicates the processor supports the first group of advanced
    /// bit manipulation extensions (ANDN, BEXTR, BLSI, BLSMSK, BLSR, TZCNT)
    ///
    UINT32  BMI1:1;
    ///
    /// [Bit 4] Hardware Lock Elision
    ///
    UINT32  HLE:1;
    ///
    /// [Bit 5] If 1 indicates the processor supports AVX2 instruction extensions.
    ///
    UINT32  AVX2:1;
    ///
    /// [Bit 6] x87 FPU Data Pointer updated only on x87 exceptions if 1.
    ///
    UINT32  FDP_EXCPTN_ONLY:1;
    ///
    /// [Bit 7] Supports Supervisor-Mode Execution Prevention if 1.
    ///
    UINT32  SMEP:1;
    ///
    /// [Bit 8] If 1 indicates the processor supports the second group of
    /// advanced bit manipulation extensions (BZHI, MULX, PDEP, PEXT, RORX,
    /// SARX, SHLX, SHRX)
    ///
    UINT32  BMI2:1;
    ///
    /// [Bit 9] Supports Enhanced REP MOVSB/STOSB if 1.
    ///
    UINT32  EnhancedRepMovsbStosb:1;
    ///
    /// [Bit 10] If 1, supports INVPCID instruction for system software that
    /// manages process-context identifiers.
    ///
    UINT32  INVPCID:1;
    ///
    /// [Bit 11] Restricted Transactional Memory
    ///
    UINT32  RTM:1;
    ///
    /// [Bit 12] Supports Intel(R) Resource Director Technology (Intel(R) RDT)
    /// Monitoring capability if 1.
    ///
    UINT32  RDT_M:1;
    ///
    /// [Bit 13] Deprecates FPU CS and FPU DS values if 1.
    ///
    UINT32  DeprecateFpuCsDs:1;
    ///
    /// [Bit 14] Supports Intel(R) Memory Protection Extensions if 1.
    ///
    UINT32  MPX:1;
    ///
    /// [Bit 15] Supports Intel(R) Resource Director Technology (Intel(R) RDT)
    /// Allocation capability if 1.
    ///
    UINT32  RDT_A:1;
    ///
    /// [Bit 16] AVX512F.
    ///
    UINT32  AVX512F:1;
    ///
    /// [Bit 17] AVX512DQ.
    ///
    UINT32  AVX512DQ:1;
    ///
    /// [Bit 18] If 1 indicates the processor supports the RDSEED instruction.
    ///
    UINT32  RDSEED:1;
    ///
    /// [Bit 19] If 1 indicates the processor supports the ADCX and ADOX
    /// instructions.
    ///
    UINT32  ADX:1;
    ///
    /// [Bit 20] Supports Supervisor-Mode Access Prevention (and the CLAC/STAC
    /// instructions) if 1.
    ///
    UINT32  SMAP:1;
    ///
    /// [Bit 21] AVX512_IFMA.
    ///
    UINT32  AVX512_IFMA:1;
    UINT32  Reserved6:1;
    ///
    /// [Bit 23] If 1 indicates the processor supports the CLFLUSHOPT instruction.
    ///
    UINT32  CLFLUSHOPT:1;
    ///
    /// [Bit 24] If 1 indicates the processor supports the CLWB instruction.
    ///
    UINT32  CLWB:1;
    ///
    /// [Bit 25] If 1 indicates the processor supports the Intel Processor Trace
    /// extensions.
    ///
    UINT32  IntelProcessorTrace:1;
    ///
    /// [Bit 26] AVX512PF. (Intel Xeon Phi only.).
    ///
    UINT32  AVX512PF:1;
    ///
    /// [Bit 27] AVX512ER. (Intel Xeon Phi only.).
    ///
    UINT32  AVX512ER:1;
    ///
    /// [Bit 28] AVX512CD.
    ///
    UINT32  AVX512CD:1;
    ///
    /// [Bit 29] Supports Intel(R) Secure Hash Algorithm Extensions (Intel(R)
    /// SHA Extensions) if 1.
    ///
    UINT32  SHA:1;
    ///
    /// [Bit 30] AVX512BW.
    ///
    UINT32  AVX512BW:1;
    ///
    /// [Bit 31] AVX512VL.
    ///
    UINT32  AVX512VL:1;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX;

/**
  CPUID Structured Extended Feature Flags Enumeration in ECX for CPUID leaf
  #CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS sub leaf
  #CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] If 1 indicates the processor supports the PREFETCHWT1 instruction.
    /// (Intel Xeon Phi only.)
    ///
    UINT32  PREFETCHWT1:1;
    ///
    /// [Bit 1] AVX512_VBMI.
    ///
    UINT32  AVX512_VBMI:1;
    ///
    /// [Bit 2] Supports user-mode instruction prevention if 1.
    ///
    UINT32  UMIP:1;
    ///
    /// [Bit 3] Supports protection keys for user-mode pages if 1.
    ///
    UINT32  PKU:1;
    ///
    /// [Bit 4] If 1, OS has set CR4.PKE to enable protection keys (and the
    /// RDPKRU/WRPKRU instructions).
    ///
    UINT32  OSPKE:1;
    UINT32  Reserved5:9;
    ///
    /// [Bits 14] AVX512_VPOPCNTDQ. (Intel Xeon Phi only.).
    ///
    UINT32  AVX512_VPOPCNTDQ:1;
    UINT32  Reserved7:1;
    ///
    /// [Bits 16] Supports 5-level paging if 1.
    ///
    UINT32  FiveLevelPage:1;
    ///
    /// [Bits 21:17] The value of MAWAU used by the BNDLDX and BNDSTX instructions
    /// in 64-bit mode.
    ///
    UINT32  MAWAU:5;
    ///
    /// [Bit 22] RDPID and IA32_TSC_AUX are available if 1.
    ///
    UINT32  RDPID:1;
    UINT32  Reserved3:7;
    ///
    /// [Bit 30] Supports SGX Launch Configuration if 1.
    ///
    UINT32  SGX_LC:1;
    UINT32  Reserved4:1;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_ECX;

/**
  CPUID Structured Extended Feature Flags Enumeration in EDX for CPUID leaf
  #CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS sub leaf
  #CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 1:0] Reserved.
    ///
    UINT32  Reserved1:2;
    ///
    /// [Bit 2] AVX512_4VNNIW. (Intel Xeon Phi only.)
    ///
    UINT32  AVX512_4VNNIW:1;
    ///
    /// [Bit 3] AVX512_4FMAPS. (Intel Xeon Phi only.)
    ///
    UINT32  AVX512_4FMAPS:1;
    ///
    /// [Bit 14:4] Reserved.
    ///
    UINT32  Reserved4:11;
    ///
    /// [Bit 15] Hybrid. If 1, the processor is identified as a hybrid part.
    ///
    UINT32  Hybrid:1;
    ///
    /// [Bit 25:16] Reserved.
    ///
    UINT32  Reserved5:10;
    ///
    /// [Bit 26] Enumerates support for indirect branch restricted speculation
    /// (IBRS) and the indirect branch pre-dictor barrier (IBPB). Processors
    /// that set this bit support the IA32_SPEC_CTRL MSR and the IA32_PRED_CMD
    /// MSR. They allow software to set IA32_SPEC_CTRL[0] (IBRS) and
    /// IA32_PRED_CMD[0] (IBPB).
    ///
    UINT32  EnumeratesSupportForIBRSAndIBPB:1;
    ///
    /// [Bit 27] Enumerates support for single thread indirect branch
    /// predictors (STIBP). Processors that set this bit support the
    /// IA32_SPEC_CTRL MSR. They allow software to set IA32_SPEC_CTRL[1]
    /// (STIBP).
    ///
    UINT32  EnumeratesSupportForSTIBP:1;
    ///
    /// [Bit 28] Enumerates support for L1D_FLUSH. Processors that set this bit
    /// support the IA32_FLUSH_CMD MSR. They allow software to set
    /// IA32_FLUSH_CMD[0] (L1D_FLUSH).
    ///
    UINT32  EnumeratesSupportForL1D_FLUSH:1;
    ///
    /// [Bit 29] Enumerates support for the IA32_ARCH_CAPABILITIES MSR.
    ///
    UINT32  EnumeratesSupportForCapability:1;
    ///
    /// [Bit 30] Enumerates support for the IA32_CORE_CAPABILITIES MSR.
    ///
    UINT32  EnumeratesSupportForCoreCapabilitiesMsr:1;
    ///
    /// [Bit 31] Enumerates support for Speculative Store Bypass Disable (SSBD).
    /// Processors that set this bit sup-port the IA32_SPEC_CTRL MSR. They allow
    /// software to set IA32_SPEC_CTRL[2] (SSBD).
    ///
    UINT32  EnumeratesSupportForSSBD:1;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EDX;

/**
  CPUID Direct Cache Access Information

  @param   EAX  CPUID_DIRECT_CACHE_ACCESS_INFO (0x09)

  @retval  EAX  Value of bits [31:0] of IA32_PLATFORM_DCA_CAP MSR (address 1F8H).
  @retval  EBX  Reserved.
  @retval  ECX  Reserved.
  @retval  EDX  Reserved.

  <b>Example usage</b>
  @code
  UINT32  Eax;

  AsmCpuid (CPUID_DIRECT_CACHE_ACCESS_INFO, &Eax, NULL, NULL, NULL);
  @endcode
**/
#define CPUID_DIRECT_CACHE_ACCESS_INFO              0x09


/**
  CPUID Architectural Performance Monitoring

  @param   EAX  CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING (0x0A)

  @retval  EAX  Architectural Performance Monitoring information described by
                the type CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EAX.
  @retval  EBX  Architectural Performance Monitoring information described by
                the type CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EBX.
  @retval  ECX  Reserved.
  @retval  EDX  Architectural Performance Monitoring information described by
                the type CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EDX.

  <b>Example usage</b>
  @code
  CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EAX  Eax;
  CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EBX  Ebx;
  CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EDX  Edx;

  AsmCpuid (CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING, &Eax.Uint32, &Ebx.Uint32, NULL, &Edx.Uint32);
  @endcode
**/
#define CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING  0x0A

/**
  CPUID Architectural Performance Monitoring EAX for CPUID leaf
  #CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 7:0] Version ID of architectural performance monitoring.
    ///
    UINT32  ArchPerfMonVerID:8;
    ///
    /// [Bits 15:8] Number of general-purpose performance monitoring counter
    /// per logical processor.
    ///
    /// IA32_PERFEVTSELx MSRs start at address 186H and occupy a contiguous
    /// block of MSR address space. Each performance event select register is
    /// paired with a corresponding performance counter in the 0C1H address
    /// block.
    ///
    UINT32  PerformanceMonitorCounters:8;
    ///
    /// [Bits 23:16] Bit width of general-purpose, performance monitoring counter.
    ///
    /// The bit width of an IA32_PMCx MSR. This the number of valid bits for
    /// read operation. On write operations, the lower-order 32 bits of the MSR
    /// may be written with any value, and the high-order bits are sign-extended
    /// from the value of bit 31.
    ///
    UINT32  PerformanceMonitorCounterWidth:8;
    ///
    /// [Bits 31:24] Length of EBX bit vector to enumerate architectural
    /// performance monitoring events.
    ///
    UINT32  EbxBitVectorLength:8;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EAX;

/**
  CPUID Architectural Performance Monitoring EBX for CPUID leaf
  #CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] Core cycle event not available if 1.
    ///
    UINT32  UnhaltedCoreCycles:1;
    ///
    /// [Bit 1] Instruction retired event not available if 1.
    ///
    UINT32  InstructionsRetired:1;
    ///
    /// [Bit 2] Reference cycles event not available if 1.
    ///
    UINT32  UnhaltedReferenceCycles:1;
    ///
    /// [Bit 3] Last-level cache reference event not available if 1.
    ///
    UINT32  LastLevelCacheReferences:1;
    ///
    /// [Bit 4] Last-level cache misses event not available if 1.
    ///
    UINT32  LastLevelCacheMisses:1;
    ///
    /// [Bit 5] Branch instruction retired event not available if 1.
    ///
    UINT32  BranchInstructionsRetired:1;
    ///
    /// [Bit 6] Branch mispredict retired event not available if 1.
    ///
    UINT32  AllBranchMispredictRetired:1;
    UINT32  Reserved:25;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EBX;

/**
  CPUID Architectural Performance Monitoring EDX for CPUID leaf
  #CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 4:0] Number of fixed-function performance counters
    /// (if Version ID > 1).
    ///
    UINT32  FixedFunctionPerformanceCounters:5;
    ///
    /// [Bits 12:5] Bit width of fixed-function performance counters
    /// (if Version ID > 1).
    ///
    UINT32  FixedFunctionPerformanceCounterWidth:8;
    UINT32  Reserved1:2;
    ///
    /// [Bits 15] AnyThread deprecation.
    ///
    UINT32  AnyThreadDeprecation:1;
    UINT32  Reserved2:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EDX;


/**
  CPUID Extended Topology Information

  @note
  CPUID leaf 1FH is a preferred superset to leaf 0BH. Intel recommends first
  checking for the existence of Leaf 1FH before using leaf 0BH.
  Most of Leaf 0BH output depends on the initial value in ECX.  The EDX output
  of leaf 0BH is always valid and does not vary with input value in ECX.  Output
  value in ECX[7:0] always equals input value in ECX[7:0].
  Sub-leaf index 0 enumerates SMT level. Each subsequent higher sub-leaf index
  enumerates a higher-level topological entity in hierarchical order.
  For sub-leaves that return an invalid level-type of 0 in ECX[15:8]; EAX and
  EBX will return 0.
  If an input value n in ECX returns the invalid level-type of 0 in ECX[15:8],
  other input values with ECX > n also return 0 in ECX[15:8].

  @param   EAX  CPUID_EXTENDED_TOPOLOGY (0x0B)
  @param   ECX  Level number

  @retval  EAX  Extended topology information described by the type
                CPUID_EXTENDED_TOPOLOGY_EAX.
  @retval  EBX  Extended topology information described by the type
                CPUID_EXTENDED_TOPOLOGY_EBX.
  @retval  ECX  Extended topology information described by the type
                CPUID_EXTENDED_TOPOLOGY_ECX.
  @retval  EDX  x2APIC ID the current logical processor.

  <b>Example usage</b>
  @code
  CPUID_EXTENDED_TOPOLOGY_EAX  Eax;
  CPUID_EXTENDED_TOPOLOGY_EBX  Ebx;
  CPUID_EXTENDED_TOPOLOGY_ECX  Ecx;
  UINT32                       Edx;
  UINT32                       LevelNumber;

  LevelNumber = 0;
  do {
    AsmCpuidEx (
      CPUID_EXTENDED_TOPOLOGY, LevelNumber,
      &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx
      );
    LevelNumber++;
  } while (Eax.Bits.ApicIdShift != 0);
  @endcode
**/
#define CPUID_EXTENDED_TOPOLOGY                             0x0B

/**
  CPUID Extended Topology Information EAX for CPUID leaf #CPUID_EXTENDED_TOPOLOGY.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 4:0] Number of bits to shift right on x2APIC ID to get a unique
    /// topology ID of the next level type.  All logical processors with the
    /// same next level ID share current level.
    ///
    /// @note
    /// Software should use this field (EAX[4:0]) to enumerate processor
    /// topology of the system.
    ///
    UINT32  ApicIdShift:5;
    UINT32  Reserved:27;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_EXTENDED_TOPOLOGY_EAX;

/**
  CPUID Extended Topology Information EBX for CPUID leaf #CPUID_EXTENDED_TOPOLOGY.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 15:0] Number of logical processors at this level type. The number
    /// reflects configuration as shipped by Intel.
    ///
    /// @note
    /// Software must not use EBX[15:0] to enumerate processor topology of the
    /// system. This value in this field (EBX[15:0]) is only intended for
    /// display/diagnostic purposes. The actual number of logical processors
    /// available to BIOS/OS/Applications may be different from the value of
    /// EBX[15:0], depending on software and platform hardware configurations.
    ///
    UINT32  LogicalProcessors:16;
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_EXTENDED_TOPOLOGY_EBX;

/**
  CPUID Extended Topology Information ECX for CPUID leaf #CPUID_EXTENDED_TOPOLOGY.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 7:0] Level number. Same value in ECX input.
    ///
    UINT32  LevelNumber:8;
    ///
    /// [Bits 15:8] Level type.
    ///
    /// @note
    /// The value of the "level type" field is not related to level numbers in
    /// any way, higher "level type" values do not mean higher levels.
    ///
    UINT32  LevelType:8;
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_EXTENDED_TOPOLOGY_ECX;

///
/// @{ Define value for CPUID_EXTENDED_TOPOLOGY_ECX.LevelType
///
#define   CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_INVALID        0x00
#define   CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_SMT            0x01
#define   CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_CORE           0x02
///
/// @}
///


/**
  CPUID Extended State Information

  @param   EAX  CPUID_EXTENDED_STATE (0x0D)
  @param   ECX  CPUID_EXTENDED_STATE_MAIN_LEAF (0x00).
                CPUID_EXTENDED_STATE_SUB_LEAF (0x01).
                CPUID_EXTENDED_STATE_SIZE_OFFSET (0x02).
                Sub leafs 2..n based on supported bits in XCR0 or IA32_XSS_MSR.
**/
#define CPUID_EXTENDED_STATE                                0x0D

/**
  CPUID Extended State Information Main Leaf

  @param   EAX  CPUID_EXTENDED_STATE (0x0D)
  @param   ECX  CPUID_EXTENDED_STATE_MAIN_LEAF (0x00)

  @retval  EAX  Reports the supported bits of the lower 32 bits of XCR0. XCR0[n]
                can be set to 1 only if EAX[n] is 1.  The format of the extended
                state main leaf is described by the type
                CPUID_EXTENDED_STATE_MAIN_LEAF_EAX.
  @retval  EBX  Maximum size (bytes, from the beginning of the XSAVE/XRSTOR save
                area) required by enabled features in XCR0. May be different than
                ECX if some features at the end of the XSAVE save area are not
                enabled.
  @retval  ECX  Maximum size (bytes, from the beginning of the XSAVE/XRSTOR save
                area) of the XSAVE/XRSTOR save area required by all supported
                features in the processor, i.e., all the valid bit fields in XCR0.
  @retval  EDX  Reports the supported bits of the upper 32 bits of XCR0.
                XCR0[n+32] can be set to 1 only if EDX[n] is 1.

  <b>Example usage</b>
  @code
  CPUID_EXTENDED_STATE_MAIN_LEAF_EAX  Eax;
  UINT32                              Ebx;
  UINT32                              Ecx;
  UINT32                              Edx;

  AsmCpuidEx (
    CPUID_EXTENDED_STATE, CPUID_EXTENDED_STATE_MAIN_LEAF,
    &Eax.Uint32, &Ebx, &Ecx, &Edx
    );
  @endcode
**/
#define CPUID_EXTENDED_STATE_MAIN_LEAF                      0x00

/**
  CPUID Extended State Information EAX for CPUID leaf #CPUID_EXTENDED_STATE,
  sub-leaf #CPUID_EXTENDED_STATE_MAIN_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] x87 state.
    ///
    UINT32  x87:1;
    ///
    /// [Bit 1] SSE state.
    ///
    UINT32  SSE:1;
    ///
    /// [Bit 2] AVX state.
    ///
    UINT32  AVX:1;
    ///
    /// [Bits 4:3] MPX state.
    ///
    UINT32  MPX:2;
    ///
    /// [Bits 7:5] AVX-512 state.
    ///
    UINT32  AVX_512:3;
    ///
    /// [Bit 8] Used for IA32_XSS.
    ///
    UINT32  IA32_XSS:1;
    ///
    /// [Bit 9] PKRU state.
    ///
    UINT32  PKRU:1;
    UINT32  Reserved1:3;
    ///
    /// [Bit 13] Used for IA32_XSS, part 2.
    ///
    UINT32  IA32_XSS_2:1;
    UINT32  Reserved2:18;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_EXTENDED_STATE_MAIN_LEAF_EAX;

/**
  CPUID Extended State Information Sub Leaf

  @param   EAX  CPUID_EXTENDED_STATE (0x0D)
  @param   ECX  CPUID_EXTENDED_STATE_SUB_LEAF (0x01)

  @retval  EAX  The format of the extended state sub-leaf is described by the
                type CPUID_EXTENDED_STATE_SUB_LEAF_EAX.
  @retval  EBX  The size in bytes of the XSAVE area containing all states
                enabled by XCRO | IA32_XSS.
  @retval  ECX  The format of the extended state sub-leaf is described by the
                type CPUID_EXTENDED_STATE_SUB_LEAF_ECX.
  @retval  EDX  Reports the supported bits of the upper 32 bits of the
                IA32_XSS MSR. IA32_XSS[n+32] can be set to 1 only if EDX[n] is 1.

  <b>Example usage</b>
  @code
  CPUID_EXTENDED_STATE_SUB_LEAF_EAX  Eax;
  UINT32                             Ebx;
  CPUID_EXTENDED_STATE_SUB_LEAF_ECX  Ecx;
  UINT32                             Edx;

  AsmCpuidEx (
    CPUID_EXTENDED_STATE, CPUID_EXTENDED_STATE_SUB_LEAF,
    &Eax.Uint32, &Ebx, &Ecx.Uint32, &Edx
    );
  @endcode
**/
#define CPUID_EXTENDED_STATE_SUB_LEAF                       0x01

/**
  CPUID Extended State Information EAX for CPUID leaf #CPUID_EXTENDED_STATE,
  sub-leaf #CPUID_EXTENDED_STATE_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] XSAVEOPT is available.
    ///
    UINT32  XSAVEOPT:1;
    ///
    /// [Bit 1] Supports XSAVEC and the compacted form of XRSTOR if set.
    ///
    UINT32  XSAVEC:1;
    ///
    /// [Bit 2] Supports XGETBV with ECX = 1 if set.
    ///
    UINT32  XGETBV:1;
    ///
    /// [Bit 3] Supports XSAVES/XRSTORS and IA32_XSS if set.
    ///
    UINT32  XSAVES:1;
    UINT32  Reserved:28;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_EXTENDED_STATE_SUB_LEAF_EAX;

/**
  CPUID Extended State Information ECX for CPUID leaf #CPUID_EXTENDED_STATE,
  sub-leaf #CPUID_EXTENDED_STATE_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 7:0] Used for XCR0.
    ///
    UINT32  XCR0:1;
    ///
    /// [Bit 8] PT STate.
    ///
    UINT32  PT:1;
    ///
    /// [Bit 9] Used for XCR0.
    ///
    UINT32  XCR0_1:1;
    UINT32  Reserved1:3;
    ///
    /// [Bit 13] HWP state.
    ///
    UINT32  HWPState:1;
    UINT32  Reserved8:18;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_EXTENDED_STATE_SUB_LEAF_ECX;

/**
  CPUID Extended State Information Size and Offset Sub Leaf

  @note
  Leaf 0DH output depends on the initial value in ECX.
  Each sub-leaf index (starting at position 2) is supported if it corresponds to
  a supported bit in either the XCR0 register or the IA32_XSS MSR.
  If ECX contains an invalid sub-leaf index, EAX/EBX/ECX/EDX return 0. Sub-leaf
  n (0 <= n <= 31) is invalid if sub-leaf 0 returns 0 in EAX[n] and sub-leaf 1
  returns 0 in ECX[n]. Sub-leaf n (32 <= n <= 63) is invalid if sub-leaf 0
  returns 0 in EDX[n-32] and sub-leaf 1 returns 0 in EDX[n-32].

  @param   EAX  CPUID_EXTENDED_STATE (0x0D)
  @param   ECX  CPUID_EXTENDED_STATE_SIZE_OFFSET (0x02).  Sub leafs 2..n based
                on supported bits in XCR0 or IA32_XSS_MSR.

  @retval  EAX  The size in bytes (from the offset specified in EBX) of the save
                area for an extended state feature associated with a valid
                sub-leaf index, n.
  @retval  EBX  The offset in bytes of this extended state component's save area
                from the beginning of the XSAVE/XRSTOR area.  This field reports
                0 if the sub-leaf index, n, does not map to a valid bit in the
                XCR0 register.
  @retval  ECX  The format of the extended state components's save area as
                described by the type CPUID_EXTENDED_STATE_SIZE_OFFSET_ECX.
                This field reports 0 if the sub-leaf index, n, is invalid.
  @retval  EDX  This field reports 0 if the sub-leaf index, n, is invalid;
                otherwise it is reserved.

  <b>Example usage</b>
  @code
  UINT32                                Eax;
  UINT32                                Ebx;
  CPUID_EXTENDED_STATE_SIZE_OFFSET_ECX  Ecx;
  UINT32                                Edx;
  UINTN                                 SubLeaf;

  for (SubLeaf = CPUID_EXTENDED_STATE_SIZE_OFFSET; SubLeaf < 32; SubLeaf++) {
    AsmCpuidEx (
      CPUID_EXTENDED_STATE, SubLeaf,
      &Eax, &Ebx, &Ecx.Uint32, &Edx
      );
  }
  @endcode
**/
#define CPUID_EXTENDED_STATE_SIZE_OFFSET                    0x02

/**
  CPUID Extended State Information ECX for CPUID leaf #CPUID_EXTENDED_STATE,
  sub-leaf #CPUID_EXTENDED_STATE_SIZE_OFFSET.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] Is set if the bit n (corresponding to the sub-leaf index) is
    /// supported in the IA32_XSS MSR; it is clear if bit n is instead supported
    /// in XCR0.
    ///
    UINT32  XSS:1;
    ///
    /// [Bit 1] is set if, when the compacted format of an XSAVE area is used,
    /// this extended state component located on the next 64-byte boundary
    /// following the preceding state component (otherwise, it is located
    /// immediately following the preceding state component).
    ///
    UINT32  Compacted:1;
    UINT32  Reserved:30;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_EXTENDED_STATE_SIZE_OFFSET_ECX;


/**
  CPUID Intel Resource Director Technology (Intel RDT) Monitoring Information

  @param   EAX  CPUID_INTEL_RDT_MONITORING (0x0F)
  @param   ECX  CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF (0x00).
                CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF (0x01).

**/
#define CPUID_INTEL_RDT_MONITORING                          0x0F

/**
  CPUID Intel Resource Director Technology (Intel RDT) Monitoring Information
  Enumeration Sub-leaf

  @param   EAX  CPUID_INTEL_RDT_MONITORING (0x0F)
  @param   ECX  CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF (0x00)

  @retval  EAX  Reserved.
  @retval  EBX  Maximum range (zero-based) of RMID within this physical
                processor of all types.
  @retval  ECX  Reserved.
  @retval  EDX  L3 Cache Intel RDT Monitoring Information Enumeration described by
                the type CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF_EDX.

  <b>Example usage</b>
  @code
  UINT32                                                  Ebx;
  CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF_EDX     Edx;

  AsmCpuidEx (
    CPUID_INTEL_RDT_MONITORING, CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF,
    NULL, &Ebx, NULL, &Edx.Uint32
    );
  @endcode
**/
#define CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF     0x00

/**
  CPUID Intel RDT Monitoring Information EDX for CPUID leaf
  #CPUID_INTEL_RDT_MONITORING, sub-leaf
  #CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    UINT32  Reserved1:1;
    ///
    /// [Bit 1] Supports L3 Cache Intel RDT Monitoring if 1.
    ///
    UINT32  L3CacheRDT_M:1;
    UINT32  Reserved2:30;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF_EDX;

/**
  CPUID L3 Cache Intel RDT Monitoring Capability Enumeration Sub-leaf

  @param   EAX  CPUID_INTEL_RDT_MONITORING (0x0F)
  @param   ECX  CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF (0x01)

  @retval  EAX  Reserved.
  @retval  EBX  Conversion factor from reported IA32_QM_CTR value to occupancy metric (bytes).
  @retval  ECX  Maximum range (zero-based) of RMID of this resource type.
  @retval  EDX  L3 Cache Intel RDT Monitoring Capability information described by the
                type CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF_EDX.

  <b>Example usage</b>
  @code
  UINT32                                            Ebx;
  UINT32                                            Ecx;
  CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF_EDX  Edx;

  AsmCpuidEx (
    CPUID_INTEL_RDT_MONITORING, CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF,
    NULL, &Ebx, &Ecx, &Edx.Uint32
    );
  @endcode
**/
#define CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF        0x01

/**
  CPUID L3 Cache Intel RDT Monitoring Capability Information EDX for CPUID leaf
  #CPUID_INTEL_RDT_MONITORING, sub-leaf
  #CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] Supports L3 occupancy monitoring if 1.
    ///
    UINT32  L3CacheOccupancyMonitoring:1;
    ///
    /// [Bit 1] Supports L3 Total Bandwidth monitoring if 1.
    ///
    UINT32  L3CacheTotalBandwidthMonitoring:1;
    ///
    /// [Bit 2] Supports L3 Local Bandwidth monitoring if 1.
    ///
    UINT32  L3CacheLocalBandwidthMonitoring:1;
    UINT32  Reserved:29;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF_EDX;


/**
  CPUID Intel Resource Director Technology (Intel RDT) Allocation Information

  @param   EAX  CPUID_INTEL_RDT_ALLOCATION (0x10).
  @param   ECX  CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF (0x00).
                CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF (0x01).
                CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF (0x02).
**/
#define CPUID_INTEL_RDT_ALLOCATION                          0x10

/**
  Intel Resource Director Technology (Intel RDT) Allocation Enumeration Sub-leaf

  @param   EAX  CPUID_INTEL_RDT_ALLOCATION (0x10)
  @param   ECX  CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF (0x00).

  @retval  EAX  Reserved.
  @retval  EBX  L3 and L2 Cache Allocation Technology information described by
                the type CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF_EBX.
  @retval  ECX  Reserved.
  @retval  EDX  Reserved.

  <b>Example usage</b>
  @code
  CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF_EBX  Ebx;

  AsmCpuidEx (
    CPUID_INTEL_RDT_ALLOCATION, CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF,
    NULL, &Ebx.Uint32, NULL, NULL
    );
  @endcode
**/
#define CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF     0x00

/**
  CPUID L3 and L2 Cache Allocation Support Information EBX for CPUID leaf
  #CPUID_INTEL_RDT_ALLOCATION, sub-leaf
  #CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    UINT32  Reserved1:1;
    ///
    /// [Bit 1] Supports L3 Cache Allocation Technology if 1.
    ///
    UINT32  L3CacheAllocation:1;
    ///
    /// [Bit 2] Supports L2 Cache Allocation Technology if 1.
    ///
    UINT32  L2CacheAllocation:1;
    ///
    /// [Bit 3] Supports Memory Bandwidth Allocation if 1.
    ///
    UINT32  MemoryBandwidth:1;
    UINT32  Reserved3:28;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF_EBX;


/**
  L3 Cache Allocation Technology Enumeration Sub-leaf

  @param   EAX  CPUID_INTEL_RDT_ALLOCATION (0x10)
  @param   ECX  CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF (0x01)

  @retval  EAX  RESID L3 Cache Allocation Technology information described by
                the type CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_EAX.
  @retval  EBX  Bit-granular map of isolation/contention of allocation units.
  @retval  ECX  RESID L3 Cache Allocation Technology information described by
                the type CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_ECX.
  @retval  EDX  RESID L3 Cache Allocation Technology information described by
                the type CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_EDX.

  <b>Example usage</b>
  @code
  CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_EAX  Eax;
  UINT32                                            Ebx;
  CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_ECX  Ecx;
  CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_EDX  Edx;

  AsmCpuidEx (
    CPUID_INTEL_RDT_ALLOCATION, CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF,
    &Eax.Uint32, &Ebx, &Ecx.Uint32, &Edx.Uint32
    );
  @endcode
**/
#define CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF        0x01

/**
  CPUID L3 Cache Allocation Technology Information EAX for CPUID leaf
  #CPUID_INTEL_RDT_ALLOCATION, sub-leaf
  #CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 4:0] Length of the capacity bit mask for the corresponding ResID
    /// using minus-one notation.
    ///
    UINT32  CapacityLength:5;
    UINT32  Reserved:27;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_EAX;

/**
  CPUID L3 Cache Allocation Technology Information ECX for CPUID leaf
  #CPUID_INTEL_RDT_ALLOCATION, sub-leaf
  #CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    UINT32  Reserved3:2;
    ///
    /// [Bit 2] Code and Data Prioritization Technology supported if 1.
    ///
    UINT32  CodeDataPrioritization:1;
    UINT32  Reserved2:29;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_ECX;

/**
  CPUID L3 Cache Allocation Technology Information EDX for CPUID leaf
  #CPUID_INTEL_RDT_ALLOCATION, sub-leaf
  #CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 15:0] Highest COS number supported for this ResID.
    ///
    UINT32  HighestCosNumber:16;
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_EDX;

/**
  L2 Cache Allocation Technology Enumeration Sub-leaf

  @param   EAX  CPUID_INTEL_RDT_ALLOCATION (0x10)
  @param   ECX  CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF (0x02)

  @retval  EAX  RESID L2 Cache Allocation Technology information described by
                the type CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF_EAX.
  @retval  EBX  Bit-granular map of isolation/contention of allocation units.
  @retval  ECX  Reserved.
  @retval  EDX  RESID L2 Cache Allocation Technology information described by
                the type CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF_EDX.

  <b>Example usage</b>
  @code
  CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF_EAX  Eax;
  UINT32                                            Ebx;
  CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF_EDX  Edx;

  AsmCpuidEx (
    CPUID_INTEL_RDT_ALLOCATION, CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF,
    &Eax.Uint32, &Ebx, NULL, &Edx.Uint32
    );
  @endcode
**/
#define CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF        0x02

/**
  CPUID L2 Cache Allocation Technology Information EAX for CPUID leaf
  #CPUID_INTEL_RDT_ALLOCATION, sub-leaf
  #CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 4:0] Length of the capacity bit mask for the corresponding ResID
    /// using minus-one notation.
    ///
    UINT32  CapacityLength:5;
    UINT32  Reserved:27;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF_EAX;

/**
  CPUID L2 Cache Allocation Technology Information EDX for CPUID leaf
  #CPUID_INTEL_RDT_ALLOCATION, sub-leaf
  #CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 15:0] Highest COS number supported for this ResID.
    ///
    UINT32  HighestCosNumber:16;
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF_EDX;

/**
  Memory Bandwidth Allocation Enumeration Sub-leaf

  @param   EAX  CPUID_INTEL_RDT_ALLOCATION (0x10)
  @param   ECX  CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF (0x03)

  @retval  EAX  RESID memory bandwidth Allocation Technology information
                described by the type
                CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EAX.
  @retval  EBX  Reserved.
  @retval  ECX  RESID memory bandwidth Allocation Technology information
                described by the type
                CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_ECX.
  @retval  EDX  RESID memory bandwidth Allocation Technology information
                described by the type
                CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EDX.

  <b>Example usage</b>
  @code
  CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EAX  Eax;
  UINT32                                                    Ebx;
  CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_ECX  Ecx;
  CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EDX  Edx;


  AsmCpuidEx (
    CPUID_INTEL_RDT_ALLOCATION, CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF,
    &Eax.Uint32, &Ebx, NULL, &Edx.Uint32
    );
  @endcode
**/
#define CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF        0x03

/**
  CPUID memory bandwidth Allocation Technology Information EAX for CPUID leaf
  #CPUID_INTEL_RDT_ALLOCATION, sub-leaf
  #CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 11:0] Reports the maximum MBA throttling value supported for
    /// the corresponding ResID using minus-one notation.
    ///
    UINT32  MaximumMBAThrottling:12;
    UINT32  Reserved:20;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EAX;

/**
  CPUID memory bandwidth Allocation Technology Information ECX for CPUID leaf
  #CPUID_INTEL_RDT_ALLOCATION, sub-leaf
  #CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 1:0] Reserved.
    ///
    UINT32  Reserved1:2;
    ///
    /// [Bits 3] Reports whether the response of the delay values is linear.
    ///
    UINT32  Liner:1;
    UINT32  Reserved2:29;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_ECX;

/**
  CPUID memory bandwidth Allocation Technology Information EDX for CPUID leaf
  #CPUID_INTEL_RDT_ALLOCATION, sub-leaf
  #CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 15:0] Highest COS number supported for this ResID.
    ///
    UINT32  HighestCosNumber:16;
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EDX;

/**
  Intel SGX resource capability and configuration.
  See Section 37.7.2 "Intel(R) SGX Resource Enumeration Leaves".

  If CPUID.(EAX=07H, ECX=0H):EBX.SGX = 1, the processor also supports querying
  CPUID with EAX=12H on Intel SGX resource capability and configuration.

  @param   EAX  CPUID_INTEL_SGX (0x12)
  @param   ECX  CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF (0x00).
                CPUID_INTEL_SGX_CAPABILITIES_1_SUB_LEAF (0x01).
                CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF (0x02).
                Sub leafs 2..n based on the sub-leaf-type encoding (returned in EAX[3:0])
                until the sub-leaf type is invalid.

**/
#define CPUID_INTEL_SGX                                  0x12

/**
  Sub-Leaf 0 Enumeration of Intel SGX Capabilities.
  Enumerates Intel SGX capability, including enclave instruction opcode support.

  @param   EAX  CPUID_INTEL_SGX (0x12)
  @param   ECX  CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF (0x00)

  @retval  EAX  The format of Sub-Leaf 0 Enumeration of Intel SGX Capabilities is
                described by the type CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF_EAX.
  @retval  EBX  MISCSELECT: Reports the bit vector of supported extended features
                that can be written to the MISC region of the SSA.
  @retval  ECX  Reserved.
  @retval  EDX  The format of Sub-Leaf 0 Enumeration of Intel SGX Capabilities is
                described by the type CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF_EDX.

  <b>Example usage</b>
  @code
  CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF_EAX  Eax;
  UINT32                                       Ebx;
  CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF_EDX  Edx;

  AsmCpuidEx (
    CPUID_INTEL_SGX, CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF,
    &Eax.Uint32, &Ebx, NULL, &Edx.Uint32
    );
  @endcode
**/
#define CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF          0x00

/**
  Sub-Leaf 0 Enumeration of Intel SGX Capabilities EAX for CPUID leaf #CPUID_INTEL_SGX,
  sub-leaf #CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] If 1, indicates leaf functions of SGX1 instruction are supported.
    ///
    UINT32  SGX1:1;
    ///
    /// [Bit 1] If 1, indicates leaf functions of SGX2 instruction are supported.
    ///
    UINT32  SGX2:1;
    UINT32  Reserved1:3;
    ///
    /// [Bit 5] If 1, indicates Intel SGX supports ENCLV instruction leaves
    /// EINCVIRTCHILD, EDECVIRTCHILD, and ESETCONTEXT.
    ///
    UINT32  ENCLV:1;
    ///
    /// [Bit 6] If 1, indicates Intel SGX supports ENCLS instruction leaves ETRACKC,
    /// ERDINFO, ELDBC, and ELDUC.
    ///
    UINT32  ENCLS:1;
    UINT32  Reserved2:25;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF_EAX;

/**
  Sub-Leaf 0 Enumeration of Intel SGX Capabilities EDX for CPUID leaf #CPUID_INTEL_SGX,
  sub-leaf #CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 7:0] The maximum supported enclave size is 2^(EDX[7:0]) bytes
    /// when not in 64-bit mode.
    ///
    UINT32  MaxEnclaveSize_Not64:8;
    ///
    /// [Bit 15:8] The maximum supported enclave size is 2^(EDX[15:8]) bytes
    /// when operating in 64-bit mode.
    ///
    UINT32  MaxEnclaveSize_64:8;
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF_EDX;


/**
  Sub-Leaf 1 Enumeration of Intel SGX Capabilities.
  Enumerates Intel SGX capability of processor state configuration and enclave
  configuration in the SECS structure.

  @param   EAX  CPUID_INTEL_SGX (0x12)
  @param   ECX  CPUID_INTEL_SGX_CAPABILITIES_1_SUB_LEAF (0x01)

  @retval  EAX  Report the valid bits of SECS.ATTRIBUTES[31:0] that software can
                set with ECREATE. SECS.ATTRIBUTES[n] can be set to 1 using ECREATE
                only if EAX[n] is 1, where n < 32.
  @retval  EBX  Report the valid bits of SECS.ATTRIBUTES[63:32] that software can
                set with ECREATE. SECS.ATTRIBUTES[n+32] can be set to 1 using ECREATE
                only if EBX[n] is 1, where n < 32.
  @retval  ECX  Report the valid bits of SECS.ATTRIBUTES[95:64] that software can
                set with ECREATE. SECS.ATTRIBUTES[n+64] can be set to 1 using ECREATE
                only if ECX[n] is 1, where n < 32.
  @retval  EDX  Report the valid bits of SECS.ATTRIBUTES[127:96] that software can
                set with ECREATE. SECS.ATTRIBUTES[n+96] can be set to 1 using ECREATE
                only if EDX[n] is 1, where n < 32.

  <b>Example usage</b>
  @code
  UINT32  Eax;
  UINT32  Ebx;
  UINT32  Ecx;
  UINT32  Edx;

  AsmCpuidEx (
    CPUID_INTEL_SGX, CPUID_INTEL_SGX_CAPABILITIES_1_SUB_LEAF,
    &Eax, &Ebx, &Ecx, &Edx
    );
  @endcode
**/
#define CPUID_INTEL_SGX_CAPABILITIES_1_SUB_LEAF          0x01


/**
  Sub-Leaf Index 2 or Higher Enumeration of Intel SGX Resources.
  Enumerates available EPC resources.

  @param   EAX  CPUID_INTEL_SGX (0x12)
  @param   ECX  CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF (0x02)

  @retval  EAX  The format of Sub-Leaf Index 2 or Higher Enumeration of Intel SGX
                Resources is described by the type
                CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EAX.
  @retval  EBX  The format of Sub-Leaf Index 2 or Higher Enumeration of Intel SGX
                Resources is described by the type
                CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EBX.
  @retval  EDX  The format of Sub-Leaf Index 2 or Higher Enumeration of Intel SGX
                Resources is described by the type
                CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_ECX.
  @retval  EDX  The format of Sub-Leaf Index 2 or Higher Enumeration of Intel SGX
                Resources is described by the type
                CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EDX.

  <b>Example usage</b>
  @code
  CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EAX  Eax;
  CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EBX  Ebx;
  CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_ECX  Ecx;
  CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EDX  Edx;

  AsmCpuidEx (
    CPUID_INTEL_SGX, CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF,
    &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32
    );
  @endcode
**/
#define CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF  0x02

/**
  Sub-Leaf Index 2 or Higher Enumeration of Intel SGX Resources EAX for CPUID
  leaf #CPUID_INTEL_SGX, sub-leaf #CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 3:0] Sub-leaf-type encoding.
    /// 0000b: This sub-leaf is invalid, EBX:EAX and EDX:ECX report 0.
    /// 0001b: This sub-leaf provides information on the Enclave Page Cache (EPC)
    ///        in EBX:EAX and EDX:ECX.
    /// All other encoding are reserved.
    ///
    UINT32  SubLeafType:4;
    UINT32  Reserved:8;
    ///
    /// [Bit 31:12] If EAX[3:0] = 0001b, these are bits 31:12 of the physical address of
    /// the base of the EPC section.
    ///
    UINT32  LowAddressOfEpcSection:20;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EAX;

/**
  Sub-Leaf Index 2 or Higher Enumeration of Intel SGX Resources EBX for CPUID
  leaf #CPUID_INTEL_SGX, sub-leaf #CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 19:0] If EAX[3:0] = 0001b, these are bits 51:32 of the physical address of
    /// the base of the EPC section.
    ///
    UINT32  HighAddressOfEpcSection:20;
    UINT32  Reserved:12;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EBX;

/**
  Sub-Leaf Index 2 or Higher Enumeration of Intel SGX Resources ECX for CPUID
  leaf #CPUID_INTEL_SGX, sub-leaf #CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 3:0] The EPC section encoding.
    /// 0000b: Not valid.
    /// 0001b: The EPC section is confidentiality, integrity and replay protected.
    /// All other encoding are reserved.
    ///
    UINT32  EpcSection:4;
    UINT32  Reserved:8;
    ///
    /// [Bit 31:12] If EAX[3:0] = 0001b, these are bits 31:12 of the size of the
    /// corresponding EPC section within the Processor Reserved Memory.
    ///
    UINT32  LowSizeOfEpcSection:20;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_ECX;

/**
  Sub-Leaf Index 2 or Higher Enumeration of Intel SGX Resources EDX for CPUID
  leaf #CPUID_INTEL_SGX, sub-leaf #CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 19:0] If EAX[3:0] = 0001b, these are bits 51:32 of the size of the
    /// corresponding EPC section within the Processor Reserved Memory.
    ///
    UINT32  HighSizeOfEpcSection:20;
    UINT32  Reserved:12;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EDX;


/**
  CPUID Intel Processor Trace Information

  @param   EAX  CPUID_INTEL_PROCESSOR_TRACE (0x14)
  @param   ECX  CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF (0x00).
                CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF (0x01).

**/
#define CPUID_INTEL_PROCESSOR_TRACE                         0x14

/**
  CPUID Intel Processor Trace Information Main Leaf

  @param   EAX  CPUID_INTEL_PROCEDSSOR_TRACE (0x14)
  @param   ECX  CPUID_INTEL_PROCEDSSOR_TRACE_MAIN_LEAF (0x00)

  @retval  EAX  Reports the maximum sub-leaf supported in leaf 14H.
  @retval  EBX  Returns Intel processor trace information described by the
                type CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_EBX.
  @retval  ECX  Returns Intel processor trace information described by the
                type CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_ECX.
  @retval  EDX  Reserved.

  <b>Example usage</b>
  @code
  UINT32                                     Eax;
  CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_EBX  Ebx;
  CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_ECX  Ecx;

  AsmCpuidEx (
    CPUID_INTEL_PROCESSOR_TRACE, CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF,
    &Eax, &Ebx.Uint32, &Ecx.Uint32, NULL
    );
  @endcode
**/
#define CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF               0x00

/**
  CPUID Intel Processor Trace EBX for CPUID leaf #CPUID_INTEL_PROCESSOR_TRACE,
  sub-leaf #CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] If 1, indicates that IA32_RTIT_CTL.CR3Filter can be set to 1,
    /// and that IA32_RTIT_CR3_MATCH MSR can be accessed.
    ///
    UINT32  Cr3Filter:1;
    ///
    /// [Bit 1] If 1, indicates support of Configurable PSB and Cycle-Accurate
    /// Mode.
    ///
    UINT32  ConfigurablePsb:1;
    ///
    /// [Bit 2] If 1, indicates support of IP Filtering, TraceStop filtering,
    /// and preservation of Intel PT MSRs across warm reset.
    ///
    UINT32  IpTraceStopFiltering:1;
    ///
    /// [Bit 3] If 1, indicates support of MTC timing packet and suppression of
    /// COFI-based packets.
    ///
    UINT32  Mtc:1;
    ///
    /// [Bit 4] If 1, indicates support of PTWRITE. Writes can set
    /// IA32_RTIT_CTL[12] (PTWEn) and IA32_RTIT_CTL[5] (FUPonPTW), and PTWRITE
    /// can generate packets.
    ///
    UINT32  PTWrite:1;
    ///
    /// [Bit 5] If 1, indicates support of Power Event Trace. Writes can set
    /// IA32_RTIT_CTL[4] (PwrEvtEn), enabling Power Event Trace packet
    /// generation.
    ///
    UINT32  PowerEventTrace:1;
    UINT32  Reserved:26;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_EBX;

/**
  CPUID Intel Processor Trace ECX for CPUID leaf #CPUID_INTEL_PROCESSOR_TRACE,
  sub-leaf #CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] If 1, Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1, hence
    /// utilizing the ToPA output scheme; IA32_RTIT_OUTPUT_BASE and
    /// IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be accessed.
    ///
    UINT32  RTIT:1;
    ///
    /// [Bit 1] If 1, ToPA tables can hold any number of output entries, up to
    /// the maximum allowed by the MaskOrTableOffset field of
    /// IA32_RTIT_OUTPUT_MASK_PTRS.
    ///
    UINT32  ToPA:1;
    ///
    /// [Bit 2] If 1, indicates support of Single-Range Output scheme.
    ///
    UINT32  SingleRangeOutput:1;
    ///
    /// [Bit 3] If 1, indicates support of output to Trace Transport subsystem.
    ///
    UINT32  TraceTransportSubsystem:1;
    UINT32  Reserved:27;
    ///
    /// [Bit 31] If 1, generated packets which contain IP payloads have LIP
    /// values, which include the CS base component.
    ///
    UINT32  LIP:1;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_ECX;


/**
  CPUID Intel Processor Trace Information Sub-leaf

  @param   EAX  CPUID_INTEL_PROCEDSSOR_TRACE (0x14)
  @param   ECX  CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF (0x01)

  @retval  EAX  Returns Intel processor trace information described by the
                type CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF_EAX.
  @retval  EBX  Returns Intel processor trace information described by the
                type CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF_EBX.
  @retval  ECX  Reserved.
  @retval  EDX  Reserved.

  <b>Example usage</b>
  @code
  UINT32                                    MaximumSubLeaf;
  UINT32                                    SubLeaf;
  CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF_EAX  Eax;
  CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF_EBX  Ebx;

  AsmCpuidEx (
    CPUID_INTEL_PROCESSOR_TRACE, CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF,
    &MaximumSubLeaf, NULL, NULL, NULL
    );

  for (SubLeaf = CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF; SubLeaf <= MaximumSubLeaf; SubLeaf++) {
    AsmCpuidEx (
      CPUID_INTEL_PROCESSOR_TRACE, SubLeaf,
      &Eax.Uint32, &Ebx.Uint32, NULL, NULL
      );
  }
  @endcode
**/
#define CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF                0x01

/**
  CPUID Intel Processor Trace EAX for CPUID leaf #CPUID_INTEL_PROCESSOR_TRACE,
  sub-leaf #CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 2:0] Number of configurable Address Ranges for filtering.
    ///
    UINT32  ConfigurableAddressRanges:3;
    UINT32  Reserved:13;
    ///
    /// [Bits 31:16] Bitmap of supported MTC period encodings
    ///
    UINT32  MtcPeriodEncodings:16;

  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF_EAX;

/**
  CPUID Intel Processor Trace EBX for CPUID leaf #CPUID_INTEL_PROCESSOR_TRACE,
  sub-leaf #CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 15:0] Bitmap of supported Cycle Threshold value encodings.
    ///
    UINT32  CycleThresholdEncodings:16;
    ///
    /// [Bits 31:16] Bitmap of supported Configurable PSB frequency encodings.
    ///
    UINT32  PsbFrequencyEncodings:16;

  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF_EBX;


/**
  CPUID Time Stamp Counter and Nominal Core Crystal Clock Information

  @note
  If EBX[31:0] is 0, the TSC/"core crystal clock" ratio is not enumerated.
  EBX[31:0]/EAX[31:0] indicates the ratio of the TSC frequency and the core
  crystal clock frequency.
  If ECX is 0, the nominal core crystal clock frequency is not enumerated.
  "TSC frequency" = "core crystal clock frequency" * EBX/EAX.
  The core crystal clock may differ from the reference clock, bus clock, or core
  clock frequencies.

  @param   EAX  CPUID_TIME_STAMP_COUNTER (0x15)

  @retval  EAX  An unsigned integer which is the denominator of the
                TSC/"core crystal clock" ratio
  @retval  EBX  An unsigned integer which is the numerator of the
                TSC/"core crystal clock" ratio.
  @retval  ECX  An unsigned integer which is the nominal frequency
                of the core crystal clock in Hz.
  @retval  EDX  Reserved.

  <b>Example usage</b>
  @code
  UINT32  Eax;
  UINT32  Ebx;
  UINT32  Ecx;

  AsmCpuid (CPUID_TIME_STAMP_COUNTER, &Eax, &Ebx, &Ecx, NULL);
  @endcode
**/
#define CPUID_TIME_STAMP_COUNTER                            0x15


/**
  CPUID Processor Frequency Information

  @note
  Data is returned from this interface in accordance with the processor's
  specification and does not reflect actual values. Suitable use of this data
  includes the display of processor information in like manner to the processor
  brand string and for determining the appropriate range to use when displaying
  processor information e.g. frequency history graphs. The returned information
  should not be used for any other purpose as the returned information does not
  accurately correlate to information / counters returned by other processor
  interfaces.  While a processor may support the Processor Frequency Information
  leaf, fields that return a value of zero are not supported.

  @param   EAX  CPUID_TIME_STAMP_COUNTER (0x16)

  @retval  EAX  Returns processor base frequency information described by the
                type CPUID_PROCESSOR_FREQUENCY_EAX.
  @retval  EBX  Returns maximum frequency information described by the type
                CPUID_PROCESSOR_FREQUENCY_EBX.
  @retval  ECX  Returns bus frequency information described by the type
                CPUID_PROCESSOR_FREQUENCY_ECX.
  @retval  EDX  Reserved.

  <b>Example usage</b>
  @code
  CPUID_PROCESSOR_FREQUENCY_EAX  Eax;
  CPUID_PROCESSOR_FREQUENCY_EBX  Ebx;
  CPUID_PROCESSOR_FREQUENCY_ECX  Ecx;

  AsmCpuid (CPUID_PROCESSOR_FREQUENCY, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, NULL);
  @endcode
**/
#define CPUID_PROCESSOR_FREQUENCY                           0x16

/**
  CPUID Processor Frequency Information EAX for CPUID leaf
  #CPUID_PROCESSOR_FREQUENCY.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 15:0] Processor Base Frequency (in MHz).
    ///
    UINT32  ProcessorBaseFrequency:16;
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_PROCESSOR_FREQUENCY_EAX;

/**
  CPUID Processor Frequency Information EBX for CPUID leaf
  #CPUID_PROCESSOR_FREQUENCY.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 15:0] Maximum Frequency (in MHz).
    ///
    UINT32  MaximumFrequency:16;
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_PROCESSOR_FREQUENCY_EBX;

/**
  CPUID Processor Frequency Information ECX for CPUID leaf
  #CPUID_PROCESSOR_FREQUENCY.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 15:0] Bus (Reference) Frequency (in MHz).
    ///
    UINT32  BusFrequency:16;
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_PROCESSOR_FREQUENCY_ECX;


/**
  CPUID SoC Vendor Information

  @param   EAX  CPUID_SOC_VENDOR (0x17)
  @param   ECX  CPUID_SOC_VENDOR_MAIN_LEAF (0x00)
                CPUID_SOC_VENDOR_BRAND_STRING1 (0x01)
                CPUID_SOC_VENDOR_BRAND_STRING1 (0x02)
                CPUID_SOC_VENDOR_BRAND_STRING1 (0x03)

  @note
  Leaf 17H output depends on the initial value in ECX.  SOC Vendor Brand String
  is a UTF-8 encoded string padded with trailing bytes of 00H.  The complete SOC
  Vendor Brand String is constructed by concatenating in ascending order of
  EAX:EBX:ECX:EDX and from the sub-leaf 1 fragment towards sub-leaf 3.

**/
#define CPUID_SOC_VENDOR                                    0x17

/**
  CPUID SoC Vendor Information

  @param   EAX  CPUID_SOC_VENDOR (0x17)
  @param   ECX  CPUID_SOC_VENDOR_MAIN_LEAF (0x00)

  @retval  EAX  MaxSOCID_Index. Reports the maximum input value of supported
                sub-leaf in leaf 17H.
  @retval  EBX  Returns SoC Vendor information described by the type
                CPUID_SOC_VENDOR_MAIN_LEAF_EBX.
  @retval  ECX  Project ID. A unique number an SOC vendor assigns to its SOC
                projects.
  @retval  EDX  Stepping ID. A unique number within an SOC project that an SOC
                vendor assigns.

  <b>Example usage</b>
  @code
  UINT32                          Eax;
  CPUID_SOC_VENDOR_MAIN_LEAF_EBX  Ebx;
  UINT32                          Ecx;
  UINT32                          Edx;

  AsmCpuidEx (
    CPUID_SOC_VENDOR, CPUID_SOC_VENDOR_MAIN_LEAF,
    &Eax, &Ebx.Uint32, &Ecx, &Edx
    );
  @endcode
**/
#define CPUID_SOC_VENDOR_MAIN_LEAF                          0x00

/**
  CPUID SoC Vendor Information EBX for CPUID leaf #CPUID_SOC_VENDOR sub-leaf
  #CPUID_SOC_VENDOR_MAIN_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 15:0] SOC Vendor ID.
    ///
    UINT32  SocVendorId:16;
    ///
    /// [Bit 16] If 1, the SOC Vendor ID field is assigned via an industry
    /// standard enumeration scheme. Otherwise, the SOC Vendor ID field is
    /// assigned by Intel.
    ///
    UINT32  IsVendorScheme:1;
    UINT32  Reserved:15;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_SOC_VENDOR_MAIN_LEAF_EBX;

/**
  CPUID SoC Vendor Information

  @param   EAX  CPUID_SOC_VENDOR (0x17)
  @param   ECX  CPUID_SOC_VENDOR_BRAND_STRING1 (0x01)

  @retval  EAX  SOC Vendor Brand String. UTF-8 encoded string of type
                CPUID_SOC_VENDOR_BRAND_STRING_DATA.
  @retval  EBX  SOC Vendor Brand String. UTF-8 encoded string of type
                CPUID_SOC_VENDOR_BRAND_STRING_DATA.
  @retval  ECX  SOC Vendor Brand String. UTF-8 encoded string of type
                CPUID_SOC_VENDOR_BRAND_STRING_DATA.
  @retval  EDX  SOC Vendor Brand String. UTF-8 encoded string of type
                CPUID_SOC_VENDOR_BRAND_STRING_DATA.

  <b>Example usage</b>
  @code
  CPUID_SOC_VENDOR_BRAND_STRING_DATA  Eax;
  CPUID_SOC_VENDOR_BRAND_STRING_DATA  Ebx;
  CPUID_SOC_VENDOR_BRAND_STRING_DATA  Ecx;
  CPUID_SOC_VENDOR_BRAND_STRING_DATA  Edx;

  AsmCpuidEx (
    CPUID_SOC_VENDOR, CPUID_SOC_VENDOR_BRAND_STRING1,
    &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32
    );
  @endcode
**/
#define CPUID_SOC_VENDOR_BRAND_STRING1                      0x01

/**
  CPUID SoC Vendor Brand String for CPUID leafs #CPUID_SOC_VENDOR_BRAND_STRING1,
  #CPUID_SOC_VENDOR_BRAND_STRING2, and #CPUID_SOC_VENDOR_BRAND_STRING3.
**/
typedef union {
  ///
  /// 4 UTF-8 characters of Soc Vendor Brand String
  ///
  CHAR8   BrandString[4];
  ///
  /// All fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_SOC_VENDOR_BRAND_STRING_DATA;

/**
  CPUID SoC Vendor Information

  @param   EAX  CPUID_SOC_VENDOR (0x17)
  @param   ECX  CPUID_SOC_VENDOR_BRAND_STRING2 (0x02)

  @retval  EAX  SOC Vendor Brand String. UTF-8 encoded string of type
                CPUID_SOC_VENDOR_BRAND_STRING_DATA.
  @retval  EBX  SOC Vendor Brand String. UTF-8 encoded string of type
                CPUID_SOC_VENDOR_BRAND_STRING_DATA.
  @retval  ECX  SOC Vendor Brand String. UTF-8 encoded string of type
                CPUID_SOC_VENDOR_BRAND_STRING_DATA.
  @retval  EDX  SOC Vendor Brand String. UTF-8 encoded string of type
                CPUID_SOC_VENDOR_BRAND_STRING_DATA.

  <b>Example usage</b>
  @code
  CPUID_SOC_VENDOR_BRAND_STRING_DATA  Eax;
  CPUID_SOC_VENDOR_BRAND_STRING_DATA  Ebx;
  CPUID_SOC_VENDOR_BRAND_STRING_DATA  Ecx;
  CPUID_SOC_VENDOR_BRAND_STRING_DATA  Edx;

  AsmCpuidEx (
    CPUID_SOC_VENDOR, CPUID_SOC_VENDOR_BRAND_STRING2,
    &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32
    );
  @endcode
**/
#define CPUID_SOC_VENDOR_BRAND_STRING2                      0x02

/**
  CPUID SoC Vendor Information

  @param   EAX  CPUID_SOC_VENDOR (0x17)
  @param   ECX  CPUID_SOC_VENDOR_BRAND_STRING3 (0x03)

  @retval  EAX  SOC Vendor Brand String. UTF-8 encoded string of type
                CPUID_SOC_VENDOR_BRAND_STRING_DATA.
  @retval  EBX  SOC Vendor Brand String. UTF-8 encoded string of type
                CPUID_SOC_VENDOR_BRAND_STRING_DATA.
  @retval  ECX  SOC Vendor Brand String. UTF-8 encoded string of type
                CPUID_SOC_VENDOR_BRAND_STRING_DATA.
  @retval  EDX  SOC Vendor Brand String. UTF-8 encoded string of type
                CPUID_SOC_VENDOR_BRAND_STRING_DATA.

  <b>Example usage</b>
  @code
  CPUID_SOC_VENDOR_BRAND_STRING_DATA  Eax;
  CPUID_SOC_VENDOR_BRAND_STRING_DATA  Ebx;
  CPUID_SOC_VENDOR_BRAND_STRING_DATA  Ecx;
  CPUID_SOC_VENDOR_BRAND_STRING_DATA  Edx;

  AsmCpuidEx (
    CPUID_SOC_VENDOR, CPUID_SOC_VENDOR_BRAND_STRING3,
    &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32
    );
  @endcode
**/
#define CPUID_SOC_VENDOR_BRAND_STRING3                      0x03

/**
  CPUID Deterministic Address Translation Parameters

  @note
  Each sub-leaf enumerates a different address translation structure.
  If ECX contains an invalid sub-leaf index, EAX/EBX/ECX/EDX return 0. Sub-leaf
  index n is invalid if n exceeds the value that sub-leaf 0 returns in EAX. A
  sub-leaf index is also invalid if EDX[4:0] returns 0.
  Valid sub-leaves do not need to be contiguous or in any particular order. A
  valid sub-leaf may be in a higher input ECX value than an invalid sub-leaf or
  than a valid sub-leaf of a higher or lower-level structure.
  * Some unified TLBs will allow a single TLB entry to satisfy data read/write
  and instruction fetches. Others will require separate entries (e.g., one
  loaded on data read/write and another loaded on an instruction fetch).
  Please see the Intel 64 and IA-32 Architectures Optimization Reference Manual
  for details of a particular product.
  ** Add one to the return value to get the result.

  @param   EAX  CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS (0x18)
  @param   ECX  CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_MAIN_LEAF (0x00)
                CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_SUB_LEAF  (0x*)

**/
#define CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS             0x18

/**
  CPUID Deterministic Address Translation Parameters

  @param   EAX  CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS (0x18)
  @param   ECX  CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_MAIN_LEAF (0x00)

  @retval  EAX  Reports the maximum input value of supported sub-leaf in leaf 18H.
  @retval  EBX  Returns Deterministic Address Translation Parameters described by
                the type CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EBX.
  @retval  ECX  Number of Sets.
  @retval  EDX  Returns Deterministic Address Translation Parameters described by
                the type CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EDX.

  <b>Example usage</b>
  @code
  UINT32                                                  Eax;
  CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EBX  Ebx;
  UINT32                                                  Ecx;
  CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EDX  Edx;

  AsmCpuidEx (
    CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS,
    CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_MAIN_LEAF,
    &Eax, &Ebx.Uint32, &Ecx, &Edx.Uint32
    );
  @endcode
**/
#define CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_MAIN_LEAF   0x00

/**
  CPUID Deterministic Address Translation Parameters EBX for CPUID leafs.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 0] 4K page size entries supported by this structure.
    ///
    UINT32  Page4K:1;
    ///
    /// [Bits 1] 2MB page size entries supported by this structure.
    ///
    UINT32  Page2M:1;
    ///
    /// [Bits 2] 4MB page size entries supported by this structure.
    ///
    UINT32  Page4M:1;
    ///
    /// [Bits 3] 1 GB page size entries supported by this structure.
    ///
    UINT32  Page1G:1;
    ///
    /// [Bits 7:4] Reserved.
    ///
    UINT32  Reserved1:4;
    ///
    /// [Bits 10:8] Partitioning (0: Soft partitioning between the logical
    /// processors sharing this structure)
    ///
    UINT32  Partitioning:3;
    ///
    /// [Bits 15:11] Reserved.
    ///
    UINT32  Reserved2:5;
    ///
    /// [Bits 31:16] W = Ways of associativity.
    ///
    UINT32  Way:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EBX;

/**
  CPUID Deterministic Address Translation Parameters EDX for CPUID leafs.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 4:0] Translation cache type field.
    ///
    UINT32  TranslationCacheType:5;
    ///
    /// [Bits 7:5] Translation cache level (starts at 1).
    ///
    UINT32  TranslationCacheLevel:3;
    ///
    /// [Bits 8] Fully associative structure.
    ///
    UINT32  FullyAssociative:1;
    ///
    /// [Bits 13:9] Reserved.
    ///
    UINT32  Reserved1:5;
    ///
    /// [Bits 25:14] Maximum number of addressable IDs for logical
    /// processors sharing this translation cache.
    ///
    UINT32  MaximumNum:12;
    ///
    /// [Bits 31:26] Reserved.
    ///
    UINT32  Reserved2:6;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EDX;

///
/// @{ Define value for CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EDX.TranslationCacheType
///
#define   CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_TRANSLATION_CACHE_TYPE_INVALID          0x00
#define   CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_TRANSLATION_CACHE_TYPE_DATA_TLB         0x01
#define   CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_TRANSLATION_CACHE_TYPE_INSTRUCTION_TLB  0x02
#define   CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_TRANSLATION_CACHE_TYPE_UNIFIED_TLB      0x03
///
/// @}
///


/**
  CPUID Hybrid Information Enumeration Leaf

  @param   EAX  CPUID_HYBRID_INFORMATION (0x1A)
  @param   ECX  CPUID_HYBRID_INFORMATION_MAIN_LEAF (0x00).

  @retval  EAX  Enumerates the native model ID and core type described
                by the type CPUID_NATIVE_MODEL_ID_AND_CORE_TYPE_EAX
  @retval  EBX  Reserved.
  @retval  ECX  Reserved.
  @retval  EDX  Reserved.

  <b>Example usage</b>
  @code
  CPUID_NATIVE_MODEL_ID_AND_CORE_TYPE_EAX          Eax;

  AsmCpuidEx (
    CPUID_HYBRID_INFORMATION,
    CPUID_HYBRID_INFORMATION_MAIN_LEAF,
    &Eax, NULL, NULL, NULL
    );
  @endcode

**/
#define CPUID_HYBRID_INFORMATION                                       0x1A

///
/// CPUID Hybrid Information Enumeration main leaf
///
#define CPUID_HYBRID_INFORMATION_MAIN_LEAF                              0x00

/**
  CPUID Hybrid Information EAX for CPUID leaf #CPUID_HYBRID_INFORMATION,
  main leaf #CPUID_HYBRID_INFORMATION_MAIN_LEAF.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 23:0] Native model ID of the core.
    ///
    /// The core-type and native mode ID can be used to uniquely identify
    /// the microarchitecture of the core.This native model ID is not unique
    /// across core types, and not related to the model ID reported in CPUID
    /// leaf 01H, and does not identify the SOC.
    ///
    UINT32  NativeModelId:24;
    ///
    /// [Bit 31:24] Core type
    ///
    UINT32  CoreType:8;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_NATIVE_MODEL_ID_AND_CORE_TYPE_EAX;

///
/// @{ Define value for CPUID_NATIVE_MODEL_ID_AND_CORE_TYPE_EAX.CoreType
///
#define   CPUID_CORE_TYPE_INTEL_ATOM                                    0x20
#define   CPUID_CORE_TYPE_INTEL_CORE                                    0x40
///
/// @}
///


/**
  CPUID V2 Extended Topology Enumeration Leaf

  @note
  CPUID leaf 1FH is a preferred superset to leaf 0BH. Intel recommends first checking
  for the existence of Leaf 1FH and using this if available.
  Most of Leaf 1FH output depends on the initial value in ECX. The EDX output of leaf
  1FH is always valid and does not vary with input value in ECX. Output value in ECX[7:0]
  always equals input value in ECX[7:0]. Sub-leaf index 0 enumerates SMT level. Each
  subsequent higher sub-leaf index enumerates a higher-level topological entity in
  hierarchical order. For sub-leaves that return an invalid level-type of 0 in ECX[15:8];
  EAX and EBX will return 0. If an input value n in ECX returns the invalid level-type of
  0 in ECX[15:8], other input values with ECX > n also return 0 in ECX[15:8].

  Software should use this field (EAX[4:0]) to enumerate processor topology of the system.
  Software must not use EBX[15:0] to enumerate processor topology of the system. This value
  in this field (EBX[15:0]) is only intended for display/diagnostic purposes. The actual
  number of logical processors available to BIOS/OS/Applications may be different from the
  value of EBX[15:0], depending on software and platform hardware configurations.

  @param   EAX  CPUID_V2_EXTENDED_TOPOLOGY                        (0x1F)
  @param   ECX  Level number

**/
#define CPUID_V2_EXTENDED_TOPOLOGY                                     0x1F

///
/// @{ Define value for CPUID_EXTENDED_TOPOLOGY_ECX.LevelType
/// The value of the "level type" field is not related to level numbers in
/// any way, higher "level type" values do not mean higher levels.
///
#define   CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_TYPE_MODULE                  0x03
#define   CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_TYPE_TILE                    0x04
#define   CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_TYPE_DIE                     0x05
///
/// @}
///

/**
  CPUID Extended Function

  @param   EAX  CPUID_EXTENDED_FUNCTION (0x80000000)

  @retval  EAX  Maximum Input Value for Extended Function CPUID Information.
  @retval  EBX  Reserved.
  @retval  ECX  Reserved.
  @retval  EDX  Reserved.

  <b>Example usage</b>
  @code
  UINT32  Eax;

  AsmCpuid (CPUID_EXTENDED_FUNCTION, &Eax, NULL, NULL, NULL);
  @endcode
**/
#define CPUID_EXTENDED_FUNCTION                 0x80000000


/**
  CPUID Extended Processor Signature and Feature Bits

  @param   EAX  CPUID_EXTENDED_CPU_SIG (0x80000001)

  @retval  EAX  CPUID_EXTENDED_CPU_SIG.
  @retval  EBX  Reserved.
  @retval  ECX  Extended Processor Signature and Feature Bits information
                described by the type CPUID_EXTENDED_CPU_SIG_ECX.
  @retval  EDX  Extended Processor Signature and Feature Bits information
                described by the type CPUID_EXTENDED_CPU_SIG_EDX.

  <b>Example usage</b>
  @code
  UINT32                      Eax;
  CPUID_EXTENDED_CPU_SIG_ECX  Ecx;
  CPUID_EXTENDED_CPU_SIG_EDX  Edx;

  AsmCpuid (CPUID_EXTENDED_CPU_SIG, &Eax, NULL, &Ecx.Uint32, &Edx.Uint32);
  @endcode
**/
#define CPUID_EXTENDED_CPU_SIG                  0x80000001

/**
  CPUID Extended Processor Signature and Feature Bits ECX for CPUID leaf
  #CPUID_EXTENDED_CPU_SIG.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] LAHF/SAHF available in 64-bit mode.
    ///
    UINT32  LAHF_SAHF:1;
    UINT32  Reserved1:4;
    ///
    /// [Bit 5] LZCNT.
    ///
    UINT32  LZCNT:1;
    UINT32  Reserved2:2;
    ///
    /// [Bit 8] PREFETCHW.
    ///
    UINT32  PREFETCHW:1;
    UINT32  Reserved3:23;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_EXTENDED_CPU_SIG_ECX;

/**
  CPUID Extended Processor Signature and Feature Bits EDX for CPUID leaf
  #CPUID_EXTENDED_CPU_SIG.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    UINT32  Reserved1:11;
    ///
    /// [Bit 11] SYSCALL/SYSRET available in 64-bit mode.
    ///
    UINT32  SYSCALL_SYSRET:1;
    UINT32  Reserved2:8;
    ///
    /// [Bit 20] Execute Disable Bit available.
    ///
    UINT32  NX:1;
    UINT32  Reserved3:5;
    ///
    /// [Bit 26] 1-GByte pages are available if 1.
    ///
    UINT32  Page1GB:1;
    ///
    /// [Bit 27] RDTSCP and IA32_TSC_AUX are available if 1.
    ///
    UINT32  RDTSCP:1;
    UINT32  Reserved4:1;
    ///
    /// [Bit 29] Intel(R) 64 Architecture available if 1.
    ///
    UINT32  LM:1;
    UINT32  Reserved5:2;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_EXTENDED_CPU_SIG_EDX;


/**
  CPUID Processor Brand String

  @param   EAX  CPUID_BRAND_STRING1 (0x80000002)

  @retval  EAX  Processor Brand String in type CPUID_BRAND_STRING_DATA.
  @retval  EBX  Processor Brand String Continued in type CPUID_BRAND_STRING_DATA.
  @retval  ECX  Processor Brand String Continued in type CPUID_BRAND_STRING_DATA.
  @retval  EDX  Processor Brand String Continued in type CPUID_BRAND_STRING_DATA.

  <b>Example usage</b>
  @code
  CPUID_BRAND_STRING_DATA  Eax;
  CPUID_BRAND_STRING_DATA  Ebx;
  CPUID_BRAND_STRING_DATA  Ecx;
  CPUID_BRAND_STRING_DATA  Edx;

  AsmCpuid (CPUID_BRAND_STRING1, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32);
  @endcode
**/
#define CPUID_BRAND_STRING1                     0x80000002

/**
  CPUID Processor Brand String for CPUID leafs #CPUID_BRAND_STRING1,
  #CPUID_BRAND_STRING2, and #CPUID_BRAND_STRING3.
**/
typedef union {
  ///
  /// 4 ASCII characters of Processor Brand String
  ///
  CHAR8   BrandString[4];
  ///
  /// All fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_BRAND_STRING_DATA;

/**
  CPUID Processor Brand String

  @param   EAX  CPUID_BRAND_STRING2 (0x80000003)

  @retval  EAX  Processor Brand String Continued in type CPUID_BRAND_STRING_DATA.
  @retval  EBX  Processor Brand String Continued in type CPUID_BRAND_STRING_DATA.
  @retval  ECX  Processor Brand String Continued in type CPUID_BRAND_STRING_DATA.
  @retval  EDX  Processor Brand String Continued in type CPUID_BRAND_STRING_DATA.

  <b>Example usage</b>
  @code
  CPUID_BRAND_STRING_DATA  Eax;
  CPUID_BRAND_STRING_DATA  Ebx;
  CPUID_BRAND_STRING_DATA  Ecx;
  CPUID_BRAND_STRING_DATA  Edx;

  AsmCpuid (CPUID_BRAND_STRING2, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32);
  @endcode
**/
#define CPUID_BRAND_STRING2                     0x80000003

/**
  CPUID Processor Brand String

  @param   EAX  CPUID_BRAND_STRING3 (0x80000004)

  @retval  EAX  Processor Brand String Continued in type CPUID_BRAND_STRING_DATA.
  @retval  EBX  Processor Brand String Continued in type CPUID_BRAND_STRING_DATA.
  @retval  ECX  Processor Brand String Continued in type CPUID_BRAND_STRING_DATA.
  @retval  EDX  Processor Brand String Continued in type CPUID_BRAND_STRING_DATA.

  <b>Example usage</b>
  @code
  CPUID_BRAND_STRING_DATA  Eax;
  CPUID_BRAND_STRING_DATA  Ebx;
  CPUID_BRAND_STRING_DATA  Ecx;
  CPUID_BRAND_STRING_DATA  Edx;

  AsmCpuid (CPUID_BRAND_STRING3, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32);
  @endcode
**/
#define CPUID_BRAND_STRING3                     0x80000004


/**
  CPUID Extended Cache information

  @param   EAX  CPUID_EXTENDED_CACHE_INFO (0x80000006)

  @retval  EAX  Reserved.
  @retval  EBX  Reserved.
  @retval  ECX  Extended cache information described by the type
                CPUID_EXTENDED_CACHE_INFO_ECX.
  @retval  EDX  Reserved.

  <b>Example usage</b>
  @code
  CPUID_EXTENDED_CACHE_INFO_ECX  Ecx;

  AsmCpuid (CPUID_EXTENDED_CACHE_INFO, NULL, NULL, &Ecx.Uint32, NULL);
  @endcode
**/
#define CPUID_EXTENDED_CACHE_INFO               0x80000006

/**
  CPUID Extended Cache information ECX for CPUID leaf #CPUID_EXTENDED_CACHE_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 7:0] Cache line size in bytes.
    ///
    UINT32  CacheLineSize:8;
    UINT32  Reserved:4;
    ///
    /// [Bits 15:12] L2 Associativity field.  Supported values are in the range
    /// #CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_DISABLED to
    /// #CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_FULL
    ///
    UINT32  L2Associativity:4;
    ///
    /// [Bits 31:16] Cache size in 1K units.
    ///
    UINT32  CacheSize:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_EXTENDED_CACHE_INFO_ECX;

///
/// @{ Define value for bit field CPUID_EXTENDED_CACHE_INFO_ECX.L2Associativity
///
#define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_DISABLED       0x00
#define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_DIRECT_MAPPED  0x01
#define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_2_WAY          0x02
#define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_4_WAY          0x04
#define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_8_WAY          0x06
#define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_16_WAY         0x08
#define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_32_WAY         0x0A
#define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_48_WAY         0x0B
#define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_64_WAY         0x0C
#define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_96_WAY         0x0D
#define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_128_WAY        0x0E
#define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_FULL           0x0F
///
/// @}
///

/**
  CPUID Extended Time Stamp Counter information

  @param   EAX  CPUID_EXTENDED_TIME_STAMP_COUNTER (0x80000007)

  @retval  EAX  Reserved.
  @retval  EBX  Reserved.
  @retval  ECX  Reserved.
  @retval  EDX  Extended time stamp counter (TSC) information described by the
                type CPUID_EXTENDED_TIME_STAMP_COUNTER_EDX.

  <b>Example usage</b>
  @code
  CPUID_EXTENDED_TIME_STAMP_COUNTER_EDX  Edx;

  AsmCpuid (CPUID_EXTENDED_TIME_STAMP_COUNTER, NULL, NULL, NULL, &Edx.Uint32);
  @endcode
**/
#define CPUID_EXTENDED_TIME_STAMP_COUNTER       0x80000007

/**
  CPUID Extended Time Stamp Counter information EDX for CPUID leaf
  #CPUID_EXTENDED_TIME_STAMP_COUNTER.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    UINT32  Reserved1:8;
    ///
    /// [Bit 8] Invariant TSC available if 1.
    ///
    UINT32  InvariantTsc:1;
    UINT32  Reserved2:23;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_EXTENDED_TIME_STAMP_COUNTER_EDX;


/**
  CPUID Linear Physical Address Size

  @param   EAX  CPUID_VIR_PHY_ADDRESS_SIZE (0x80000008)

  @retval  EAX  Linear/Physical Address Size described by the type
                CPUID_VIR_PHY_ADDRESS_SIZE_EAX.
  @retval  EBX  Reserved.
  @retval  ECX  Reserved.
  @retval  EDX  Reserved.

  <b>Example usage</b>
  @code
  CPUID_VIR_PHY_ADDRESS_SIZE_EAX  Eax;

  AsmCpuid (CPUID_VIR_PHY_ADDRESS_SIZE, &Eax.Uint32, NULL, NULL, NULL);
  @endcode
**/
#define CPUID_VIR_PHY_ADDRESS_SIZE              0x80000008

/**
  CPUID Linear Physical Address Size EAX for CPUID leaf
  #CPUID_VIR_PHY_ADDRESS_SIZE.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 7:0] Number of physical address bits.
    ///
    /// @note
    /// If CPUID.80000008H:EAX[7:0] is supported, the maximum physical address
    /// number supported should come from this field.
    ///
    UINT32  PhysicalAddressBits:8;
    ///
    /// [Bits 15:8] Number of linear address bits.
    ///
    UINT32  LinearAddressBits:8;
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_VIR_PHY_ADDRESS_SIZE_EAX;

#endif
