Revision: 15337
http://sourceforge.net/p/edk2/code/15337
Author: lzeng14
Date: 2014-03-18 09:10:13 +0000 (Tue, 18 Mar 2014)
Log Message:
-----------
IntelFrameworkModulePkg AcpiS3SaveDxe: Remove ASSERT, add lock and remove RT
for AcpiGlobalVariable variable.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <[email protected]>
Reviewed-by: Jiewen Yao <[email protected]>
Modified Paths:
--------------
trunk/edk2/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf
trunk/edk2/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiVariableThunkPlatform.c
Modified:
trunk/edk2/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf
===================================================================
---
trunk/edk2/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf
2014-03-18 07:43:27 UTC (rev 15336)
+++
trunk/edk2/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3SaveDxe.inf
2014-03-18 09:10:13 UTC (rev 15337)
@@ -2,7 +2,7 @@
# Component description file for AcpiS3Save module.
#
# This is an implementation of the ACPI S3 Save protocol.
-# Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
#
# This program and the accompanying materials are
# licensed and made available under the terms and conditions of the BSD License
@@ -64,6 +64,7 @@
gEfiLegacyBiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED
gEfiLegacyRegion2ProtocolGuid # PROTOCOL SOMETIMES_CONSUMED
gFrameworkEfiMpServiceProtocolGuid # PROTOCOL SOMETIMES_CONSUMED
+ gEdkiiVariableLockProtocolGuid ## SOMETIMES_CONSUMES
[FeaturePcd]
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformCsmSupport ##
CONSUMES
Modified:
trunk/edk2/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiVariableThunkPlatform.c
===================================================================
---
trunk/edk2/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiVariableThunkPlatform.c
2014-03-18 07:43:27 UTC (rev 15336)
+++
trunk/edk2/IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiVariableThunkPlatform.c
2014-03-18 09:10:13 UTC (rev 15337)
@@ -1,7 +1,7 @@
/** @file
This is an implementation of the AcpiVariable platform field for ECP
platform.
-Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions
@@ -39,7 +39,9 @@
#include <Library/HobLib.h>
#include <Library/PcdLib.h>
#include <Library/DebugLib.h>
+#include <Library/UefiLib.h>
#include <Protocol/FrameworkMpService.h>
+#include <Protocol/VariableLock.h>
#include <Guid/AcpiVariableCompatibility.h>
#include <Guid/AcpiS3Context.h>
@@ -80,6 +82,10 @@
DEBUG ((EFI_D_INFO, "S3ReadyThunkPlatform\n"));
+ if (mAcpiVariableSetCompatibility == NULL) {
+ return;
+ }
+
//
// Allocate ACPI reserved memory under 4G
//
@@ -118,6 +124,32 @@
}
/**
+ Register callback function upon VariableLockProtocol
+ to lock ACPI_GLOBAL_VARIABLE variable to avoid malicious code to update it.
+
+ @param[in] Event Event whose notification function is being invoked.
+ @param[in] Context Pointer to the notification function's context.
+**/
+VOID
+EFIAPI
+VariableLockAcpiGlobalVariable (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+ EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock;
+ //
+ // Mark ACPI_GLOBAL_VARIABLE variable to read-only if the Variable Lock
protocol exists
+ //
+ Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID
**) &VariableLock);
+ if (!EFI_ERROR (Status)) {
+ Status = VariableLock->RequestToLock (VariableLock, ACPI_GLOBAL_VARIABLE,
&gEfiAcpiVariableCompatiblityGuid);
+ ASSERT_EFI_ERROR (Status);
+ }
+}
+
+/**
Hook point for AcpiVariableThunkPlatform for InstallAcpiS3Save.
**/
VOID
@@ -128,6 +160,7 @@
EFI_STATUS Status;
FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *FrameworkMpService;
UINTN VarSize;
+ VOID *Registration;
Status = gBS->LocateProtocol (
&gFrameworkEfiMpServiceProtocolGuid,
@@ -147,21 +180,44 @@
&VarSize,
&mAcpiVariableSetCompatibility
);
- ASSERT_EFI_ERROR (Status);
+ if (EFI_ERROR (Status) || (VarSize != sizeof
(mAcpiVariableSetCompatibility))) {
+ DEBUG ((EFI_D_ERROR, "FATAL ERROR: AcpiVariableSetCompatibility was not
saved by CPU driver correctly. OS S3 may fail!\n"));
+ mAcpiVariableSetCompatibility = NULL;
+ }
} else {
//
// Allocate/initialize the compatible version of Acpi Variable Set since
Framework chipset/platform
- // driver need this variable
+ // driver need this variable. ACPI_GLOBAL_VARIABLE variable is not used in
runtime phase,
+ // so RT attribute is not needed for it.
//
mAcpiVariableSetCompatibility = AllocateMemoryBelow4G (EfiACPIMemoryNVS,
sizeof(ACPI_VARIABLE_SET_COMPATIBILITY));
Status = gRT->SetVariable (
ACPI_GLOBAL_VARIABLE,
&gEfiAcpiVariableCompatiblityGuid,
- EFI_VARIABLE_BOOTSERVICE_ACCESS |
EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS |
EFI_VARIABLE_NON_VOLATILE,
sizeof(mAcpiVariableSetCompatibility),
&mAcpiVariableSetCompatibility
);
- ASSERT_EFI_ERROR (Status);
+ if (!EFI_ERROR (Status)) {
+ //
+ // Register callback function upon VariableLockProtocol
+ // to lock ACPI_GLOBAL_VARIABLE variable to avoid malicious code to
update it.
+ //
+ EfiCreateProtocolNotifyEvent (
+ &gEdkiiVariableLockProtocolGuid,
+ TPL_CALLBACK,
+ VariableLockAcpiGlobalVariable,
+ NULL,
+ &Registration
+ );
+ } else {
+ DEBUG ((EFI_D_ERROR, "FATAL ERROR: AcpiVariableSetCompatibility cannot
be saved: %r. OS S3 may fail!\n", Status));
+ gBS->FreePages (
+ (EFI_PHYSICAL_ADDRESS) (UINTN) mAcpiVariableSetCompatibility,
+ EFI_SIZE_TO_PAGES (sizeof (ACPI_VARIABLE_SET_COMPATIBILITY))
+ );
+ mAcpiVariableSetCompatibility = NULL;
+ }
}
DEBUG((EFI_D_INFO, "AcpiVariableSetCompatibility is 0x%8x\n",
mAcpiVariableSetCompatibility));
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/13534_NeoTech
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits