]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c
SecurityPkg: Tcg2Smm: TPM2 Vendor specific HID
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Smm / Tcg2Smm.c
index d02123dfa61fb282420675d7dd8533afc0a96a1c..2cedfde75329fc2dd0c7317868fb7ab92bf890e8 100644 (file)
@@ -302,6 +302,108 @@ UpdatePPVersion (
   return EFI_NOT_FOUND;\r
 }\r
 \r
+/**\r
+  Patch TPM2 device HID string.  The initial string tag in TPM2 ACPI table is "NNN0000".\r
+\r
+  @param[in, out] Table          The TPM2 SSDT ACPI table.\r
+\r
+  @return                               HID Update status.\r
+\r
+**/\r
+EFI_STATUS\r
+UpdateHID (\r
+  EFI_ACPI_DESCRIPTION_HEADER    *Table\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINT8       *DataPtr;\r
+  CHAR8       HID[TPM_HID_ACPI_SIZE];\r
+  UINT32      ManufacturerID;\r
+  UINT32      FirmwareVersion1;\r
+  UINT32      FirmwareVersion2;\r
+  BOOLEAN     PnpHID;\r
+\r
+  PnpHID = TRUE;\r
+\r
+  //\r
+  // Initialize HID with Default PNP string\r
+  //\r
+  ZeroMem(HID, TPM_HID_ACPI_SIZE);\r
+  CopyMem(HID, TPM_HID_TAG, TPM_HID_PNP_SIZE);\r
+\r
+  //\r
+  // Get Manufacturer ID\r
+  //\r
+  Status = Tpm2GetCapabilityManufactureID(&ManufacturerID);\r
+  if (!EFI_ERROR(Status)) {\r
+    DEBUG((EFI_D_INFO, "TPM_PT_MANUFACTURER 0x%08x\n", ManufacturerID));\r
+    //\r
+    // ManfacturerID defined in TCG Vendor ID Registry \r
+    // may tailed with 0x00 or 0x20\r
+    //\r
+    if ((ManufacturerID >> 24) == 0x00 || ((ManufacturerID >> 24) == 0x20)) {\r
+      //\r
+      //  HID containing PNP ID "NNN####"\r
+      //   NNN is uppercase letter for Vendor ID specified by manufacturer\r
+      //\r
+      CopyMem(HID, &ManufacturerID, 3);\r
+    } else {\r
+      //\r
+      //  HID containing ACP ID "NNNN####"\r
+      //   NNNN is uppercase letter for Vendor ID specified by manufacturer\r
+      //\r
+      CopyMem(HID, &ManufacturerID, 4);\r
+      PnpHID = FALSE;\r
+    }\r
+  } else {\r
+    DEBUG ((EFI_D_ERROR, "Get TPM_PT_MANUFACTURER failed %x!\n", Status));\r
+    ASSERT(FALSE);\r
+    return Status;\r
+  }\r
+\r
+  Status = Tpm2GetCapabilityFirmwareVersion(&FirmwareVersion1, &FirmwareVersion2);\r
+  if (!EFI_ERROR(Status)) {\r
+    DEBUG((EFI_D_INFO, "TPM_PT_FIRMWARE_VERSION_1 0x%x\n", FirmwareVersion1));\r
+    DEBUG((EFI_D_INFO, "TPM_PT_FIRMWARE_VERSION_2 0x%x\n", FirmwareVersion2));\r
+    //\r
+    //   #### is Firmware Version 1\r
+    //\r
+    if (PnpHID) {\r
+      AsciiSPrint(HID + 3, TPM_HID_PNP_SIZE - 3, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 && 0x0000FFFF));\r
+    } else {\r
+      AsciiSPrint(HID + 4, TPM_HID_ACPI_SIZE - 4, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 && 0x0000FFFF));\r
+    }\r
+    \r
+  } else {\r
+    DEBUG ((EFI_D_ERROR, "Get TPM_PT_FIRMWARE_VERSION_X failed %x!\n", Status));\r
+    ASSERT(FALSE);\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Patch HID in ASL code before loading the SSDT.\r
+  //\r
+  for (DataPtr  = (UINT8 *)(Table + 1);\r
+       DataPtr <= (UINT8 *) ((UINT8 *) Table + Table->Length - TPM_HID_PNP_SIZE);\r
+       DataPtr += 1) {\r
+    if (AsciiStrCmp((CHAR8 *)DataPtr,  TPM_HID_TAG) == 0) {\r
+      if (PnpHID) {\r
+        CopyMem(DataPtr, HID, TPM_HID_PNP_SIZE);\r
+      } else {\r
+        //\r
+        // NOOP will be patched to '\0'\r
+        //\r
+        CopyMem(DataPtr, HID, TPM_HID_ACPI_SIZE);\r
+      }\r
+      DEBUG((EFI_D_INFO, "TPM2 ACPI _HID updated to %a\n", HID));\r
+      return Status;\r
+    }\r
+  }\r
+\r
+  DEBUG((EFI_D_ERROR, "TPM2 ACPI HID TAG for patch not found!\n"));\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
 /**\r
   Initialize and publish TPM items in ACPI table.\r
 \r
@@ -335,6 +437,14 @@ PublishAcpiTable (
   Status = UpdatePPVersion(Table, (CHAR8 *)PcdGetPtr(PcdTcgPhysicalPresenceInterfaceVer));\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  //\r
+  // Update TPM2 HID before measuring it to PCR\r
+  //\r
+  Status = UpdateHID(Table);\r
+  if (EFI_ERROR(Status)) {\r
+    return Status;\r
+  }\r
+\r
   //\r
   // Measure to PCR[0] with event EV_POST_CODE ACPI DATA\r
   //\r