]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c
SecurityPkg: Tcg2Smm: Fix type casting issue
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Smm / Tcg2Smm.c
index dab1f532cc9a68b9d77d32dc2c49cbded6171f42..19d9b489fe522e17bc537469372acf52b9f9ae9c 100644 (file)
@@ -50,18 +50,27 @@ GetPtpInterface (
   InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
   InterfaceCapability.Uint32 = MmioRead32 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->InterfaceCapability);\r
 \r
+  if (InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_TIS) {\r
+    return PtpInterfaceTis;\r
+  }\r
+\r
   if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) &&\r
       (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB) &&\r
       (InterfaceId.Bits.CapCRB != 0)) {\r
     return PtpInterfaceCrb;\r
   }\r
+\r
   if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO) &&\r
       (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_FIFO) &&\r
       (InterfaceId.Bits.CapFIFO != 0) &&\r
       (InterfaceCapability.Bits.InterfaceVersion == INTERFACE_CAPABILITY_INTERFACE_VERSION_PTP)) {\r
     return PtpInterfaceFifo;\r
   }\r
-  return PtpInterfaceTis;\r
+\r
+  //\r
+  // No Ptp interface available\r
+  //\r
+  return PtpInterfaceMax;\r
 }\r
 \r
 EFI_TPM2_ACPI_TABLE  mTpm2AcpiTemplate = {\r
@@ -250,6 +259,41 @@ AssignOpRegion (
   return (VOID *) (UINTN) MemoryAddress;\r
 }\r
 \r
+/**\r
+  Patch version string of Physical Presence interface supported by platform. The initial string tag in TPM \r
+ACPI table is "$PV".\r
+\r
+  @param[in, out] Table          The TPM item in ACPI table.\r
+  @param[in]      PPVer          Version string of Physical Presence interface supported by platform.\r
+\r
+  @return                        The allocated address for the found region.\r
+\r
+**/\r
+EFI_STATUS\r
+UpdatePPVersion (\r
+  EFI_ACPI_DESCRIPTION_HEADER    *Table,\r
+  CHAR8                          *PPVer\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINT8       *DataPtr;\r
+\r
+  //\r
+  // Patch some pointers for the ASL code before loading the SSDT.\r
+  //\r
+  for (DataPtr  = (UINT8 *)(Table + 1);\r
+       DataPtr <= (UINT8 *) ((UINT8 *) Table + Table->Length - PHYSICAL_PRESENCE_VERSION_SIZE);\r
+       DataPtr += 1) {\r
+    if (AsciiStrCmp((CHAR8 *)DataPtr,  PHYSICAL_PRESENCE_VERSION_TAG) == 0) {\r
+      Status = AsciiStrCpyS((CHAR8 *)DataPtr, PHYSICAL_PRESENCE_VERSION_SIZE, PPVer);\r
+      DEBUG((EFI_D_INFO, "TPM2 Physical Presence Interface Version update status 0x%x\n", Status));\r
+      return Status;\r
+    }\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
 /**\r
   Initialize and publish TPM items in ACPI table.\r
 \r
@@ -277,6 +321,11 @@ PublishAcpiTable (
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  //\r
+  // Update Table version before measuring it to PCR\r
+  //\r
+  Status = UpdatePPVersion(Table, (CHAR8 *)PcdGetPtr(PcdTcgPhysicalPresenceInterfaceVer));\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
   // Measure to PCR[0] with event EV_POST_CODE ACPI DATA\r
@@ -297,7 +346,7 @@ PublishAcpiTable (
   ASSERT (mTcgNvs != NULL);\r
 \r
   //\r
-  // Publish the TPM ACPI table\r
+  // Publish the TPM ACPI table. Table is re-checksumed.\r
   //\r
   Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **) &AcpiTable);\r
   ASSERT_EFI_ERROR (Status);\r
@@ -360,6 +409,7 @@ PublishTpm2 (
   case PtpInterfaceTis:\r
     break;\r
   default:\r
+    DEBUG((EFI_D_ERROR, "TPM2 InterfaceType get error! %d\n", InterfaceType));\r
     break;\r
   }\r
 \r