Reviewed-by: Michael D Kinney <michael.d.kin...@intel.com>

Mike

> -----Original Message-----
> From: Zeng, Star
> Sent: Tuesday, August 7, 2018 3:28 AM
> To: edk2-devel@lists.01.org
> Cc: Zeng, Star <star.z...@intel.com>; Kinney, Michael D
> <michael.d.kin...@intel.com>
> Subject: [PATCH] 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.kin...@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Star Zeng <star.z...@intel.com>
> ---
>  FmpDevicePkg/FmpDxe/FmpDxe.c | 96
> ++++++++++++++++++++++----------------------
>  1 file changed, 48 insertions(+), 48 deletions(-)
> 
> diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.c
> b/FmpDevicePkg/FmpDxe/FmpDxe.c
> index 3794ac5008f9..57eac5ac147f 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;
>  }
> --
> 2.7.0.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to