From nobody Fri Apr 26 09:08:40 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1533637703097230.41378469133826; Tue, 7 Aug 2018 03:28:23 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id D1144210DC1C1; Tue, 7 Aug 2018 03:28:21 -0700 (PDT) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 8989F210DBE84 for ; Tue, 7 Aug 2018 03:28:20 -0700 (PDT) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 Aug 2018 03:28:20 -0700 Received: from shwdeopenpsi068.ccr.corp.intel.com ([10.239.158.46]) by orsmga002.jf.intel.com with ESMTP; 07 Aug 2018 03:28:14 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.65; helo=mga03.intel.com; envelope-from=star.zeng@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,455,1526367600"; d="scan'208";a="81337012" From: Star Zeng To: edk2-devel@lists.01.org Date: Tue, 7 Aug 2018 18:28:12 +0800 Message-Id: <1533637692-72548-1-git-send-email-star.zeng@intel.com> X-Mailer: git-send-email 2.7.0.windows.1 Subject: [edk2] [PATCH] FmpDevicePkg FmpDxe: Lock variables in entrypoint instead of callback X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.27 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Michael D Kinney , Star Zeng MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RDMRC_1 RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" 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 =3D gEfiEndOfDxeEventGroupGuid, the callback's execution sequence depends on the callback's TPL and registration sequence. When PcdFmpDeviceLockEventGuid =3D 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 Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Star Zeng Reviewed-by: Michael D Kinney --- 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; =20 if (!mFmpDeviceLocked) { - if (IsLockFmpDeviceAtLockEventGuidRequired ()) { - // - // Lock all UEFI Variables used by this module. - // - Status =3D LockAllFmpVariables (); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "FmpDxe: Failed to lock variables. Status = =3D %r.\n")); + // + // Lock the firmware device + // + Status =3D FmpDeviceLock(); + if (EFI_ERROR (Status)) { + if (Status !=3D EFI_UNSUPPORTED) { + DEBUG ((DEBUG_ERROR, "FmpDxe: FmpDeviceLock() returned error. Sta= tus =3D %r\n", Status)); } else { - DEBUG ((DEBUG_INFO, "FmpDxe: All variables locked\n")); - } - - // - // Lock the firmware device - // - Status =3D FmpDeviceLock(); - if (EFI_ERROR (Status)) { - if (Status !=3D EFI_UNSUPPORTED) { - DEBUG ((DEBUG_ERROR, "FmpDxe: FmpDeviceLock() returned error. S= tatus =3D %r\n", Status)); - } else { - DEBUG ((DEBUG_WARN, "FmpDxe: FmpDeviceLock() returned error. St= atus =3D %r\n", Status)); - } + DEBUG ((DEBUG_WARN, "FmpDxe: FmpDeviceLock() returned error. Stat= us =3D %r\n", Status)); } - mFmpDeviceLocked =3D TRUE; - } else { - DEBUG ((DEBUG_VERBOSE, "FmpDxe: Not calling FmpDeviceLock() because = mfg mode\n")); } + mFmpDeviceLocked =3D TRUE; } } =20 @@ -1417,6 +1403,45 @@ FmpDxeEntryPoint ( // DetectTestKey (); =20 + if (IsLockFmpDeviceAtLockEventGuidRequired ()) { + // + // Lock all UEFI Variables used by this module. + // + Status =3D LockAllFmpVariables (); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "FmpDxe: Failed to lock variables. Status =3D = %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 =3D &gEfiEndOfDxeEventGroupGuid; + if (PcdGetSize (PcdFmpDeviceLockEventGuid) =3D=3D sizeof (EFI_GUID)) { + LockGuid =3D (EFI_GUID *)PcdGetPtr (PcdFmpDeviceLockEventGuid); + } + DEBUG ((DEBUG_INFO, "FmpDxe: Lock GUID: %g\n", LockGuid)); + + Status =3D gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + FmpDxeLockEventNotify, + NULL, + LockGuid, + &mFmpDeviceLockEvent + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "FmpDxe: Failed to register notification. Stat= us =3D %r\n", Status)); + } + ASSERT_EFI_ERROR (Status); + } else { + DEBUG ((DEBUG_VERBOSE, "FmpDxe: Not registering notification to call F= mpDeviceLock() 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 d= evice handle @@ -1436,30 +1461,5 @@ FmpDxeEntryPoint ( )); } =20 - // - // 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 =3D &gEfiEndOfDxeEventGroupGuid; - if (PcdGetSize (PcdFmpDeviceLockEventGuid) =3D=3D sizeof (EFI_GUID)) { - LockGuid =3D (EFI_GUID *)PcdGetPtr (PcdFmpDeviceLockEventGuid); - } - DEBUG ((DEBUG_INFO, "FmpDxe: Lock GUID: %g\n", LockGuid)); - - Status =3D 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. S= tatus =3D %r\n", Status)); - } - ASSERT_EFI_ERROR (Status); - return Status; } --=20 2.7.0.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel