summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStar Zeng <star.zeng@intel.com>2018-08-07 18:01:12 +0800
committerStar Zeng <star.zeng@intel.com>2018-08-08 19:19:46 +0800
commitb4f4877e3ffc207f147970f35f447aafeb9b7149 (patch)
tree1f65cd2c79e6d2f1089a27c1fd905ff5acc1ccb6
parentec991e153dbc31cd1d0b0a63bac2acfe706fa5d2 (diff)
downloadedk2-b4f4877e3ffc207f147970f35f447aafeb9b7149.zip
edk2-b4f4877e3ffc207f147970f35f447aafeb9b7149.tar.gz
edk2-b4f4877e3ffc207f147970f35f447aafeb9b7149.tar.bz2
FmpDevicePkg FmpDxe: Lock variables in entrypoint instead of callback
Current code locks variables in PcdFmpDeviceLockEventGuid callback by VariableLock protocol whose interface will be closed at EndOfDxe. So the PcdFmpDeviceLockEventGuid callback needs be executed before the EndOfDxe callback in Variable driver. When PcdFmpDeviceLockEventGuid = gEfiEndOfDxeEventGroupGuid, the callback's execution sequence depends on the callback's TPL and registration sequence. When PcdFmpDeviceLockEventGuid = gEfiEventReadyToBootGuid, the PcdFmpDeviceLockEventGuid callback will be executed after the EndOfDxe callback in Variable driver, the locking will fail. The patch moves the variables locking logic to entrypoint. The patch also moves the IsLockFmpDeviceAtLockEventGuidRequired () checking to entrypoint. The entrypoint's final return status should be better to depend on the return status of RegisterFmpInstaller/InstallFmpInstance, but not gBS->CreateEventEx. So the patch also moves the RegisterFmpInstaller/InstallFmpInstance calling to the end of entrypoint. Cc: Michael D Kinney <michael.d.kinney@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com> (cherry picked from commit 9e6c4f1527e6f72d6ada10aa39854f2bdd40772f)
-rw-r--r--FmpDevicePkg/FmpDxe/FmpDxe.c96
1 files changed, 48 insertions, 48 deletions
diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.c b/FmpDevicePkg/FmpDxe/FmpDxe.c
index 3794ac5..57eac5a 100644
--- a/FmpDevicePkg/FmpDxe/FmpDxe.c
+++ b/FmpDevicePkg/FmpDxe/FmpDxe.c
@@ -1248,32 +1248,18 @@ FmpDxeLockEventNotify (
EFI_STATUS Status;
if (!mFmpDeviceLocked) {
- if (IsLockFmpDeviceAtLockEventGuidRequired ()) {
- //
- // Lock all UEFI Variables used by this module.
- //
- Status = LockAllFmpVariables ();
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "FmpDxe: Failed to lock variables. Status = %r.\n"));
+ //
+ // Lock the firmware device
+ //
+ Status = FmpDeviceLock();
+ if (EFI_ERROR (Status)) {
+ if (Status != EFI_UNSUPPORTED) {
+ DEBUG ((DEBUG_ERROR, "FmpDxe: FmpDeviceLock() returned error. Status = %r\n", Status));
} else {
- DEBUG ((DEBUG_INFO, "FmpDxe: All variables locked\n"));
- }
-
- //
- // Lock the firmware device
- //
- Status = FmpDeviceLock();
- if (EFI_ERROR (Status)) {
- if (Status != EFI_UNSUPPORTED) {
- DEBUG ((DEBUG_ERROR, "FmpDxe: FmpDeviceLock() returned error. Status = %r\n", Status));
- } else {
- DEBUG ((DEBUG_WARN, "FmpDxe: FmpDeviceLock() returned error. Status = %r\n", Status));
- }
+ DEBUG ((DEBUG_WARN, "FmpDxe: FmpDeviceLock() returned error. Status = %r\n", Status));
}
- mFmpDeviceLocked = TRUE;
- } else {
- DEBUG ((DEBUG_VERBOSE, "FmpDxe: Not calling FmpDeviceLock() because mfg mode\n"));
}
+ mFmpDeviceLocked = TRUE;
}
}
@@ -1417,6 +1403,45 @@ FmpDxeEntryPoint (
//
DetectTestKey ();
+ if (IsLockFmpDeviceAtLockEventGuidRequired ()) {
+ //
+ // Lock all UEFI Variables used by this module.
+ //
+ Status = LockAllFmpVariables ();
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "FmpDxe: Failed to lock variables. Status = %r.\n", Status));
+ } else {
+ DEBUG ((DEBUG_INFO, "FmpDxe: All variables locked\n"));
+ }
+
+ //
+ // Register notify function to lock the FMP device.
+ // The lock event GUID is retrieved from PcdFmpDeviceLockEventGuid.
+ // If PcdFmpDeviceLockEventGuid is not the size of an EFI_GUID, then
+ // gEfiEndOfDxeEventGroupGuid is used.
+ //
+ LockGuid = &gEfiEndOfDxeEventGroupGuid;
+ if (PcdGetSize (PcdFmpDeviceLockEventGuid) == sizeof (EFI_GUID)) {
+ LockGuid = (EFI_GUID *)PcdGetPtr (PcdFmpDeviceLockEventGuid);
+ }
+ DEBUG ((DEBUG_INFO, "FmpDxe: Lock GUID: %g\n", LockGuid));
+
+ Status = gBS->CreateEventEx (
+ EVT_NOTIFY_SIGNAL,
+ TPL_CALLBACK,
+ FmpDxeLockEventNotify,
+ NULL,
+ LockGuid,
+ &mFmpDeviceLockEvent
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "FmpDxe: Failed to register notification. Status = %r\n", Status));
+ }
+ ASSERT_EFI_ERROR (Status);
+ } else {
+ DEBUG ((DEBUG_VERBOSE, "FmpDxe: Not registering notification to call FmpDeviceLock() because mfg mode\n"));
+ }
+
//
// Register with library the install function so if the library uses
// UEFI driver model/driver binding protocol it can install FMP on its device handle
@@ -1436,30 +1461,5 @@ FmpDxeEntryPoint (
));
}
- //
- // Register notify function to lock the FMP device.
- // The lock event GUID is retrieved from PcdFmpDeviceLockEventGuid.
- // If PcdFmpDeviceLockEventGuid is not the size of an EFI_GUID, then
- // gEfiEndOfDxeEventGroupGuid is used.
- //
- LockGuid = &gEfiEndOfDxeEventGroupGuid;
- if (PcdGetSize (PcdFmpDeviceLockEventGuid) == sizeof (EFI_GUID)) {
- LockGuid = (EFI_GUID *)PcdGetPtr (PcdFmpDeviceLockEventGuid);
- }
- DEBUG ((DEBUG_INFO, "FmpDxe: Lock GUID: %g\n", LockGuid));
-
- Status = gBS->CreateEventEx (
- EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- FmpDxeLockEventNotify,
- NULL,
- LockGuid,
- &mFmpDeviceLockEvent
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "FmpDxe: Failed to register for ready to boot. Status = %r\n", Status));
- }
- ASSERT_EFI_ERROR (Status);
-
return Status;
}