]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c
SecurityPkg Tcg2ConfigDxe: Add setup option to configure PPI version
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Config / Tcg2ConfigDriver.c
index 881368345b82981c7b304ca2734ce232f1ff1659..ad7cd54e6cb0c7c49c740e5319065bf92aec5d35 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   The module entry point for Tcg2 configuration module.\r
 \r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials \r
 are licensed and made available under the terms and conditions of the BSD License \r
 which accompanies this distribution.  The full text of the license may be found at \r
@@ -60,6 +60,154 @@ UpdateDefaultPCRBanks (
   return ;\r
 }\r
 \r
+/**\r
+  Initialize TCG2 version information.\r
+\r
+  This function will initialize efi varstore configuration data for\r
+  TCG2_VERSION_NAME variable, check the value of related PCD with\r
+  the variable value and set string for the version state content\r
+  according to the PCD value.\r
+\r
+  @param[in] PrivateData    Points to TCG2 configuration private data.\r
+\r
+**/\r
+VOID\r
+InitializeTcg2VersionInfo (\r
+  IN TCG2_CONFIG_PRIVATE_DATA   *PrivateData\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  EFI_STRING                    ConfigRequestHdr;\r
+  BOOLEAN                       ActionFlag;\r
+  TCG2_VERSION                  Tcg2Version;\r
+  UINTN                         DataSize;\r
+  UINT64                        PcdTcg2PpiVersion;\r
+\r
+  //\r
+  // Get the PCD value before initializing efi varstore configuration data.\r
+  //\r
+  PcdTcg2PpiVersion = 0;\r
+  CopyMem (\r
+    &PcdTcg2PpiVersion,\r
+    PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer),\r
+    AsciiStrSize (PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer))\r
+    );\r
+\r
+  //\r
+  // Initialize efi varstore configuration data.\r
+  //\r
+  ZeroMem (&Tcg2Version, sizeof (Tcg2Version));\r
+  ConfigRequestHdr = HiiConstructConfigHdr (\r
+                       &gTcg2ConfigFormSetGuid,\r
+                       TCG2_VERSION_NAME,\r
+                       PrivateData->DriverHandle\r
+                       );\r
+  ASSERT (ConfigRequestHdr != NULL);\r
+  DataSize = sizeof (Tcg2Version);\r
+  Status = gRT->GetVariable (\r
+                  TCG2_VERSION_NAME,\r
+                  &gTcg2ConfigFormSetGuid,\r
+                  NULL,\r
+                  &DataSize,\r
+                  &Tcg2Version\r
+                  );\r
+  if (!EFI_ERROR (Status)) {\r
+    //\r
+    // EFI variable does exist and validate current setting.\r
+    //\r
+    ActionFlag = HiiValidateSettings (ConfigRequestHdr);\r
+    if (!ActionFlag) {\r
+      //\r
+      // Current configuration is invalid, reset to defaults.\r
+      //\r
+      ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
+      ASSERT (ActionFlag);\r
+      //\r
+      // Get the default values from variable.\r
+      //\r
+      DataSize = sizeof (Tcg2Version);\r
+      Status = gRT->GetVariable (\r
+                      TCG2_VERSION_NAME,\r
+                      &gTcg2ConfigFormSetGuid,\r
+                      NULL,\r
+                      &DataSize,\r
+                      &Tcg2Version\r
+                      );\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
+  } else {\r
+    //\r
+    // EFI variable doesn't exist.\r
+    //\r
+\r
+    //\r
+    // Store zero data Buffer Storage to EFI variable.\r
+    //\r
+    Status = gRT->SetVariable (\r
+                    TCG2_VERSION_NAME,\r
+                    &gTcg2ConfigFormSetGuid,\r
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                    sizeof (Tcg2Version),\r
+                    &Tcg2Version\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_VERSION_NAME\n"));\r
+      return;\r
+    } else {\r
+      //\r
+      // Build this variable based on default values stored in IFR.\r
+      //\r
+      ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
+      ASSERT (ActionFlag);\r
+      //\r
+      // Get the default values from variable.\r
+      //\r
+      DataSize = sizeof (Tcg2Version);\r
+      Status = gRT->GetVariable (\r
+                      TCG2_VERSION_NAME,\r
+                      &gTcg2ConfigFormSetGuid,\r
+                      NULL,\r
+                      &DataSize,\r
+                      &Tcg2Version\r
+                      );\r
+      ASSERT_EFI_ERROR (Status);\r
+      if (PcdTcg2PpiVersion != Tcg2Version.PpiVersion) {\r
+        DEBUG ((DEBUG_WARN, "WARNING: PcdTcgPhysicalPresenceInterfaceVer default value is not same with the default value in VFR\n"));\r
+        DEBUG ((DEBUG_WARN, "WARNING: The default value in VFR has be chosen\n"));\r
+      }\r
+    }\r
+  }\r
+  FreePool (ConfigRequestHdr);\r
+\r
+  //\r
+  // Get the PCD value again.\r
+  // If the PCD value is not equal to the value in variable,\r
+  // the PCD is not DynamicHii type and maps to the setup option.\r
+  //\r
+  PcdTcg2PpiVersion = 0;\r
+  CopyMem (\r
+    &PcdTcg2PpiVersion,\r
+    PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer),\r
+    AsciiStrSize (PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer))\r
+    );\r
+  if (PcdTcg2PpiVersion != Tcg2Version.PpiVersion) {\r
+    DEBUG ((DEBUG_WARN, "WARNING: PcdTcgPhysicalPresenceInterfaceVer is not DynamicHii type and maps to TCG2_VERSION.PpiVersion\n"));\r
+    DEBUG ((DEBUG_WARN, "WARNING: The TCG2 PPI version configuring from setup page will not work\n"));\r
+  }\r
+\r
+  switch (PcdTcg2PpiVersion) {\r
+    case TCG2_PPI_VERSION_1_2:\r
+      HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_PPI_VERSION_STATE_CONTENT), L"1.2", NULL);\r
+      break;\r
+    case TCG2_PPI_VERSION_1_3:\r
+      HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_PPI_VERSION_STATE_CONTENT), L"1.3", NULL);\r
+      break;\r
+    default:\r
+      ASSERT (FALSE);\r
+      break;\r
+  }\r
+}\r
+\r
 /**\r
   The entry point for Tcg2 configuration driver.\r
 \r
@@ -158,20 +306,6 @@ Tcg2ConfigDriverEntryPoint (
   PrivateData->PCRBanksDesired = CurrentActivePCRBanks;\r
   UpdateDefaultPCRBanks (Tcg2ConfigBin + sizeof(UINT32), ReadUnaligned32((UINT32 *)Tcg2ConfigBin) - sizeof(UINT32), CurrentActivePCRBanks);\r
 \r
-  //\r
-  // Save to variable so platform driver can get it.\r
-  //\r
-  Status = gRT->SetVariable (\r
-                  TCG2_STORAGE_NAME,\r
-                  &gTcg2ConfigFormSetGuid,\r
-                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-                  sizeof(Tcg2Configuration),\r
-                  &Tcg2Configuration\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_NAME\n"));\r
-  }\r
-\r
   //\r
   // Sync data from PCD to variable, so that we do not need detect again in S3 phase.\r
   //\r
@@ -184,6 +318,7 @@ Tcg2ConfigDriverEntryPoint (
   }\r
 \r
   PrivateData->TpmDeviceDetected = Tcg2DeviceDetection.TpmDeviceDetected;\r
+  Tcg2Configuration.TpmDevice = Tcg2DeviceDetection.TpmDeviceDetected;\r
 \r
   //\r
   // Save to variable so platform driver can get it.\r
@@ -207,6 +342,20 @@ Tcg2ConfigDriverEntryPoint (
     ASSERT_EFI_ERROR (Status);\r
   }\r
 \r
+  //\r
+  // Save to variable so platform driver can get it.\r
+  //\r
+  Status = gRT->SetVariable (\r
+                  TCG2_STORAGE_NAME,\r
+                  &gTcg2ConfigFormSetGuid,\r
+                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                  sizeof(Tcg2Configuration),\r
+                  &Tcg2Configuration\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_NAME\n"));\r
+  }\r
+\r
   //\r
   // We should lock Tcg2DeviceDetection, because it contains information needed at S3.\r
   //\r
@@ -228,6 +377,8 @@ Tcg2ConfigDriverEntryPoint (
     goto ErrorExit;\r
   }\r
 \r
+  InitializeTcg2VersionInfo (PrivateData);\r
+\r
   return EFI_SUCCESS;\r
 \r
 ErrorExit:\r