]> git.proxmox.com Git - mirror_edk2.git/commitdiff
IntelFrameworkModulePkg AcpiS3SaveDxe: Remove ASSERT, add lock and remove RT for...
authorStar Zeng <star.zeng@intel.com>
Tue, 18 Mar 2014 09:10:13 +0000 (09:10 +0000)
committerlzeng14 <lzeng14@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 18 Mar 2014 09:10:13 +0000 (09:10 +0000)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15337 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf
IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiVariableThunkPlatform.c

index eb3ade991eb3ac7ef00a9be3771fd3e1a987145a..dc6da58f9f28921fd1c758d12c35e42d0cc96eb7 100644 (file)
@@ -2,7 +2,7 @@
 # Component description file for AcpiS3Save module.\r
 #\r
 # This is an implementation of the ACPI S3 Save protocol.\r
 # Component description file for AcpiS3Save module.\r
 #\r
 # This is an implementation of the ACPI S3 Save protocol.\r
-# Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are\r
 # licensed and made available under the terms and conditions of the BSD License\r
 #\r
 # This program and the accompanying materials are\r
 # licensed and made available under the terms and conditions of the BSD License\r
@@ -64,6 +64,7 @@
   gEfiLegacyBiosProtocolGuid                    # PROTOCOL ALWAYS_CONSUMED\r
   gEfiLegacyRegion2ProtocolGuid                 # PROTOCOL SOMETIMES_CONSUMED\r
   gFrameworkEfiMpServiceProtocolGuid            # PROTOCOL SOMETIMES_CONSUMED\r
   gEfiLegacyBiosProtocolGuid                    # PROTOCOL ALWAYS_CONSUMED\r
   gEfiLegacyRegion2ProtocolGuid                 # PROTOCOL SOMETIMES_CONSUMED\r
   gFrameworkEfiMpServiceProtocolGuid            # PROTOCOL SOMETIMES_CONSUMED\r
+  gEdkiiVariableLockProtocolGuid                ## SOMETIMES_CONSUMES\r
 \r
 [FeaturePcd]\r
   gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformCsmSupport          ## CONSUMES\r
 \r
 [FeaturePcd]\r
   gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformCsmSupport          ## CONSUMES\r
index 641a0ae0c9ec4d90c6d9d8bd7fab2c633570abe2..7ad9eb4336dfffddf4fb20a7e7a2ee0040bc02b3 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   This is an implementation of the AcpiVariable platform field for ECP platform.\r
 \r
 /** @file\r
   This is an implementation of the AcpiVariable platform field for ECP platform.\r
 \r
-Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
 \r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions\r
 \r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions\r
@@ -39,7 +39,9 @@ typedef struct {
 #include <Library/HobLib.h>\r
 #include <Library/PcdLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/HobLib.h>\r
 #include <Library/PcdLib.h>\r
 #include <Library/DebugLib.h>\r
+#include <Library/UefiLib.h>\r
 #include <Protocol/FrameworkMpService.h>\r
 #include <Protocol/FrameworkMpService.h>\r
+#include <Protocol/VariableLock.h>\r
 #include <Guid/AcpiVariableCompatibility.h>\r
 #include <Guid/AcpiS3Context.h>\r
 \r
 #include <Guid/AcpiVariableCompatibility.h>\r
 #include <Guid/AcpiS3Context.h>\r
 \r
@@ -80,6 +82,10 @@ S3ReadyThunkPlatform (
 \r
   DEBUG ((EFI_D_INFO, "S3ReadyThunkPlatform\n"));\r
 \r
 \r
   DEBUG ((EFI_D_INFO, "S3ReadyThunkPlatform\n"));\r
 \r
+  if (mAcpiVariableSetCompatibility == NULL) {\r
+    return;\r
+  }\r
+\r
   //\r
   // Allocate ACPI reserved memory under 4G\r
   //\r
   //\r
   // Allocate ACPI reserved memory under 4G\r
   //\r
@@ -117,6 +123,32 @@ S3ReadyThunkPlatform (
   return ;\r
 }\r
 \r
   return ;\r
 }\r
 \r
+/**\r
+  Register callback function upon VariableLockProtocol\r
+  to lock ACPI_GLOBAL_VARIABLE variable to avoid malicious code to update it.\r
+\r
+  @param[in] Event    Event whose notification function is being invoked.\r
+  @param[in] Context  Pointer to the notification function's context.\r
+**/\r
+VOID\r
+EFIAPI\r
+VariableLockAcpiGlobalVariable (\r
+  IN  EFI_EVENT                             Event,\r
+  IN  VOID                                  *Context\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  EDKII_VARIABLE_LOCK_PROTOCOL  *VariableLock;\r
+  //\r
+  // Mark ACPI_GLOBAL_VARIABLE variable to read-only if the Variable Lock protocol exists\r
+  //\r
+  Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **) &VariableLock);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = VariableLock->RequestToLock (VariableLock, ACPI_GLOBAL_VARIABLE, &gEfiAcpiVariableCompatiblityGuid);\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+}\r
+\r
 /**\r
   Hook point for AcpiVariableThunkPlatform for InstallAcpiS3Save.\r
 **/\r
 /**\r
   Hook point for AcpiVariableThunkPlatform for InstallAcpiS3Save.\r
 **/\r
