]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Application/Cpuid/Cpuid.c
UefiCpuPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / UefiCpuPkg / Application / Cpuid / Cpuid.c
index 2efad6840548b0d56e8eab88927b3175a0df30db..2f907034e61127873cdc25b8a0ce49d8e9ba3f64 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   UEFI Application to display CPUID leaf information.\r
 \r
-  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -153,6 +147,7 @@ CPUID_CACHE_INFO_DESCRIPTION  mCpuidCacheInfoDescription[] = {
   { 0xEC , "Cache"    , "3rd-level cache: 24MByte, 24-way set associative, 64 byte line size" },\r
   { 0xF0 , "Prefetch" , "64-Byte prefetching" },\r
   { 0xF1 , "Prefetch" , "128-Byte prefetching" },\r
+  { 0xFE , "General"  , "CPUID leaf 2 does not report TLB descriptor information; use CPUID leaf 18H to query TLB and other address translation parameters." },\r
   { 0xFF , "General"  , "CPUID leaf 2 does not report cache descriptor information, use CPUID leaf 4 to query cache parameters" }\r
 };\r
 \r
@@ -557,6 +552,12 @@ CpuidThermalPowerManagement (
   PRINT_BIT_FIELD (Eax, HWP_Energy_Performance_Preference);\r
   PRINT_BIT_FIELD (Eax, HWP_Package_Level_Request);\r
   PRINT_BIT_FIELD (Eax, HDC);\r
+  PRINT_BIT_FIELD (Eax, TurboBoostMaxTechnology30);\r
+  PRINT_BIT_FIELD (Eax, HWPCapabilities);\r
+  PRINT_BIT_FIELD (Eax, HWPPECIOverride);\r
+  PRINT_BIT_FIELD (Eax, FlexibleHWP);\r
+  PRINT_BIT_FIELD (Eax, FastAccessMode);\r
+  PRINT_BIT_FIELD (Eax, IgnoringIdleLogicalProcessorHWPRequest);\r
   PRINT_BIT_FIELD (Ebx, InterruptThresholds);\r
   PRINT_BIT_FIELD (Ecx, HardwareCoordinationFeedback);\r
   PRINT_BIT_FIELD (Ecx, PerformanceEnergyBias);\r
@@ -574,6 +575,7 @@ CpuidStructuredExtendedFeatureFlags (
   UINT32                                       Eax;\r
   CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX  Ebx;\r
   CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_ECX  Ecx;\r
+  CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EDX  Edx;\r
   UINT32                                       SubLeaf;\r
 \r
   if (CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS > gMaximumBasicFunction) {\r
@@ -589,11 +591,11 @@ CpuidStructuredExtendedFeatureFlags (
     AsmCpuidEx (\r
       CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS,\r
       SubLeaf,\r
-      NULL, &Ebx.Uint32, &Ecx.Uint32, NULL\r
+      NULL, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32\r
       );\r
-    if (Ebx.Uint32 != 0 || Ecx.Uint32 != 0) {\r
+    if (Ebx.Uint32 != 0 || Ecx.Uint32 != 0 || Edx.Uint32 != 0) {\r
       Print (L"CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS (Leaf %08x, Sub-Leaf %08x)\n", CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS, SubLeaf);\r
-      Print (L"  EAX:%08x  EBX:%08x  ECX:%08x  EDX:%08x\n", Eax, Ebx.Uint32, Ecx.Uint32, 0);\r
+      Print (L"  EAX:%08x  EBX:%08x  ECX:%08x  EDX:%08x\n", Eax, Ebx.Uint32, Ecx.Uint32, Edx.Uint32);\r
       PRINT_BIT_FIELD (Ebx, FSGSBASE);\r
       PRINT_BIT_FIELD (Ebx, IA32_TSC_ADJUST);\r
       PRINT_BIT_FIELD (Ebx, SGX);\r
@@ -610,20 +612,39 @@ CpuidStructuredExtendedFeatureFlags (
       PRINT_BIT_FIELD (Ebx, DeprecateFpuCsDs);\r
       PRINT_BIT_FIELD (Ebx, MPX);\r
       PRINT_BIT_FIELD (Ebx, RDT_A);\r
+      PRINT_BIT_FIELD (Ebx, AVX512F);\r
+      PRINT_BIT_FIELD (Ebx, AVX512DQ);\r
       PRINT_BIT_FIELD (Ebx, RDSEED);\r
       PRINT_BIT_FIELD (Ebx, ADX);\r
       PRINT_BIT_FIELD (Ebx, SMAP);\r
+      PRINT_BIT_FIELD (Ebx, AVX512_IFMA);\r
       PRINT_BIT_FIELD (Ebx, CLFLUSHOPT);\r
       PRINT_BIT_FIELD (Ebx, CLWB);\r
       PRINT_BIT_FIELD (Ebx, IntelProcessorTrace);\r
+      PRINT_BIT_FIELD (Ebx, AVX512PF);\r
+      PRINT_BIT_FIELD (Ebx, AVX512ER);\r
+      PRINT_BIT_FIELD (Ebx, AVX512CD);\r
       PRINT_BIT_FIELD (Ebx, SHA);\r
+      PRINT_BIT_FIELD (Ebx, AVX512BW);\r
+      PRINT_BIT_FIELD (Ebx, AVX512VL);\r
+\r
       PRINT_BIT_FIELD (Ecx, PREFETCHWT1);\r
+      PRINT_BIT_FIELD (Ecx, AVX512_VBMI);\r
       PRINT_BIT_FIELD (Ecx, UMIP);\r
       PRINT_BIT_FIELD (Ecx, PKU);\r
       PRINT_BIT_FIELD (Ecx, OSPKE);\r
+      PRINT_BIT_FIELD (Ecx, AVX512_VPOPCNTDQ);\r
       PRINT_BIT_FIELD (Ecx, MAWAU);\r
       PRINT_BIT_FIELD (Ecx, RDPID);\r
       PRINT_BIT_FIELD (Ecx, SGX_LC);\r
+\r
+      PRINT_BIT_FIELD (Edx, AVX512_4VNNIW);\r
+      PRINT_BIT_FIELD (Edx, AVX512_4FMAPS);\r
+      PRINT_BIT_FIELD (Edx, EnumeratesSupportForIBRSAndIBPB);\r
+      PRINT_BIT_FIELD (Edx, EnumeratesSupportForSTIBP);\r
+      PRINT_BIT_FIELD (Edx, EnumeratesSupportForL1D_FLUSH);\r
+      PRINT_BIT_FIELD (Edx, EnumeratesSupportForCapability);\r
+      PRINT_BIT_FIELD (Edx, EnumeratesSupportForSSBD);\r
     }\r
   }\r
 }\r
@@ -681,6 +702,7 @@ CpuidArchitecturalPerformanceMonitoring (
   PRINT_BIT_FIELD (Ebx, AllBranchMispredictRetired);\r
   PRINT_BIT_FIELD (Edx, FixedFunctionPerformanceCounters);\r
   PRINT_BIT_FIELD (Edx, FixedFunctionPerformanceCounterWidth);\r
+  PRINT_BIT_FIELD (Edx, AnyThreadDeprecation);\r
 }\r
 \r
 /**\r
@@ -689,7 +711,7 @@ CpuidArchitecturalPerformanceMonitoring (
 **/\r
 VOID\r
 CpuidExtendedTopology (\r
-  VOID\r
+  UINT32                       LeafFunction\r
   )\r
 {\r
   CPUID_EXTENDED_TOPOLOGY_EAX  Eax;\r
@@ -698,27 +720,34 @@ CpuidExtendedTopology (
   UINT32                       Edx;\r
   UINT32                       LevelNumber;\r
 \r
-  if (CPUID_EXTENDED_TOPOLOGY > gMaximumBasicFunction) {\r
+  if (LeafFunction > gMaximumBasicFunction) {\r
+    return;\r
+  }\r
+  if ((LeafFunction != CPUID_EXTENDED_TOPOLOGY) && (LeafFunction != CPUID_V2_EXTENDED_TOPOLOGY)) {\r
     return;\r
   }\r
 \r
   LevelNumber = 0;\r
-  do {\r
+  for (LevelNumber = 0; ; LevelNumber++) {\r
     AsmCpuidEx (\r
-      CPUID_EXTENDED_TOPOLOGY, LevelNumber,\r
+      LeafFunction, LevelNumber,\r
       &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx\r
       );\r
-    if (Eax.Bits.ApicIdShift != 0) {\r
-      Print (L"CPUID_EXTENDED_TOPOLOGY (Leaf %08x, Sub-Leaf %08x)\n", CPUID_EXTENDED_TOPOLOGY, LevelNumber);\r
-      Print (L"  EAX:%08x  EBX:%08x  ECX:%08x  EDX:%08x\n", Eax.Uint32, Ebx.Uint32, Ecx.Uint32, Edx);\r
-      PRINT_BIT_FIELD (Eax, ApicIdShift);\r
-      PRINT_BIT_FIELD (Ebx, LogicalProcessors);\r
-      PRINT_BIT_FIELD (Ecx, LevelNumber);\r
-      PRINT_BIT_FIELD (Ecx, LevelType);\r
-      PRINT_VALUE     (Edx, x2APIC_ID);\r
+    if (Ecx.Bits.LevelType == CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_INVALID) {\r
+      break;\r
     }\r
-    LevelNumber++;\r
-  } while (Eax.Bits.ApicIdShift != 0);\r
+    Print (\r
+      L"%a (Leaf %08x, Sub-Leaf %08x)\n",\r
+      LeafFunction == CPUID_EXTENDED_TOPOLOGY ? "CPUID_EXTENDED_TOPOLOGY" : "CPUID_V2_EXTENDED_TOPOLOGY",\r
+      LeafFunction, LevelNumber\r
+      );\r
+    Print (L"  EAX:%08x  EBX:%08x  ECX:%08x  EDX:%08x\n", Eax.Uint32, Ebx.Uint32, Ecx.Uint32, Edx);\r
+    PRINT_BIT_FIELD (Eax, ApicIdShift);\r
+    PRINT_BIT_FIELD (Ebx, LogicalProcessors);\r
+    PRINT_BIT_FIELD (Ecx, LevelNumber);\r
+    PRINT_BIT_FIELD (Ecx, LevelType);\r
+    PRINT_VALUE     (Edx, x2APIC_ID);\r
+  }\r
 }\r
 \r
 /**\r
@@ -747,6 +776,7 @@ CpuidExtendedStateSubLeaf (
   PRINT_BIT_FIELD (Eax, XSAVES);\r
   PRINT_VALUE     (Ebx, EnabledSaveStateSize_XCR0_IA32_XSS);\r
   PRINT_BIT_FIELD (Ecx, XCR0);\r
+  PRINT_BIT_FIELD (Ecx, HWPState);\r
   PRINT_BIT_FIELD (Ecx, PT);\r
   PRINT_BIT_FIELD (Ecx, XCR0_1);\r
   PRINT_VALUE     (Edx, IA32_XSS_Supported_32_63);\r
@@ -814,6 +844,7 @@ CpuidExtendedStateMainLeaf (
   PRINT_BIT_FIELD (Eax, AVX_512);\r
   PRINT_BIT_FIELD (Eax, IA32_XSS);\r
   PRINT_BIT_FIELD (Eax, PKRU);\r
+  PRINT_BIT_FIELD (Eax, IA32_XSS_2);\r
   PRINT_VALUE     (Ebx, EnabledSaveStateSize);\r
   PRINT_VALUE     (Ecx, SupportedSaveStateSize);\r
   PRINT_VALUE     (Edx, XCR0_Supported_32_63);\r
@@ -878,6 +909,33 @@ CpuidIntelRdtMonitoringL3CacheCapabilitySubLeaf (
   PRINT_BIT_FIELD (Edx, L3CacheLocalBandwidthMonitoring);\r
 }\r
 \r
+/**\r
+  Display CPUID_INTEL_RDT_ALLOCATION memory bandwidth allocation technology enumeration\r
+  sub-leaf.\r
+\r
+**/\r
+VOID\r
+CpuidIntelRdtAllocationMemoryBandwidthSubLeaf (\r
+  VOID\r
+  )\r
+{\r
+  CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EAX  Eax;\r
+  UINT32                                                    Ebx;\r
+  CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_ECX  Ecx;\r
+  CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EDX  Edx;\r
+\r
+  AsmCpuidEx (\r
+    CPUID_INTEL_RDT_ALLOCATION, CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF,\r
+    &Eax.Uint32, &Ebx, &Ecx.Uint32, &Edx.Uint32\r
+    );\r
+  Print (L"CPUID_INTEL_RDT_ALLOCATION (Leaf %08x, Sub-Leaf %08x)\n", CPUID_INTEL_RDT_ALLOCATION, CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF);\r
+  Print (L"  EAX:%08x  EBX:%08x  ECX:%08x  EDX:%08x\n", Eax.Uint32, Ebx, Ecx.Uint32, Edx.Uint32);\r
+  PRINT_BIT_FIELD (Eax, MaximumMBAThrottling);\r
+  PRINT_VALUE     (Ebx, AllocationUnitBitMap);\r
+  PRINT_BIT_FIELD (Ecx, Liner);\r
+  PRINT_BIT_FIELD (Edx, HighestCosNumber);\r
+}\r
+\r
 /**\r
   Display CPUID_INTEL_RDT_ALLOCATION L3 cache allocation technology enumeration\r
   sub-leaf.\r
@@ -901,7 +959,6 @@ CpuidIntelRdtAllocationL3CacheSubLeaf (
   Print (L"  EAX:%08x  EBX:%08x  ECX:%08x  EDX:%08x\n", Eax.Uint32, Ebx, Ecx.Uint32, Edx.Uint32);\r
   PRINT_BIT_FIELD (Eax, CapacityLength);\r
   PRINT_VALUE     (Ebx, AllocationUnitBitMap);\r
-  PRINT_BIT_FIELD (Ecx, CosUpdatesInfrequent);\r
   PRINT_BIT_FIELD (Ecx, CodeDataPrioritization);\r
   PRINT_BIT_FIELD (Edx, HighestCosNumber);\r
 }\r
@@ -954,7 +1011,8 @@ CpuidIntelRdtAllocationMainLeaf (
   Print (L"  EAX:%08x  EBX:%08x  ECX:%08x  EDX:%08x\n", 0, Ebx.Uint32, 0, 0);\r
   PRINT_BIT_FIELD (Ebx, L3CacheAllocation);\r
   PRINT_BIT_FIELD (Ebx, L2CacheAllocation);\r
-\r
+  PRINT_BIT_FIELD (Ebx, MemoryBandwidth);\r
+  CpuidIntelRdtAllocationMemoryBandwidthSubLeaf ();\r
   CpuidIntelRdtAllocationL3CacheSubLeaf ();\r
   CpuidIntelRdtAllocationL2CacheSubLeaf ();\r
 }\r
@@ -980,6 +1038,8 @@ CpuidEnumerationOfIntelSgxCapabilities0SubLeaf (
   Print (L"  EAX:%08x  EBX:%08x  ECX:%08x  EDX:%08x\n", Eax.Uint32, Ebx, 0, Edx.Uint32);\r
   PRINT_BIT_FIELD (Eax, SGX1);\r
   PRINT_BIT_FIELD (Eax, SGX2);\r
+  PRINT_BIT_FIELD (Eax, ENCLV);\r
+  PRINT_BIT_FIELD (Eax, ENCLS);\r
   PRINT_BIT_FIELD (Edx, MaxEnclaveSize_Not64);\r
   PRINT_BIT_FIELD (Edx, MaxEnclaveSize_64);\r
 }\r
@@ -1020,7 +1080,7 @@ CpuidEnumerationOfIntelSgxResourcesSubLeaf (
   CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_ECX  Ecx;\r
   CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EDX  Edx;\r
   UINT32                                               SubLeaf;\r
\r
+\r
   SubLeaf = CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF;\r
   do {\r
     AsmCpuidEx (\r
@@ -1068,7 +1128,7 @@ CpuidEnumerationOfIntelSgx (
     //\r
     return;\r
   }\r
-  \r
+\r
   CpuidEnumerationOfIntelSgxCapabilities0SubLeaf ();\r
   CpuidEnumerationOfIntelSgxCapabilities1SubLeaf ();\r
   CpuidEnumerationOfIntelSgxResourcesSubLeaf ();\r
@@ -1284,6 +1344,48 @@ CpuidSocVendor (
   CpuidSocVendorBrandString ();\r
 }\r
 \r
+/**\r
+  Display CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS main leaf and sub-leafs.\r
+\r
+**/\r
+VOID\r
+CpuidDeterministicAddressTranslationParameters (\r
+  VOID\r
+  )\r
+{\r
+  UINT32                                                  Eax;\r
+  CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EBX  Ebx;\r
+  UINT32                                                  Ecx;\r
+  CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EDX  Edx;\r
+\r
+  if (CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS > gMaximumBasicFunction) {\r
+    return;\r
+  }\r
+\r
+  AsmCpuidEx (\r
+    CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS,\r
+    CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_MAIN_LEAF,\r
+    &Eax, &Ebx.Uint32, &Ecx, &Edx.Uint32\r
+    );\r
+  Print (L"CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS (Leaf %08x, Sub-Leaf %08x)\n", CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS, CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_MAIN_LEAF);\r
+  Print (L"  EAX:%08x  EBX:%08x  ECX:%08x  EDX:%08x\n", Eax, Ebx.Uint32, Ecx, Edx.Uint32);\r
+\r
+  PRINT_VALUE     (Eax, MaxID_Index);\r
+  PRINT_BIT_FIELD (Ebx, Page4K);\r
+  PRINT_BIT_FIELD (Ebx, Page2M);\r
+  PRINT_BIT_FIELD (Ebx, Page4M);\r
+  PRINT_BIT_FIELD (Ebx, Page1G);\r
+  PRINT_BIT_FIELD (Ebx, Partitioning);\r
+  PRINT_BIT_FIELD (Ebx, Way);\r
+\r
+  PRINT_VALUE     (Ecx, NumberOfSets);\r
+\r
+  PRINT_BIT_FIELD (Edx, TranslationCacheType);\r
+  PRINT_BIT_FIELD (Edx, TranslationCacheLevel);\r
+  PRINT_BIT_FIELD (Edx, FullyAssociative);\r
+  PRINT_BIT_FIELD (Edx, MaximumNum);\r
+}\r
+\r
 /**\r
   Display CPUID_EXTENDED_FUNCTION leaf.\r
 \r
@@ -1485,7 +1587,7 @@ UefiMain (
   CpuidStructuredExtendedFeatureFlags ();\r
   CpuidDirectCacheAccessInfo();\r
   CpuidArchitecturalPerformanceMonitoring ();\r
-  CpuidExtendedTopology ();\r
+  CpuidExtendedTopology (CPUID_EXTENDED_TOPOLOGY);\r
   CpuidExtendedStateMainLeaf ();\r
   CpuidIntelRdtMonitoringEnumerationSubLeaf ();\r
   CpuidIntelRdtMonitoringL3CacheCapabilitySubLeaf ();\r
@@ -1495,6 +1597,8 @@ UefiMain (
   CpuidTimeStampCounter ();\r
   CpuidProcessorFrequency ();\r
   CpuidSocVendor ();\r
+  CpuidDeterministicAddressTranslationParameters ();\r
+  CpuidExtendedTopology (CPUID_V2_EXTENDED_TOPOLOGY);\r
   CpuidExtendedFunction ();\r
   CpuidExtendedCpuSig ();\r
   CpuidProcessorBrandString ();\r