]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/TrEEConfig/TrEEConfigDriver.c
SecurityPkg: Use PcdSet##S to instead of PcdSet##
[mirror_edk2.git] / SecurityPkg / Tcg / TrEEConfig / TrEEConfigDriver.c
index 74b5e7ee25e66668a56661ccf88a38f4dd19d2f5..2ad02c05a6956b82c65e32fb42dd8c617eee90ed 100644 (file)
@@ -38,8 +38,10 @@ TrEEConfigDriverEntryPoint (
   EFI_STATUS                    Status;\r
   TREE_CONFIG_PRIVATE_DATA      *PrivateData;\r
   TREE_CONFIGURATION            TrEEConfiguration;\r
+  TREE_DEVICE_DETECTION         TrEEDeviceDetection;\r
   UINTN                         Index;\r
   UINTN                         DataSize;\r
+  EDKII_VARIABLE_LOCK_PROTOCOL  *VariableLockProtocol;\r
 \r
   Status = gBS->OpenProtocol (\r
                   ImageHandle,\r
@@ -79,37 +81,80 @@ TrEEConfigDriverEntryPoint (
                   &TrEEConfiguration\r
                   );\r
   if (EFI_ERROR (Status)) {\r
+    //\r
+    // Variable not ready, set default value\r
+    //\r
+    TrEEConfiguration.TpmDevice           = TPM_DEVICE_DEFAULT;\r
   }\r
+\r
   //\r
-  // We should always reinit PP request.\r
+  // Validation\r
   //\r
-  TrEEConfiguration.Tpm2Operation = TREE_PHYSICAL_PRESENCE_NO_ACTION;\r
+  if ((TrEEConfiguration.TpmDevice > TPM_DEVICE_MAX) || (TrEEConfiguration.TpmDevice < TPM_DEVICE_MIN)) {\r
+    TrEEConfiguration.TpmDevice   = TPM_DEVICE_DEFAULT;\r
+  }\r
 \r
   //\r
-  // Sync data from PCD to variable, so that we do not need detect again in S3 phase.\r
+  // Save to variable so platform driver can get it.\r
   //\r
+  Status = gRT->SetVariable (\r
+                  TREE_STORAGE_NAME,\r
+                  &gTrEEConfigFormSetGuid,\r
+                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                  sizeof(TrEEConfiguration),\r
+                  &TrEEConfiguration\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "TrEEConfigDriver: Fail to set TREE_STORAGE_NAME\n"));\r
+  }\r
 \r
   //\r
-  // Get data from PCD to make sure data consistant - platform driver is suppose to construct this PCD accroding to Variable\r
+  // Sync data from PCD to variable, so that we do not need detect again in S3 phase.\r
   //\r
+  TrEEDeviceDetection.TpmDeviceDetected = TPM_DEVICE_NULL;\r
   for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) {\r
     if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) {\r
-      TrEEConfiguration.TpmDevice = mTpmInstanceId[Index].TpmDevice;\r
+      TrEEDeviceDetection.TpmDeviceDetected = mTpmInstanceId[Index].TpmDevice;\r
       break;\r
     }\r
   }\r
 \r
+  PrivateData->TpmDeviceDetected = TrEEDeviceDetection.TpmDeviceDetected;\r
+\r
   //\r
   // Save to variable so platform driver can get it.\r
   //\r
   Status = gRT->SetVariable (\r
-                  TREE_STORAGE_NAME,\r
+                  TREE_DEVICE_DETECTION_NAME,\r
                   &gTrEEConfigFormSetGuid,\r
                   EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-                  sizeof(TrEEConfiguration),\r
-                  &TrEEConfiguration\r
+                  sizeof(TrEEDeviceDetection),\r
+                  &TrEEDeviceDetection\r
                   );\r
-  ASSERT_EFI_ERROR (Status);\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "TrEEConfigDriver: Fail to set TREE_DEVICE_DETECTION_NAME\n"));\r
+    Status = gRT->SetVariable (\r
+                    TREE_DEVICE_DETECTION_NAME,\r
+                    &gTrEEConfigFormSetGuid,\r
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                    0,\r
+                    NULL\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+\r
+  //\r
+  // We should lock TrEEDeviceDetection, because it contains information needed at S3.\r
+  //\r
+  Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLockProtocol);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = VariableLockProtocol->RequestToLock (\r
+                                     VariableLockProtocol,\r
+                                     TREE_DEVICE_DETECTION_NAME,\r
+                                     &gTrEEConfigFormSetGuid\r
+                                     );\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
   \r
   //\r
   // Install TrEE configuration form\r