\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
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
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
Status = AcpiTable->InstallAcpiTable (\r
AcpiTable,\r
&mTpm2AcpiTemplate,\r
- sizeof(mTpm2AcpiTemplate),\r
+ mTpm2AcpiTemplate.Header.Length,\r
&TableKey\r
);\r
ASSERT_EFI_ERROR (Status);\r