]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c
SecurityPkg/Tcg2: Add Support Laml, Lasa for TPM2 ACPI.
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Smm / Tcg2Smm.c
index a2d71741f2e52efc08330635e4216d8e0513a0f3..14e4ed0ee1e0e3d4f2b277e519174e906b4cb0c0 100644 (file)
@@ -16,8 +16,24 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 \r
 #include "Tcg2Smm.h"\r
 \r
+#pragma pack(1)\r
 \r
-EFI_TPM2_ACPI_TABLE  mTpm2AcpiTemplate = {\r
+typedef struct {\r
+  EFI_ACPI_DESCRIPTION_HEADER Header;\r
+  // Flags field is replaced in version 4 and above\r
+  //    BIT0~15:  PlatformClass      This field is only valid for version 4 and above\r
+  //    BIT16~31: Reserved\r
+  UINT32                      Flags;\r
+  UINT64                      AddressOfControlArea;\r
+  UINT32                      StartMethod;\r
+  UINT8                       PlatformSpecificParameters[12];  // size up to 12\r
+  UINT32                      Laml;                          // Optional\r
+  UINT64                      Lasa;                          // Optional\r
+} EFI_TPM2_ACPI_TABLE_V4;\r
+\r
+#pragma pack()\r
+\r
+EFI_TPM2_ACPI_TABLE_V4  mTpm2AcpiTemplate = {\r
   {\r
     EFI_ACPI_5_0_TRUSTED_COMPUTING_PLATFORM_2_TABLE_SIGNATURE,\r
     sizeof (mTpm2AcpiTemplate),\r
@@ -748,6 +764,16 @@ PublishTpm2 (
     DEBUG((DEBUG_INFO, "Tpm2 ACPI table PlatformClass is %d\n", (mTpm2AcpiTemplate.Flags & 0x0000FFFF)));\r
   }\r
 \r
+  mTpm2AcpiTemplate.Laml = PcdGet32(PcdTpm2AcpiTableLaml);\r
+  mTpm2AcpiTemplate.Lasa = PcdGet64(PcdTpm2AcpiTableLasa);\r
+  if ((mTpm2AcpiTemplate.Header.Revision < EFI_TPM2_ACPI_TABLE_REVISION_4) ||\r
+      (mTpm2AcpiTemplate.Laml == 0) || (mTpm2AcpiTemplate.Lasa == 0)) {\r
+    //\r
+    // If version is smaller than 4 or Laml/Lasa is not valid, rollback to original Length.\r
+    //\r
+    mTpm2AcpiTemplate.Header.Length = sizeof(EFI_TPM2_ACPI_TABLE);\r
+  }\r
+\r
   //\r
   // Measure to PCR[0] with event EV_POST_CODE ACPI DATA\r
   //\r
@@ -757,7 +783,7 @@ PublishTpm2 (
     EV_POSTCODE_INFO_ACPI_DATA,\r
     ACPI_DATA_LEN,\r
     &mTpm2AcpiTemplate,\r
-    sizeof(mTpm2AcpiTemplate)\r
+    mTpm2AcpiTemplate.Header.Length\r
     );\r
 \r
   InterfaceType = PcdGet8(PcdActiveTpmInterfaceType);\r
@@ -795,7 +821,7 @@ PublishTpm2 (
   Status = AcpiTable->InstallAcpiTable (\r
                         AcpiTable,\r
                         &mTpm2AcpiTemplate,\r
-                        sizeof(mTpm2AcpiTemplate),\r
+                        mTpm2AcpiTemplate.Header.Length,\r
                         &TableKey\r
                         );\r
   ASSERT_EFI_ERROR (Status);\r