Reviewed-by: Michael Kinney <michael.d.kin...@intel.com>

> -----Original Message-----
> From: Fan, Jeff
> Sent: Sunday, March 27, 2016 6:59 PM
> To: edk2-devel@lists.01.org
> Cc: Kinney, Michael D <michael.d.kin...@intel.com>; Feng Tian 
> <feng.t...@intel.com>
> Subject: [Patch 1/2] UefiCpuPkg/Cpuid.h: Add CPUID defines and structures for 
> Intel SGX
> 
> Add Intel SGX Resource Enumeration Leaves as described by Section 37.7 in
> Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 3D,
> December 2015.
> 
> Cc: Michael Kinney <michael.d.kin...@intel.com>
> Cc: Feng Tian <feng.t...@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Jeff Fan <jeff....@intel.com>
> ---
>  UefiCpuPkg/Include/Register/Cpuid.h | 281 
> +++++++++++++++++++++++++++++++++++-
>  1 file changed, 280 insertions(+), 1 deletion(-)
> 
> diff --git a/UefiCpuPkg/Include/Register/Cpuid.h 
> b/UefiCpuPkg/Include/Register/Cpuid.h
> index 4a5bc73..eb24840 100644
> --- a/UefiCpuPkg/Include/Register/Cpuid.h
> +++ b/UefiCpuPkg/Include/Register/Cpuid.h
> @@ -1304,7 +1304,11 @@ typedef union {
>      /// [Bit 1] IA32_TSC_ADJUST MSR is supported if 1.
>      ///
>      UINT32  IA32_TSC_ADJUST:1;
> -    UINT32  Reserved1: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)
> @@ -2256,6 +2260,281 @@ typedef union {
> 
> 
>  /**
> +  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  Reserved:30;
> +  } 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)
> --
> 2.7.4.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to