@@ -128,6 +160,7 @@ InstallAcpiS3SaveThunk (
   EFI_STATUS                           Status;\r
   FRAMEWORK_EFI_MP_SERVICES_PROTOCOL   *FrameworkMpService;\r
   UINTN                                VarSize;\r
   EFI_STATUS                           Status;\r
   FRAMEWORK_EFI_MP_SERVICES_PROTOCOL   *FrameworkMpService;\r
   UINTN                                VarSize;\r
+  VOID                                 *Registration;\r
 \r
   Status = gBS->LocateProtocol (\r
                   &gFrameworkEfiMpServiceProtocolGuid,\r
 \r
   Status = gBS->LocateProtocol (\r
                   &gFrameworkEfiMpServiceProtocolGuid,\r
@@ -147,21 +180,44 @@ InstallAcpiS3SaveThunk (
                     &VarSize,\r
                     &mAcpiVariableSetCompatibility\r
                     );\r
                     &VarSize,\r
                     &mAcpiVariableSetCompatibility\r
                     );\r
-    ASSERT_EFI_ERROR (Status);\r
+    if (EFI_ERROR (Status) || (VarSize != sizeof (mAcpiVariableSetCompatibility))) {\r
+      DEBUG ((EFI_D_ERROR, "FATAL ERROR: AcpiVariableSetCompatibility was not saved by CPU driver correctly. OS S3 may fail!\n"));\r
+      mAcpiVariableSetCompatibility = NULL;\r
+    }\r
   } else {\r
     //\r
     // Allocate/initialize the compatible version of Acpi Variable Set since Framework chipset/platform \r
   } else {\r
     //\r
     // Allocate/initialize the compatible version of Acpi Variable Set since Framework chipset/platform \r
-    // driver need this variable\r
+    // driver need this variable. ACPI_GLOBAL_VARIABLE variable is not used in runtime phase,\r
+    // so RT attribute is not needed for it.\r
     //\r
     mAcpiVariableSetCompatibility = AllocateMemoryBelow4G (EfiACPIMemoryNVS, sizeof(ACPI_VARIABLE_SET_COMPATIBILITY));\r
     Status = gRT->SetVariable (\r
                     ACPI_GLOBAL_VARIABLE,\r
                     &gEfiAcpiVariableCompatiblityGuid,\r
     //\r
     mAcpiVariableSetCompatibility = AllocateMemoryBelow4G (EfiACPIMemoryNVS, sizeof(ACPI_VARIABLE_SET_COMPATIBILITY));\r
     Status = gRT->SetVariable (\r
                     ACPI_GLOBAL_VARIABLE,\r
                     &gEfiAcpiVariableCompatiblityGuid,\r
-                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
                     sizeof(mAcpiVariableSetCompatibility),\r
                     &mAcpiVariableSetCompatibility\r
                     );\r
                     sizeof(mAcpiVariableSetCompatibility),\r
                     &mAcpiVariableSetCompatibility\r
                     );\r
-    ASSERT_EFI_ERROR (Status);\r
+    if (!EFI_ERROR (Status)) {\r
+      //\r
+      // Register callback function upon VariableLockProtocol\r
+      // to lock ACPI_GLOBAL_VARIABLE variable to avoid malicious code to update it.\r
+      //\r
+      EfiCreateProtocolNotifyEvent (\r
+        &gEdkiiVariableLockProtocolGuid,\r
+        TPL_CALLBACK,\r
+        VariableLockAcpiGlobalVariable,\r
+        NULL,\r
+        &Registration\r
+        );\r
+    } else {\r
+      DEBUG ((EFI_D_ERROR, "FATAL ERROR: AcpiVariableSetCompatibility cannot be saved: %r. OS S3 may fail!\n", Status));\r
+      gBS->FreePages (\r
+             (EFI_PHYSICAL_ADDRESS) (UINTN) mAcpiVariableSetCompatibility,\r
+             EFI_SIZE_TO_PAGES (sizeof (ACPI_VARIABLE_SET_COMPATIBILITY))\r
+             );\r
+      mAcpiVariableSetCompatibility = NULL;\r
+    }\r
   }\r
 \r
   DEBUG((EFI_D_INFO, "AcpiVariableSetCompatibility is 0x%8x\n", mAcpiVariableSetCompatibility));\r
   }\r
 \r
   DEBUG((EFI_D_INFO, "AcpiVariableSetCompatibility is 0x%8x\n", mAcpiVariableSetCompatibility));\r