]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.c
MdeModulePkg/Smbios: Add TCG PFP rev 105 support.
[mirror_edk2.git] / MdeModulePkg / Universal / SmbiosMeasurementDxe / SmbiosMeasurementDxe.c
index 5aafabfcedaf521455bef683ec1b3641e806adb4..1050c9b17b871841b2c359fc95c386d3f84f9a49 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   This driver measures SMBIOS table to TPM.\r
 \r
-Copyright (c) 2015, 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) 2015 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -26,6 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/PcdLib.h>\r
 #include <Library/TpmMeasurementLib.h>\r
 \r
 #define FIELD_SIZE_OF(TYPE, Field) ((UINTN)sizeof(((TYPE *)0)->Field))\r
@@ -70,6 +65,7 @@ SMBIOS_FILTER_TABLE  mSmbiosFilterType4BlackList[] = {
   {0x04, OFFSET_OF(SMBIOS_TABLE_TYPE4, CoreCount2),           FIELD_SIZE_OF(SMBIOS_TABLE_TYPE4, CoreCount2),           0},\r
   {0x04, OFFSET_OF(SMBIOS_TABLE_TYPE4, EnabledCoreCount2),    FIELD_SIZE_OF(SMBIOS_TABLE_TYPE4, EnabledCoreCount2),    0},\r
   {0x04, OFFSET_OF(SMBIOS_TABLE_TYPE4, ThreadCount2),         FIELD_SIZE_OF(SMBIOS_TABLE_TYPE4, ThreadCount2),         0},\r
+  {0x04, OFFSET_OF(SMBIOS_TABLE_TYPE4, Voltage),              FIELD_SIZE_OF(SMBIOS_TABLE_TYPE4, Voltage),              0},\r
 };\r
 SMBIOS_FILTER_TABLE  mSmbiosFilterType17BlackList[] = {\r
   {0x11, OFFSET_OF(SMBIOS_TABLE_TYPE17, SerialNumber),        FIELD_SIZE_OF(SMBIOS_TABLE_TYPE17, SerialNumber),        SMBIOS_FILTER_TABLE_FLAG_IS_STRING},\r
@@ -84,6 +80,9 @@ SMBIOS_FILTER_TABLE  mSmbiosFilterType22BlackList[] = {
 SMBIOS_FILTER_TABLE  mSmbiosFilterType23BlackList[] = {\r
   {0x17, OFFSET_OF(SMBIOS_TABLE_TYPE23, ResetCount),          FIELD_SIZE_OF(SMBIOS_TABLE_TYPE23, ResetCount),          0},\r
 };\r
+SMBIOS_FILTER_TABLE  mSmbiosFilterType27BlackList[] = {\r
+  {0x1B, OFFSET_OF(SMBIOS_TABLE_TYPE27, NominalSpeed),        FIELD_SIZE_OF(SMBIOS_TABLE_TYPE27, NominalSpeed),        0},\r
+};\r
 SMBIOS_FILTER_TABLE  mSmbiosFilterType39BlackList[] = {\r
   {0x27, OFFSET_OF(SMBIOS_TABLE_TYPE39, SerialNumber),        FIELD_SIZE_OF(SMBIOS_TABLE_TYPE39, SerialNumber),        SMBIOS_FILTER_TABLE_FLAG_IS_STRING},\r
   {0x27, OFFSET_OF(SMBIOS_TABLE_TYPE39, AssetTagNumber),      FIELD_SIZE_OF(SMBIOS_TABLE_TYPE39, AssetTagNumber),      SMBIOS_FILTER_TABLE_FLAG_IS_STRING},\r
@@ -101,6 +100,7 @@ SMBIOS_FILTER_STRUCT  mSmbiosFilterStandardTableBlackList[] = {
   {0x12, NULL, 0},\r
   {0x16, mSmbiosFilterType22BlackList, sizeof(mSmbiosFilterType22BlackList)/sizeof(mSmbiosFilterType22BlackList[0])},\r
   {0x17, mSmbiosFilterType23BlackList, sizeof(mSmbiosFilterType23BlackList)/sizeof(mSmbiosFilterType23BlackList[0])},\r
+  {0x1B, mSmbiosFilterType27BlackList, sizeof(mSmbiosFilterType27BlackList)/sizeof(mSmbiosFilterType27BlackList[0])},\r
   {0x1F, NULL, 0},\r
   {0x21, NULL, 0},\r
   {0x27, mSmbiosFilterType39BlackList, sizeof(mSmbiosFilterType39BlackList)/sizeof(mSmbiosFilterType39BlackList[0])},\r
@@ -109,6 +109,18 @@ SMBIOS_FILTER_STRUCT  mSmbiosFilterStandardTableBlackList[] = {
 EFI_SMBIOS_PROTOCOL *mSmbios;\r
 UINTN               mMaxLen;\r
 \r
+#pragma pack (1)\r
+\r
+#define SMBIOS_HANDOFF_TABLE_DESC  "SmbiosTable"\r
+typedef struct {\r
+  UINT8                             TableDescriptionSize;\r
+  UINT8                             TableDescription[sizeof(SMBIOS_HANDOFF_TABLE_DESC)];\r
+  UINT64                            NumberOfTables;\r
+  EFI_CONFIGURATION_TABLE           TableEntry[1];\r
+} SMBIOS_HANDOFF_TABLE_POINTERS2;\r
+\r
+#pragma pack ()\r
+\r
 /**\r
 \r
   This function dump raw data.\r
@@ -273,25 +285,39 @@ FilterSmbiosEntry (
   DEBUG ((EFI_D_INFO, "Smbios Table (Type - %d):\n", ((SMBIOS_STRUCTURE *)TableEntry)->Type));\r
   DEBUG_CODE (InternalDumpHex (TableEntry, TableEntrySize););\r
 \r
-  FilterStruct = GetFilterStructByType (((SMBIOS_STRUCTURE *)TableEntry)->Type);\r
-  if (FilterStruct != NULL) {\r
-    if (FilterStruct->Filter == NULL || FilterStruct->FilterCount == 0) {\r
-      // zero all table entries, except header\r
-      ZeroMem ((UINT8 *)TableEntry + sizeof(SMBIOS_STRUCTURE), TableEntrySize - sizeof(SMBIOS_STRUCTURE));\r
-    } else {\r
-      Filter = FilterStruct->Filter;\r
-      for (Index = 0; Index < FilterStruct->FilterCount; Index++) {\r
-        if ((Filter[Index].Flags & SMBIOS_FILTER_TABLE_FLAG_IS_STRING) != 0) {\r
-          CopyMem (&StringId, (UINT8 *)TableEntry + Filter[Index].Offset, sizeof(StringId));\r
-          if (StringId != 0) {\r
-            // set ' ' for string field\r
-            String = GetSmbiosStringById (TableEntry, StringId, &StringLen);\r
-            //DEBUG ((EFI_D_INFO,"StrId(0x%x)-%a(%d)\n", StringId, String, StringLen));\r
-            SetMem (String, StringLen, ' ');\r
+  //\r
+  // Skip measurement for OEM types.\r
+  //\r
+  if (((SMBIOS_STRUCTURE *)TableEntry)->Type >= SMBIOS_OEM_BEGIN) {\r
+    // zero all table fields, except header\r
+    ZeroMem ((UINT8 *)TableEntry + sizeof(SMBIOS_STRUCTURE), TableEntrySize - sizeof(SMBIOS_STRUCTURE));\r
+  } else {\r
+    FilterStruct = GetFilterStructByType (((SMBIOS_STRUCTURE *)TableEntry)->Type);\r
+    if (FilterStruct != NULL) {\r
+      if (FilterStruct->Filter == NULL || FilterStruct->FilterCount == 0) {\r
+        // zero all table fields, except header\r
+        ZeroMem ((UINT8 *)TableEntry + sizeof(SMBIOS_STRUCTURE), TableEntrySize - sizeof(SMBIOS_STRUCTURE));\r
+      } else {\r
+        Filter = FilterStruct->Filter;\r
+        for (Index = 0; Index < FilterStruct->FilterCount; Index++) {\r
+          if (((SMBIOS_STRUCTURE *) TableEntry)->Length >= (Filter[Index].Offset + Filter[Index].Size)) {\r
+            //\r
+            // The field is present in the SMBIOS entry.\r
+            //\r
+            if ((Filter[Index].Flags & SMBIOS_FILTER_TABLE_FLAG_IS_STRING) != 0) {\r
+              CopyMem (&StringId, (UINT8 *)TableEntry + Filter[Index].Offset, sizeof(StringId));\r
+              if (StringId != 0) {\r
+                // set ' ' for string field\r
+                String = GetSmbiosStringById (TableEntry, StringId, &StringLen);\r
+                ASSERT (String != NULL);\r
+                //DEBUG ((EFI_D_INFO,"StrId(0x%x)-%a(%d)\n", StringId, String, StringLen));\r
+                SetMem (String, StringLen, ' ');\r
+              }\r
+            }\r
+            // zero non-string field\r
+            ZeroMem ((UINT8 *)TableEntry + Filter[Index].Offset, Filter[Index].Size);\r
           }\r
         }\r
-        // zero non-string field\r
-        ZeroMem ((UINT8 *)TableEntry + Filter[Index].Offset, Filter[Index].Size);\r
       }\r
     }\r
   }\r
@@ -447,6 +473,10 @@ MeasureSmbiosTable (
 {\r
   EFI_STATUS                        Status;\r
   EFI_HANDOFF_TABLE_POINTERS        HandoffTables;\r
+  SMBIOS_HANDOFF_TABLE_POINTERS2    SmbiosHandoffTables2;\r
+  UINT32                            EventType;\r
+  VOID                              *EventLog;\r
+  UINT32                            EventLogSize;\r
   SMBIOS_TABLE_ENTRY_POINT          *SmbiosTable;\r
   SMBIOS_TABLE_3_0_ENTRY_POINT      *Smbios3Table;\r
   VOID                              *SmbiosTableAddress;\r
@@ -556,16 +586,29 @@ MeasureSmbiosTable (
       CopyGuid (&(HandoffTables.TableEntry[0].VendorGuid), &gEfiSmbiosTableGuid);\r
       HandoffTables.TableEntry[0].VendorTable = SmbiosTable;\r
     }\r
+    EventType = EV_EFI_HANDOFF_TABLES;\r
+    EventLog = &HandoffTables;\r
+    EventLogSize = sizeof (HandoffTables);\r
+\r
+    if (PcdGet32(PcdTcgPfpMeasurementRevision) >= TCG_EfiSpecIDEventStruct_SPEC_ERRATA_TPM2_REV_105) {\r
+      SmbiosHandoffTables2.TableDescriptionSize = sizeof(SmbiosHandoffTables2.TableDescription);\r
+      CopyMem (SmbiosHandoffTables2.TableDescription, SMBIOS_HANDOFF_TABLE_DESC, sizeof(SmbiosHandoffTables2.TableDescription));\r
+      SmbiosHandoffTables2.NumberOfTables = HandoffTables.NumberOfTables;\r
+      CopyMem (&(SmbiosHandoffTables2.TableEntry[0]), &(HandoffTables.TableEntry[0]), sizeof(SmbiosHandoffTables2.TableEntry[0]));\r
+      EventType = EV_EFI_HANDOFF_TABLES2;\r
+      EventLog = &SmbiosHandoffTables2;\r
+      EventLogSize = sizeof (SmbiosHandoffTables2);\r
+    }\r
     Status = TpmMeasureAndLogData (\r
                1,                       // PCRIndex\r
-               EV_EFI_HANDOFF_TABLES,   // EventType\r
-               &HandoffTables,          // EventLog\r
-               sizeof (HandoffTables),  // LogLen\r
+               EventType,               // EventType\r
+               EventLog,                // EventLog\r
+               EventLogSize,            // LogLen\r
                TableAddress,            // HashData\r
                TableLength              // HashDataLen\r
                );\r
-    if (EFI_ERROR (Status)) {\r
-      return ;\r
+    if (!EFI_ERROR (Status)) {\r
+      gBS->CloseEvent (Event) ;\r
     }\r
   }\r
 \r