From nobody Sun May 5 03:55:56 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 1530252209260919.6540724183852; Thu, 28 Jun 2018 23:03:29 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 38A4C203369CF; Thu, 28 Jun 2018 23:03:27 -0700 (PDT) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 5141D202E53DB for ; Thu, 28 Jun 2018 23:03:26 -0700 (PDT) Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Jun 2018 23:03:26 -0700 Received: from ray-dev.ccr.corp.intel.com ([10.239.9.4]) by orsmga007.jf.intel.com with ESMTP; 28 Jun 2018 23:03:25 -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.20; helo=mga02.intel.com; envelope-from=ruiyu.ni@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,285,1526367600"; d="scan'208";a="52785747" From: Ruiyu Ni To: edk2-devel@lists.01.org Date: Fri, 29 Jun 2018 14:03:43 +0800 Message-Id: <20180629060344.105716-2-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.16.1.windows.1 In-Reply-To: <20180629060344.105716-1-ruiyu.ni@intel.com> References: <20180629060344.105716-1-ruiyu.ni@intel.com> Subject: [edk2] [PATCH v2 1/2] MdeModulePkg/UefiBootManagerLib: new APIs for ultimate boot failure X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laszlo Ersek , Michael Turner MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D982 When no boot option could be launched including platform recovery options and options pointing to applications built into firmware volumes, a platform callback registered through EfiBootManagerRegisterUnableToBootHandler() is called. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni Cc: Sean Brogan Cc: Michael Turner Cc: Laszlo Ersek Cc: Sunny Wang Reviewed-by: Laszlo Ersek Reviewed-by: Sunny Wang --- MdeModulePkg/Include/Library/UefiBootManagerLib.h | 48 +++++++++++++++++++= ++++ MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c | 41 +++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/MdeModulePkg/Include/Library/UefiBootManagerLib.h b/MdeModuleP= kg/Include/Library/UefiBootManagerLib.h index bfc0cb86f8..453893e030 100644 --- a/MdeModulePkg/Include/Library/UefiBootManagerLib.h +++ b/MdeModulePkg/Include/Library/UefiBootManagerLib.h @@ -800,4 +800,52 @@ EFIAPI EfiBootManagerDispatchDeferredImages ( VOID ); + +/** + The function is called when no boot option could be launched, + including platform recovery options and options pointing to applications + built into firmware volumes. + + The platform may register this function to inform the user about the abo= ve fact. + If this function returns, BDS core attempts to enter an infinite loop of= pulling + up the Boot Manager Menu (if the platform includes the Boot Manager Menu= ). + If the Boot Manager Menu is unavailable, BDS will hang. +**/ +typedef +VOID +(EFIAPI *EFI_BOOT_MANAGER_UNABLE_TO_BOOT) ( + VOID + ); + +/** + Register the callback function when no boot option could be launched, + including platform recovery options and options pointing to applications + built into firmware volumes. + + @param Handler The callback function. +**/ +VOID +EFIAPI +EfiBootManagerRegisterUnableToBootHandler ( + EFI_BOOT_MANAGER_UNABLE_TO_BOOT Handler + ); + +/** + The function is called when no boot option could be launched, + including platform recovery options and options pointing to applications + built into firmware volumes. + + If this function returns, BDS core attempts to enter an infinite loop of= pulling + up the Boot Manager Menu (if the platform includes the Boot Manager Menu= ). + If the Boot Manager Menu is unavailable, BDS will hang. + + @retval EFI_SUCCESS The unable-to-boot callback is called successful= ly. + @retval EFI_UNSUPPORTED There is no unable-to-boot callback registered. +**/ +EFI_STATUS +EFIAPI +EfiBootManagerUnableToBoot ( + VOID + ); + #endif diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c b/MdeModulePk= g/Library/UefiBootManagerLib/BmBoot.c index 6a23477eb8..e59d790122 100644 --- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c @@ -19,6 +19,7 @@ EFI_RAM_DISK_PROTOCOL *mRamDisk = =3D NULL; =20 EFI_BOOT_MANAGER_REFRESH_LEGACY_BOOT_OPTION mBmRefreshLegacyBootOption = =3D NULL; EFI_BOOT_MANAGER_LEGACY_BOOT mBmLegacyBoot = =3D NULL; +EFI_BOOT_MANAGER_UNABLE_TO_BOOT mBmUnableToBoot = =3D NULL; =20 /// /// This GUID is used for an EFI Variable that stores the front device pat= hes @@ -2461,3 +2462,43 @@ EfiBootManagerGetBootManagerMenu ( } } =20 +/** + Register the callback function when no boot option could be launched, + including platform recovery options and options pointing to applications + built into firmware volumes. + + @param Handler The callback function. +**/ +VOID +EFIAPI +EfiBootManagerRegisterUnableToBootHandler ( + EFI_BOOT_MANAGER_UNABLE_TO_BOOT Handler + ) +{ + mBmUnableToBoot =3D Handler; +} + +/** + The function is called when no boot option could be launched, + including platform recovery options and options pointing to applications + built into firmware volumes. + + If this function returns, BDS core attempts to enter an infinite loop of= pulling + up the Boot Manager Menu (if the platform includes the Boot Manager Menu= ). + If the Boot Manager Menu is unavailable, BDS will hang. + + @retval EFI_SUCCESS The unable-to-boot callback is called successful= ly. + @retval EFI_UNSUPPORTED There is no unable-to-boot callback registered. +**/ +EFI_STATUS +EFIAPI +EfiBootManagerUnableToBoot ( + VOID + ) +{ + if (mBmUnableToBoot !=3D NULL) { + mBmUnableToBoot (); + return EFI_SUCCESS; + } + return EFI_UNSUPPORTED; +} --=20 2.16.1.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Sun May 5 03:55:56 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 1530252212119373.78975814558555; Thu, 28 Jun 2018 23:03:32 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 6AA78203369D3; Thu, 28 Jun 2018 23:03:29 -0700 (PDT) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 9B913202E544F for ; Thu, 28 Jun 2018 23:03:27 -0700 (PDT) Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Jun 2018 23:03:27 -0700 Received: from ray-dev.ccr.corp.intel.com ([10.239.9.4]) by orsmga007.jf.intel.com with ESMTP; 28 Jun 2018 23:03:26 -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.20; helo=mga02.intel.com; envelope-from=ruiyu.ni@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,285,1526367600"; d="scan'208";a="52785749" From: Ruiyu Ni To: edk2-devel@lists.01.org Date: Fri, 29 Jun 2018 14:03:44 +0800 Message-Id: <20180629060344.105716-3-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.16.1.windows.1 In-Reply-To: <20180629060344.105716-1-ruiyu.ni@intel.com> References: <20180629060344.105716-1-ruiyu.ni@intel.com> Subject: [edk2] [PATCH v2 2/2] MdeModulePkg/BdsDxe: Call *UnableToBoot() for ultimate boot failure X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laszlo Ersek , Michael Turner MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D982 The patch changes the default core behavior of ultimate boot failure to launch Boot Manager Menu. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni Cc: Sean Brogan Cc: Michael Turner Cc: Laszlo Ersek Cc: Sunny Wang Reviewed-by: Laszlo Ersek Reviewed-by: Sunny Wang --- MdeModulePkg/Universal/BdsDxe/BdsEntry.c | 65 +++++++---------------------= ---- 1 file changed, 13 insertions(+), 52 deletions(-) diff --git a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c b/MdeModulePkg/Univer= sal/BdsDxe/BdsEntry.c index 49e403e181..db2a4cf208 100644 --- a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c +++ b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c @@ -634,55 +634,6 @@ BdsFormalizeEfiGlobalVariable ( BdsFormalizeOSIndicationVariable (); } =20 -/** - Enter an infinite loop of calling the Boot Manager Menu. - - This is a last resort alternative to BdsEntry() giving up for good. This - function never returns. - - @param[in] BootManagerMenu The EFI_BOOT_MANAGER_LOAD_OPTION located and= /or - created by the EfiBootManagerGetBootManagerM= enu() - call in BdsEntry(). -**/ -VOID -BdsBootManagerMenuLoop ( - IN EFI_BOOT_MANAGER_LOAD_OPTION *BootManagerMenu - ) -{ - EFI_INPUT_KEY Key; - - // - // Normally BdsDxe does not print anything to the system console, but th= is is - // a last resort -- the end-user will likely not see any DEBUG messages - // logged in this situation. - // - // AsciiPrint() will NULL-check gST->ConOut internally. We check gST->Co= nIn - // here to see if it makes sense to request and wait for a keypress. - // - if (gST->ConIn !=3D NULL) { - AsciiPrint ( - "%a: No bootable option or device was found.\n" - "%a: Press any key to enter the Boot Manager Menu.\n", - gEfiCallerBaseName, - gEfiCallerBaseName - ); - BdsWaitForSingleEvent (gST->ConIn->WaitForKey, 0); - - // - // Drain any queued keys. - // - while (!EFI_ERROR (gST->ConIn->ReadKeyStroke (gST->ConIn, &Key))) { - // - // just throw away Key - // - } - } - - for (;;) { - EfiBootManagerBoot (BootManagerMenu); - } -} - /** =20 Service routine for BdsInstance->Entry(). Devices are connected, the @@ -1088,10 +1039,20 @@ BdsEntry ( } =20 // - // If BootManagerMenu is available, fall back to it indefinitely. + // Inform the platform that we're unable to boot. The platform may enter + // BootManagerMenu with the public EfiBootManagerBoot() interface, if so + // desired. // - if (BootManagerMenuStatus !=3D EFI_NOT_FOUND) { - BdsBootManagerMenuLoop (&BootManagerMenu); + Status =3D EfiBootManagerUnableToBoot (); + if (EFI_ERROR (Status) && (BootManagerMenuStatus !=3D EFI_NOT_FOUND)) { + // + // The platform didn't register a callback; fall back to BootManagerMe= nu + // internally, indefinitely. + // + =20 + while (TRUE) { + EfiBootManagerBoot (&BootManagerMenu); + } } =20 DEBUG ((EFI_D_ERROR, "[Bds] Unable to boot!\n")); --=20 2.16.1.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel