]> 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 5ec2aca0953ff05c205d684d8425c68a35433bd5..1050c9b17b871841b2c359fc95c386d3f84f9a49 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   This driver measures SMBIOS table to TPM.\r
 \r
-Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>\r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -20,6 +20,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #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
@@ -108,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
@@ -460,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
@@ -569,11 +586,24 @@ 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