From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 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) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False 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 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,285,1526367600"; d="scan'208";a="52785749" 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 From: Ruiyu Ni To: edk2-devel@lists.01.org Cc: Sean Brogan , Michael Turner , Laszlo Ersek , Sunny Wang 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: [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: , X-List-Received-Date: Fri, 29 Jun 2018 06:03:27 -0000 REF: https://bugzilla.tianocore.org/show_bug.cgi?id=982 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 --- MdeModulePkg/Universal/BdsDxe/BdsEntry.c | 65 +++++++------------------------- 1 file changed, 13 insertions(+), 52 deletions(-) diff --git a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c b/MdeModulePkg/Universal/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 (); } -/** - 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 EfiBootManagerGetBootManagerMenu() - 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 this 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->ConIn - // here to see if it makes sense to request and wait for a keypress. - // - if (gST->ConIn != 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); - } -} - /** Service routine for BdsInstance->Entry(). Devices are connected, the @@ -1088,10 +1039,20 @@ BdsEntry ( } // - // 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 != EFI_NOT_FOUND) { - BdsBootManagerMenuLoop (&BootManagerMenu); + Status = EfiBootManagerUnableToBoot (); + if (EFI_ERROR (Status) && (BootManagerMenuStatus != EFI_NOT_FOUND)) { + // + // The platform didn't register a callback; fall back to BootManagerMenu + // internally, indefinitely. + // + + while (TRUE) { + EfiBootManagerBoot (&BootManagerMenu); + } } DEBUG ((EFI_D_ERROR, "[Bds] Unable to boot!\n")); -- 2.16.1.windows.1