From nobody Tue Nov 26 12:31:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52223+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52223+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1576287160; cv=none; d=zohomail.com; s=zohoarc; b=FhjhBPCJlVKYmj6lYAl+0XldAe5XX8NPq+0qlD82YD7ALBLIQB0Q+J3p0r6F/7rrzJ4hRfVJwuchnCqVaL5kb8+XIAU8kybOeaqncO5eiRcS86DYdQXPTJhaHpRZCE8ruGMWFzjoxnA7ps41kOIF5hkkIhWRfLHK4S09xoI00Fs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576287160; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=wbextg31vdIqlc5BmXTWzSfFiNTgrcrByPWk19wUAQI=; b=YGlKO9Wt2AbUSVGFtdS4XoWQqMmCw7xt0Xb7WirqjtKxibGpBiHC5YIFIAAMDEUf6mUsQGd3ghh9yA8+/Ne+g6XZAylwGbnjZkKJIjmQnu3RGWC70UAPwT2oNE0NoSXVeblynweQEIbvEPoiZGS03cozW5PSdkF7Qc7TULIauj0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52223+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1576287160560447.5373101720601; Fri, 13 Dec 2019 17:32:40 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 2g1DYY1788612xXMPIxHxyNV; Fri, 13 Dec 2019 17:32:39 -0800 X-Received: from mga01.intel.com (mga01.intel.com []) by mx.groups.io with SMTP id smtpd.web10.2430.1576287158438932734 for ; Fri, 13 Dec 2019 17:32:38 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 17:32:37 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,311,1571727600"; d="scan'208";a="297091507" X-Received: from paagyema-desk2.amr.corp.intel.com ([10.24.15.84]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2019 17:32:37 -0800 From: "Agyeman, Prince" To: devel@edk2.groups.io Cc: Michael Kubacki , Chasel Chiu , Nate DeSimone Subject: [edk2-devel] [edk2-platforms] [PATCH 01/11] MinPlatformPkg: Add BDS Hook Point Guids Date: Fri, 13 Dec 2019 17:32:27 -0800 Message-Id: <20c55746e3b8e848cfff7b17b41a26207383d7e1.1576282834.git.prince.agyeman@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,prince.agyeman@intel.com X-Gm-Message-State: vsaCMpYo5ufqRkSZnjbWMhXTx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1576287159; bh=e4TjAvCNRv99t0WhOmXZjoKTDJew79REsNk5HvIIous=; h=Cc:Date:From:Reply-To:Subject:To; b=IZrP9fFpoQnwY8DAnLCnjb/DGGxW9zCTGE+2M+y7bIWhYzyRgFaC0DA4Rb8nRqd+tRw Qn08ADhsQkl2sfJVH+1MKsR0ybV4zdzrKzGJPWLG8qemEjeMcWlr85s9t1MSh+eNWkeWI 5JC5XD99p4K2qPrL2c4QaCDBtSyW1L1/ip0= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2336 Added BDS hook point guids as defined in the Minimum Platform specification. These GUIDs shall be used in the identification of three of the BDS hook point event groups. These event groups are Before Console After Trusted, Before Console Before End Of Dxe and After Console Ready Before BootOption events. See https://edk2-docs.gitbooks.io/edk-ii-minimum-platform-specification, under Appendix A.3 BDS Hook Points, for more details Cc: Michael Kubacki Cc: Chasel Chiu Cc: Nate DeSimone Signed-off-by: Prince Agyeman Reviewed-by: Chasel Chiu Reviewed-by: Michael Kubacki Reviewed-by: Nate DeSimone --- Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec b/Platform/In= tel/MinPlatformPkg/MinPlatformPkg.dec index 7f74ac9380..5bec4eee3a 100644 --- a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec +++ b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec @@ -46,6 +46,11 @@ gDefaultDataFileGuid =3D {0x1ae42876, 0x008f, 0x4161, {0xb2= , 0xb7, 0x1c, 0x0d, 0x15, 0xc5, 0xef, 0x43}} gDefaultDataOptSizeFileGuid =3D {0x003e7b41, 0x98a2, 0x4be2, {0xb2= , 0x7a, 0x6c, 0x30, 0xc7, 0x65, 0x52, 0x25}} =20 + # BDS Hook point event Guids + gBdsEventBeforeConsoleAfterTrustedConsoleGuid =3D {0x51e49ff5, 0x28a9, = 0x4159, { 0xac, 0x8a, 0xb8, 0xc4, 0x88, 0xa7, 0xfd, 0xee}} + gBdsEventBeforeConsoleBeforeEndOfDxeGuid =3D {0xfcf26e41, 0xbda6, = 0x4633, { 0xb5, 0x73, 0xd4, 0xb8, 0x0e, 0x6d, 0xd0, 0x78}} + gBdsEventAfterConsoleReadyBeforeBootOptionGuid =3D {0x8eb3d5dc, 0xf4e7, = 0x4b57, { 0xa9, 0xe7, 0x27, 0x39, 0x10, 0xf2, 0x18, 0x9f}} + [LibraryClasses] =20 PeiLib|Include/Library/PeiLib.h --=20 2.19.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52223): https://edk2.groups.io/g/devel/message/52223 Mute This Topic: https://groups.io/mt/68590722/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Tue Nov 26 12:31:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52224+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52224+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1576287161; cv=none; d=zohomail.com; s=zohoarc; b=hhKGII5abhkQSvacL8RHq+ZHYqd2g17Fk3++zJ7ce7EcZ0vcLCTQV2tQuehbc/ZI7sJoRujlAxJn9jOFDdTt4YQKl5790L2OXi83LvxViXxNX4EvNumKSso8IlrxfFM6SACOgb+rPoDnj4BFqZwpcVl+dnfSv/G16c6Nvd91vEk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576287161; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=0qrstS0TtKaNu4gWl6eYb5uyDBVnGxfFZI4ga9NrQIs=; b=KDkgFH2Ce1AKCBpLE/g8/DPMSZnpzzaJG+PnlBGKYA5fOpd5/N0TwKPJx4z8sJvReeeJtXGJUNkBQicJyd12wusLDdiaKzSwzW8Ru9CWaawksidUlbLtUCsXDyeA3cr5ssm3HcP/b8ByssfXWjzqw2zN0k03lKPjwD18IPHy+vE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52224+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1576287161018646.0560965840286; Fri, 13 Dec 2019 17:32:41 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 1zEIYY1788612xoGMGjtJ9f5; Fri, 13 Dec 2019 17:32:39 -0800 X-Received: from mga01.intel.com (mga01.intel.com []) by mx.groups.io with SMTP id smtpd.web10.2430.1576287158438932734 for ; Fri, 13 Dec 2019 17:32:39 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 17:32:37 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,311,1571727600"; d="scan'208";a="297091511" X-Received: from paagyema-desk2.amr.corp.intel.com ([10.24.15.84]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2019 17:32:37 -0800 From: "Agyeman, Prince" To: devel@edk2.groups.io Cc: Michael Kubacki , Chasel Chiu , Nate DeSimone Subject: [edk2-devel] [edk2-platforms] [PATCH 02/11] BoardModulePkg: Add BDS Hook Library Date: Fri, 13 Dec 2019 17:32:28 -0800 Message-Id: <6db8d0100389024cf00c0d1e260ce48cca179d53.1576282834.git.prince.agyeman@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,prince.agyeman@intel.com X-Gm-Message-State: QpAyVu0t6CcAo2XLJ4aQoM15x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1576287159; bh=NrKY//jDpSsVvkE3fa9vQNBhUyxIkYbS2OyDSvtoj8k=; h=Cc:Date:From:Reply-To:Subject:To; b=u7V60w1dWrYEoJLbBZgZvT7QAiF6poXQqmC68DdZrzzXLZMNxoo74hYqy4LPgbilWSh mhToo5yXUP44OkBien3hf3CnKQuwKNN559Al9XK0KTW1HL3Sl8d3jhtvkn5gw9FpIExWp Yl8RWvztu5m870wcYDmvduEYxl74QAB2iF8= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2336 Added a generic board BDS hook library that implements BDS hook points as defined in the Minimum platform specification. This library implements callbacks for the three MinPlatformPkg BDS event groups, namely gBdsEventBeforeConsoleAfterTrustedConsoleGuid, gBdsEventBeforeConsoleBeforeEndOfDxeGuid and gBdsEventAfterConsoleReadyBeforeBootOptionGuid. This Library also implements callbacks for pre-existing event groups: gEfiEndOfDxeEventGroupGuid, gEfiPciEnumerationCompleteProtocolGuid, gEfiDxeSmmReadyToLockProtocolGuid. These callbacks can be registered to their respective event groups, through other libraries or DXE drivers Cc: Michael Kubacki Cc: Chasel Chiu Cc: Nate DeSimone Signed-off-by: Prince Agyeman Reviewed-by: Michael Kubacki --- .../Include/Library/BoardBdsHookLib.h | 100 ++ .../Library/BoardBdsHookLib/BoardBdsHook.h | 211 +++ .../Library/BoardBdsHookLib/BoardBdsHookLib.c | 1390 +++++++++++++++++ .../BoardBdsHookLib/BoardBdsHookLib.inf | 95 ++ .../Library/BoardBdsHookLib/BoardBootOption.c | 598 +++++++ .../Library/BoardBdsHookLib/BoardMemoryTest.c | 83 + 6 files changed, 2477 insertions(+) create mode 100644 Platform/Intel/BoardModulePkg/Include/Library/BoardBdsH= ookLib.h create mode 100644 Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/B= oardBdsHook.h create mode 100644 Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/B= oardBdsHookLib.c create mode 100644 Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/B= oardBdsHookLib.inf create mode 100644 Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/B= oardBootOption.c create mode 100644 Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/B= oardMemoryTest.c diff --git a/Platform/Intel/BoardModulePkg/Include/Library/BoardBdsHookLib.= h b/Platform/Intel/BoardModulePkg/Include/Library/BoardBdsHookLib.h new file mode 100644 index 0000000000..ba351b7bf4 --- /dev/null +++ b/Platform/Intel/BoardModulePkg/Include/Library/BoardBdsHookLib.h @@ -0,0 +1,100 @@ +/** @file +Header file for BDS Hook Library + +Copyright (c) 2019, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _BDS_HOOK_LIB_H_ +#define _BDS_HOOK_LIB_H_ + +#include + + +/** + This is the callback function for Bds Ready To Boot event. + + @param Event Pointer to this event + @param Context Event hanlder private data + + @retval None. +**/ +VOID +EFIAPI +BdsReadyToBootCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ); + + +/** + This is the callback function for Smm Ready To Lock event. + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +EFIAPI +BdsSmmReadyToLockCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ); + + +/** + This is the callback function for PCI ENUMERATION COMPLETE. + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +EFIAPI +BdsPciEnumCompleteCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ); + + +/** + Before console after trusted console event callback + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +EFIAPI +BdsBeforeConsoleAfterTrustedConsoleCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ); + + +/** + Before console before end of DXE event callback + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +EFIAPI +BdsBeforeConsoleBeforeEndOfDxeGuidCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ); + + +/** + After console ready before boot option event callback + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +EFIAPI +BdsAfterConsoleReadyBeforeBootOptionCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +#endif diff --git a/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardBds= Hook.h b/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardBdsHook= .h new file mode 100644 index 0000000000..748385499b --- /dev/null +++ b/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardBdsHook.h @@ -0,0 +1,211 @@ +/** @file + Header file for BDS Hook Library + +Copyright (c) 2019, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _BDS_HOOK_H_ +#define _BDS_HOOK_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/// +/// ConnectType +/// +#define CONSOLE_OUT 0x00000001 +#define STD_ERROR 0x00000002 +#define CONSOLE_IN 0x00000004 +#define CONSOLE_ALL (CONSOLE_OUT | CONSOLE_IN | STD_ERROR) + +extern EFI_GUID gUefiShellFileGuid; +extern EFI_BOOT_MODE gBootMode; + +#define gPciRootBridge \ + { \ + { \ + ACPI_DEVICE_PATH, \ + ACPI_DP, \ + { \ + (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \ + (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \ + }, \ + }, \ + EISA_PNP_ID (0x0A03), \ + 0 \ + } + +#define gEndEntire \ + { \ + END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { END_DEVICE_PAT= H_LENGTH, 0 } \ + } + +typedef struct { + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + UINTN ConnectType; +} BDS_CONSOLE_CONNECT_ENTRY; + +// +// Platform Root Bridge +// +typedef struct { + ACPI_HID_DEVICE_PATH PciRootBridge; + EFI_DEVICE_PATH_PROTOCOL End; +} PLATFORM_ROOT_BRIDGE_DEVICE_PATH; + +// +// Below is the platform console device path +// +typedef struct { + ACPI_HID_DEVICE_PATH PciRootBridge; + PCI_DEVICE_PATH IsaBridge; + ACPI_HID_DEVICE_PATH Keyboard; + EFI_DEVICE_PATH_PROTOCOL End; +} PLATFORM_KEYBOARD_DEVICE_PATH; + +typedef struct { + ACPI_HID_DEVICE_PATH PciRootBridge; + PCI_DEVICE_PATH PciDevice; + EFI_DEVICE_PATH_PROTOCOL End; +} PLATFORM_ONBOARD_CONTROLLER_DEVICE_PATH; + +typedef struct { + ACPI_HID_DEVICE_PATH PciRootBridge; + PCI_DEVICE_PATH Pci0Device; + EFI_DEVICE_PATH_PROTOCOL End; +} PLATFORM_PEG_ROOT_CONTROLLER_DEVICE_PATH; + +typedef struct { + ACPI_HID_DEVICE_PATH PciRootBridge; + PCI_DEVICE_PATH PciBridge; + PCI_DEVICE_PATH PciDevice; + EFI_DEVICE_PATH_PROTOCOL End; +} PLATFORM_PCI_CONTROLLER_DEVICE_PATH; + +// +// Below is the boot option device path +// + +#define CLASS_HID 3 +#define SUBCLASS_BOOT 1 +#define PROTOCOL_KEYBOARD 1 + +typedef struct { + USB_CLASS_DEVICE_PATH UsbClass; + EFI_DEVICE_PATH_PROTOCOL End; +} USB_CLASS_FORMAT_DEVICE_PATH; + +extern USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboardDevicePa= th; + +// +// Platform BDS Functions +// + + +/** + Perform the memory test base on the memory test intensive level, + and update the memory resource. + + @param Level The memory test intensive level. + + @retval EFI_STATUS Success test all the system memory and update + the memory resource + +**/ +EFI_STATUS +MemoryTest ( + IN EXTENDMEM_COVERAGE_LEVEL Level + ); + +/** + Connect with predeined platform connect sequence, + the OEM/IBV can customize with their own connect sequence. + + @param[in] BootMode Boot mode of this boot. +**/ +VOID +ConnectSequence ( + IN EFI_BOOT_MODE BootMode + ); + + +/** + Compares boot priorities of two boot options + + @param Left The left boot option + @param Right The right boot option + + @return The difference between the Left and Right + boot options + **/ +INTN +EFIAPI +CompareBootOption ( + CONST VOID *Left, + CONST VOID *Right + ); + +/** + This function is called after all the boot options are enumerated and or= dered properly. +**/ +VOID +RegisterStaticHotkey ( + VOID + ); + + +/** + Registers/Unregisters boot option hotkey + + @param OptionNumber The boot option number for the key option. + @param Key The the key input + @param Add Flag to indicate to add or remove a key +**/ +VOID +RegisterDefaultBootOption ( + VOID + ); + +#endif diff --git a/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardBds= HookLib.c b/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardBdsH= ookLib.c new file mode 100644 index 0000000000..9d42a8c27f --- /dev/null +++ b/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardBdsHookLib= .c @@ -0,0 +1,1390 @@ +/** @file + This library registers Bds callbacks. It is a default library + implementation instance of the BDS hook library + + Copyright (c) 2019, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "BoardBdsHook.h" + +GLOBAL_REMOVE_IF_UNREFERENCED EFI_BOOT_MODE gBootMode; +BOOLEAN gPPRequireUIConfirm; +extern UINTN mBootMenuOptionNumber; + + +GLOBAL_REMOVE_IF_UNREFERENCED USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboa= rdDevicePath =3D { + { + { + MESSAGING_DEVICE_PATH, + MSG_USB_CLASS_DP, + { + (UINT8) (sizeof (USB_CLASS_DEVICE_PATH)), + (UINT8) ((sizeof (USB_CLASS_DEVICE_PATH)) >> 8) + } + }, + 0xffff, // VendorId + 0xffff, // ProductId + CLASS_HID, // DeviceClass + SUBCLASS_BOOT, // DeviceSubClass + PROTOCOL_KEYBOARD // DeviceProtocol + }, + gEndEntire +}; + + +// +// BDS Platform Functions +// +BOOLEAN +IsMorBitSet ( + VOID + ) +{ + UINTN MorControl; + EFI_STATUS Status; + UINTN DataSize; + + // + // Check if the MOR bit is set. + // + DataSize =3D sizeof (MorControl); + Status =3D gRT->GetVariable ( + MEMORY_OVERWRITE_REQUEST_VARIABLE_NAME, + &gEfiMemoryOverwriteControlDataGuid, + NULL, + &DataSize, + &MorControl + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, " gEfiMemoryOverwriteControlDataGuid doesn't exist= !!***\n")); + MorControl =3D 0; + } else { + DEBUG ((DEBUG_INFO, " Get the gEfiMemoryOverwriteControlDataGuid =3D %= x!!***\n", MorControl)); + } + + return (BOOLEAN) (MorControl & 0x01); +} + + +/** + Prints device paths. + @param Name The device name. + @param DevicePath The device path to be printed +**/ +VOID +EFIAPI +DumpDevicePath ( + IN CHAR16 *Name, + IN EFI_DEVICE_PATH *DevicePath + ) +{ + CHAR16 *Str; + Str =3D ConvertDevicePathToText (DevicePath, TRUE, TRUE); + DEBUG ((DEBUG_INFO, "%s: %s\n", Name, Str)); + if (Str !=3D NULL) { + FreePool (Str); + } +} + +/** + Return whether the device is trusted console. + + @param Device The device to be tested. + + @retval TRUE The device can be trusted. + @retval FALSE The device cannot be trusted. +**/ +BOOLEAN +IsTrustedConsole ( + IN CONSOLE_TYPE ConsoleType, + IN EFI_DEVICE_PATH_PROTOCOL *Device + ) +{ + VOID *TrustedConsoleDevicepath; + EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; + EFI_DEVICE_PATH_PROTOCOL *Instance; + UINTN Size; + EFI_DEVICE_PATH_PROTOCOL *ConsoleDevice; + + if (Device =3D=3D NULL) { + return FALSE; + } + + ConsoleDevice =3D DuplicateDevicePath (Device); + + TrustedConsoleDevicepath =3D NULL; + + switch (ConsoleType) { + case ConIn: + TrustedConsoleDevicepath =3D PcdGetPtr (PcdTrustedConsoleInputDevice= Path); + break; + case ConOut: + // + // Check GOP and remove last node + // + TempDevicePath =3D ConsoleDevice; + while (!IsDevicePathEndType (TempDevicePath)) { + if (DevicePathType (TempDevicePath) =3D=3D ACPI_DEVICE_PATH && + DevicePathSubType (TempDevicePath) =3D=3D ACPI_ADR_DP) { + SetDevicePathEndNode (TempDevicePath); + break; + } + TempDevicePath =3D NextDevicePathNode (TempDevicePath); + } + + TrustedConsoleDevicepath =3D PcdGetPtr (PcdTrustedConsoleOutputDevic= ePath); + break; + default: + ASSERT (FALSE); + break; + } + + TempDevicePath =3D TrustedConsoleDevicepath; + do { + Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); + if (Instance =3D=3D NULL) { + break; + } + + if (CompareMem (ConsoleDevice, Instance, Size - END_DEVICE_PATH_LENGTH= ) =3D=3D 0) { + FreePool (Instance); + FreePool (ConsoleDevice); + return TRUE; + } + + FreePool (Instance); + } while (TempDevicePath !=3D NULL); + + FreePool (ConsoleDevice); + + return FALSE; +} + + +/** + Return whether the USB device path is in a short form. + + @param DevicePath The device path to be tested. + + @retval TRUE The device path is in short form. + @retval FALSE The device path is not in short form. +**/ +BOOLEAN +IsUsbShortForm ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +{ + if ((DevicePathType (DevicePath) =3D=3D MESSAGING_DEVICE_PATH) && + ((DevicePathSubType (DevicePath) =3D=3D MSG_USB_CLASS_DP) || + (DevicePathSubType (DevicePath) =3D=3D MSG_USB_WWID_DP)) ) { + return TRUE; + } + + return FALSE; +} + +/** + Connect the USB short form device path. + + @param DevicePath USB short form device path + + @retval EFI_SUCCESS Successfully connected the USB device + @retval EFI_NOT_FOUND Cannot connect the USB device + @retval EFI_INVALID_PARAMETER The device path is invalid. +**/ +EFI_STATUS +ConnectUsbShortFormDevicePath ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +{ + EFI_STATUS Status; + EFI_HANDLE *Handles; + UINTN HandleCount; + UINTN Index; + EFI_PCI_IO_PROTOCOL *PciIo; + UINT8 Class[3]; + BOOLEAN AtLeastOneConnected; + + // + // Check the passed in parameters + // + if (DevicePath =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + if (!IsUsbShortForm (DevicePath)) { + return EFI_INVALID_PARAMETER; + } + + // + // Find the usb host controller firstly, then connect with the remaining= device path + // + AtLeastOneConnected =3D FALSE; + Status =3D gBS->LocateHandleBuffer ( + ByProtocol, + &gEfiPciIoProtocolGuid, + NULL, + &HandleCount, + &Handles + ); + for (Index =3D 0; Index < HandleCount; Index++) { + Status =3D gBS->HandleProtocol ( + Handles[Index], + &gEfiPciIoProtocolGuid, + (VOID **) &PciIo + ); + if (!EFI_ERROR (Status)) { + // + // Check whether the Pci device is the wanted usb host controller + // + Status =3D PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Cla= ss); + if (!EFI_ERROR (Status) && + ((PCI_CLASS_SERIAL =3D=3D Class[2]) && (PCI_CLASS_SERIAL_USB =3D= =3D Class[1]))) { + Status =3D gBS->ConnectController ( + Handles[Index], + NULL, + DevicePath, + FALSE + ); + if (!EFI_ERROR(Status)) { + AtLeastOneConnected =3D TRUE; + } + } + } + } + + return AtLeastOneConnected ? EFI_SUCCESS : EFI_NOT_FOUND; +} + + +/** + Return whether the Handle is a vga handle. + + @param Handle The handle to be tested. + + @retval TRUE The handle is a vga handle. + @retval FALSE The handle is not a vga handle.. +**/ +BOOLEAN +IsVgaHandle ( + IN EFI_HANDLE Handle + ) +{ + EFI_PCI_IO_PROTOCOL *PciIo; + PCI_TYPE00 Pci; + EFI_STATUS Status; + + Status =3D gBS->HandleProtocol ( + Handle, + &gEfiPciIoProtocolGuid, + (VOID **)&PciIo + ); + if (!EFI_ERROR (Status)) { + Status =3D PciIo->Pci.Read ( + PciIo, + EfiPciIoWidthUint32, + 0, + sizeof (Pci) / sizeof (UINT32), + &Pci + ); + if (!EFI_ERROR (Status)) { + if (IS_PCI_VGA (&Pci) || IS_PCI_OLD_VGA (&Pci)) { + return TRUE; + } + } + } + return FALSE; +} + + +/** + Return whether the device path points to a video controller. + + @param DevicePath The device path to be tested. + + @retval TRUE The device path points to a video controller. + @retval FALSE The device path does not point to a video controller. +**/ +EFI_HANDLE +IsVideoController ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +{ + EFI_DEVICE_PATH_PROTOCOL *DupDevicePath; + EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; + EFI_STATUS Status; + EFI_HANDLE DeviceHandle; + + DupDevicePath =3D DuplicateDevicePath (DevicePath); + ASSERT (DupDevicePath !=3D NULL); + if (DupDevicePath =3D=3D NULL) { + return NULL; + } + + TempDevicePath =3D DupDevicePath; + Status =3D gBS->LocateDevicePath ( + &gEfiDevicePathProtocolGuid, + &TempDevicePath, + &DeviceHandle + ); + FreePool (DupDevicePath); + if (EFI_ERROR (Status)) { + return NULL; + } + + if (IsVgaHandle (DeviceHandle)) { + return DeviceHandle; + } else { + return NULL; + } +} + + +/** + Return whether the device path is a GOP device path. + + @param DevicePath The device path to be tested. + + @retval TRUE The device path is a GOP device path. + @retval FALSE The device on the device path is not a GOP device path. +**/ +BOOLEAN +IsGopDevicePath ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +{ + while (!IsDevicePathEndType (DevicePath)) { + if (DevicePathType (DevicePath) =3D=3D ACPI_DEVICE_PATH && + DevicePathSubType (DevicePath) =3D=3D ACPI_ADR_DP) { + return TRUE; + } + DevicePath =3D NextDevicePathNode (DevicePath); + } + return FALSE; +} + + +/** + Remove all GOP device path instance from DevicePath and add the Gop to t= he DevicePath. + + @param DevicePath The device path to be removed + @param Gop The device path to be added. + + @retval Return The updated device path. +**/ +EFI_DEVICE_PATH_PROTOCOL * +UpdateGopDevicePath ( + EFI_DEVICE_PATH_PROTOCOL *DevicePath, + EFI_DEVICE_PATH_PROTOCOL *Gop + ) +{ + UINTN Size; + UINTN GopSize; + EFI_DEVICE_PATH_PROTOCOL *Temp; + EFI_DEVICE_PATH_PROTOCOL *Return; + EFI_DEVICE_PATH_PROTOCOL *Instance; + BOOLEAN Exist; + + Exist =3D FALSE; + Return =3D NULL; + GopSize =3D GetDevicePathSize (Gop); + do { + Instance =3D GetNextDevicePathInstance (&DevicePath, &Size); + if (Instance =3D=3D NULL) { + break; + } + if (!IsGopDevicePath (Instance) || + (Size =3D=3D GopSize && CompareMem (Instance, Gop, GopSize) =3D=3D= 0) + ) { + if (Size =3D=3D GopSize && CompareMem (Instance, Gop, GopSize) =3D= =3D 0) { + Exist =3D TRUE; + } + Temp =3D Return; + Return =3D AppendDevicePathInstance (Return, Instance); + if (Temp !=3D NULL) { + FreePool (Temp); + } + } + FreePool (Instance); + } while (DevicePath !=3D NULL); + + if (!Exist) { + Temp =3D Return; + Return =3D AppendDevicePathInstance (Return, Gop); + if (Temp !=3D NULL) { + FreePool (Temp); + } + } + return Return; +} + + +/** + Get Graphics Controller Handle. + + @param NeedTrustedConsole The flag to determine if trusted console + or non trusted console should be returned + + @retval NULL Console not found + @retval PciHandles Successfully located +**/ +EFI_HANDLE +EFIAPI +GetGraphicsController ( + IN BOOLEAN NeedTrustedConsole + ) +{ + EFI_STATUS Status; + UINTN Index; + EFI_HANDLE *PciHandles; + UINTN PciHandlesSize; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + Status =3D gBS->LocateHandleBuffer ( + ByProtocol, + &gEfiPciIoProtocolGuid, + NULL, + &PciHandlesSize, + &PciHandles + ); + if (EFI_ERROR (Status)) { + return NULL; + } + + for (Index =3D 0; Index < PciHandlesSize; Index++) { + Status =3D gBS->HandleProtocol ( + PciHandles[Index], + &gEfiDevicePathProtocolGuid, + (VOID **) &DevicePath + ); + if (EFI_ERROR(Status)) { + continue; + } + if (!IsVgaHandle (PciHandles[Index])) { + continue; + } + if ((NeedTrustedConsole && IsTrustedConsole (ConOut, DevicePath)) || + ((!NeedTrustedConsole) && (!IsTrustedConsole (ConOut, DevicePath))= )) { + return PciHandles[Index]; + } + } + + return NULL; +} + + +/** + Updates Graphic ConOut variable. + + @param NeedTrustedConsole The flag that determines if trusted console + or non trusted console should be returned +**/ +VOID +UpdateGraphicConOut ( + IN BOOLEAN NeedTrustedConsole + ) +{ + EFI_HANDLE GraphicsControllerHandle; + EFI_DEVICE_PATH_PROTOCOL *GopDevicePath; + EFI_DEVICE_PATH_PROTOCOL *ConOutDevicePath; + EFI_DEVICE_PATH_PROTOCOL *UpdatedConOutDevicePath; + + // + // Update ConOut variable + // + GraphicsControllerHandle =3D GetGraphicsController (NeedTrustedConsole); + if (GraphicsControllerHandle !=3D NULL) { + // + // Connect the GOP driver + // + gBS->ConnectController (GraphicsControllerHandle, NULL, NULL, TRUE); + + // + // Get the GOP device path + // NOTE: We may get a device path that contains Controller node in it. + // + GopDevicePath =3D EfiBootManagerGetGopDevicePath (GraphicsControllerHa= ndle); + if (GopDevicePath !=3D NULL) { + GetEfiGlobalVariable2 (L"ConOut", (VOID **)&ConOutDevicePath, NULL); + UpdatedConOutDevicePath =3D UpdateGopDevicePath (ConOutDevicePath, G= opDevicePath); + if (ConOutDevicePath !=3D NULL) { + FreePool (ConOutDevicePath); + } + FreePool (GopDevicePath); + gRT->SetVariable ( + L"ConOut", + &gEfiGlobalVariableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACC= ESS | EFI_VARIABLE_BOOTSERVICE_ACCESS, + GetDevicePathSize (UpdatedConOutDevicePath), + UpdatedConOutDevicePath + ); + } + } +} + + +/** + The function connects the trusted consoles. +**/ +VOID +ConnectTrustedConsole ( + VOID + ) +{ + EFI_DEVICE_PATH_PROTOCOL *Consoles; + EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; + EFI_DEVICE_PATH_PROTOCOL *Instance; + EFI_DEVICE_PATH_PROTOCOL *Next; + UINTN Size; + UINTN Index; + EFI_HANDLE Handle; + EFI_STATUS Status; + CHAR16 *ConsoleVar[] =3D {L"ConIn", L"ConOut"}; + VOID *TrustedConsoleDevicepath; + + TrustedConsoleDevicepath =3D PcdGetPtr (PcdTrustedConsoleInputDevicePath= ); + DumpDevicePath (L"TrustedConsoleIn", TrustedConsoleDevicepath); + TrustedConsoleDevicepath =3D PcdGetPtr (PcdTrustedConsoleOutputDevicePat= h); + DumpDevicePath (L"TrustedConsoleOut", TrustedConsoleDevicepath); + + for (Index =3D 0; Index < sizeof (ConsoleVar) / sizeof (ConsoleVar[0]); = Index++) { + + GetEfiGlobalVariable2 (ConsoleVar[Index], (VOID **)&Consoles, NULL); + + TempDevicePath =3D Consoles; + do { + Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); + if (Instance =3D=3D NULL) { + break; + } + if (IsTrustedConsole (Index, Instance)) { + if (IsUsbShortForm (Instance)) { + ConnectUsbShortFormDevicePath (Instance); + } else { + for (Next =3D Instance; !IsDevicePathEnd (Next); Next =3D NextDe= vicePathNode (Next)) { + if (DevicePathType (Next) =3D=3D ACPI_DEVICE_PATH && DevicePat= hSubType (Next) =3D=3D ACPI_ADR_DP) { + break; + } else if (DevicePathType (Next) =3D=3D HARDWARE_DEVICE_PATH && + DevicePathSubType (Next) =3D=3D HW_CONTROLLER_DP && + DevicePathType (NextDevicePathNode (Next)) =3D=3D A= CPI_DEVICE_PATH && + DevicePathSubType (NextDevicePathNode (Next)) =3D= =3D ACPI_ADR_DP + ) { + break; + } + } + if (!IsDevicePathEnd (Next)) { + SetDevicePathEndNode (Next); + Status =3D EfiBootManagerConnectDevicePath (Instance, &Handle); + if (!EFI_ERROR (Status)) { + gBS->ConnectController (Handle, NULL, NULL, TRUE); + } + } else { + EfiBootManagerConnectDevicePath (Instance, NULL); + } + } + } + FreePool (Instance); + } while (TempDevicePath !=3D NULL); + + if (Consoles !=3D NULL) { + FreePool (Consoles); + } + } +} + + +/** + The function connects the trusted Storages. +**/ +VOID +ConnectTrustedStorage ( + VOID + ) +{ + VOID *TrustedStorageDevicepath; + EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; + EFI_DEVICE_PATH_PROTOCOL *Instance; + UINTN Size; + EFI_DEVICE_PATH_PROTOCOL *TempStorageDevicePath; + EFI_STATUS Status; + EFI_HANDLE DeviceHandle; + + TrustedStorageDevicepath =3D PcdGetPtr (PcdTrustedStorageDevicePath); + DumpDevicePath (L"TrustedStorage", TrustedStorageDevicepath); + + TempDevicePath =3D TrustedStorageDevicepath; + do { + Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); + if (Instance =3D=3D NULL) { + break; + } + + EfiBootManagerConnectDevicePath (Instance, NULL); + + TempStorageDevicePath =3D Instance; + + Status =3D gBS->LocateDevicePath ( + &gEfiDevicePathProtocolGuid, + &TempStorageDevicePath, + &DeviceHandle + ); + if (!EFI_ERROR (Status)) { + gBS->ConnectController (DeviceHandle, NULL, NULL, FALSE); + } + + FreePool (Instance); + } while (TempDevicePath !=3D NULL); +} + + +/** + Check if current BootCurrent variable is internal shell boot option. + + @retval TRUE BootCurrent is internal shell. + @retval FALSE BootCurrent is not internal shell. +**/ +BOOLEAN +BootCurrentIsInternalShell ( + VOID + ) +{ + UINTN VarSize; + UINT16 BootCurrent; + CHAR16 BootOptionName[16]; + UINT8 *BootOption; + UINT8 *Ptr; + BOOLEAN Result; + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; + EFI_DEVICE_PATH_PROTOCOL *LastDeviceNode; + EFI_GUID *GuidPoint; + + BootOption =3D NULL; + Result =3D FALSE; + + // + // Get BootCurrent variable + // + VarSize =3D sizeof (UINT16); + Status =3D gRT->GetVariable ( + L"BootCurrent", + &gEfiGlobalVariableGuid, + NULL, + &VarSize, + &BootCurrent + ); + if (EFI_ERROR (Status)) { + return FALSE; + } + + // + // Create boot option Bootxxxx from BootCurrent + // + UnicodeSPrint (BootOptionName, sizeof(BootOptionName), L"Boot%04X", Boot= Current); + + GetEfiGlobalVariable2 (BootOptionName, (VOID **) &BootOption, &VarSize); + if (BootOption =3D=3D NULL || VarSize =3D=3D 0) { + return FALSE; + } + + Ptr =3D BootOption; + Ptr +=3D sizeof (UINT32); + Ptr +=3D sizeof (UINT16); + Ptr +=3D StrSize ((CHAR16 *) Ptr); + TempDevicePath =3D (EFI_DEVICE_PATH_PROTOCOL *) Ptr; + LastDeviceNode =3D TempDevicePath; + while (!IsDevicePathEnd (TempDevicePath)) { + LastDeviceNode =3D TempDevicePath; + TempDevicePath =3D NextDevicePathNode (TempDevicePath); + } + GuidPoint =3D EfiGetNameGuidFromFwVolDevicePathNode ( + (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode + ); + if ((GuidPoint !=3D NULL) && + ((CompareGuid (GuidPoint, &gUefiShellFileGuid)))) { + // + // if this option is internal shell, return TRUE + // + Result =3D TRUE; + } + + if (BootOption !=3D NULL) { + FreePool (BootOption); + BootOption =3D NULL; + } + + return Result; +} + +/** + This function will change video resolution and text mode + for internl shell when internal shell is launched. + + @param None. + + @retval EFI_SUCCESS Mode is changed successfully. + @retval Others Mode failed to changed. +**/ +EFI_STATUS +EFIAPI +ChangeModeForInternalShell ( + VOID + ) +{ + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut; + UINTN SizeOfInfo; + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; + UINT32 MaxGopMode; + UINT32 MaxTextMode; + UINT32 ModeNumber; + UINTN HandleCount; + EFI_HANDLE *HandleBuffer; + EFI_STATUS Status; + UINTN Index; + UINTN CurrentColumn; + UINTN CurrentRow; + + // + // Internal shell mode + // + UINT32 mShellModeColumn; + UINT32 mShellModeRow; + UINT32 mShellHorizontalResolution; + UINT32 mShellVerticalResolution; + + + // + // Get user defined text mode for internal shell only once. + // + mShellHorizontalResolution =3D PcdGet32 (PcdSetupVideoHorizontalResoluti= on); + mShellVerticalResolution =3D PcdGet32 (PcdSetupVideoVerticalResolution= ); + mShellModeColumn =3D PcdGet32 (PcdSetupConOutColumn); + mShellModeRow =3D PcdGet32 (PcdSetupConOutRow); + + + Status =3D gBS->HandleProtocol ( + gST->ConsoleOutHandle, + &gEfiGraphicsOutputProtocolGuid, + (VOID**)&GraphicsOutput + ); + if (EFI_ERROR (Status)) { + GraphicsOutput =3D NULL; + } + + Status =3D gBS->HandleProtocol ( + gST->ConsoleOutHandle, + &gEfiSimpleTextOutProtocolGuid, + (VOID**)&SimpleTextOut + ); + if (EFI_ERROR (Status)) { + SimpleTextOut =3D NULL; + } + + if ((GraphicsOutput =3D=3D NULL) || (SimpleTextOut =3D=3D NULL)) { + return EFI_UNSUPPORTED; + } + + MaxGopMode =3D GraphicsOutput->Mode->MaxMode; + MaxTextMode =3D SimpleTextOut->Mode->MaxMode; + + // + // 1. If current video resolution is same with new video resolution, + // video resolution need not be changed. + // 1.1. If current text mode is same with new text mode, text mode ne= ed not be change. + // 1.2. If current text mode is different with new text mode, text mo= de need be change to new text mode. + // 2. If current video resolution is different with new video resolution= , we need restart whole console drivers. + // + for (ModeNumber =3D 0; ModeNumber < MaxGopMode; ModeNumber++) { + Status =3D GraphicsOutput->QueryMode ( + GraphicsOutput, + ModeNumber, + &SizeOfInfo, + &Info + ); + if (!EFI_ERROR (Status)) { + if ((Info->HorizontalResolution =3D=3D mShellHorizontalResolution) && + (Info->VerticalResolution =3D=3D mShellVerticalResolution)) { + if ((GraphicsOutput->Mode->Info->HorizontalResolution =3D=3D mShel= lHorizontalResolution) && + (GraphicsOutput->Mode->Info->VerticalResolution =3D=3D mShellVer= ticalResolution)) { + // + // If current video resolution is same with new resolution, + // then check if current text mode is same with new text mode. + // + Status =3D SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOu= t->Mode->Mode, &CurrentColumn, &CurrentRow); + ASSERT_EFI_ERROR (Status); + if (CurrentColumn =3D=3D mShellModeColumn && CurrentRow =3D=3D m= ShellModeRow) { + // + // Current text mode is same with new text mode, text mode nee= d not be change. + // + FreePool (Info); + return EFI_SUCCESS; + } else { + // + // Current text mode is different with new text mode, text mod= e need be change to new text mode. + // + for (Index =3D 0; Index < MaxTextMode; Index++) { + Status =3D SimpleTextOut->QueryMode (SimpleTextOut, Index, &= CurrentColumn, &CurrentRow); + if (!EFI_ERROR(Status)) { + if ((CurrentColumn =3D=3D mShellModeColumn) && (CurrentRow= =3D=3D mShellModeRow)) { + // + // New text mode is supported, set it. + // + Status =3D SimpleTextOut->SetMode (SimpleTextOut, Index); + ASSERT_EFI_ERROR (Status); + // + // Update text mode PCD. + // + Status =3D PcdSet32S (PcdConOutColumn, mShellModeColumn); + ASSERT_EFI_ERROR (Status); + + Status =3D PcdSet32S (PcdConOutRow, mShellModeRow); + ASSERT_EFI_ERROR (Status); + + FreePool (Info); + return EFI_SUCCESS; + } + } + } + if (Index =3D=3D MaxTextMode) { + // + // If new text mode is not supported, return error. + // + FreePool (Info); + return EFI_UNSUPPORTED; + } + } + } else { + FreePool (Info); + // + // If current video resolution is not same with the new one, set= new video resolution. + // In this case, the driver which produces simple text out need = be restarted. + // + Status =3D GraphicsOutput->SetMode (GraphicsOutput, ModeNumber); + if (!EFI_ERROR (Status)) { + // + // Set PCD to restart GraphicsConsole and Consplitter to chang= e video resolution + // and produce new text mode based on new resolution. + // + Status =3D PcdSet32S (PcdVideoHorizontalResolution, mShellHori= zontalResolution); + ASSERT_EFI_ERROR (Status); + + Status =3D PcdSet32S (PcdVideoVerticalResolution, mShellVertic= alResolution); + ASSERT_EFI_ERROR (Status); + + Status =3D PcdSet32S (PcdConOutColumn, mShellModeColumn); + ASSERT_EFI_ERROR (Status); + + Status =3D PcdSet32S (PcdConOutRow, mShellModeRow); + ASSERT_EFI_ERROR (Status); + + Status =3D gBS->LocateHandleBuffer ( + ByProtocol, + &gEfiSimpleTextOutProtocolGuid, + NULL, + &HandleCount, + &HandleBuffer + ); + if (!EFI_ERROR (Status)) { + for (Index =3D 0; Index < HandleCount; Index++) { + gBS->DisconnectController (HandleBuffer[Index], NULL, NULL= ); + } + for (Index =3D 0; Index < HandleCount; Index++) { + gBS->ConnectController (HandleBuffer[Index], NULL, NULL, T= RUE); + } + if (HandleBuffer !=3D NULL) { + FreePool (HandleBuffer); + } + break; + } + } + } + } + FreePool (Info); + } + } + + if (ModeNumber =3D=3D MaxGopMode) { + // + // If the new resolution is not supported, return error. + // + return EFI_UNSUPPORTED; + } + + return EFI_SUCCESS; +} + + +/** + The function connects the trusted consoles and then call the PP processi= ng library interface. +**/ +VOID +ProcessTcgPp ( + VOID + ) +{ + gPPRequireUIConfirm |=3D Tcg2PhysicalPresenceLibNeedUserConfirm(); + + if (gPPRequireUIConfirm) { + ConnectTrustedConsole (); + } + + Tcg2PhysicalPresenceLibProcessRequest (NULL); +} + + +/** + The function connects the trusted storage to perform TPerReset. +**/ +VOID +ProcessTcgMor ( + VOID + ) +{ + if (IsMorBitSet ()) { + ConnectTrustedConsole(); + ConnectTrustedStorage(); + } +} + + +/** + Update the ConIn variable with USB Keyboard device path,if its not alrea= dy exists in ConIn +**/ +VOID +EnumUsbKeyboard ( + VOID + ) +{ + DEBUG ((DEBUG_INFO, "[EnumUsbKeyboard]\n")); + EfiBootManagerUpdateConsoleVariable (ConIn, (EFI_DEVICE_PATH_PROTOCOL *)= &gUsbClassKeyboardDevicePath, NULL); + // + // Append Usb Keyboard short form DevicePath into "ConInDev" + // + EfiBootManagerUpdateConsoleVariable (ConInDev, (EFI_DEVICE_PATH_PROTOCOL= *) &gUsbClassKeyboardDevicePath, NULL); +} + + +/** + Connect with predeined platform connect sequence, + the OEM/IBV can customize with their own connect sequence. + + @param[in] BootMode Boot mode of this boot. +**/ +VOID +ConnectSequence ( + IN EFI_BOOT_MODE BootMode + ) +{ + EfiBootManagerConnectAll (); +} + + +/** + The function is to consider the boot order which is not in our expectati= on. + In the case that we need to re-sort the boot option. + + @retval TRUE Need to sort Boot Option. + @retval FALSE Don't need to sort Boot Option. +**/ +BOOLEAN +IsNeedSortBootOption ( + VOID + ) +{ + EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; + UINTN BootOptionCount; + + BootOptions =3D EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOpti= onTypeBoot); + + // + // If setup is the first priority in boot option, we need to sort boot o= ption. + // + if ((BootOptionCount > 1) && + (((StrnCmp (BootOptions->Description, L"Enter Setup", StrLen (L"Enter = Setup"))) =3D=3D 0) || + ((StrnCmp (BootOptions->Description, L"BootManagerMenuApp", StrLen (L"= BootManagerMenuApp"))) =3D=3D 0))) { + return TRUE; + } + + return FALSE; +} + + +/** + Connects Root Bridge + **/ +VOID +ConnectRootBridge ( + BOOLEAN Recursive + ) +{ + UINTN RootBridgeHandleCount; + EFI_HANDLE *RootBridgeHandleBuffer; + UINTN RootBridgeIndex; + + RootBridgeHandleCount =3D 0; + gBS->LocateHandleBuffer ( + ByProtocol, + &gEfiPciRootBridgeIoProtocolGuid, + NULL, + &RootBridgeHandleCount, + &RootBridgeHandleBuffer + ); + for (RootBridgeIndex =3D 0; RootBridgeIndex < RootBridgeHandleCount; Roo= tBridgeIndex++) { + gBS->ConnectController (RootBridgeHandleBuffer[RootBridgeIndex], NULL,= NULL, Recursive); + } +} + +VOID +AddConsoleVariable ( + IN CONSOLE_TYPE ConsoleType, + IN EFI_DEVICE_PATH *ConsoleDevicePath + ) +{ + EFI_DEVICE_PATH *TempDevicePath; + EFI_DEVICE_PATH *Instance; + UINTN Size; + EFI_HANDLE GraphicsControllerHandle; + EFI_DEVICE_PATH *GopDevicePath; + + TempDevicePath =3D ConsoleDevicePath; + do { + Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); + if (Instance =3D=3D NULL) { + break; + } + + switch (ConsoleType) { + case ConIn: + if (IsUsbShortForm (Instance)) { + // + // Append Usb Keyboard short form DevicePath into "ConInDev" + // + EfiBootManagerUpdateConsoleVariable (ConInDev, Instance, NULL); + } + EfiBootManagerUpdateConsoleVariable (ConsoleType, Instance, NULL); + break; + case ConOut: + GraphicsControllerHandle =3D IsVideoController (Instance); + if (GraphicsControllerHandle =3D=3D NULL) { + EfiBootManagerUpdateConsoleVariable (ConsoleType, Instance, NULL= ); + } else { + // + // Connect the GOP driver + // + gBS->ConnectController (GraphicsControllerHandle, NULL, NULL, TR= UE); + // + // Get the GOP device path + // NOTE: We may get a device path that contains Controller node = in it. + // + GopDevicePath =3D EfiBootManagerGetGopDevicePath (GraphicsContro= llerHandle); + if (GopDevicePath !=3D NULL) { + EfiBootManagerUpdateConsoleVariable (ConsoleType, GopDevicePat= h, NULL); + } + } + break; + default: + ASSERT(FALSE); + break; + } + + FreePool (Instance); + } while (TempDevicePath !=3D NULL); +} + + +/** + This is the callback function for PCI ENUMERATION COMPLETE. + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +EFIAPI +BdsPciEnumCompleteCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + VOID *ProtocolPointer; + EFI_DEVICE_PATH_PROTOCOL *VarConOut; + EFI_DEVICE_PATH_PROTOCOL *VarConIn; + + Status =3D EFI_SUCCESS; + + // + // Check if this is first time called by EfiCreateProtocolNotifyEvent() = or not, + // if it is, we will skip it until real event is triggered + // + Status =3D gBS->LocateProtocol (&gEfiPciEnumerationCompleteProtocolGuid,= NULL, (VOID **) &ProtocolPointer); + if (EFI_SUCCESS !=3D Status) { + return; + } + //gBS->CloseEvent (Event); + + + DEBUG ((DEBUG_INFO, "Event BdsPciEnumCompleteCallback callback starts\n"= )); + + gBootMode =3D GetBootModeHob (); + + // + // Connect Root Bridge to make PCI BAR resource allocated and all PciIo = created + // + ConnectRootBridge (FALSE); + + // + // Fill ConIn/ConOut in Full Configuration boot mode + // + DEBUG ((DEBUG_INFO, "PlatformBootManagerInit - %x\n", gBootMode)); + + + if (gBootMode =3D=3D BOOT_WITH_FULL_CONFIGURATION || + gBootMode =3D=3D BOOT_WITH_DEFAULT_SETTINGS || + gBootMode =3D=3D BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS || + gBootMode =3D=3D BOOT_IN_RECOVERY_MODE) { + + GetEfiGlobalVariable2 (L"ConOut", (VOID **)&VarConOut, NULL); + if (VarConOut !=3D NULL) { + FreePool (VarConOut); + } + + GetEfiGlobalVariable2 (L"ConIn", (VOID **)&VarConIn, NULL); + if (VarConIn !=3D NULL) { + FreePool (VarConIn); + } + + // + // Only fill ConIn/ConOut when ConIn/ConOut is empty because we may dr= op to Full Configuration boot mode in non-first boot + // + if (VarConOut =3D=3D NULL || VarConIn =3D=3D NULL) { + if (PcdGetSize (PcdTrustedConsoleOutputDevicePath) >=3D sizeof(EFI_D= EVICE_PATH_PROTOCOL)) { + AddConsoleVariable (ConOut, PcdGetPtr (PcdTrustedConsoleOutputDevi= cePath)); + } + if (PcdGetSize (PcdTrustedConsoleInputDevicePath) >=3D sizeof(EFI_DE= VICE_PATH_PROTOCOL)) { + AddConsoleVariable (ConIn, PcdGetPtr (PcdTrustedConsoleInputDevice= Path)); + } + } + } + +} + +/** + This is the callback function for Smm Ready To Lock. + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +EFIAPI +BdsSmmReadyToLockCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + VOID *ProtocolPointer; + EFI_STATUS Status; + // + // Check if this is first time called by EfiCreateProtocolNotifyEvent() = or not, + // if it is, we will skip it until real event is triggered + // + Status =3D gBS->LocateProtocol (&gEfiDxeSmmReadyToLockProtocolGuid, NULL= , (VOID **) &ProtocolPointer); + if (EFI_SUCCESS !=3D Status) { + return; + } + + DEBUG ((DEBUG_INFO, "Event gEfiDxeSmmReadyToLockProtocolGuid callback st= arts\n")); + + // + // Dispatch the deferred 3rd party images. + // + EfiBootManagerDispatchDeferredImages (); + + // + // For non-trusted console it must be handled here. + // + UpdateGraphicConOut (FALSE); +} + +/** + ReadyToBoot callback to set video and text mode for internal shell boot. + That will not connect USB controller while CSM and FastBoot are disabled= , we need to connect them + before booting to Shell for showing USB devices in Shell. + + When FastBoot is enabled and Windows Console is the chosen Console behav= ior, input devices will not be connected + by default. Hence, when booting to EFI shell, connecting input consoles = are required. + + @param Event Pointer to this event + @param Context Event hanlder private data + + @retval None. +**/ +VOID +EFIAPI +BdsReadyToBootCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + DEBUG ((DEBUG_INFO, "BdsReadyToBootCallback\n")); + + if (BootCurrentIsInternalShell ()) { + + ChangeModeForInternalShell (); + EfiBootManagerConnectAllDefaultConsoles (); + gDS->Dispatch (); + } +} + + +/** + Before console after trusted console event callback + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +BdsBeforeConsoleAfterTrustedConsoleCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + DEBUG ((DEBUG_INFO, "Event gBdsEventBeforeConsoleBeforeEndOfDxeGuid call= back starts\n")); + + // + // Enumerate USB keyboard + // + EnumUsbKeyboard (); + + // + // For trusted console it must be handled here. + // + UpdateGraphicConOut (TRUE); + + // + // Register Boot Options + // + RegisterDefaultBootOption (); + + // + // Register Static Hot keys + // + RegisterStaticHotkey (); + + // + // Process Physical Preo + // + PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7010); + if (PcdGetBool (PcdTpm2Enable)) { + ProcessTcgPp (); + ProcessTcgMor (); + } + PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7011); + + // + // Perform memory test + // We should make all UEFI memory and GCD information populated before E= xitPmAuth. + // SMM may consume these information. + // + MemoryTest((EXTENDMEM_COVERAGE_LEVEL) PcdGet32 (PcdPlatformMemoryCheckLe= vel)); +} + + +/** + Before console before end of DXE event callback + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +BdsBeforeConsoleBeforeEndOfDxeGuidCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + DEBUG ((DEBUG_INFO, "Event gBdsBeforeConsoleBeforeEndOfDxeGuid callback = starts\n")); + +} + + +/** + After console ready before boot option event callback + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +BdsAfterConsoleReadyBeforeBootOptionCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_BOOT_MODE LocalBootMode; + + DEBUG ((DEBUG_INFO, "Event gBdsAfterConsoleReadyBeforeBootOptionEvent ca= llback starts\n")); + // + // Get current Boot Mode + // + LocalBootMode =3D gBootMode; + DEBUG ((DEBUG_INFO, "Current local bootmode - %x\n", LocalBootMode)); + + // + // Go the different platform policy with different boot mode + // Notes: this part code can be change with the table policy + // + switch (LocalBootMode) { + case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES: + case BOOT_WITH_MINIMAL_CONFIGURATION: + case BOOT_ON_S4_RESUME: + // + // Perform some platform specific connect sequence + // + PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7050); + ConnectSequence (LocalBootMode); + PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7051); + + break; + + case BOOT_WITH_FULL_CONFIGURATION: + case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS: + case BOOT_WITH_DEFAULT_SETTINGS: + default: + // + // Perform some platform specific connect sequence + // + ConnectSequence (LocalBootMode); + + // + // Only in Full Configuration boot mode we do the enumeration of boo= t device + // + // + // Dispatch all but Storage Oprom explicitly, because we assume Int1= 3Thunk driver is there. + // + + // + // PXE boot option may appear after boot option enumeration + // + break; + } + + Print (L"Press F7 for BootMenu!\n"); + + EfiBootManagerRefreshAllBootOption (); + + if (IsNeedSortBootOption()) { + EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBootO= ption); + } +} diff --git a/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardBds= HookLib.inf b/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardBd= sHookLib.inf new file mode 100644 index 0000000000..69f3fcb552 --- /dev/null +++ b/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardBdsHookLib= .inf @@ -0,0 +1,95 @@ +### @file +# Module Information file for the Bds Hook Library. +# +# Copyright (c) 2019, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +### + +[Defines] + INF_VERSION =3D 0x00010017 + BASE_NAME =3D BoardBdsHookLib + FILE_GUID =3D 649A7502-7301-4E3A-A99B-EA91AD6DD7A8 + VERSION_STRING =3D 1.0 + MODULE_TYPE =3D DXE_DRIVER + LIBRARY_CLASS =3D BoardBdsHookLib|DXE_DRIVER + +[LibraryClasses] + BaseLib + MemoryAllocationLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + BaseMemoryLib + DebugLib + PcdLib + PrintLib + DevicePathLib + UefiLib + HobLib + DxeServicesLib + DxeServicesTableLib + HiiLib + UefiBootManagerLib + PerformanceLib + TimerLib + Tcg2PhysicalPresenceLib + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + SecurityPkg/SecurityPkg.dec + MinPlatformPkg/MinPlatformPkg.dec + BoardModulePkg/BoardModulePkg.dec + +[Pcd] + gMinPlatformPkgTokenSpaceGuid.PcdTpm2Enable ## CON= SUMES + gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut ## PRO= DUCES + gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution ## PRO= DUCES + gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution ## PRO= DUCES + gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow ## PRO= DUCES + gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn ## PRO= DUCES + gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn ## CON= SUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow ## CON= SUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution ## CON= SUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution ## CON= SUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdConInConnectOnDemand ## PRO= DUCES + gMinPlatformPkgTokenSpaceGuid.PcdPlatformMemoryCheckLevel ## CON= SUMES + gMinPlatformPkgTokenSpaceGuid.PcdBootToShellOnly ## CON= SUMES + gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleInputDevicePath ## CON= SUMES + gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleOutputDevicePath ## CON= SUMES + gMinPlatformPkgTokenSpaceGuid.PcdTrustedStorageDevicePath ## CON= SUMES + +[Sources] + BoardBdsHook.h + BoardBdsHookLib.c + BoardMemoryTest.c + BoardBootOption.c + +[Protocols] + gEfiPciRootBridgeIoProtocolGuid ## CONSUMES + gEfiPciIoProtocolGuid ## CONSUMES + gEfiCpuIo2ProtocolGuid ## CONSUMES + gEfiDxeSmmReadyToLockProtocolGuid ## PRODUCES + gEfiGenericMemTestProtocolGuid ## CONSUMES + gEfiDiskInfoProtocolGuid ## CONSUMES + gEfiDevicePathToTextProtocolGuid ## CONSUMES + gEfiSimpleTextInputExProtocolGuid ## CONSUMES + gEfiFirmwareVolume2ProtocolGuid ## CONSUMES + gEfiFormBrowser2ProtocolGuid ## CONSUMES + gEfiGenericMemTestProtocolGuid ## CONSUMES + gEfiDxeSmmReadyToLockProtocolGuid + +[Guids] + gEfiGlobalVariableGuid ## PRODUCES + gEfiMemoryOverwriteControlDataGuid ## PRODUCES + gEfiEndOfDxeEventGroupGuid ## CONSUMES + gBdsEventBeforeConsoleAfterTrustedConsoleGuid + gBdsEventBeforeConsoleBeforeEndOfDxeGuid + gBdsEventAfterConsoleReadyBeforeBootOptionGuid + +[Depex.common.DXE_DRIVER] + gEfiVariableArchProtocolGuid + +[Depex] + TRUE diff --git a/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardBoo= tOption.c b/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardBoot= Option.c new file mode 100644 index 0000000000..87138bdd79 --- /dev/null +++ b/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardBootOption= .c @@ -0,0 +1,598 @@ +/** @file + Driver for Platform Boot Options support. + +Copyright (c) 2019, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "BoardBdsHook.h" + +BOOLEAN mContinueBoot =3D FALSE; +BOOLEAN mBootMenuBoot =3D FALSE; +BOOLEAN mPxeBoot =3D FALSE; +BOOLEAN mHotKeypressed =3D FALSE; +EFI_EVENT HotKeyEvent =3D NULL; + +UINTN mBootMenuOptionNumber; + + +/** + This function will create a SHELL BootOption to boot. + + @return Shell Device path for booting. +**/ +EFI_DEVICE_PATH_PROTOCOL * +BdsCreateShellDevicePath ( + VOID + ) +{ + UINTN FvHandleCount; + EFI_HANDLE *FvHandleBuffer; + UINTN Index; + EFI_STATUS Status; + EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; + UINTN Size; + UINT32 AuthenticationStatus; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + VOID *Buffer; + + DevicePath =3D NULL; + Status =3D EFI_SUCCESS; + + DEBUG ((DEBUG_INFO, "BdsCreateShellDevicePath\n")); + gBS->LocateHandleBuffer ( + ByProtocol, + &gEfiFirmwareVolume2ProtocolGuid, + NULL, + &FvHandleCount, + &FvHandleBuffer + ); + + for (Index =3D 0; Index < FvHandleCount; Index++) { + gBS->HandleProtocol ( + FvHandleBuffer[Index], + &gEfiFirmwareVolume2ProtocolGuid, + (VOID **) &Fv + ); + + Buffer =3D NULL; + Size =3D 0; + Status =3D Fv->ReadSection ( + Fv, + &gUefiShellFileGuid, + EFI_SECTION_PE32, + 0, + &Buffer, + &Size, + &AuthenticationStatus + ); + if (EFI_ERROR (Status)) { + // + // Skip if no shell file in the FV + // + continue; + } else { + // + // Found the shell + // + break; + } + } + + if (EFI_ERROR (Status)) { + // + // No shell present + // + if (FvHandleCount) { + FreePool (FvHandleBuffer); + } + return NULL; + } + // + // Build the shell boot option + // + DevicePath =3D DevicePathFromHandle (FvHandleBuffer[Index]); + + if (FvHandleCount) { + FreePool (FvHandleBuffer); + } + + return DevicePath; +} + + +EFI_STATUS +CreateFvBootOption ( + EFI_GUID *FileGuid, + CHAR16 *Description, + EFI_BOOT_MANAGER_LOAD_OPTION *BootOption, + UINT32 Attributes, + UINT8 *OptionalData, OPTIONAL + UINT32 OptionalDataSize + ) +{ + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; + MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode; + EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; + UINT32 AuthenticationStatus; + VOID *Buffer; + UINTN Size; + + if ((BootOption =3D=3D NULL) || (FileGuid =3D=3D NULL) || (Description = =3D=3D NULL)) { + return EFI_INVALID_PARAMETER; + } + + EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid); + + if (!CompareGuid (&gUefiShellFileGuid, FileGuid)) { + Status =3D gBS->HandleProtocol ( + gImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID **) &LoadedImage + ); + if (!EFI_ERROR (Status)) { + Status =3D gBS->HandleProtocol ( + LoadedImage->DeviceHandle, + &gEfiFirmwareVolume2ProtocolGuid, + (VOID **) &Fv + ); + if (!EFI_ERROR (Status)) { + Buffer =3D NULL; + Size =3D 0; + Status =3D Fv->ReadSection ( + Fv, + FileGuid, + EFI_SECTION_PE32, + 0, + &Buffer, + &Size, + &AuthenticationStatus + ); + if (Buffer !=3D NULL) { + FreePool (Buffer); + } + } + } + if (EFI_ERROR (Status)) { + return EFI_NOT_FOUND; + } + + DevicePath =3D AppendDevicePathNode ( + DevicePathFromHandle (LoadedImage->DeviceHandle), + (EFI_DEVICE_PATH_PROTOCOL *) &FileNode + ); + } else { + DevicePath =3D AppendDevicePathNode ( + BdsCreateShellDevicePath (), + (EFI_DEVICE_PATH_PROTOCOL *) &FileNode + ); + } + + Status =3D EfiBootManagerInitializeLoadOption ( + BootOption, + LoadOptionNumberUnassigned, + LoadOptionTypeBoot, + Attributes, + Description, + DevicePath, + OptionalData, + OptionalDataSize + ); + FreePool (DevicePath); + return Status; +} + +EFI_GUID mUiFile =3D { + 0x462CAA21, 0x7614, 0x4503, { 0x83, 0x6E, 0x8A, 0xB6, 0xF4, 0x66, 0x23, = 0x31 } +}; +EFI_GUID mBootMenuFile =3D { + 0xEEC25BDC, 0x67F2, 0x4D95, { 0xB1, 0xD5, 0xF8, 0x1B, 0x20, 0x39, 0xD1, = 0x1D } +}; + + +/** + Return the index of the load option in the load option array. + + The function consider two load options are equal when the + OptionType, Attributes, Description, FilePath and OptionalData are equal. + + @param Key Pointer to the load option to be found. + @param Array Pointer to the array of load options to be found. + @param Count Number of entries in the Array. + + @retval -1 Key wasn't found in the Array. + @retval 0 ~ Count-1 The index of the Key in the Array. +**/ +INTN +PlatformFindLoadOption ( + IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Key, + IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Array, + IN UINTN Count + ) +{ + UINTN Index; + + for (Index =3D 0; Index < Count; Index++) { + if ((Key->OptionType =3D=3D Array[Index].OptionType) && + (Key->Attributes =3D=3D Array[Index].Attributes) && + (StrCmp (Key->Description, Array[Index].Description) =3D=3D 0) && + (CompareMem (Key->FilePath, Array[Index].FilePath, GetDevicePathSi= ze (Key->FilePath)) =3D=3D 0) && + (Key->OptionalDataSize =3D=3D Array[Index].OptionalDataSize) && + (CompareMem (Key->OptionalData, Array[Index].OptionalData, Key->Op= tionalDataSize) =3D=3D 0)) { + return (INTN) Index; + } + } + + return -1; +} + + +/** + Registers a boot option + + @param FileGuid Boot file GUID + @param Description Boot option discription + @param Position Position of the new load option to put in = the ****Order variable. + @param Attributes Boot option attributes + @param OptionalData Optional data of the boot option. + @param OptionalDataSize Size of the optional data of the boot opti= on + + @return boot option number +**/ +UINTN +RegisterFvBootOption ( + EFI_GUID *FileGuid, + CHAR16 *Description, + UINTN Position, + UINT32 Attributes, + UINT8 *OptionalData, OPTIONAL + UINT32 OptionalDataSize + ) +{ + EFI_STATUS Status; + UINTN OptionIndex; + EFI_BOOT_MANAGER_LOAD_OPTION NewOption; + EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; + UINTN BootOptionCount; + + NewOption.OptionNumber =3D LoadOptionNumberUnassigned; + Status =3D CreateFvBootOption (FileGuid, Description, &NewOption, Attrib= utes, OptionalData, OptionalDataSize); + if (!EFI_ERROR (Status)) { + BootOptions =3D EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOp= tionTypeBoot); + + OptionIndex =3D PlatformFindLoadOption (&NewOption, BootOptions, BootO= ptionCount); + + if (OptionIndex =3D=3D -1) { + Status =3D EfiBootManagerAddLoadOptionVariable (&NewOption, Position= ); + ASSERT_EFI_ERROR (Status); + } else { + NewOption.OptionNumber =3D BootOptions[OptionIndex].OptionNumber; + } + EfiBootManagerFreeLoadOption (&NewOption); + EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); + } + + return NewOption.OptionNumber; +} + + +/** + Boot manager wait callback + + @param TimeoutRemain The remaingin timeout period +**/ +VOID +EFIAPI +PlatformBootManagerWaitCallback ( + UINT16 TimeoutRemain + ) +{ + EFI_STATUS Status; + EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TxtInEx; + EFI_KEY_DATA KeyData; + BOOLEAN PausePressed; + + // + // Pause on PAUSE key + // + Status =3D gBS->HandleProtocol (gST->ConsoleInHandle, &gEfiSimpleTextInp= utExProtocolGuid, (VOID **) &TxtInEx); + ASSERT_EFI_ERROR (Status); + + PausePressed =3D FALSE; + + while (TRUE) { + Status =3D TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData); + if (EFI_ERROR (Status)) { + break; + } + + if (KeyData.Key.ScanCode =3D=3D SCAN_PAUSE) { + PausePressed =3D TRUE; + break; + } + } + + // + // Loop until non-PAUSE key pressed + // + while (PausePressed) { + Status =3D TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData); + if (!EFI_ERROR (Status)) { + DEBUG (( + DEBUG_INFO, "[PauseCallback] %x/%x %x/%x\n", + KeyData.Key.ScanCode, KeyData.Key.UnicodeChar, + KeyData.KeyState.KeyShiftState, KeyData.KeyState.KeyToggleState + )); + PausePressed =3D (BOOLEAN) (KeyData.Key.ScanCode =3D=3D SCAN_PAUSE); + } + } +} + + +EFI_GUID gUefiShellFileGuid =3D { 0x7C04A583, 0x9E3E, 0x4f1c, { 0xAD, 0x65= , 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 } }; + +#define INTERNAL_UEFI_SHELL_NAME L"Internal UEFI Shell 2.0" +#define UEFI_HARD_DRIVE_NAME L"UEFI Hard Drive" + +/** + Registers default boot option +**/ + +VOID +RegisterDefaultBootOption ( + VOID + ) +{ + UINT16 *ShellData; + UINT32 ShellDataSize; + + ShellData =3D NULL; + ShellDataSize =3D 0; + RegisterFvBootOption (&gUefiShellFileGuid, INTERNAL_UEFI_SHELL_NA= ME, (UINTN) -1, LOAD_OPTION_ACTIVE, (UINT8 *)ShellData, ShellDataSize); + + // + // Boot Menu + // + mBootMenuOptionNumber =3D RegisterFvBootOption (&mBootMenuFile, L"Boot D= evice List", (UINTN) -1, LOAD_OPTION_CATEGORY_APP | LOAD_OPTION_ACTIVE | = LOAD_OPTION_HIDDEN, NULL, 0); + + if (mBootMenuOptionNumber =3D=3D LoadOptionNumberUnassigned) { + DEBUG ((DEBUG_INFO, "BootMenuOptionNumber (%d) should not be same to L= oadOptionNumberUnassigned(%d).\n", mBootMenuOptionNumber, LoadOptionNumberU= nassigned)); + } +#if 0 + // + // Boot Manager Menu + // + EfiInitializeFwVolDevicepathNode (&FileNode, &mUiFile); + + gBS->HandleProtocol ( + gImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID **) &LoadedImage + ); + DevicePath =3D AppendDevicePathNode (DevicePathFromHandle (LoadedImage->= DeviceHandle), (EFI_DEVICE_PATH_PROTOCOL *) &FileNode); +#endif + +} + +/** + Registers/Unregisters boot option hotkey + + @param OptionNumber The boot option number for the key option. + @param Key The the key input + @param Add Flag to indicate to add or remove a key +**/ +VOID +RegisterBootOptionHotkey ( + UINT16 OptionNumber, + EFI_INPUT_KEY *Key, + BOOLEAN Add + ) +{ + EFI_STATUS Status; + + if (!Add) { + // + // No enter hotkey when force to setup or there is no boot option + // + Status =3D EfiBootManagerDeleteKeyOptionVariable (NULL, 0, Key, NULL); + ASSERT (Status =3D=3D EFI_SUCCESS || Status =3D=3D EFI_NOT_FOUND); + } else { + // + // Register enter hotkey for the first boot option + // + Status =3D EfiBootManagerAddKeyOptionVariable (NULL, OptionNumber, 0, = Key,NULL); + ASSERT (Status =3D=3D EFI_SUCCESS || Status =3D=3D EFI_ALREADY_STARTED= ); + } +} + + +/** + Detect key press callback + + @param The key data + + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +DetectKeypressCallback ( + IN EFI_KEY_DATA *KeyData +) +{ + mHotKeypressed =3D TRUE; + + if (HotKeyEvent !=3D NULL) { + gBS->SignalEvent(HotKeyEvent); + } + + return EFI_SUCCESS; +} + +/** + This function is called after all the boot options are enumerated and or= dered properly. +**/ +VOID +RegisterStaticHotkey ( + VOID + ) +{ + + EFI_INPUT_KEY Enter; + EFI_KEY_DATA F2; + EFI_KEY_DATA F7; + BOOLEAN EnterSetup; + EFI_STATUS Status; + EFI_BOOT_MANAGER_LOAD_OPTION BootOption; + + EnterSetup =3D FALSE; + + // + // [Enter] + // + mContinueBoot =3D !EnterSetup; + if (mContinueBoot) { + Enter.ScanCode =3D SCAN_NULL; + Enter.UnicodeChar =3D CHAR_CARRIAGE_RETURN; + EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL); + } + + + // + // [F2]/[F7] + // + F2.Key.ScanCode =3D SCAN_F2; + F2.Key.UnicodeChar =3D CHAR_NULL; + F2.KeyState.KeyShiftState =3D EFI_SHIFT_STATE_VALID; + F2.KeyState.KeyToggleState =3D 0; + Status =3D EfiBootManagerGetBootManagerMenu (&BootOption); + ASSERT_EFI_ERROR (Status); + RegisterBootOptionHotkey ((UINT16) BootOption.OptionNumber, &F2.Key, TRU= E); + EfiBootManagerFreeLoadOption (&BootOption); + + F7.Key.ScanCode =3D SCAN_F7; + F7.Key.UnicodeChar =3D CHAR_NULL; + F7.KeyState.KeyShiftState =3D EFI_SHIFT_STATE_VALID; + F7.KeyState.KeyToggleState =3D 0; + mBootMenuBoot =3D !EnterSetup; + RegisterBootOptionHotkey ((UINT16) mBootMenuOptionNumber, &F7.Key, mBoot= MenuBoot); + +} + + + +/** + Returns the boot option type of a device + + @param DevicePath The path of device whose boot option type + to be returned + @retval -1 Device type not found + @retval > -1 Device type found +**/ +UINT8 +BootOptionType ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +{ + EFI_DEVICE_PATH_PROTOCOL *Node; + EFI_DEVICE_PATH_PROTOCOL *NextNode; + + for (Node =3D DevicePath; !IsDevicePathEndType (Node); Node =3D NextDevi= cePathNode (Node)) { + if (DevicePathType (Node) =3D=3D MESSAGING_DEVICE_PATH) { + // + // Make sure the device path points to the driver device. + // + NextNode =3D NextDevicePathNode (Node); + if (DevicePathSubType(NextNode) =3D=3D MSG_DEVICE_LOGICAL_UNIT_DP) { + // + // if the next node type is Device Logical Unit, which specify the= Logical Unit Number (LUN), + // skip it + // + NextNode =3D NextDevicePathNode (NextNode); + } + if (IsDevicePathEndType (NextNode)) { + if ((DevicePathType (Node) =3D=3D MESSAGING_DEVICE_PATH)) { + return DevicePathSubType (Node); + } else { + return MSG_SATA_DP; + } + } + } + } + + return (UINT8) -1; +} + +/** + Returns the priority number. + OptionType EFI + ------------------------------------ + PXE 2 + DVD 4 + USB 6 + NVME 7 + HDD 8 + EFI Shell 9 + Others 100 + + @param BootOption +**/ +UINTN +BootOptionPriority ( + CONST EFI_BOOT_MANAGER_LOAD_OPTION *BootOption + ) +{ + // + // EFI boot options + // + switch (BootOptionType (BootOption->FilePath)) { + case MSG_MAC_ADDR_DP: + case MSG_VLAN_DP: + case MSG_IPv4_DP: + case MSG_IPv6_DP: + return 2; + + case MSG_SATA_DP: + case MSG_ATAPI_DP: + case MSG_UFS_DP: + case MSG_NVME_NAMESPACE_DP: + return 4; + + case MSG_USB_DP: + return 6; + + } + if (StrCmp (BootOption->Description, INTERNAL_UEFI_SHELL_NAME) =3D=3D = 0) { + if (PcdGetBool (PcdBootToShellOnly)) { + return 0; + } + return 9; + } + if (StrCmp (BootOption->Description, UEFI_HARD_DRIVE_NAME) =3D=3D 0) { + return 8; + } + return 100; +} + +/** + Compares boot priorities of two boot options + + @param Left The left boot option + @param Right The right boot option + + @return The difference between the Left and Right + boot options + **/ +INTN +EFIAPI +CompareBootOption ( + CONST VOID *Left, + CONST VOID *Right + ) +{ + return BootOptionPriority ((EFI_BOOT_MANAGER_LOAD_OPTION *) Left) - + BootOptionPriority ((EFI_BOOT_MANAGER_LOAD_OPTION *) Right); +} + diff --git a/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardMem= oryTest.c b/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardMemo= ryTest.c new file mode 100644 index 0000000000..e3650721fe --- /dev/null +++ b/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/BoardMemoryTest= .c @@ -0,0 +1,83 @@ +/** @file + Perform the platform memory test + +Copyright (c) 2019, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "BoardBdsHook.h" +#include + +/** + Perform the memory test base on the memory test intensive level, + and update the memory resource. + + @param Level The memory test intensive level. + + @retval EFI_STATUS Success test all the system memory and update + the memory resource + +**/ +EFI_STATUS +MemoryTest ( + IN EXTENDMEM_COVERAGE_LEVEL Level + ) +{ + EFI_STATUS Status; + BOOLEAN RequireSoftECCInit; + EFI_GENERIC_MEMORY_TEST_PROTOCOL *GenMemoryTest; + UINT64 TestedMemorySize; + UINT64 TotalMemorySize; + BOOLEAN ErrorOut; + BOOLEAN TestAbort; + + TestedMemorySize =3D 0; + TotalMemorySize =3D 0; + ErrorOut =3D FALSE; + TestAbort =3D FALSE; + + RequireSoftECCInit =3D FALSE; + + Status =3D gBS->LocateProtocol ( + &gEfiGenericMemTestProtocolGuid, + NULL, + (VOID **) &GenMemoryTest + ); + if (EFI_ERROR (Status)) { + return EFI_SUCCESS; + } + + Status =3D GenMemoryTest->MemoryTestInit ( + GenMemoryTest, + Level, + &RequireSoftECCInit + ); + if (Status =3D=3D EFI_NO_MEDIA) { + // + // The PEI codes also have the relevant memory test code to check the = memory, + // it can select to test some range of the memory or all of them. If P= EI code + // checks all the memory, this BDS memory test will has no not-test me= mory to + // do the test, and then the status of EFI_NO_MEDIA will be returned by + // "MemoryTestInit". So it does not need to test memory again, just re= turn. + // + return EFI_SUCCESS; + } + + do { + Status =3D GenMemoryTest->PerformMemoryTest ( + GenMemoryTest, + &TestedMemorySize, + &TotalMemorySize, + &ErrorOut, + TestAbort + ); + if (ErrorOut && (Status =3D=3D EFI_DEVICE_ERROR)) { + ASSERT (0); + } + } while (Status !=3D EFI_NOT_FOUND); + + Status =3D GenMemoryTest->Finished (GenMemoryTest); + + return EFI_SUCCESS; +} --=20 2.19.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52224): https://edk2.groups.io/g/devel/message/52224 Mute This Topic: https://groups.io/mt/68590724/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Tue Nov 26 12:31:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52225+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52225+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1576287160; cv=none; d=zohomail.com; s=zohoarc; b=LIWTITcQHNo7mur4Q/nirDUx+X3fK7nOzoQvMZcncQilFptHwS7Ghj3yn8slBSiiFVaW3OquN4WCAYeDEjs1zAaYqJak7BhW/1qm1Ah3ReQSuWqCygD5QuoNneXtyo6JifqAPlaoqBTm+UWL9sYnxiBytuIMLMraAX5ACGUJuj4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576287160; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=6Tgqw0Be4vZ8f5Sx93TP3yEYKDdDXKTgyZkwjL5FEwE=; b=V47+xleWesvtptKLCfUI5EzfiKVuMjb4zonY5GTm7Dj333Xh8FaR6xtw9NtNzz8AX8kCT7StZMRxoIQ6XAUzKMe1g8oFpcJaoMrX8NL8y4Uui6ZrZJpw7Ls7wLXEqsODbjTTH+c4pQbk3T/8PVY49CTBI3tU+epv0UlZCZSJ49I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52225+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1576287160976605.0402067767174; Fri, 13 Dec 2019 17:32:40 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id yDD4YY1788612xzXUqDo3YC8; Fri, 13 Dec 2019 17:32:39 -0800 X-Received: from mga01.intel.com (mga01.intel.com []) by mx.groups.io with SMTP id smtpd.web10.2430.1576287158438932734 for ; Fri, 13 Dec 2019 17:32:39 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 17:32:38 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,311,1571727600"; d="scan'208";a="297091514" X-Received: from paagyema-desk2.amr.corp.intel.com ([10.24.15.84]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2019 17:32:38 -0800 From: "Agyeman, Prince" To: devel@edk2.groups.io Cc: Michael Kubacki , Chasel Chiu , Nate DeSimone Subject: [edk2-devel] [edk2-platforms] [PATCH 03/11] BoardModulePkg: Add BDS Hook DXE Driver Date: Fri, 13 Dec 2019 17:32:29 -0800 Message-Id: <4917b65e194ea62af08d6a811bc9ae332be2b538.1576282834.git.prince.agyeman@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,prince.agyeman@intel.com X-Gm-Message-State: mzsTi0fc2AkbGOZKxkF33rk0x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1576287159; bh=g0A3JdPul0493TR5BeNqLRBa6qG0vSrz/GS5MHWQNMY=; h=Cc:Date:From:Reply-To:Subject:To; b=ryN9I5w35Vng3mX5NBCLLDFgMvtbM0K/daYVMCruqzQyxN30paablaIXjDOjWJYvUtr Ycw1UNLxKNd1RlpmVmepdyAZwfK+isjzi/Vty7jcfTNcEkfMhI0Eclfp2fvdBi854sWax zBsgCec/AdGSvZYVmeSZD07dR6N35A3j6kA= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2336 This is a sample/generic DXE driver that registers all the BDS hook points or callbacks as defined in BoardBdsHookLib. Cc: Michael Kubacki Cc: Chasel Chiu Cc: Nate DeSimone Signed-off-by: Prince Agyeman Reviewed-by: Michael Kubacki Reviewed-by: Nate DeSimone --- .../BoardBdsHookDxe/BoardBdsHookDxe.c | 121 ++++++++++++++++++ .../BoardBdsHookDxe/BoardBdsHookDxe.inf | 46 +++++++ 2 files changed, 167 insertions(+) create mode 100644 Platform/Intel/BoardModulePkg/BoardBdsHookDxe/BoardBdsH= ookDxe.c create mode 100644 Platform/Intel/BoardModulePkg/BoardBdsHookDxe/BoardBdsH= ookDxe.inf diff --git a/Platform/Intel/BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.= c b/Platform/Intel/BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.c new file mode 100644 index 0000000000..88eb7d70e9 --- /dev/null +++ b/Platform/Intel/BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.c @@ -0,0 +1,121 @@ +/** @file + Bds Hook Point callbacks DXE driver + + Copyright (c) 2019, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include + +#include + +/** + Initialize DXE Platform. + + @param[in] ImageHandle Image handle of this driver. + @param[in] SystemTable Global system service table. + + @retval EFI_SUCCESS Initialization complete. + @exception EFI_UNSUPPORTED The chipset is unsupported by this driv= er. + @retval EFI_OUT_OF_RESOURCES Do not have enough resources to initialize= the driver. + @retval EFI_DEVICE_ERROR Device error, driver exits abnormally. +**/ +EFI_STATUS +EFIAPI +BdsHookDxeEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_EVENT BeforeConsoleAfterTrustedConsoleEvent; + EFI_EVENT BeforeConsoleBeforeEndOfDxeEvent; + EFI_EVENT AfterConsoleReadyBeforeBootOptionEvent; + EFI_EVENT ReadyToBootEvent; + EFI_EVENT PciEnumCompleteEvent; + EFI_EVENT SmmReadyToLockEvent; + EFI_STATUS Status; + VOID *Registration; + + DEBUG ((DEBUG_INFO, "%a starts\n", __FUNCTION__ )); + + // + // Create event to set proper video resolution and text mode for interna= l shell. + // + Status =3D EfiCreateEventReadyToBootEx ( + TPL_CALLBACK, + BdsReadyToBootCallback, + NULL, + &ReadyToBootEvent + ); + ASSERT_EFI_ERROR (Status); + + // + // Create PCI Enumeration Completed callback for BDS + // + PciEnumCompleteEvent =3D EfiCreateProtocolNotifyEvent ( + &gEfiPciEnumerationCompleteProtocolGuid, + TPL_CALLBACK, + BdsPciEnumCompleteCallback, + NULL, + &Registration + ); + ASSERT (PciEnumCompleteEvent !=3D NULL); + + // + // Create PCI Enumeration Completed callback for BDS + // + SmmReadyToLockEvent =3D EfiCreateProtocolNotifyEvent ( + &gEfiDxeSmmReadyToLockProtocolGuid, + TPL_CALLBACK, + BdsSmmReadyToLockCallback, + NULL, + &Registration + ); + ASSERT (SmmReadyToLockEvent !=3D NULL); + + // + // Create BeforeConsoleAfterTrustedConsole event callback + // + Status =3D gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + BdsBeforeConsoleAfterTrustedConsoleCallback, + NULL, + &gBdsEventBeforeConsoleAfterTrustedConsoleGuid, + &BeforeConsoleAfterTrustedConsoleEvent + ); + ASSERT_EFI_ERROR (Status); + + // + // Create BeforeConsoleBeforeEndOfDxeGuid event callback + // + Status =3D gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + BdsBeforeConsoleBeforeEndOfDxeGuidCallback, + NULL, + &gBdsEventBeforeConsoleBeforeEndOfDxeGuid, + &BeforeConsoleBeforeEndOfDxeEvent + ); + ASSERT_EFI_ERROR (Status); + + // + // Create AfterConsoleReadyBeforeBootOption event callback + // + Status =3D gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + BdsAfterConsoleReadyBeforeBootOptionCallback, + NULL, + &gBdsEventAfterConsoleReadyBeforeBootOptionGuid, + &AfterConsoleReadyBeforeBootOptionEvent + ); + ASSERT_EFI_ERROR (Status); + + return Status; +} diff --git a/Platform/Intel/BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.= inf b/Platform/Intel/BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.inf new file mode 100644 index 0000000000..e3871d6dd4 --- /dev/null +++ b/Platform/Intel/BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.inf @@ -0,0 +1,46 @@ +### @file +# Module Information file for the Bds Hook DXE driver. +# +# Copyright (c) 2019, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +### + +[Defines] + INF_VERSION =3D 0x00010017 + BASE_NAME =3D BoardBdsHookDxe + FILE_GUID =3D EEA6491C-0DC5-48AB-B99D-CE77D14D43F2 + VERSION_STRING =3D 1.0 + MODULE_TYPE =3D DXE_DRIVER + ENTRY_POINT =3D BdsHookDxeEntryPoint + +[LibraryClasses] + BaseLib + UefiBootServicesTableLib + UefiDriverEntryPoint + DebugLib + UefiLib + BoardBdsHookLib + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + SecurityPkg/SecurityPkg.dec + MinPlatformPkg/MinPlatformPkg.dec + BoardModulePkg/BoardModulePkg.dec + +[Sources] + BoardBdsHookDxe.c + +[Protocols] + gEfiPciEnumerationCompleteProtocolGuid + gEfiDxeSmmReadyToLockProtocolGuid + +[Guids] + gBdsEventBeforeConsoleAfterTrustedConsoleGuid + gBdsEventBeforeConsoleBeforeEndOfDxeGuid + gBdsEventAfterConsoleReadyBeforeBootOptionGuid + +[Depex] + TRUE --=20 2.19.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52225): https://edk2.groups.io/g/devel/message/52225 Mute This Topic: https://groups.io/mt/68590726/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Tue Nov 26 12:31:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52227+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52227+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1576287161; cv=none; d=zohomail.com; s=zohoarc; b=PhDedb6iRJk4lhWmJ3rxBYrsCix8t3AEn3fzeStbgft0967DUKpnuIsUhwW/AHEFLeKFKFytqzymUbAPCJeaTEVBdHibv4TbWStpD72DgwWYISOtuo2hOmMBaKC+rfd/V7XG8Ym1woFeTOIf77RwowxZys7BEPaUWpWdy3NH2rc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576287161; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=Io9ZbeYaxwFjNObV2ZWM5uGJCHll8coOjeGufROuyEI=; b=YYPy8m7Vn6pp7Ic33x6VjpSYawxWOlkyHyHFs6zma5R1mgibjQB4VMBmaJAMSe8JczPCv19BP0gZzimVcn+J3VxGwr0DJvYDv4t2oW7L2SH1cYvkCBe4HTN/2rVENJ3JH+zjiDr/3zeiWWQO/3vRLmFrVAwlrOFnTp/mffeel/8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52227+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1576287161029692.3344983411415; Fri, 13 Dec 2019 17:32:41 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id pzwNYY1788612xp1dVe9tv4k; Fri, 13 Dec 2019 17:32:40 -0800 X-Received: from mga01.intel.com (mga01.intel.com []) by mx.groups.io with SMTP id smtpd.web10.2430.1576287158438932734 for ; Fri, 13 Dec 2019 17:32:39 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 17:32:38 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,311,1571727600"; d="scan'208";a="297091516" X-Received: from paagyema-desk2.amr.corp.intel.com ([10.24.15.84]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2019 17:32:38 -0800 From: "Agyeman, Prince" To: devel@edk2.groups.io Cc: Michael Kubacki , Chasel Chiu , Nate DeSimone Subject: [edk2-devel] [edk2-platforms] [PATCH 04/11] MinPlatformPkg: Add BDS Board Boot Manager library Date: Fri, 13 Dec 2019 17:32:30 -0800 Message-Id: <1a09aca176f54fff55f69ad40935d01d7330350a.1576282834.git.prince.agyeman@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,prince.agyeman@intel.com X-Gm-Message-State: b1HxC1TvSgpMHEIOLKODEwMrx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1576287160; bh=rqyBJXz1jSokPaEJ2IJ8YTpRQqahnkqEIJ8I6eb81hg=; h=Cc:Date:From:Reply-To:Subject:To; b=mPnb/Hdz2i1voZdYy2k/YOIeRxTKluZ8u6oTuedgLvLljcoKQHcZykTSqVCe6OWp4U7 1Y2hIpc0CmMsWflQT/m0xO7LZT2/KClZHg+yGwLMoVRo03T325pwaRn8yh/8xWuKVPJnR RJVk8N+QKCY0VWHTvecoMRKe3+iltxcMZyQ= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2336 As Minplatform's PlatformBootManager library instance implements event signals (as specified in the minimum platform specification) to trigger board actions, some of its functions namely PlatformBootManagerWaitCallback and PlatformBootManagerUnableToBoot will not have events signaled for boards to take action. This library implements PlatformBootManagerWaitCallback and PlatformBootManagerUnableToBoot which will be linked to Minplatform's PlatformBootManager libary instance. Added is an interface/header file that defines the board boot manager library. Also added is a NULL implementation of the board boot manager library Cc: Michael Kubacki Cc: Chasel Chiu Cc: Nate DeSimone Signed-off-by: Prince Agyeman Reviewed-by: Nate DeSimone --- .../BoardBootManagerLib.c | 38 ++++++++++++++++++ .../BoardBootManagerLibNull.inf | 31 +++++++++++++++ .../Include/Library/BoardBootManagerLib.h | 39 +++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 Platform/Intel/MinPlatformPkg/Bds/Library/BoardBootMana= gerLibNull/BoardBootManagerLib.c create mode 100644 Platform/Intel/MinPlatformPkg/Bds/Library/BoardBootMana= gerLibNull/BoardBootManagerLibNull.inf create mode 100644 Platform/Intel/MinPlatformPkg/Include/Library/BoardBoot= ManagerLib.h diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/BoardBootManagerLibN= ull/BoardBootManagerLib.c b/Platform/Intel/MinPlatformPkg/Bds/Library/Board= BootManagerLibNull/BoardBootManagerLib.c new file mode 100644 index 0000000000..46fce8f59f --- /dev/null +++ b/Platform/Intel/MinPlatformPkg/Bds/Library/BoardBootManagerLibNull/Boa= rdBootManagerLib.c @@ -0,0 +1,38 @@ +/** @file + This file include board specific boot manager callbacks + + Copyright (c) 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +/** + This function is called each second during the boot manager waits timeou= t. + + @param TimeoutRemain The remaining timeout. +**/ +VOID +EFIAPI +BoardBootManagerWaitCallback ( + IN UINT16 TimeoutRemain + ) +{ + return; +} + +/** + The function is called when no boot option could be launched, + including platform recovery options and options pointing to applications + built into firmware volumes. + +**/ +VOID +EFIAPI +BoardBootManagerUnableToBoot ( + VOID + ) +{ + return; +} + diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/BoardBootManagerLibN= ull/BoardBootManagerLibNull.inf b/Platform/Intel/MinPlatformPkg/Bds/Library= /BoardBootManagerLibNull/BoardBootManagerLibNull.inf new file mode 100644 index 0000000000..084207b111 --- /dev/null +++ b/Platform/Intel/MinPlatformPkg/Bds/Library/BoardBootManagerLibNull/Boa= rdBootManagerLibNull.inf @@ -0,0 +1,31 @@ +## @file +# The module definition file for BoardBootManagerLib. +# +# Copyright (c) 2019, Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D BoardBootManagerLib + FILE_GUID =3D 7BA684A4-5B32-4F0C-B0FF-581F143E606C + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D BoardBootManagerLib|DXE_DRIVER + + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 EBC +# + +[Sources] + BoardBootManagerLib.c + + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + MinPlatformPkg/MinPlatformPkg.dec diff --git a/Platform/Intel/MinPlatformPkg/Include/Library/BoardBootManager= Lib.h b/Platform/Intel/MinPlatformPkg/Include/Library/BoardBootManagerLib.h new file mode 100644 index 0000000000..4240142073 --- /dev/null +++ b/Platform/Intel/MinPlatformPkg/Include/Library/BoardBootManagerLib.h @@ -0,0 +1,39 @@ +/** @file + Board Boot Manager library definition. A platform can implement + instances to support platform-specific behavior. + + Copyright (c) 2019, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + + +#ifndef __BOARD_BOOT_MANAGER_LIB_H_ +#define __BOARD_BOOT_MANAGER_LIB_H_ +#include + + +/** + This function is called each second during boot manager waits the timeou= t. + + @param TimeoutRemain The remaining timeout. +**/ +VOID +EFIAPI +BoardBootManagerWaitCallback ( + IN UINT16 TimeoutRemain + ); + +/** + The function is called when no boot option could be launched, + including platform recovery options and options pointing to applications + built into firmware volumes. + +**/ +VOID +EFIAPI +BoardBootManagerUnableToBoot ( + VOID + ); + +#endif --=20 2.19.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52227): https://edk2.groups.io/g/devel/message/52227 Mute This Topic: https://groups.io/mt/68590731/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Tue Nov 26 12:31:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52228+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52228+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1576287161; cv=none; d=zohomail.com; s=zohoarc; b=ZllnUcrwXOHwAvlsutsM0n72P+15XkzHiC0WckUWi1jFyhwTJcS3z2QDMPD+sSXh+hfjFVqYhlnfKOOgb+naUqnvZjgHgRAUj3Q8JUXOUiwh9GVo4Raf2DhDnCSpwrtASTOlOXd1JOkb9DxvVKWaj3MbbfWEZ5buqQfyNS9hdqs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576287161; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=5Kmh7Q4YVWAO8uaUuaEzGO7fVFc2KL7v8bktvnxzBMo=; b=D5uW+MkvP9W4I0zLyh8aSU15Hw2zqVOTHArtBof7yE6Q7ga+B/ewfsyJNByLPIdVeLL8rysYpVyX5elrEwOZnraqUWSJ8bAsvZVPY8I7/OSs8jqSHkAYVMRduTrnaTK+TJamZF3DMRxSHVkpV7ZrxfAZiBT7GmYMf413yaQfJcI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52228+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1576287161959183.97421082751896; Fri, 13 Dec 2019 17:32:41 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id AsDmYY1788612xjPUuhmBVwS; Fri, 13 Dec 2019 17:32:40 -0800 X-Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mx.groups.io with SMTP id smtpd.web10.2431.1576287159626860661 for ; Fri, 13 Dec 2019 17:32:39 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 17:32:38 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,311,1571727600"; d="scan'208";a="297091520" X-Received: from paagyema-desk2.amr.corp.intel.com ([10.24.15.84]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2019 17:32:38 -0800 From: "Agyeman, Prince" To: devel@edk2.groups.io Cc: Michael Kubacki , Chasel Chiu , Nate DeSimone Subject: [edk2-devel] [edk2-platforms] [PATCH 05/11] MinPlatformPkg: Add BDS Hook Points Date: Fri, 13 Dec 2019 17:32:31 -0800 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,prince.agyeman@intel.com X-Gm-Message-State: aQNYECkAyrDhDmKfnZA1hlMox1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1576287160; bh=uxVHK1Ahdhjk+gM/KDlfh3JIFgm7JkSDrGDT+T5Hyt8=; h=Cc:Date:From:Reply-To:Subject:To; b=LPBks/LHt2Yn7+wUJs1rQwjezyT/5dMJQI5nZzFMAtuR2ENEFJX+T0uMvRfsEAd/2es +6EVhSj+qw0vjVUn/nyqL26aKQvhP9ELqd8ejp8rQtHV/Fl+7jifhCs1Jd1Mo7qoFcG/M 09NYzS052tcsju6WT9skC0coSykmHVQ3hqA= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2336 Added BDS hook points to the Minplatform boot manager library as defined in the Minimum Platfrom specifcations. Changes made: * Added functions to signal three BDS event groups. These event groups are BeforeConsoleAfterTrustedConsole, BeforeConsoleBeforeEndOfDxe and AfterConsoleReadyBeforeBootOption. * Removed BDS functionalities from the boot manager library. These functionalities will be added to callbacks a module in BoardModule, which will then register/hook to the BDS hook points See https://edk2-docs.gitbooks.io/edk-ii-minimum-platform-specification, under Appendix A.3 BDS Hook Points, for more details. Cc: Michael Kubacki Cc: Chasel Chiu Cc: Nate DeSimone Signed-off-by: Prince Agyeman Reviewed-by: Chasel Chiu Reviewed-by: Michael Kubacki Reviewed-by: Nate DeSimone --- .../DxePlatformBootManagerLib/BdsPlatform.c | 1262 ++--------------- .../DxePlatformBootManagerLib/BdsPlatform.h | 181 +-- .../DxePlatformBootManagerLib.inf | 51 +- .../DxePlatformBootManagerLib/MemoryTest.c | 83 -- .../PlatformBootOption.c | 559 -------- 5 files changed, 112 insertions(+), 2024 deletions(-) delete mode 100644 Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBo= otManagerLib/MemoryTest.c delete mode 100644 Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBo= otManagerLib/PlatformBootOption.c diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManag= erLib/BdsPlatform.c b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatform= BootManagerLib/BdsPlatform.c index 491fb0f26f..31a9ef4a07 100644 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/B= dsPlatform.c +++ b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/B= dsPlatform.c @@ -1,130 +1,14 @@ /** @file This file include all platform action which can be customized by IBV/OEM. =20 -Copyright (c) 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ =20 #include "BdsPlatform.h" -#include -#include -#include -#include =20 -#include -#include -#include -#include -#include - -#include - -#include -#include - -#include - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_BOOT_MODE gBootMode; - -BOOLEAN gPPRequireUIConfirm; - -extern UINTN mBootMenuOptionNumber; - -GLOBAL_REMOVE_IF_UNREFERENCED USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboa= rdDevicePath =3D { - { - { - MESSAGING_DEVICE_PATH, - MSG_USB_CLASS_DP, - { - (UINT8) (sizeof (USB_CLASS_DEVICE_PATH)), - (UINT8) ((sizeof (USB_CLASS_DEVICE_PATH)) >> 8) - } - }, - 0xffff, // VendorId - 0xffff, // ProductId - CLASS_HID, // DeviceClass - SUBCLASS_BOOT, // DeviceSubClass - PROTOCOL_KEYBOARD // DeviceProtocol - }, - gEndEntire -}; - -// -// Internal shell mode -// -GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mShellModeColumn; -GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mShellModeRow; -GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mShellHorizontalResolution; -GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mShellVerticalResolution; -// -// BDS Platform Functions -// - -BOOLEAN -IsMorBitSet ( - VOID - ) -{ - UINTN MorControl; - EFI_STATUS Status; - UINTN DataSize; - - // - // Check if the MOR bit is set. - // - DataSize =3D sizeof (MorControl); - Status =3D gRT->GetVariable ( - MEMORY_OVERWRITE_REQUEST_VARIABLE_NAME, - &gEfiMemoryOverwriteControlDataGuid, - NULL, - &DataSize, - &MorControl - ); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_INFO, " PlatformBootMangerLib: gEfiMemoryOverwriteContro= lDataGuid doesn't exist!!***\n")); - MorControl =3D 0; - } else { - DEBUG ((DEBUG_INFO, " PlatformBootMangerLib: Get the gEfiMemoryOverwri= teControlDataGuid =3D %x!!***\n", MorControl)); - } - - return (BOOLEAN) (MorControl & 0x01); -} - -VOID -DumpDevicePath ( - IN CHAR16 *Name, - IN EFI_DEVICE_PATH *DevicePath - ) -{ - CHAR16 *Str; - - Str =3D ConvertDevicePathToText(DevicePath, TRUE, TRUE); - DEBUG ((DEBUG_INFO, "%s: %s\n", Name, Str)); - if (Str !=3D NULL) { - FreePool (Str); - } -} - -/** - An empty function to pass error checking of CreateEventEx (). - - This empty function ensures that EVT_NOTIFY_SIGNAL_ALL is error - checked correctly since it is now mapped into CreateEventEx() in UEFI 2.= 0. - - @param Event Event whose notification function is being= invoked. - @param Context The pointer to the notification function's= context, - which is implementation-dependent. -**/ -VOID -EFIAPI -InternalBdsEmptyCallbackFuntion ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - return; -} +extern UINTN mBootMenuOptionNumber; =20 VOID ExitPmAuth ( @@ -145,7 +29,7 @@ ExitPmAuth ( Status =3D gBS->CreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, - InternalBdsEmptyCallbackFuntion, + EfiEventEmptyFunction, NULL, &gEfiEndOfDxeEventGroupGuid, &EndOfDxeEvent @@ -172,918 +56,134 @@ ExitPmAuth ( DEBUG((DEBUG_INFO,"ExitPmAuth ()- End\n")); } =20 -VOID -ConnectRootBridge ( - BOOLEAN Recursive - ) -{ - UINTN RootBridgeHandleCount; - EFI_HANDLE *RootBridgeHandleBuffer; - UINTN RootBridgeIndex; - - RootBridgeHandleCount =3D 0; - gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiPciRootBridgeIoProtocolGuid, - NULL, - &RootBridgeHandleCount, - &RootBridgeHandleBuffer - ); - for (RootBridgeIndex =3D 0; RootBridgeIndex < RootBridgeHandleCount; Roo= tBridgeIndex++) { - gBS->ConnectController (RootBridgeHandleBuffer[RootBridgeIndex], NULL,= NULL, Recursive); - } -} - =20 /** - Return whether the device is trusted console. - - @param Device The device to be tested. - - @retval TRUE The device can be trusted. - @retval FALSE The device cannot be trusted. -**/ -BOOLEAN -IsTrustedConsole ( - IN CONSOLE_TYPE ConsoleType, - IN EFI_DEVICE_PATH_PROTOCOL *Device - ) -{ - VOID *TrustedConsoleDevicepath; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - EFI_DEVICE_PATH_PROTOCOL *Instance; - UINTN Size; - EFI_DEVICE_PATH_PROTOCOL *ConsoleDevice; - - if (Device =3D=3D NULL) { - return FALSE; - } - - ConsoleDevice =3D DuplicateDevicePath(Device); - - TrustedConsoleDevicepath =3D NULL; - - switch (ConsoleType) { - case ConIn: - TrustedConsoleDevicepath =3D PcdGetPtr (PcdTrustedConsoleInputDevicePa= th); - break; - case ConOut: - // - // Check GOP and remove last node - // - TempDevicePath =3D ConsoleDevice; - while (!IsDevicePathEndType (TempDevicePath)) { - if (DevicePathType (TempDevicePath) =3D=3D ACPI_DEVICE_PATH && - DevicePathSubType (TempDevicePath) =3D=3D ACPI_ADR_DP) { - SetDevicePathEndNode (TempDevicePath); - break; - } - TempDevicePath =3D NextDevicePathNode (TempDevicePath); - } - - TrustedConsoleDevicepath =3D PcdGetPtr (PcdTrustedConsoleOutputDeviceP= ath); - break; - default: - ASSERT(FALSE); - break; - } - - TempDevicePath =3D TrustedConsoleDevicepath; - do { - Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); - if (Instance =3D=3D NULL) { - break; - } - - if (CompareMem (ConsoleDevice, Instance, Size - END_DEVICE_PATH_LENGTH= ) =3D=3D 0) { - FreePool (Instance); - FreePool (ConsoleDevice); - return TRUE; - } - - FreePool (Instance); - } while (TempDevicePath !=3D NULL); - - FreePool (ConsoleDevice); + Creates an EFI event in the BDS Event Group. =20 - return FALSE; -} - -BOOLEAN -IsUsbShortForm ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath - ) -{ - if ((DevicePathType (DevicePath) =3D=3D MESSAGING_DEVICE_PATH) && - ((DevicePathSubType (DevicePath) =3D=3D MSG_USB_CLASS_DP) || (Device= PathSubType (DevicePath) =3D=3D MSG_USB_WWID_DP)) ) { - return TRUE; - } + @param NotifyTpl The task priority level of the event. + @param gEfiEventGuid The GUID of the event group to signal. + @param BdsConsoleEvent Returns the EFI event returned from gBS->Creat= eEvent(Ex). =20 - return FALSE; -} - -/** - Connect the USB short form device path. + @retval EFI_SUCCESS Event was created. + @retval Other Event was not created. =20 - @param DevicePath USB short form device path - - @retval EFI_SUCCESS Successfully connected the USB device - @retval EFI_NOT_FOUND Cannot connect the USB device - @retval EFI_INVALID_PARAMETER The device path is invalid. **/ EFI_STATUS -ConnectUsbShortFormDevicePath ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath +EFIAPI +CreateBdsEvent ( + IN EFI_TPL NotifyTpl, + IN EFI_GUID *gEfiEventGuid, + OUT EFI_EVENT *BdsConsoleEvent ) { - EFI_STATUS Status; - EFI_HANDLE *Handles; - UINTN HandleCount; - UINTN Index; - EFI_PCI_IO_PROTOCOL *PciIo; - UINT8 Class[3]; - BOOLEAN AtLeastOneConnected; + EFI_STATUS Status; =20 - // - // Check the passed in parameters - // - if (DevicePath =3D=3D NULL) { - return EFI_INVALID_PARAMETER; - } - - if (!IsUsbShortForm (DevicePath)) { - return EFI_INVALID_PARAMETER; - } + ASSERT (BdsConsoleEvent !=3D NULL); =20 - // - // Find the usb host controller firstly, then connect with the remaining= device path - // - AtLeastOneConnected =3D FALSE; - Status =3D gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiPciIoProtocolGuid, + Status =3D gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + NotifyTpl, + EfiEventEmptyFunction, NULL, - &HandleCount, - &Handles - ); - for (Index =3D 0; Index < HandleCount; Index++) { - Status =3D gBS->HandleProtocol ( - Handles[Index], - &gEfiPciIoProtocolGuid, - (VOID **) &PciIo - ); - if (!EFI_ERROR (Status)) { - // - // Check whether the Pci device is the wanted usb host controller - // - Status =3D PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Cla= ss); - if (!EFI_ERROR (Status) && - ((PCI_CLASS_SERIAL =3D=3D Class[2]) && (PCI_CLASS_SERIAL_USB =3D= =3D Class[1])) - ) { - Status =3D gBS->ConnectController ( - Handles[Index], - NULL, - DevicePath, - FALSE - ); - if (!EFI_ERROR(Status)) { - AtLeastOneConnected =3D TRUE; - } - } - } - } - - return AtLeastOneConnected ? EFI_SUCCESS : EFI_NOT_FOUND; -} - -/** - Update the ConIn variable with USB Keyboard device path,if its not alrea= dy exists in ConIn -**/ -VOID -EnumUsbKeyboard ( - VOID - ) -{ - DEBUG ((DEBUG_INFO, "[EnumUsbKeyboard]\n")); - EfiBootManagerUpdateConsoleVariable (ConIn, (EFI_DEVICE_PATH_PROTOCOL *)= &gUsbClassKeyboardDevicePath, NULL); - =20 - // - // Append Usb Keyboard short form DevicePath into "ConInDev" - // - EfiBootManagerUpdateConsoleVariable (ConInDev, (EFI_DEVICE_PATH_PROTOCOL= *) &gUsbClassKeyboardDevicePath, NULL); -} - -BOOLEAN -IsVgaHandle ( - IN EFI_HANDLE Handle - ) -{ - EFI_PCI_IO_PROTOCOL *PciIo; - PCI_TYPE00 Pci; - EFI_STATUS Status; - - Status =3D gBS->HandleProtocol ( - Handle, - &gEfiPciIoProtocolGuid, - (VOID **)&PciIo - ); - if (!EFI_ERROR (Status)) { - Status =3D PciIo->Pci.Read ( - PciIo, - EfiPciIoWidthUint32, - 0, - sizeof (Pci) / sizeof (UINT32), - &Pci - ); - if (!EFI_ERROR (Status)) { - if (IS_PCI_VGA (&Pci) || IS_PCI_OLD_VGA (&Pci)) { - return TRUE; - } - } - } - return FALSE; -} - -EFI_HANDLE -IsVideoController ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath - ) -{ - EFI_DEVICE_PATH_PROTOCOL *DupDevicePath; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - EFI_STATUS Status; - EFI_HANDLE DeviceHandle; - - DupDevicePath =3D DuplicateDevicePath (DevicePath); - ASSERT (DupDevicePath !=3D NULL); - if (DupDevicePath =3D=3D NULL) { - return NULL; - } - - TempDevicePath =3D DupDevicePath; - Status =3D gBS->LocateDevicePath ( - &gEfiDevicePathProtocolGuid, - &TempDevicePath, - &DeviceHandle + gEfiEventGuid, + BdsConsoleEvent ); - FreePool (DupDevicePath); - if (EFI_ERROR (Status)) { - return NULL; - } - - if (IsVgaHandle (DeviceHandle)) { - return DeviceHandle; - } else { - return NULL; - } -} - -BOOLEAN -IsGopDevicePath ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath - ) -{ - while (!IsDevicePathEndType (DevicePath)) { - if (DevicePathType (DevicePath) =3D=3D ACPI_DEVICE_PATH && - DevicePathSubType (DevicePath) =3D=3D ACPI_ADR_DP) { - return TRUE; - } - DevicePath =3D NextDevicePathNode (DevicePath); - } - return FALSE; -} - -/** - Remove all GOP device path instance from DevicePath and add the Gop to t= he DevicePath. -**/ -EFI_DEVICE_PATH_PROTOCOL * -UpdateGopDevicePath ( - EFI_DEVICE_PATH_PROTOCOL *DevicePath, - EFI_DEVICE_PATH_PROTOCOL *Gop - ) -{ - UINTN Size; - UINTN GopSize; - EFI_DEVICE_PATH_PROTOCOL *Temp; - EFI_DEVICE_PATH_PROTOCOL *Return; - EFI_DEVICE_PATH_PROTOCOL *Instance; - BOOLEAN Exist; - - Exist =3D FALSE; - Return =3D NULL; - GopSize =3D GetDevicePathSize (Gop); - do { - Instance =3D GetNextDevicePathInstance (&DevicePath, &Size); - if (Instance =3D=3D NULL) { - break; - } - if (!IsGopDevicePath (Instance) || - (Size =3D=3D GopSize && CompareMem (Instance, Gop, GopSize) =3D=3D= 0) - ) { - if (Size =3D=3D GopSize && CompareMem (Instance, Gop, GopSize) =3D= =3D 0) { - Exist =3D TRUE; - } - Temp =3D Return; - Return =3D AppendDevicePathInstance (Return, Instance); - if (Temp !=3D NULL) { - FreePool (Temp); - } - } - FreePool (Instance); - } while (DevicePath !=3D NULL); =20 - if (!Exist) { - Temp =3D Return; - Return =3D AppendDevicePathInstance (Return, Gop); - if (Temp !=3D NULL) { - FreePool (Temp); - } - } - return Return; + return Status; } =20 /** - Get Graphics Controller Handle. - - @retval GraphicsController Successfully located - @retval NULL Failed to locate -**/ -EFI_HANDLE -EFIAPI -GetGraphicsController ( - IN BOOLEAN NeedTrustedConsole - ) -{ - EFI_STATUS Status; - UINTN Index; - EFI_HANDLE *PciHandles; - UINTN PciHandlesSize; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - - Status =3D gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiPciIoProtocolGuid, - NULL, - &PciHandlesSize, - &PciHandles - ); - if (EFI_ERROR (Status)) { - return NULL; - } - - for (Index =3D 0; Index < PciHandlesSize; Index++) { - Status =3D gBS->HandleProtocol ( - PciHandles[Index], - &gEfiDevicePathProtocolGuid, - (VOID **) &DevicePath - ); - if (EFI_ERROR(Status)) { - continue; - } - if (!IsVgaHandle (PciHandles[Index])) { - continue; - } - if ((NeedTrustedConsole && IsTrustedConsole (ConOut, DevicePath)) || - ((!NeedTrustedConsole) && (!IsTrustedConsole (ConOut, DevicePath))= )) { - return PciHandles[Index]; - } - } - - return NULL; -} - -VOID -UpdateGraphicConOut ( - IN BOOLEAN NeedTrustedConsole - ) -{ - EFI_HANDLE GraphicsControllerHandle; - EFI_DEVICE_PATH_PROTOCOL *GopDevicePath; - EFI_DEVICE_PATH_PROTOCOL *ConOutDevicePath; - EFI_DEVICE_PATH_PROTOCOL *UpdatedConOutDevicePath; + Create, Signal, and Close the Bds Event Before Console After + Trusted Console event using CreateBdsEvent(). =20 - // - // Update ConOut variable - // - GraphicsControllerHandle =3D GetGraphicsController (NeedTrustedConsole); - if (GraphicsControllerHandle !=3D NULL) { - // - // Connect the GOP driver - // - gBS->ConnectController (GraphicsControllerHandle, NULL, NULL, TRUE); - - // - // Get the GOP device path - // NOTE: We may get a device path that contains Controller node in it. - // - GopDevicePath =3D EfiBootManagerGetGopDevicePath (GraphicsControllerHa= ndle); - if (GopDevicePath !=3D NULL) { - GetEfiGlobalVariable2 (L"ConOut", (VOID **)&ConOutDevicePath, NULL); - UpdatedConOutDevicePath =3D UpdateGopDevicePath (ConOutDevicePath, G= opDevicePath); - if (ConOutDevicePath !=3D NULL) { - FreePool (ConOutDevicePath); - } - FreePool (GopDevicePath); - gRT->SetVariable ( - L"ConOut", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACC= ESS | EFI_VARIABLE_BOOTSERVICE_ACCESS, - GetDevicePathSize (UpdatedConOutDevicePath), - UpdatedConOutDevicePath - ); - } - } -} - -VOID -AddConsoleVariable ( - IN CONSOLE_TYPE ConsoleType, - IN EFI_DEVICE_PATH *ConsoleDevicePath - ) -{ - EFI_DEVICE_PATH *TempDevicePath; - EFI_DEVICE_PATH *Instance; - UINTN Size; - EFI_HANDLE GraphicsControllerHandle; - EFI_DEVICE_PATH *GopDevicePath; - - TempDevicePath =3D ConsoleDevicePath; - do { - Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); - if (Instance =3D=3D NULL) { - break; - } - =20 - switch (ConsoleType) { - case ConIn: - if (IsUsbShortForm (Instance)) { - // - // Append Usb Keyboard short form DevicePath into "ConInDev" - // - EfiBootManagerUpdateConsoleVariable (ConInDev, Instance, NULL); - } - EfiBootManagerUpdateConsoleVariable (ConsoleType, Instance, NULL); - break; - case ConOut: - GraphicsControllerHandle =3D IsVideoController (Instance); - if (GraphicsControllerHandle =3D=3D NULL) { - EfiBootManagerUpdateConsoleVariable (ConsoleType, Instance, NULL); - } else { - // - // Connect the GOP driver - // - gBS->ConnectController (GraphicsControllerHandle, NULL, NULL, TRUE= ); - // - // Get the GOP device path - // NOTE: We may get a device path that contains Controller node in= it. - // - GopDevicePath =3D EfiBootManagerGetGopDevicePath (GraphicsControll= erHandle); - if (GopDevicePath !=3D NULL) { - EfiBootManagerUpdateConsoleVariable (ConsoleType, GopDevicePath,= NULL); - } - } - break; - default: - ASSERT(FALSE); - break; - } - - FreePool (Instance); - } while (TempDevicePath !=3D NULL); -} - -/** - The function connects the trusted consoles. **/ VOID -ConnectTrustedConsole ( +EFIAPI +BdsSignalEventBeforeConsoleAfterTrustedConsole ( VOID ) { - EFI_DEVICE_PATH_PROTOCOL *Consoles; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - EFI_DEVICE_PATH_PROTOCOL *Instance; - EFI_DEVICE_PATH_PROTOCOL *Next; - UINTN Size; - UINTN Index; - EFI_HANDLE Handle; - EFI_STATUS Status; - CHAR16 *ConsoleVar[] =3D {L"ConIn", L"ConOut"}; - VOID *TrustedConsoleDevicepath; + EFI_STATUS Status; + EFI_EVENT BdsConsoleEvent; =20 - TrustedConsoleDevicepath =3D PcdGetPtr (PcdTrustedConsoleInputDevicePath= ); - DumpDevicePath (L"TrustedConsoleIn", TrustedConsoleDevicepath); - TrustedConsoleDevicepath =3D PcdGetPtr (PcdTrustedConsoleOutputDevicePat= h); - DumpDevicePath (L"TrustedConsoleOut", TrustedConsoleDevicepath); + DEBUG ((DEBUG_INFO, "%a \n", __FUNCTION__)); =20 - for (Index =3D 0; Index < sizeof (ConsoleVar) / sizeof (ConsoleVar[0]); = Index++) { - - GetEfiGlobalVariable2 (ConsoleVar[Index], (VOID **)&Consoles, NULL); + Status =3D CreateBdsEvent ( + TPL_CALLBACK, + &gBdsEventBeforeConsoleAfterTrustedConsoleGuid, + &BdsConsoleEvent + ); =20 - TempDevicePath =3D Consoles; - do { - Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); - if (Instance =3D=3D NULL) { - break; - } - if (IsTrustedConsole (Index, Instance)) { - if (IsUsbShortForm (Instance)) { - ConnectUsbShortFormDevicePath (Instance); - } else { - for (Next =3D Instance; !IsDevicePathEnd (Next); Next =3D NextDe= vicePathNode (Next)) { - if (DevicePathType (Next) =3D=3D ACPI_DEVICE_PATH && DevicePat= hSubType (Next) =3D=3D ACPI_ADR_DP) { - break; - } else if (DevicePathType (Next) =3D=3D HARDWARE_DEVICE_PATH && - DevicePathSubType (Next) =3D=3D HW_CONTROLLER_DP && - DevicePathType (NextDevicePathNode (Next)) =3D=3D A= CPI_DEVICE_PATH && - DevicePathSubType (NextDevicePathNode (Next)) =3D= =3D ACPI_ADR_DP - ) { - break; - } - } - if (!IsDevicePathEnd (Next)) { - SetDevicePathEndNode (Next); - Status =3D EfiBootManagerConnectDevicePath (Instance, &Handle); - if (!EFI_ERROR (Status)) { - gBS->ConnectController (Handle, NULL, NULL, TRUE); - } - } else { - EfiBootManagerConnectDevicePath (Instance, NULL); - } - } - } - FreePool (Instance); - } while (TempDevicePath !=3D NULL); + ASSERT_EFI_ERROR (Status); =20 - if (Consoles !=3D NULL) { - FreePool (Consoles); - } + if (!EFI_ERROR (Status)) { + gBS->SignalEvent (BdsConsoleEvent); + gBS->CloseEvent (BdsConsoleEvent); + DEBUG ((DEBUG_INFO,"All EventBeforeConsoleAfterTrustedConsole callback= s have returned successfully\n")); } } =20 -/** - The function connects the trusted Storages. -**/ -VOID -ConnectTrustedStorage ( - VOID - ) -{ - VOID *TrustedStorageDevicepath; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - EFI_DEVICE_PATH_PROTOCOL *Instance; - UINTN Size; - EFI_DEVICE_PATH_PROTOCOL *TempStorageDevicePath; - EFI_STATUS Status; - EFI_HANDLE DeviceHandle; - - TrustedStorageDevicepath =3D PcdGetPtr (PcdTrustedStorageDevicePath); - DumpDevicePath (L"TrustedStorage", TrustedStorageDevicepath); - - TempDevicePath =3D TrustedStorageDevicepath; - do { - Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); - if (Instance =3D=3D NULL) { - break; - } - - EfiBootManagerConnectDevicePath (Instance, NULL); - - TempStorageDevicePath =3D Instance; - - Status =3D gBS->LocateDevicePath ( - &gEfiDevicePathProtocolGuid, - &TempStorageDevicePath, - &DeviceHandle - ); - if (!EFI_ERROR (Status)) { - gBS->ConnectController (DeviceHandle, NULL, NULL, FALSE); - } - - FreePool (Instance); - } while (TempDevicePath !=3D NULL); -} - -/** - The function connects the trusted consoles and then call the PP processi= ng library interface. -**/ -VOID -ProcessTcgPp ( - VOID - ) -{ - gPPRequireUIConfirm |=3D Tcg2PhysicalPresenceLibNeedUserConfirm(); - - if (gPPRequireUIConfirm) { - ConnectTrustedConsole (); - } - - Tcg2PhysicalPresenceLibProcessRequest (NULL); -} =20 /** - The function connects the trusted storage to perform TPerReset. + Create, Signal, and Close the Bds Before Console Before End Of Dxe + event using CreateBdsEvent(). **/ VOID -ProcessTcgMor ( - VOID - ) -{ - if (IsMorBitSet ()) { - ConnectTrustedConsole(); - ConnectTrustedStorage(); - } -} - -/** - Check if current BootCurrent variable is internal shell boot option. - - @retval TRUE BootCurrent is internal shell. - @retval FALSE BootCurrent is not internal shell. -**/ -BOOLEAN -BootCurrentIsInternalShell ( +EFIAPI +BdsSignalEventBeforeConsoleBeforeEndOfDxe ( VOID ) { - UINTN VarSize; - UINT16 BootCurrent; - CHAR16 BootOptionName[16]; - UINT8 *BootOption; - UINT8 *Ptr; - BOOLEAN Result; - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - EFI_DEVICE_PATH_PROTOCOL *LastDeviceNode; - EFI_GUID *GuidPoint; - - BootOption =3D NULL; - Result =3D FALSE; - - // - // Get BootCurrent variable - // - VarSize =3D sizeof (UINT16); - Status =3D gRT->GetVariable ( - L"BootCurrent", - &gEfiGlobalVariableGuid, - NULL, - &VarSize, - &BootCurrent - ); - if (EFI_ERROR (Status)) { - return FALSE; - } + EFI_STATUS Status; + EFI_EVENT BdsConsoleEvent; =20 - // - // Create boot option Bootxxxx from BootCurrent - // - UnicodeSPrint (BootOptionName, sizeof(BootOptionName), L"Boot%04X", Boot= Current); + DEBUG ((DEBUG_INFO, "%a \n", __FUNCTION__)); =20 - GetEfiGlobalVariable2 (BootOptionName, (VOID **) &BootOption, &VarSize); - if (BootOption =3D=3D NULL || VarSize =3D=3D 0) { - return FALSE; - } + Status =3D CreateBdsEvent ( + TPL_CALLBACK, + &gBdsEventBeforeConsoleBeforeEndOfDxeGuid, + &BdsConsoleEvent + ); =20 - Ptr =3D BootOption; - Ptr +=3D sizeof (UINT32); - Ptr +=3D sizeof (UINT16); - Ptr +=3D StrSize ((CHAR16 *) Ptr); - TempDevicePath =3D (EFI_DEVICE_PATH_PROTOCOL *) Ptr; - LastDeviceNode =3D TempDevicePath; - while (!IsDevicePathEnd (TempDevicePath)) { - LastDeviceNode =3D TempDevicePath; - TempDevicePath =3D NextDevicePathNode (TempDevicePath); - } - GuidPoint =3D EfiGetNameGuidFromFwVolDevicePathNode ( - (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode - ); - if ((GuidPoint !=3D NULL) && - ((CompareGuid (GuidPoint, &gUefiShellFileGuid))) - ) { - // - // if this option is internal shell, return TRUE - // - Result =3D TRUE; - } + ASSERT_EFI_ERROR (Status); =20 - if (BootOption !=3D NULL) { - FreePool (BootOption); - BootOption =3D NULL; + if (!EFI_ERROR (Status)) { + gBS->SignalEvent (BdsConsoleEvent); + gBS->CloseEvent (BdsConsoleEvent); + DEBUG ((DEBUG_INFO,"All BeforeConsoleBeforeEndOfDxe callbacks have ret= urned successfully\n")); } - - return Result; } =20 /** - This function will change video resolution and text mode - for internl shell when internal shell is launched. - - @param None. - - @retval EFI_SUCCESS Mode is changed successfully. - @retval Others Mode failed to changed. + Create, Signal, and Close the Bds After Console Ready Before Boot Option + using CreateBdsEvent(). **/ -EFI_STATUS +VOID EFIAPI -ChangeModeForInternalShell ( +BdsSignalEventAfterConsoleReadyBeforeBootOption ( VOID ) { - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut; - UINTN SizeOfInfo; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; - UINT32 MaxGopMode; - UINT32 MaxTextMode; - UINT32 ModeNumber; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - EFI_STATUS Status; - UINTN Index; - UINTN CurrentColumn; - UINTN CurrentRow; - - Status =3D gBS->HandleProtocol ( - gST->ConsoleOutHandle, - &gEfiGraphicsOutputProtocolGuid, - (VOID**)&GraphicsOutput - ); - if (EFI_ERROR (Status)) { - GraphicsOutput =3D NULL; - } - - Status =3D gBS->HandleProtocol ( - gST->ConsoleOutHandle, - &gEfiSimpleTextOutProtocolGuid, - (VOID**)&SimpleTextOut - ); - if (EFI_ERROR (Status)) { - SimpleTextOut =3D NULL; - } + EFI_STATUS Status; + EFI_EVENT BdsConsoleEvent; =20 - if ((GraphicsOutput =3D=3D NULL) || (SimpleTextOut =3D=3D NULL)) { - return EFI_UNSUPPORTED; - } - - MaxGopMode =3D GraphicsOutput->Mode->MaxMode; - MaxTextMode =3D SimpleTextOut->Mode->MaxMode; - - // - // 1. If current video resolution is same with new video resolution, - // video resolution need not be changed. - // 1.1. If current text mode is same with new text mode, text mode ne= ed not be change. - // 1.2. If current text mode is different with new text mode, text mo= de need be change to new text mode. - // 2. If current video resolution is different with new video resolution= , we need restart whole console drivers. - // - for (ModeNumber =3D 0; ModeNumber < MaxGopMode; ModeNumber++) { - Status =3D GraphicsOutput->QueryMode ( - GraphicsOutput, - ModeNumber, - &SizeOfInfo, - &Info - ); - if (!EFI_ERROR (Status)) { - if ((Info->HorizontalResolution =3D=3D mShellHorizontalResolution) && - (Info->VerticalResolution =3D=3D mShellVerticalResolution)) { - if ((GraphicsOutput->Mode->Info->HorizontalResolution =3D=3D mShel= lHorizontalResolution) && - (GraphicsOutput->Mode->Info->VerticalResolution =3D=3D mShellV= erticalResolution)) { - // - // If current video resolution is same with new resolution, - // then check if current text mode is same with new text mode. - // - Status =3D SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOu= t->Mode->Mode, &CurrentColumn, &CurrentRow); - ASSERT_EFI_ERROR (Status); - if (CurrentColumn =3D=3D mShellModeColumn && CurrentRow =3D=3D m= ShellModeRow) { - // - // Current text mode is same with new text mode, text mode nee= d not be change. - // - FreePool (Info); - return EFI_SUCCESS; - } else { - // - // Current text mode is different with new text mode, text mod= e need be change to new text mode. - // - for (Index =3D 0; Index < MaxTextMode; Index++) { - Status =3D SimpleTextOut->QueryMode (SimpleTextOut, Index, &= CurrentColumn, &CurrentRow); - if (!EFI_ERROR(Status)) { - if ((CurrentColumn =3D=3D mShellModeColumn) && (CurrentRow= =3D=3D mShellModeRow)) { - // - // New text mode is supported, set it. - // - Status =3D SimpleTextOut->SetMode (SimpleTextOut, Index); - ASSERT_EFI_ERROR (Status); - // - // Update text mode PCD. - // - Status =3D PcdSet32S (PcdConOutColumn, mShellModeColumn); - ASSERT_EFI_ERROR (Status); + DEBUG ((DEBUG_INFO, "%a \n", __FUNCTION__)); =20 - Status =3D PcdSet32S (PcdConOutRow, mShellModeRow); - ASSERT_EFI_ERROR (Status); - - FreePool (Info); - return EFI_SUCCESS; - } - } - } - if (Index =3D=3D MaxTextMode) { - // - // If new text mode is not supported, return error. - // - FreePool (Info); - return EFI_UNSUPPORTED; - } - } - } else { - FreePool (Info); - // - // If current video resolution is not same with the new one, set= new video resolution. - // In this case, the driver which produces simple text out need = be restarted. - // - Status =3D GraphicsOutput->SetMode (GraphicsOutput, ModeNumber); - if (!EFI_ERROR (Status)) { - // - // Set PCD to restart GraphicsConsole and Consplitter to chang= e video resolution - // and produce new text mode based on new resolution. - // - Status =3D PcdSet32S (PcdVideoHorizontalResolution, mShellHori= zontalResolution); - ASSERT_EFI_ERROR (Status); - - Status =3D PcdSet32S (PcdVideoVerticalResolution, mShellVertic= alResolution); - ASSERT_EFI_ERROR (Status); - - Status =3D PcdSet32S (PcdConOutColumn, mShellModeColumn); - ASSERT_EFI_ERROR (Status); - - Status =3D PcdSet32S (PcdConOutRow, mShellModeRow); - ASSERT_EFI_ERROR (Status); + Status =3D CreateBdsEvent ( + TPL_CALLBACK, + &gBdsEventAfterConsoleReadyBeforeBootOptionGuid, + &BdsConsoleEvent + ); =20 - Status =3D gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiSimpleTextOutProtocolGuid, - NULL, - &HandleCount, - &HandleBuffer - ); - if (!EFI_ERROR (Status)) { - for (Index =3D 0; Index < HandleCount; Index++) { - gBS->DisconnectController (HandleBuffer[Index], NULL, NULL= ); - } - for (Index =3D 0; Index < HandleCount; Index++) { - gBS->ConnectController (HandleBuffer[Index], NULL, NULL, T= RUE); - } - if (HandleBuffer !=3D NULL) { - FreePool (HandleBuffer); - } - break; - } - } - } - } - FreePool (Info); - } - } + ASSERT_EFI_ERROR (Status); =20 - if (ModeNumber =3D=3D MaxGopMode) { - // - // If the new resolution is not supported, return error. - // - return EFI_UNSUPPORTED; + if (!EFI_ERROR (Status)) { + gBS->SignalEvent (BdsConsoleEvent); + gBS->CloseEvent (BdsConsoleEvent); + DEBUG ((DEBUG_INFO,"All AfterConsoleReadyBeforeBootOption callbacks ha= ve returned successfully\n")); } - - return EFI_SUCCESS; } =20 -/** - ReadyToBoot callback to set video and text mode for internal shell boot. - That will not connect USB controller while CSM and FastBoot are disabled= , we need to connect them - before booting to Shell for showing USB devices in Shell. - - When FastBoot is enabled and Windows Console is the chosen Console behav= ior, input devices will not be connected - by default. Hence, when booting to EFI shell, connecting input consoles = are required. - - @param Event Pointer to this event - @param Context Event hanlder private data - - @retval None. -**/ -VOID -EFIAPI -OnReadyToBootCallBack ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - DEBUG ((EFI_D_INFO, "OnReadyToBootCallBack\n")); - - if (BootCurrentIsInternalShell ()) { - - ChangeModeForInternalShell (); - EfiBootManagerConnectAllDefaultConsoles(); - gDS->Dispatch (); - } -} =20 /** Platform Bds init. Incude the platform firmware vendor, revision @@ -1095,149 +195,37 @@ PlatformBootManagerBeforeConsole ( VOID ) { - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *VarConOut; - EFI_DEVICE_PATH_PROTOCOL *VarConIn; - EFI_EVENT Event; =20 DEBUG ((EFI_D_INFO, "PlatformBootManagerBeforeConsole\n")); =20 - Status =3D EFI_SUCCESS; - - // - // Get user defined text mode for internal shell only once. - // - mShellHorizontalResolution =3D PcdGet32 (PcdSetupVideoHorizontalResoluti= on); - mShellVerticalResolution =3D PcdGet32 (PcdSetupVideoVerticalResolution= ); - mShellModeColumn =3D PcdGet32 (PcdSetupConOutColumn); - mShellModeRow =3D PcdGet32 (PcdSetupConOutRow); - - // - // Create event to set proper video resolution and text mode for interna= l shell. - // - Status =3D EfiCreateEventReadyToBootEx ( - TPL_CALLBACK, - OnReadyToBootCallBack, - NULL, - &Event - ); - ASSERT_EFI_ERROR (Status); - - // - // Connect Root Bridge to make PCI BAR resource allocated and all PciIo = created - // - ConnectRootBridge (FALSE); - // - // Fill ConIn/ConOut in Full Configuration boot mode + // Trusted console can be added in a PciEnumComplete callback // - DEBUG ((DEBUG_INFO, "PlatformBootManagerInit - %x\n", gBootMode)); - - if (gBootMode =3D=3D BOOT_WITH_FULL_CONFIGURATION || - gBootMode =3D=3D BOOT_WITH_DEFAULT_SETTINGS || - gBootMode =3D=3D BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS || - gBootMode =3D=3D BOOT_IN_RECOVERY_MODE) { - - GetEfiGlobalVariable2 (L"ConOut", (VOID **)&VarConOut, NULL); if (Va= rConOut !=3D NULL) { FreePool (VarConOut); } - GetEfiGlobalVariable2 (L"ConIn", (VOID **)&VarConIn, NULL); if (Var= ConIn !=3D NULL) { FreePool (VarConIn); } - - // - // Only fill ConIn/ConOut when ConIn/ConOut is empty because we may dr= op to Full Configuration boot mode in non-first boot - // - if (VarConOut =3D=3D NULL || VarConIn =3D=3D NULL) { - if (PcdGetSize (PcdTrustedConsoleOutputDevicePath) >=3D sizeof(EFI_D= EVICE_PATH_PROTOCOL)) { - AddConsoleVariable (ConOut, PcdGetPtr (PcdTrustedConsoleOutputDevi= cePath)); - } - if (PcdGetSize (PcdTrustedConsoleInputDevicePath) >=3D sizeof(EFI_DE= VICE_PATH_PROTOCOL)) { - AddConsoleVariable (ConIn, PcdGetPtr (PcdTrustedConsoleInputDevice= Path)); - } - } - } =20 - EnumUsbKeyboard (); // - // For trusted console it must be handled here. + // Signal Before Console, after Trusted console Event // - UpdateGraphicConOut (TRUE); + BdsSignalEventBeforeConsoleAfterTrustedConsole (); =20 // - // Dynamically register hot key: F2/F7/Enter + // Signal Before Console, before End of Dxe // - RegisterDefaultBootOption (); - RegisterStaticHotkey (); - - PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7010); - if (PcdGetBool (PcdTpm2Enable)) { - ProcessTcgPp (); - ProcessTcgMor (); - } - PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7011); + BdsSignalEventBeforeConsoleBeforeEndOfDxe (); =20 // - // We should make all UEFI memory and GCD information populated before E= xitPmAuth. - // SMM may consume these information. + // Signal End Of Dxe Event // - MemoryTest((EXTENDMEM_COVERAGE_LEVEL) PcdGet32 (PcdPlatformMemoryCheckLe= vel)); - PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7020); ExitPmAuth (); PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7021); =20 // - // Dispatch the deferred 3rd party images. - // - EfiBootManagerDispatchDeferredImages (); - - // - // For non-trusted console it must be handled here. + // Deferred 3rd party images can be dispatched in + // an SmmReadyToLock callback // - UpdateGraphicConOut (FALSE); } =20 =20 -/** - Connect with predeined platform connect sequence, - the OEM/IBV can customize with their own connect sequence. - - @param[in] BootMode Boot mode of this boot. -**/ -VOID -ConnectSequence ( - IN EFI_BOOT_MODE BootMode - ) -{ - EfiBootManagerConnectAll (); -} - -/** - The function is to consider the boot order which is not in our expectati= on. - In the case that we need to re-sort the boot option. - - @retval TRUE Need to sort Boot Option. - @retval FALSE Don't need to sort Boot Option. -**/ -BOOLEAN -IsNeedSortBootOption ( - VOID - ) -{ - EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; - UINTN BootOptionCount; - - BootOptions =3D EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOpti= onTypeBoot); - - // - // If setup is the first priority in boot option, we need to sort boot o= ption. - // - if ((BootOptionCount > 1) && - (((StrnCmp (BootOptions->Description, L"Enter Setup", StrLen (L"Ente= r Setup"))) =3D=3D 0) || - ((StrnCmp (BootOptions->Description, L"BootManagerMenuApp", StrLen = (L"BootManagerMenuApp"))) =3D=3D 0))) { - return TRUE; - } - - return FALSE; -} - /** The function will excute with as the platform policy, current policy is driven by boot mode. IBV/OEM can customize this code for their specif= ic @@ -1254,65 +242,9 @@ PlatformBootManagerAfterConsole ( VOID ) { - EFI_BOOT_MODE LocalBootMode; - DEBUG ((EFI_D_INFO, "PlatformBootManagerAfterConsole\n")); =20 - // - // Get current Boot Mode - // - LocalBootMode =3D gBootMode; - DEBUG ((DEBUG_INFO, "Current local bootmode - %x\n", LocalBootMode)); - - // - // Go the different platform policy with different boot mode - // Notes: this part code can be change with the table policy - // - switch (LocalBootMode) { - - case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES: - case BOOT_WITH_MINIMAL_CONFIGURATION: - case BOOT_ON_S4_RESUME: - // - // Perform some platform specific connect sequence - // - PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7050); - ConnectSequence (LocalBootMode); - PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7051); - - break; - - case BOOT_WITH_FULL_CONFIGURATION: - case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS: - case BOOT_WITH_DEFAULT_SETTINGS: - default: - // - // Perform some platform specific connect sequence - // - ConnectSequence (LocalBootMode); - - // - // Only in Full Configuration boot mode we do the enumeration of boot = device - // - // - // Dispatch all but Storage Oprom explicitly, because we assume Int13T= hunk driver is there. - // - EfiBootManagerRefreshAllBootOption (); - - if (IsNeedSortBootOption()) { - EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBoo= tOption); - } - // - // PXE boot option may appear after boot option enumeration - // - - break; - } - - Print (L"Press F7 for BootMenu!\n"); - - EfiBootManagerRefreshAllBootOption (); - EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBootOpt= ion); + BdsSignalEventAfterConsoleReadyBeforeBootOption (); } =20 /** @@ -1328,19 +260,19 @@ PlatformBootManagerUnableToBoot ( VOID ) { - EFI_STATUS Status; - EFI_BOOT_MANAGER_LOAD_OPTION BootDeviceList; - CHAR16 OptionName[sizeof ("Boot####")]; + BoardBootManagerUnableToBoot (); +} =20 - if (mBootMenuOptionNumber =3D=3D LoadOptionNumberUnassigned) { - return; - } - UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", mBootMenuOp= tionNumber); - Status =3D EfiBootManagerVariableToLoadOption (OptionName, &BootDeviceLi= st); - if (EFI_ERROR (Status)) { - return; - } - for (;;) { - EfiBootManagerBoot (&BootDeviceList); - } +/** + This function is called each second during the boot manager waits the ti= meout. + + @param TimeoutRemain The remaining timeout. +**/ +VOID +EFIAPI +PlatformBootManagerWaitCallback ( + UINT16 TimeoutRemain + ) +{ + BoardBootManagerWaitCallback (TimeoutRemain); } diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManag= erLib/BdsPlatform.h b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatform= BootManagerLib/BdsPlatform.h index 360a00d7d7..031676cdc3 100644 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/B= dsPlatform.h +++ b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/B= dsPlatform.h @@ -1,7 +1,7 @@ /** @file Header file for BDS Platform specific code =20 -Copyright (c) 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ @@ -9,176 +9,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #ifndef _BDS_PLATFORM_H #define _BDS_PLATFORM_H =20 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -/// -/// ConnectType -/// -#define CONSOLE_OUT 0x00000001 -#define STD_ERROR 0x00000002 -#define CONSOLE_IN 0x00000004 -#define CONSOLE_ALL (CONSOLE_OUT | CONSOLE_IN | STD_ERROR) - -extern EFI_GUID gUefiShellFileGuid; -extern EFI_BOOT_MODE gBootMode; - -#define gPciRootBridge \ - { \ - { \ - ACPI_DEVICE_PATH, \ - ACPI_DP, \ - { \ - (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \ - (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \ - }, \ - }, \ - EISA_PNP_ID (0x0A03), \ - 0 \ - } - -#define gEndEntire \ - { \ - END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { END_DEVICE_PAT= H_LENGTH, 0 } \ - } - -typedef struct { - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - UINTN ConnectType; -} BDS_CONSOLE_CONNECT_ENTRY; - -// -// Platform Root Bridge -// -typedef struct { - ACPI_HID_DEVICE_PATH PciRootBridge; - EFI_DEVICE_PATH_PROTOCOL End; -} PLATFORM_ROOT_BRIDGE_DEVICE_PATH; - -// -// Below is the platform console device path -// -typedef struct { - ACPI_HID_DEVICE_PATH PciRootBridge; - PCI_DEVICE_PATH IsaBridge; - ACPI_HID_DEVICE_PATH Keyboard; - EFI_DEVICE_PATH_PROTOCOL End; -} PLATFORM_KEYBOARD_DEVICE_PATH; - -typedef struct { - ACPI_HID_DEVICE_PATH PciRootBridge; - PCI_DEVICE_PATH PciDevice; - EFI_DEVICE_PATH_PROTOCOL End; -} PLATFORM_ONBOARD_CONTROLLER_DEVICE_PATH; - -typedef struct { - ACPI_HID_DEVICE_PATH PciRootBridge; - PCI_DEVICE_PATH Pci0Device; - EFI_DEVICE_PATH_PROTOCOL End; -} PLATFORM_PEG_ROOT_CONTROLLER_DEVICE_PATH; - -typedef struct { - ACPI_HID_DEVICE_PATH PciRootBridge; - PCI_DEVICE_PATH PciBridge; - PCI_DEVICE_PATH PciDevice; - EFI_DEVICE_PATH_PROTOCOL End; -} PLATFORM_PCI_CONTROLLER_DEVICE_PATH; - -// -// Below is the boot option device path -// - -#define CLASS_HID 3 -#define SUBCLASS_BOOT 1 -#define PROTOCOL_KEYBOARD 1 - -typedef struct { - USB_CLASS_DEVICE_PATH UsbClass; - EFI_DEVICE_PATH_PROTOCOL End; -} USB_CLASS_FORMAT_DEVICE_PATH; - -extern USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboardDevicePa= th; - -// -// Platform BDS Functions -// - - -/** - Perform the memory test base on the memory test intensive level, - and update the memory resource. - - @param Level The memory test intensive level. - - @retval EFI_STATUS Success test all the system memory and update - the memory resource - -**/ -EFI_STATUS -MemoryTest ( - IN EXTENDMEM_COVERAGE_LEVEL Level - ); - -VOID -ConnectSequence ( - IN EFI_BOOT_MODE BootMode - ); - - -INTN -EFIAPI -CompareBootOption ( - CONST VOID *Left, - CONST VOID *Right - ); - - -VOID -RegisterStaticHotkey ( - VOID - ); -VOID -RegisterDefaultBootOption ( - VOID - ); + #include + #include + #include + #include + #include + #include + #include + #include =20 #endif diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManag= erLib/DxePlatformBootManagerLib.inf b/Platform/Intel/MinPlatformPkg/Bds/Lib= rary/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf index 388ffd808b..4f7299f1df 100644 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/D= xePlatformBootManagerLib.inf +++ b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/D= xePlatformBootManagerLib.inf @@ -23,23 +23,13 @@ =20 [LibraryClasses] BaseLib - MemoryAllocationLib UefiBootServicesTableLib - UefiRuntimeServicesTableLib - BaseMemoryLib DebugLib - PcdLib - PrintLib - DevicePathLib UefiLib HobLib - DxeServicesLib - DxeServicesTableLib - HiiLib UefiBootManagerLib PerformanceLib - TimerLib - Tcg2PhysicalPresenceLib + BoardBootManagerLib =20 [Packages] MdePkg/MdePkg.dec @@ -47,47 +37,18 @@ SecurityPkg/SecurityPkg.dec MinPlatformPkg/MinPlatformPkg.dec =20 -[Pcd] - gMinPlatformPkgTokenSpaceGuid.PcdTpm2Enable ## CONSUM= ES - gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut ## PRO= DUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution ## PRO= DUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution ## PRO= DUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow ## PRO= DUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn ## PRO= DUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn ## CON= SUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow ## CON= SUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution ## CON= SUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution ## CON= SUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdConInConnectOnDemand ## PRO= DUCES - gMinPlatformPkgTokenSpaceGuid.PcdPlatformMemoryCheckLevel ## CONSUM= ES - gMinPlatformPkgTokenSpaceGuid.PcdBootToShellOnly ## CONSUM= ES - gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleInputDevicePath ## CONSU= MES - gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleOutputDevicePath ## CONSU= MES - gMinPlatformPkgTokenSpaceGuid.PcdTrustedStorageDevicePath ## CONSU= MES - [Sources] BdsPlatform.c BdsPlatform.h - PlatformBootOption.c - MemoryTest.c =20 [Protocols] - gEfiPciRootBridgeIoProtocolGuid ## CONSUMES - gEfiPciIoProtocolGuid ## CONSUMES - gEfiCpuIo2ProtocolGuid ## CONSUMES - gEfiDxeSmmReadyToLockProtocolGuid ## PRODUCES - gEfiGenericMemTestProtocolGuid ## CONSUMES - gEfiDiskInfoProtocolGuid ## CONSUMES - gEfiDevicePathToTextProtocolGuid ## CONSUMES - gEfiSimpleTextInputExProtocolGuid ## CONSUMES - gEfiFirmwareVolume2ProtocolGuid ## CONSUMES - gEfiFormBrowser2ProtocolGuid ## CONSUMES - gEfiGenericMemTestProtocolGuid ## CONSUMES + gEfiDxeSmmReadyToLockProtocolGuid ## PRODUCES =20 [Guids] - gEfiGlobalVariableGuid ## PRODUCES - gEfiMemoryOverwriteControlDataGuid ## PRODUCES - gEfiEndOfDxeEventGroupGuid ## CONSUMES + gEfiEndOfDxeEventGroupGuid ## CONSUMES + gBdsEventBeforeConsoleAfterTrustedConsoleGuid + gBdsEventBeforeConsoleBeforeEndOfDxeGuid + gBdsEventAfterConsoleReadyBeforeBootOptionGuid =20 [Depex.common.DXE_DRIVER] gEfiVariableArchProtocolGuid diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManag= erLib/MemoryTest.c b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformB= ootManagerLib/MemoryTest.c deleted file mode 100644 index 654845349a..0000000000 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/M= emoryTest.c +++ /dev/null @@ -1,83 +0,0 @@ -/** @file - Perform the platform memory test - -Copyright (c) 2017, Intel Corporation. All rights reserved.
-SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "BdsPlatform.h" -#include - -/** - Perform the memory test base on the memory test intensive level, - and update the memory resource. - - @param Level The memory test intensive level. - - @retval EFI_STATUS Success test all the system memory and update - the memory resource - -**/ -EFI_STATUS -MemoryTest ( - IN EXTENDMEM_COVERAGE_LEVEL Level - ) -{ - EFI_STATUS Status; - BOOLEAN RequireSoftECCInit; - EFI_GENERIC_MEMORY_TEST_PROTOCOL *GenMemoryTest; - UINT64 TestedMemorySize; - UINT64 TotalMemorySize; - BOOLEAN ErrorOut; - BOOLEAN TestAbort; - - TestedMemorySize =3D 0; - TotalMemorySize =3D 0; - ErrorOut =3D FALSE; - TestAbort =3D FALSE; - - RequireSoftECCInit =3D FALSE; - - Status =3D gBS->LocateProtocol ( - &gEfiGenericMemTestProtocolGuid, - NULL, - (VOID **) &GenMemoryTest - ); - if (EFI_ERROR (Status)) { - return EFI_SUCCESS; - } - - Status =3D GenMemoryTest->MemoryTestInit ( - GenMemoryTest, - Level, - &RequireSoftECCInit - ); - if (Status =3D=3D EFI_NO_MEDIA) { - // - // The PEI codes also have the relevant memory test code to check the = memory, - // it can select to test some range of the memory or all of them. If P= EI code - // checks all the memory, this BDS memory test will has no not-test me= mory to - // do the test, and then the status of EFI_NO_MEDIA will be returned by - // "MemoryTestInit". So it does not need to test memory again, just re= turn. - // - return EFI_SUCCESS; - } - - do { - Status =3D GenMemoryTest->PerformMemoryTest ( - GenMemoryTest, - &TestedMemorySize, - &TotalMemorySize, - &ErrorOut, - TestAbort - ); - if (ErrorOut && (Status =3D=3D EFI_DEVICE_ERROR)) { - ASSERT (0); - } - } while (Status !=3D EFI_NOT_FOUND); - - Status =3D GenMemoryTest->Finished (GenMemoryTest); - - return EFI_SUCCESS; -} diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManag= erLib/PlatformBootOption.c b/Platform/Intel/MinPlatformPkg/Bds/Library/DxeP= latformBootManagerLib/PlatformBootOption.c deleted file mode 100644 index 84aa097d58..0000000000 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/P= latformBootOption.c +++ /dev/null @@ -1,559 +0,0 @@ -/** @file - Driver for Platform Boot Options support. - -Copyright (c) 2017, Intel Corporation. All rights reserved.
-SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "BdsPlatform.h" - -#include - -BOOLEAN mContinueBoot =3D FALSE; -BOOLEAN mBootMenuBoot =3D FALSE; -BOOLEAN mPxeBoot =3D FALSE; -BOOLEAN mHotKeypressed =3D FALSE; -EFI_EVENT HotKeyEvent =3D NULL; - -UINTN mBootMenuOptionNumber; - -EFI_DEVICE_PATH_PROTOCOL * -BdsCreateShellDevicePath ( - VOID - ) -/*++ - -Routine Description: - - This function will create a SHELL BootOption to boot. - -Arguments: - - None. - -Returns: - - Shell Device path for booting. - ---*/ -{ - UINTN FvHandleCount; - EFI_HANDLE *FvHandleBuffer; - UINTN Index; - EFI_STATUS Status; - EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; - UINTN Size; - UINT32 AuthenticationStatus; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - VOID *Buffer; - - DevicePath =3D NULL; - Status =3D EFI_SUCCESS; - - DEBUG ((DEBUG_INFO, "BdsCreateShellDevicePath\n")); - gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiFirmwareVolume2ProtocolGuid, - NULL, - &FvHandleCount, - &FvHandleBuffer - ); - - for (Index =3D 0; Index < FvHandleCount; Index++) { - gBS->HandleProtocol ( - FvHandleBuffer[Index], - &gEfiFirmwareVolume2ProtocolGuid, - (VOID **) &Fv - ); - - Buffer =3D NULL; - Size =3D 0; - Status =3D Fv->ReadSection ( - Fv, - &gUefiShellFileGuid, - EFI_SECTION_PE32, - 0, - &Buffer, - &Size, - &AuthenticationStatus - ); - if (EFI_ERROR (Status)) { - // - // Skip if no shell file in the FV - // - continue; - } else { - // - // Found the shell - // - break; - } - } - - if (EFI_ERROR (Status)) { - // - // No shell present - // - if (FvHandleCount) { - FreePool (FvHandleBuffer); - } - return NULL; - } - // - // Build the shell boot option - // - DevicePath =3D DevicePathFromHandle (FvHandleBuffer[Index]); - - if (FvHandleCount) { - FreePool (FvHandleBuffer); - } - - return DevicePath; -} - - -EFI_STATUS -CreateFvBootOption ( - EFI_GUID *FileGuid, - CHAR16 *Description, - EFI_BOOT_MANAGER_LOAD_OPTION *BootOption, - UINT32 Attributes, - UINT8 *OptionalData, OPTIONAL - UINT32 OptionalDataSize - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; - MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode; - EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; - UINT32 AuthenticationStatus; - VOID *Buffer; - UINTN Size; - - if ((BootOption =3D=3D NULL) || (FileGuid =3D=3D NULL) || (Description = =3D=3D NULL)) { - return EFI_INVALID_PARAMETER; - } - - EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid); - - if (!CompareGuid (&gUefiShellFileGuid, FileGuid)) { - Status =3D gBS->HandleProtocol ( - gImageHandle, - &gEfiLoadedImageProtocolGuid, - (VOID **) &LoadedImage - ); - if (!EFI_ERROR (Status)) { - Status =3D gBS->HandleProtocol ( - LoadedImage->DeviceHandle, - &gEfiFirmwareVolume2ProtocolGuid, - (VOID **) &Fv - ); - if (!EFI_ERROR (Status)) { - Buffer =3D NULL; - Size =3D 0; - Status =3D Fv->ReadSection ( - Fv, - FileGuid, - EFI_SECTION_PE32, - 0, - &Buffer, - &Size, - &AuthenticationStatus - ); - if (Buffer !=3D NULL) { - FreePool (Buffer); - } - } - } - if (EFI_ERROR (Status)) { - return EFI_NOT_FOUND; - } - - DevicePath =3D AppendDevicePathNode ( - DevicePathFromHandle (LoadedImage->DeviceHandle), - (EFI_DEVICE_PATH_PROTOCOL *) &FileNode - ); - } else { - DevicePath =3D AppendDevicePathNode ( - BdsCreateShellDevicePath (), - (EFI_DEVICE_PATH_PROTOCOL *) &FileNode - ); - } - - Status =3D EfiBootManagerInitializeLoadOption ( - BootOption, - LoadOptionNumberUnassigned, - LoadOptionTypeBoot, - Attributes, - Description, - DevicePath, - OptionalData, - OptionalDataSize - ); - FreePool (DevicePath); - return Status; -} - -EFI_GUID mUiFile =3D { - 0x462CAA21, 0x7614, 0x4503, { 0x83, 0x6E, 0x8A, 0xB6, 0xF4, 0x66, 0x23, = 0x31 } -}; -EFI_GUID mBootMenuFile =3D { - 0xEEC25BDC, 0x67F2, 0x4D95, { 0xB1, 0xD5, 0xF8, 0x1B, 0x20, 0x39, 0xD1, = 0x1D } -}; - - -/** - Return the index of the load option in the load option array. - - The function consider two load options are equal when the - OptionType, Attributes, Description, FilePath and OptionalData are equal. - - @param Key Pointer to the load option to be found. - @param Array Pointer to the array of load options to be found. - @param Count Number of entries in the Array. - - @retval -1 Key wasn't found in the Array. - @retval 0 ~ Count-1 The index of the Key in the Array. -**/ -INTN -PlatformFindLoadOption ( - IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Key, - IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Array, - IN UINTN Count - ) -{ - UINTN Index; - - for (Index =3D 0; Index < Count; Index++) { - if ((Key->OptionType =3D=3D Array[Index].OptionType) && - (Key->Attributes =3D=3D Array[Index].Attributes) && - (StrCmp (Key->Description, Array[Index].Description) =3D=3D 0) && - (CompareMem (Key->FilePath, Array[Index].FilePath, GetDevicePathSi= ze (Key->FilePath)) =3D=3D 0) && - (Key->OptionalDataSize =3D=3D Array[Index].OptionalDataSize) && - (CompareMem (Key->OptionalData, Array[Index].OptionalData, Key->Op= tionalDataSize) =3D=3D 0)) { - return (INTN) Index; - } - } - - return -1; -} - -UINTN -RegisterFvBootOption ( - EFI_GUID *FileGuid, - CHAR16 *Description, - UINTN Position, - UINT32 Attributes, - UINT8 *OptionalData, OPTIONAL - UINT32 OptionalDataSize - ) -{ - EFI_STATUS Status; - UINTN OptionIndex; - EFI_BOOT_MANAGER_LOAD_OPTION NewOption; - EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; - UINTN BootOptionCount; - - NewOption.OptionNumber =3D LoadOptionNumberUnassigned; - Status =3D CreateFvBootOption (FileGuid, Description, &NewOption, Attrib= utes, OptionalData, OptionalDataSize); - if (!EFI_ERROR (Status)) { - BootOptions =3D EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOp= tionTypeBoot); - - OptionIndex =3D PlatformFindLoadOption (&NewOption, BootOptions, BootO= ptionCount); - - if (OptionIndex =3D=3D -1) { - Status =3D EfiBootManagerAddLoadOptionVariable (&NewOption, Position= ); - ASSERT_EFI_ERROR (Status); - } else { - NewOption.OptionNumber =3D BootOptions[OptionIndex].OptionNumber; - } - EfiBootManagerFreeLoadOption (&NewOption); - EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); - } - - return NewOption.OptionNumber; -} - - - -VOID -EFIAPI -PlatformBootManagerWaitCallback ( - UINT16 TimeoutRemain - ) -{ - EFI_STATUS Status; - EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TxtInEx; - EFI_KEY_DATA KeyData; - BOOLEAN PausePressed; - - // - // Pause on PAUSE key - // - Status =3D gBS->HandleProtocol (gST->ConsoleInHandle, &gEfiSimpleTextInp= utExProtocolGuid, (VOID **) &TxtInEx); - ASSERT_EFI_ERROR (Status); - - PausePressed =3D FALSE; - - while (TRUE) { - Status =3D TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData); - if (EFI_ERROR (Status)) { - break; - } - - if (KeyData.Key.ScanCode =3D=3D SCAN_PAUSE) { - PausePressed =3D TRUE; - break; - } - } - - // - // Loop until non-PAUSE key pressed - // - while (PausePressed) { - Status =3D TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData); - if (!EFI_ERROR (Status)) { - DEBUG (( - DEBUG_INFO, "[PauseCallback] %x/%x %x/%x\n", - KeyData.Key.ScanCode, KeyData.Key.UnicodeChar, - KeyData.KeyState.KeyShiftState, KeyData.KeyState.KeyToggleState - )); - PausePressed =3D (BOOLEAN) (KeyData.Key.ScanCode =3D=3D SCAN_PAUSE); - } - } -} - - -EFI_GUID gUefiShellFileGuid =3D { 0x7C04A583, 0x9E3E, 0x4f1c, { 0xAD, 0x65= , 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 } }; - -#define INTERNAL_UEFI_SHELL_NAME L"Internal UEFI Shell 2.0" -#define UEFI_HARD_DRIVE_NAME L"UEFI Hard Drive" - -VOID -RegisterDefaultBootOption ( - VOID - ) -{ -#if 0 - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; - MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode; -#endif - UINT16 *ShellData; - UINT32 ShellDataSize; - - ShellData =3D NULL; - ShellDataSize =3D 0; - RegisterFvBootOption (&gUefiShellFileGuid, INTERNAL_UEFI_SHELL_NA= ME, (UINTN) -1, LOAD_OPTION_ACTIVE, (UINT8 *)ShellData, ShellDataSize); - - // - // Boot Menu - // - mBootMenuOptionNumber =3D RegisterFvBootOption (&mBootMenuFile, L"Boot D= evice List", (UINTN) -1, LOAD_OPTION_CATEGORY_APP | LOAD_OPTION_ACTIVE | = LOAD_OPTION_HIDDEN, NULL, 0); - - if (mBootMenuOptionNumber =3D=3D LoadOptionNumberUnassigned) { - DEBUG ((DEBUG_INFO, "BootMenuOptionNumber (%d) should not be same to L= oadOptionNumberUnassigned(%d).\n", mBootMenuOptionNumber, LoadOptionNumberU= nassigned)); - } -#if 0 - // - // Boot Manager Menu - // - EfiInitializeFwVolDevicepathNode (&FileNode, &mUiFile); - - gBS->HandleProtocol ( - gImageHandle, - &gEfiLoadedImageProtocolGuid, - (VOID **) &LoadedImage - ); - DevicePath =3D AppendDevicePathNode (DevicePathFromHandle (LoadedImage->= DeviceHandle), (EFI_DEVICE_PATH_PROTOCOL *) &FileNode); -#endif - -} - -VOID -RegisterBootOptionHotkey ( - UINT16 OptionNumber, - EFI_INPUT_KEY *Key, - BOOLEAN Add - ) -{ - EFI_STATUS Status; - - if (!Add) { - // - // No enter hotkey when force to setup or there is no boot option - // - Status =3D EfiBootManagerDeleteKeyOptionVariable (NULL, 0, Key, NULL); - ASSERT (Status =3D=3D EFI_SUCCESS || Status =3D=3D EFI_NOT_FOUND); - } else { - // - // Register enter hotkey for the first boot option - // - Status =3D EfiBootManagerAddKeyOptionVariable (NULL, OptionNumber, 0, = Key,NULL); - ASSERT (Status =3D=3D EFI_SUCCESS || Status =3D=3D EFI_ALREADY_STARTED= ); - } -} - -EFI_STATUS -EFIAPI -DetectKeypressCallback ( - IN EFI_KEY_DATA *KeyData -) -{ - mHotKeypressed =3D TRUE; - - if (HotKeyEvent !=3D NULL) { - gBS->SignalEvent(HotKeyEvent); - } - - return EFI_SUCCESS; -} - -/** - This function is called after all the boot options are enumerated and or= dered properly. -**/ -VOID -RegisterStaticHotkey ( - VOID - ) -{ - - EFI_INPUT_KEY Enter; - EFI_KEY_DATA F2; - EFI_KEY_DATA F7; - BOOLEAN EnterSetup; - EFI_STATUS Status; - EFI_BOOT_MANAGER_LOAD_OPTION BootOption; - - EnterSetup =3D FALSE; - - // - // [Enter] - // - mContinueBoot =3D !EnterSetup; - if (mContinueBoot) { - Enter.ScanCode =3D SCAN_NULL; - Enter.UnicodeChar =3D CHAR_CARRIAGE_RETURN; - EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL); - } - - - // - // [F2]/[F7] - // - F2.Key.ScanCode =3D SCAN_F2; - F2.Key.UnicodeChar =3D CHAR_NULL; - F2.KeyState.KeyShiftState =3D EFI_SHIFT_STATE_VALID; - F2.KeyState.KeyToggleState =3D 0; - Status =3D EfiBootManagerGetBootManagerMenu (&BootOption); - ASSERT_EFI_ERROR (Status); - RegisterBootOptionHotkey ((UINT16) BootOption.OptionNumber, &F2.Key, TRU= E); - EfiBootManagerFreeLoadOption (&BootOption); - - F7.Key.ScanCode =3D SCAN_F7; - F7.Key.UnicodeChar =3D CHAR_NULL; - F7.KeyState.KeyShiftState =3D EFI_SHIFT_STATE_VALID; - F7.KeyState.KeyToggleState =3D 0; - mBootMenuBoot =3D !EnterSetup; - RegisterBootOptionHotkey ((UINT16) mBootMenuOptionNumber, &F7.Key, mBoot= MenuBoot); - -} - -UINT8 -BootOptionType ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath - ) -{ - EFI_DEVICE_PATH_PROTOCOL *Node; - EFI_DEVICE_PATH_PROTOCOL *NextNode; - - for (Node =3D DevicePath; !IsDevicePathEndType (Node); Node =3D NextDevi= cePathNode (Node)) { - if (DevicePathType (Node) =3D=3D MESSAGING_DEVICE_PATH) { - // - // Make sure the device path points to the driver device. - // - NextNode =3D NextDevicePathNode (Node); - if (DevicePathSubType(NextNode) =3D=3D MSG_DEVICE_LOGICAL_UNIT_DP) { - // - // if the next node type is Device Logical Unit, which specify the= Logical Unit Number (LUN), - // skip it - // - NextNode =3D NextDevicePathNode (NextNode); - } - if (IsDevicePathEndType (NextNode)) { - if ((DevicePathType (Node) =3D=3D MESSAGING_DEVICE_PATH)) { - return DevicePathSubType (Node); - } else { - return MSG_SATA_DP; - } - } - } - } - - return (UINT8) -1; -} - -/** - Returns the priority number. - OptionType EFI - ------------------------------------ - PXE 2 - DVD 4 - USB 6 - NVME 7 - HDD 8 - EFI Shell 9 - Others 100 - - @param BootOption -**/ -UINTN -BootOptionPriority ( - CONST EFI_BOOT_MANAGER_LOAD_OPTION *BootOption - ) -{ - // - // EFI boot options - // - switch (BootOptionType (BootOption->FilePath)) { - case MSG_MAC_ADDR_DP: - case MSG_VLAN_DP: - case MSG_IPv4_DP: - case MSG_IPv6_DP: - return 2; - - case MSG_SATA_DP: - case MSG_ATAPI_DP: - case MSG_UFS_DP: - case MSG_NVME_NAMESPACE_DP: - return 4; - - case MSG_USB_DP: - return 6; - - } - if (StrCmp (BootOption->Description, INTERNAL_UEFI_SHELL_NAME) =3D=3D = 0) { - if (PcdGetBool (PcdBootToShellOnly)) { - return 0; - } - return 9; - } - if (StrCmp (BootOption->Description, UEFI_HARD_DRIVE_NAME) =3D=3D 0) { - return 8; - } - return 100; -} - -INTN -EFIAPI -CompareBootOption ( - CONST VOID *Left, - CONST VOID *Right - ) -{ - return BootOptionPriority ((EFI_BOOT_MANAGER_LOAD_OPTION *) Left) - - BootOptionPriority ((EFI_BOOT_MANAGER_LOAD_OPTION *) Right); -} - --=20 2.19.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52228): https://edk2.groups.io/g/devel/message/52228 Mute This Topic: https://groups.io/mt/68590734/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Tue Nov 26 12:31:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52230+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52230+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1576287161; cv=none; d=zohomail.com; s=zohoarc; b=RykcQWfDCRbymlW8NilAnCUzrKqb5A/WZwMMdtuSXu+D2GtGTr4WsGPEWY19sGfLRLMdYgMpTe9v9wCMD9MP8eCndrUXpNWdFrZiX5QgVdQ4HDNCE6SVhEOHnR7sVAzB9iUbSITG3MR6y2AcxkMx5TFbeRVgO4CNSdDsr2y7P7c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576287161; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=I+feIN4nSMiUOHeU6sz6hhmMNRbLYdqKzxVC871RNQU=; b=FW9BmrJ+MukDzQ7bBtkZ6+COBIkYi+pRvI+do6Nphgsiii0UlGZBPptMUXdAOVpJhdIws4HM/zTWZMdj+18C0ytzefaL77vSNO+Z5nir5A6rCRKz1JwLNWjcow3I5nwALLFHlsISib7JX1Puxg9KpKI28O4r0MRyUHavCD/LVM0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52230+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1576287161864477.659554373825; Fri, 13 Dec 2019 17:32:41 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id QsWHYY1788612xCC27Cq2Piu; Fri, 13 Dec 2019 17:32:41 -0800 X-Received: from mga01.intel.com (mga01.intel.com []) by mx.groups.io with SMTP id smtpd.web10.2430.1576287158438932734 for ; Fri, 13 Dec 2019 17:32:39 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 17:32:38 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,311,1571727600"; d="scan'208";a="297091523" X-Received: from paagyema-desk2.amr.corp.intel.com ([10.24.15.84]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2019 17:32:38 -0800 From: "Agyeman, Prince" To: devel@edk2.groups.io Cc: Michael Kubacki , Chasel Chiu , Nate DeSimone Subject: [edk2-devel] [edk2-platforms] [PATCH 06/11] BoardModulePkg: Add Generic BoardBootManagerLib Date: Fri, 13 Dec 2019 17:32:32 -0800 Message-Id: <97f98fc0ed58cf75513694f674f8c0124dbab647.1576282834.git.prince.agyeman@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,prince.agyeman@intel.com X-Gm-Message-State: 2kPz0i4FChdRGyZ0fQNshxQzx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1576287161; bh=YAt3SDEaT2XTtrIBk6go3H5lOVSG78X4oTLDvYfgwMg=; h=Cc:Date:From:Reply-To:Subject:To; b=oVTCFxHOHWDW8fct+2Dl8bBlZQnyjSATubB/8Q+r4s4HrgTdZuHwiLk+DZbgsXvL+8a 6wPq2hvnc+htevrCBmXhlAyD5kLxYgRPTj0veublCSo5CPqWMj0t2a4qRC3UvNpBG4Ky7 7Bg8qLc14r+WgcdR5hTLGnj1DaEblvKdu70= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" This library implements a generic PlatformBootManagerWaitCallback and PlatformBootManagerUnableToBoot which will be linked Minplatform's PlatformBootManager library instance. Cc: Michael Kubacki Cc: Chasel Chiu Cc: Nate DeSimone Signed-off-by: Prince Agyeman Reviewed-by: Michael Kubacki Reviewed-by: Nate DeSimone --- .../BoardBootManagerLib/BoardBootManager.c | 103 ++++++++++++++++++ .../BoardBootManagerLib.inf | 39 +++++++ .../BoardBootManagerLib.c | 2 +- 3 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 Platform/Intel/BoardModulePkg/Library/BoardBootManagerL= ib/BoardBootManager.c create mode 100644 Platform/Intel/BoardModulePkg/Library/BoardBootManagerL= ib/BoardBootManagerLib.inf diff --git a/Platform/Intel/BoardModulePkg/Library/BoardBootManagerLib/Boar= dBootManager.c b/Platform/Intel/BoardModulePkg/Library/BoardBootManagerLib/= BoardBootManager.c new file mode 100644 index 0000000000..f6628d4125 --- /dev/null +++ b/Platform/Intel/BoardModulePkg/Library/BoardBootManagerLib/BoardBootMa= nager.c @@ -0,0 +1,103 @@ +/** @file + This file include board specific boot manager callbacks + + Copyright (c) 2019, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + + +#include +#include +#include +#include +#include +#include +#include +#include + + +BOOLEAN mHotKeypressed =3D FALSE; +EFI_EVENT HotKeyEvent =3D NULL; +UINTN mBootMenuOptionNumber; + +/** + This function is called each second during the boot manager waits timeou= t. + + @param TimeoutRemain The remaining timeout. +**/ +VOID +EFIAPI +BoardBootManagerWaitCallback ( + UINT16 TimeoutRemain + ) +{ + EFI_STATUS Status; + EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TxtInEx; + EFI_KEY_DATA KeyData; + BOOLEAN PausePressed; + + // + // Pause on PAUSE key + // + Status =3D gBS->HandleProtocol (gST->ConsoleInHandle, &gEfiSimpleTextInp= utExProtocolGuid, (VOID **) &TxtInEx); + ASSERT_EFI_ERROR (Status); + + PausePressed =3D FALSE; + + while (TRUE) { + Status =3D TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData); + if (EFI_ERROR (Status)) { + break; + } + + if (KeyData.Key.ScanCode =3D=3D SCAN_PAUSE) { + PausePressed =3D TRUE; + break; + } + } + + // + // Loop until non-PAUSE key pressed + // + while (PausePressed) { + Status =3D TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData); + if (!EFI_ERROR (Status)) { + DEBUG (( + DEBUG_INFO, "[PauseCallback] %x/%x %x/%x\n", + KeyData.Key.ScanCode, KeyData.Key.UnicodeChar, + KeyData.KeyState.KeyShiftState, KeyData.KeyState.KeyToggleState + )); + PausePressed =3D (BOOLEAN) (KeyData.Key.ScanCode =3D=3D SCAN_PAUSE); + } + } +} + +/** + 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 attempts to enter an infinite loop. +**/ +VOID +EFIAPI +BoardBootManagerUnableToBoot ( + VOID + ) +{ + EFI_STATUS Status; + EFI_BOOT_MANAGER_LOAD_OPTION BootDeviceList; + CHAR16 OptionName[sizeof ("Boot####")]; + + if (mBootMenuOptionNumber =3D=3D LoadOptionNumberUnassigned) { + return; + } + UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", mBootMenuOp= tionNumber); + Status =3D EfiBootManagerVariableToLoadOption (OptionName, &BootDeviceLi= st); + if (EFI_ERROR (Status)) { + return; + } + for (;;) { + EfiBootManagerBoot (&BootDeviceList); + } +} diff --git a/Platform/Intel/BoardModulePkg/Library/BoardBootManagerLib/Boar= dBootManagerLib.inf b/Platform/Intel/BoardModulePkg/Library/BoardBootManage= rLib/BoardBootManagerLib.inf new file mode 100644 index 0000000000..38ff52ca81 --- /dev/null +++ b/Platform/Intel/BoardModulePkg/Library/BoardBootManagerLib/BoardBootMa= nagerLib.inf @@ -0,0 +1,39 @@ +## @file +# The module definition file for BoardBootManagerLib. +# +# Copyright (c) 2019, Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D BoardBootManagerLib + FILE_GUID =3D E7512AE0-6CB1-47ED-B6FF-94A97A86BABB + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D BoardBootManagerLib|DXE_DRIVER + + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 EBC +# + +[Sources] + BoardBootManager.c + +[LibraryClasses] + BaseLib + UefiBootServicesTableLib + DebugLib + UefiLib + HobLib + UefiBootManagerLib + TimerLib + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + MinPlatformPkg/MinPlatformPkg.dec diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/BoardBootManagerLibN= ull/BoardBootManagerLib.c b/Platform/Intel/MinPlatformPkg/Bds/Library/Board= BootManagerLibNull/BoardBootManagerLib.c index 46fce8f59f..6bc518f02c 100644 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/BoardBootManagerLibNull/Boa= rdBootManagerLib.c +++ b/Platform/Intel/MinPlatformPkg/Bds/Library/BoardBootManagerLibNull/Boa= rdBootManagerLib.c @@ -1,7 +1,7 @@ /** @file This file include board specific boot manager callbacks =20 - Copyright (c) 2018, Intel Corporation. All rights reserved.
+ Copyright (c) 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ =20 --=20 2.19.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52230): https://edk2.groups.io/g/devel/message/52230 Mute This Topic: https://groups.io/mt/68590736/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Tue Nov 26 12:31:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52226+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52226+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1576287161; cv=none; d=zohomail.com; s=zohoarc; b=cHH+oWemFGJdtxz66sUQ25xsnlW3uEynXHSWp8JkBxX8k7IhWhPYGy4uYtg371JZ4dsYn1pZ0FWoAeAdMr82Z52Jz3Uxd7szrSLdtxtVeDaeijCIEFJijS1YBB/sJiCeOlQhyWwZdkDKWY0j0mOBTEPWxpb7Q08oFB3eI3M0mlI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576287161; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=D5F4H5egRU8/cYXmd5cCVmm4f2bkp7TEch4kIe5m7R8=; b=OkaknuexVl4Q2DAmbUgdYe7GEl57Cn4DOM1FFq2MlVEkP3Mh+r8MCNK6VkEQm2S4XUdFyaUWzfd+DnXgfZRId5CavF3AashoYlBfHvPsXbp1r8ZagZeMYSEbL3ZrXt+OWKlgY9Ap+W/l1D2KP7/ve5f0LmkIlN4U/ditg8/NDgE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52226+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1576287161454557.1095356625095; Fri, 13 Dec 2019 17:32:41 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 3q7RYY1788612x5nSeur0sFh; Fri, 13 Dec 2019 17:32:40 -0800 X-Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by mx.groups.io with SMTP id smtpd.web09.2403.1576287159525865036 for ; Fri, 13 Dec 2019 17:32:39 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 17:32:39 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,311,1571727600"; d="scan'208";a="297091526" X-Received: from paagyema-desk2.amr.corp.intel.com ([10.24.15.84]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2019 17:32:38 -0800 From: "Agyeman, Prince" To: devel@edk2.groups.io Cc: Michael Kubacki , Chasel Chiu , Nate DeSimone Subject: [edk2-devel] [edk2-platforms] [PATCH 07/11] KabylakeOpenBoardPkg: Add BDS Hook Dxe Driver Date: Fri, 13 Dec 2019 17:32:33 -0800 Message-Id: <96314428770c53cf9d46a0baffeb378180283656.1576282834.git.prince.agyeman@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,prince.agyeman@intel.com X-Gm-Message-State: FuGGZkNR1uZdEJsdzz5Or4uZx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1576287160; bh=fFSqKKx/jrru2kaFrZzV9d72OkeTzdCC1z6kTXHgu7w=; h=Cc:Date:From:Reply-To:Subject:To; b=VKTFPRyHnNJoGsSkjOXQGhVQvxCfMYXkfJlmj2jX9JIwRFdsTa+QBcrkK+6TddikVM3 rXsKK6PRgvwCVthL+wtYFRtCwp9E3iFvQlmIaN2q86i82GOXcc00KZV15G9FXZz67N8NU mcfeEYvlpLsw7vb1MTyzOquw24WBqjwogjg= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2336 Added a DXE driver that registers the minimum platform BDS hook points for the GalagoPro3 and KabylakeRvp3 boards. These hooks are triggered on the BDS hook events What was done: * Included an instance of BoardBdsHookLib and BoardBootManagerLib from BoardModulePkg * Included BdsHookDxe to register the callbacks implemented in BoardBdsHookLib Cc: Michael Kubacki Cc: Chasel Chiu Cc: Nate DeSimone Signed-off-by: Prince Agyeman Reviewed-by: Chasel Chiu Reviewed-by: Michael Kubacki Reviewed-by: Nate DeSimone --- .../Intel/KabylakeOpenBoardPkg/GalagoPro3/OpenBoardPkg.dsc | 7 +++++++ .../Intel/KabylakeOpenBoardPkg/GalagoPro3/OpenBoardPkg.fdf | 1 + .../KabylakeOpenBoardPkg/KabylakeRvp3/OpenBoardPkg.dsc | 6 ++++++ .../KabylakeOpenBoardPkg/KabylakeRvp3/OpenBoardPkg.fdf | 1 + 4 files changed, 15 insertions(+) diff --git a/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/OpenBoardPkg.ds= c b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/OpenBoardPkg.dsc index a39547f41f..bf63d53bef 100644 --- a/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/OpenBoardPkg.dsc +++ b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/OpenBoardPkg.dsc @@ -201,6 +201,12 @@ TestPointCheckLib|$(PLATFORM_PACKAGE)/Test/Library/TestPointCheckLib/Dxe= TestPointCheckLib.inf !endif =20 + ####################################### + # Board Package + ####################################### + BoardBdsHookLib|BoardModulePkg/Library/BoardBdsHookLib/BoardBdsHookLib.i= nf + BoardBootManagerLib|BoardModulePkg/Library/BoardBootManagerLib/BoardBoot= ManagerLib.inf + ####################################### # Board-specific ####################################### @@ -425,3 +431,4 @@ } !endif BoardModulePkg/LegacySioDxe/LegacySioDxe.inf + BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.inf diff --git a/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/OpenBoardPkg.fd= f b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/OpenBoardPkg.fdf index da94ed0cd1..196f04c68d 100644 --- a/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/OpenBoardPkg.fdf +++ b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/OpenBoardPkg.fdf @@ -341,6 +341,7 @@ INF MdeModulePkg/Universal/Console/GraphicsOutputDxe/G= raphicsOutputDxe.inf INF MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf INF BoardModulePkg/LegacySioDxe/LegacySioDxe.inf INF MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KeyboardDxe.inf +INF BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.inf =20 INF ShellPkg/Application/Shell/Shell.inf =20 diff --git a/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/OpenBoardPkg.= dsc b/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/OpenBoardPkg.dsc index 50be2bb624..044688ba4e 100644 --- a/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/OpenBoardPkg.dsc +++ b/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/OpenBoardPkg.dsc @@ -241,6 +241,11 @@ !if $(TARGET) =3D=3D DEBUG TestPointCheckLib|$(PLATFORM_PACKAGE)/Test/Library/TestPointCheckLib/Dxe= TestPointCheckLib.inf !endif + ####################################### + # Board Package + ####################################### + BoardBdsHookLib|BoardModulePkg/Library/BoardBdsHookLib/BoardBdsHookLib.i= nf + BoardBootManagerLib|BoardModulePkg/Library/BoardBootManagerLib/BoardBoot= ManagerLib.inf =20 ####################################### # Board-specific @@ -505,3 +510,4 @@ } !endif BoardModulePkg/LegacySioDxe/LegacySioDxe.inf + BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.inf diff --git a/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/OpenBoardPkg.= fdf b/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/OpenBoardPkg.fdf index fc1c6a9c25..f2cfff1c7b 100644 --- a/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/OpenBoardPkg.fdf +++ b/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/OpenBoardPkg.fdf @@ -343,6 +343,7 @@ INF MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPass= Thru.inf INF MdeModulePkg/Universal/Console/GraphicsOutputDxe/GraphicsOutputDxe.inf INF BoardModulePkg/LegacySioDxe/LegacySioDxe.inf INF MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KeyboardDxe.inf +INF BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.inf =20 INF ShellPkg/Application/Shell/Shell.inf =20 --=20 2.19.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52226): https://edk2.groups.io/g/devel/message/52226 Mute This Topic: https://groups.io/mt/68590729/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Tue Nov 26 12:31:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52231+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52231+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1576287162; cv=none; d=zohomail.com; s=zohoarc; b=bS8ecZPnIZpXJSfD1NjaEz213qo0Y9DCTgiJdzdIWPxrbMRsoGtLILOvyUGZp9zW4OdbqrX/2igO0sOHJ/IHOzhuZl4AbdUNB0pC9KNHXo+SaG4QpwiCfpAzKZTS+bTIG4nUv8dyjifCbR0KTf54R5lkOgcUj15HJ36quLzO4VU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576287162; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=bXAAODhEAINIQDq95z0IZZ/T0V3dfaZtMnuJjrQr8xI=; b=nBca7qVcWpdNoDMIvxLlCy5q2QUImuqJdDu7ajjRZXYuaZuZOK2dXzxDwoAfOGooOEv3tTsfU9GDvG3E04Loi3JKEehOy8pMXNmBMgAm32klnzYdQDIE8B+1eDNldBitoEnYf5WydLzg1rlcTVxNWcw2v7zhnvZMjyx0CJc2c3A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52231+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 157628716257198.15319688206296; Fri, 13 Dec 2019 17:32:42 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id dTBSYY1788612x95Isi1U5NY; Fri, 13 Dec 2019 17:32:41 -0800 X-Received: from mga01.intel.com (mga01.intel.com []) by mx.groups.io with SMTP id smtpd.web10.2431.1576287159626860661 for ; Fri, 13 Dec 2019 17:32:40 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 17:32:38 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,311,1571727600"; d="scan'208";a="297091529" X-Received: from paagyema-desk2.amr.corp.intel.com ([10.24.15.84]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2019 17:32:38 -0800 From: "Agyeman, Prince" To: devel@edk2.groups.io Cc: Michael Kubacki , Chasel Chiu , Nate DeSimone Subject: [edk2-devel] [edk2-platforms] [PATCH 08/11] WhiskeylakeOpenBoardPkg: Add BDS Hook Dxe Driver Date: Fri, 13 Dec 2019 17:32:34 -0800 Message-Id: <8d19c7fcaeb13430c0557bdc1bd6ce1b8835a9b1.1576282834.git.prince.agyeman@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,prince.agyeman@intel.com X-Gm-Message-State: O71SBb29rNVku5t69Q3Cn8LTx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1576287161; bh=3zDyDAGWsBTJNsn7tIOu158M0q0mKcesqMvehRUcy9A=; h=Cc:Date:From:Reply-To:Subject:To; b=cJSjWWxjXTqc0WXrHF/dgto675XR4rZ5sVgSkfBSLGKIDbyYS7hnB4ntBe1rIg2c1Og NH/jC0jRvYjkNT4xHpToQnI9+/v+KLtqZVvcrAA5m3I04d3GNiKaw6Y2f2w4jAFdrz/mS u37yPuKFinfyB0CZbuT15LMh4tVKNWAv5Zs= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2336 Added a DXE driver that registers the minimum platform BDS hook points, to WhiskeylakeURvp board. These hooks are triggered on the BDS hook events What was done: * Included an instance of BdsHookLib and BoardBootManagerLib from BoardModulePkg * Included BdsHookDxe to register the callbacks implemented in BdsHookLib Cc: Michael Kubacki Cc: Chasel Chiu Cc: Nate DeSimone Signed-off-by: Prince Agyeman Reviewed-by: Chasel Chiu Reviewed-by: Michael Kubacki Reviewed-by: Nate DeSimone --- .../WhiskeylakeOpenBoardPkg/WhiskeylakeURvp/OpenBoardPkg.dsc | 4 ++++ .../WhiskeylakeOpenBoardPkg/WhiskeylakeURvp/OpenBoardPkg.fdf | 1 + 2 files changed, 5 insertions(+) diff --git a/Platform/Intel/WhiskeylakeOpenBoardPkg/WhiskeylakeURvp/OpenBoa= rdPkg.dsc b/Platform/Intel/WhiskeylakeOpenBoardPkg/WhiskeylakeURvp/OpenBoar= dPkg.dsc index 47e156be08..1a9e608bd6 100644 --- a/Platform/Intel/WhiskeylakeOpenBoardPkg/WhiskeylakeURvp/OpenBoardPkg.d= sc +++ b/Platform/Intel/WhiskeylakeOpenBoardPkg/WhiskeylakeURvp/OpenBoardPkg.d= sc @@ -224,6 +224,8 @@ ####################################### DxePolicyUpdateLib|$(PLATFORM_BOARD_PACKAGE)/Policy/Library/DxePolicyUpd= ateLib/DxePolicyUpdateLib.inf DxeTbtPolicyLib|$(PLATFORM_BOARD_PACKAGE)/Features/Tbt/Library/DxeTbtPol= icyLib/DxeTbtPolicyLib.inf + BoardBdsHookLib|BoardModulePkg/Library/BoardBdsHookLib/BoardBdsHookLib.i= nf + BoardBootManagerLib|BoardModulePkg/Library/BoardBootManagerLib/BoardBoot= ManagerLib.inf =20 ####################################### # Board-specific @@ -452,3 +454,5 @@ $(PLATFORM_BOARD_PACKAGE)/Acpi/BoardAcpiDxe/BoardAcpiDxe.inf !endif BoardModulePkg/LegacySioDxe/LegacySioDxe.inf + BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.inf + diff --git a/Platform/Intel/WhiskeylakeOpenBoardPkg/WhiskeylakeURvp/OpenBoa= rdPkg.fdf b/Platform/Intel/WhiskeylakeOpenBoardPkg/WhiskeylakeURvp/OpenBoar= dPkg.fdf index f39b41b186..ad32268a82 100644 --- a/Platform/Intel/WhiskeylakeOpenBoardPkg/WhiskeylakeURvp/OpenBoardPkg.f= df +++ b/Platform/Intel/WhiskeylakeOpenBoardPkg/WhiskeylakeURvp/OpenBoardPkg.f= df @@ -346,6 +346,7 @@ INF MdeModulePkg/Universal/Console/GraphicsOutputDxe/G= raphicsOutputDxe.inf INF MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf INF BoardModulePkg/LegacySioDxe/LegacySioDxe.inf INF MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KeyboardDxe.inf +INF BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.inf =20 INF ShellPkg/Application/Shell/Shell.inf =20 --=20 2.19.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52231): https://edk2.groups.io/g/devel/message/52231 Mute This Topic: https://groups.io/mt/68590738/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Tue Nov 26 12:31:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52229+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52229+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1576287162; cv=none; d=zohomail.com; s=zohoarc; b=i7owPwwguGIdNJeOu0pLerbYjComeCwImSaaSkAwFM76UnWp+5HE+Ax/5fto25G+IHKXcyWRxvhrFvcN1OsCJyHMftCaz16Sqm/pgib49sumyaMECQGgYgbodCINBaVjuiGdaPdxuYc8tPnOgWES5Gd1j6CdKDp+KToN/ZQLK4M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576287162; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=R6gGgpgSlmaSPtIlrPlI9tsTjrWcyPuePDcHTt6tW7Y=; b=ezFEtaJOJZNOWyDEebuMOaekLz6ZXfUVjXv+5T/+FV1+DUOstcxgmYCYqAGRDxcpL1LTe/aC4hMQQJptvDxX+HU/8ErIwiqCKRRkYXFoiJvs0V51x8D+s2GAf2nxscisXQKMB/XR15HZcJ67ULRQgZd2mJpidCbkuNwCnmpYn0Q= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52229+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1576287162724731.6018791575506; Fri, 13 Dec 2019 17:32:42 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id KX3CYY1788612xRVPqLo22KC; Fri, 13 Dec 2019 17:32:41 -0800 X-Received: from mga04.intel.com (mga04.intel.com []) by mx.groups.io with SMTP id smtpd.web09.2403.1576287159525865036 for ; Fri, 13 Dec 2019 17:32:39 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 17:32:39 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,311,1571727600"; d="scan'208";a="297091532" X-Received: from paagyema-desk2.amr.corp.intel.com ([10.24.15.84]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2019 17:32:38 -0800 From: "Agyeman, Prince" To: devel@edk2.groups.io Cc: Nate DeSimone , Michael Kubacki Subject: [edk2-devel] [edk2-platforms] [PATCH 09/11] SimicsOpenBoardPkg: Add Bds Hook Library Date: Fri, 13 Dec 2019 17:32:35 -0800 Message-Id: <0e6adf38585b824f8751ac68269ce7e97bff50d8.1576282834.git.prince.agyeman@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,prince.agyeman@intel.com X-Gm-Message-State: HYR3DfB6F8g0iiI4eO0HjvsLx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1576287161; bh=jwGPsq3obqjZhFo/NxzqXf1smlx2VNq2hq/ed5fZHZk=; h=Cc:Date:From:Reply-To:Subject:To; b=LsgCMOxRZlBERK7EwY55plVYEiToOQN9lKc8FoQFWXpO9gRVRwnKI9BTyr4fpIPYdKj r4UoEDlvNUAWAr7NtRoZMWhQEvhZ/y2iCy8VX9wcdDJbU+aPom37TXw6z2rurXX89vRRO sgS2NMk29Pgx1x/d0A7B+DgcGIVMeVEHrYU= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2336 Added Board BDS Hook library that implements simics specific Bds hook points or callbacks. Cc: Nate DeSimone Cc: Michael Kubacki Signed-off-by: Prince Agyeman --- .../Library/BoardBdsHookLib/BoardBdsHook.h | 173 ++ .../Library/BoardBdsHookLib/BoardBdsHookLib.c | 1630 +++++++++++++++++ .../BoardBdsHookLib/BoardBdsHookLib.inf | 81 + 3 files changed, 1884 insertions(+) create mode 100644 Platform/Intel/SimicsOpenBoardPkg/Library/BoardBdsHookL= ib/BoardBdsHook.h create mode 100644 Platform/Intel/SimicsOpenBoardPkg/Library/BoardBdsHookL= ib/BoardBdsHookLib.c create mode 100644 Platform/Intel/SimicsOpenBoardPkg/Library/BoardBdsHookL= ib/BoardBdsHookLib.inf diff --git a/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBdsHookLib/Boar= dBdsHook.h b/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBdsHookLib/Boar= dBdsHook.h new file mode 100644 index 0000000000..fda41b1c97 --- /dev/null +++ b/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBdsHookLib/BoardBdsHoo= k.h @@ -0,0 +1,173 @@ +/** @file + Header file for the board board specific BDS hook library. + + Copyright (c) 2019 Intel Corporation. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _PLATFORM_SPECIFIC_BDS_PLATFORM_H_ +#define _PLATFORM_SPECIFIC_BDS_PLATFORM_H_ + + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +extern EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[]; +extern ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode; +extern ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode; +extern UART_DEVICE_PATH gUartDeviceNode; +extern VENDOR_DEVICE_PATH gTerminalTypeDeviceNode; + +#define PCI_DEVICE_PATH_NODE(Func, Dev) \ + { \ + { \ + HARDWARE_DEVICE_PATH, \ + HW_PCI_DP, \ + { \ + (UINT8) (sizeof (PCI_DEVICE_PATH)), \ + (UINT8) ((sizeof (PCI_DEVICE_PATH)) >> 8) \ + } \ + }, \ + (Func), \ + (Dev) \ + } + +#define PNPID_DEVICE_PATH_NODE(PnpId) \ + { \ + { \ + ACPI_DEVICE_PATH, \ + ACPI_DP, \ + { \ + (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \ + (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \ + }, \ + }, \ + EISA_PNP_ID((PnpId)), \ + 0 \ + } + +#define gPciIsaBridge \ + PCI_DEVICE_PATH_NODE(0, 0x1f) + +#define gP2PBridge \ + PCI_DEVICE_PATH_NODE(0, 0x1e) + +#define gPnpPs2Keyboard \ + PNPID_DEVICE_PATH_NODE(0x0303) + +#define gPnp16550ComPort \ + PNPID_DEVICE_PATH_NODE(0x0501) + +#define gUart \ + { \ + { \ + MESSAGING_DEVICE_PATH, \ + MSG_UART_DP, \ + { \ + (UINT8) (sizeof (UART_DEVICE_PATH)), \ + (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8) \ + } \ + }, \ + 0, \ + 115200, \ + 8, \ + 1, \ + 1 \ + } + +#define gPcAnsiTerminal \ + { \ + { \ + MESSAGING_DEVICE_PATH, \ + MSG_VENDOR_DP, \ + { \ + (UINT8) (sizeof (VENDOR_DEVICE_PATH)), \ + (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) \ + } \ + }, \ + DEVICE_PATH_MESSAGING_PC_ANSI \ + } + +#define PCI_CLASS_SCC 0x07 +#define PCI_SUBCLASS_SERIAL 0x00 +#define PCI_IF_16550 0x02 +#define IS_PCI_16550SERIAL(_p) IS_CLASS3 (_p, PCI_CLASS_SCC, PCI= _SUBCLASS_SERIAL, PCI_IF_16550) +#define IS_PCI_ISA_PDECODE(_p) IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI= _CLASS_BRIDGE_ISA_PDECODE, 0) + +typedef struct { + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + UINTN ConnectType; +} PLATFORM_CONSOLE_CONNECT_ENTRY; + +#define CONSOLE_OUT BIT0 +#define CONSOLE_IN BIT1 +#define STD_ERROR BIT2 +extern PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[]; + +// +// Platform BDS Functions +// + +VOID +PlatformInitializeConsole ( + IN PLATFORM_CONSOLE_CONNECT_ENTRY *PlatformConsole + ); + +/** + Use SystemTable ConOut to stop video based Simple Text Out consoles from= going + to the video device. Put up LogoFile on every video device that is a con= sole. + + @param[in] LogoFile The file name of logo to display on the center of= the screen. + + @retval EFI_SUCCESS ConsoleControl has been flipped to graphics and = logo displayed. + @retval EFI_UNSUPPORTED Logo not found. + +**/ +EFI_STATUS +EFIAPI +EnableBootLogo( + IN EFI_GUID *LogoFile +); + +#endif // _PLATFORM_SPECIFIC_BDS_PLATFORM_H_ diff --git a/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBdsHookLib/Boar= dBdsHookLib.c b/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBdsHookLib/B= oardBdsHookLib.c new file mode 100644 index 0000000000..1058dbf3cf --- /dev/null +++ b/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBdsHookLib/BoardBdsHoo= kLib.c @@ -0,0 +1,1630 @@ +/** @file + Board BDS hook Library. Implements board specific BDS hook library + + Copyright (c) 2019 Intel Corporation. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "BoardBdsHook.h" +#include +#include + +#define LEGACY_8259_MASK_REGISTER_MASTER 0x21 +#define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1 +#define LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_MASTER 0x4D0 +#define LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_SLAVE 0x4D1 + +// +// Predefined platform connect sequence +// +EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[] =3D { NULL }; + + +ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode =3D gPnpPs2Keyboard; +ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode =3D gPnp16550ComPort; +UART_DEVICE_PATH gUartDeviceNode =3D gUart; +VENDOR_DEVICE_PATH gTerminalTypeDeviceNode =3D gPcAnsiTerminal; + +// +// Global data +// + +VOID *mEfiDevPathNotifyReg; +EFI_EVENT mEfiDevPathEvent; +VOID *mEmuVariableEventReg; +EFI_EVENT mEmuVariableEvent; +BOOLEAN mDetectVgaOnly; +UINT16 mHostBridgeDevId; + +// +// Table of host IRQs matching PCI IRQs A-D +// (for configuring PCI Interrupt Line register) +// +CONST UINT8 PciHostIrqs[] =3D { + 0x0a, 0x0a, 0x0b, 0x0b +}; + +// +// Type definitions +// +typedef +EFI_STATUS +(EFIAPI *PROTOCOL_INSTANCE_CALLBACK)( + IN EFI_HANDLE Handle, + IN VOID *Instance, + IN VOID *Context + ); + +/** + @param[in] Handle - Handle of PCI device instance + @param[in] PciIo - PCI IO protocol instance + @param[in] Pci - PCI Header register block +**/ +typedef +EFI_STATUS +(EFIAPI *VISIT_PCI_INSTANCE_CALLBACK)( + IN EFI_HANDLE Handle, + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN PCI_TYPE00 *Pci + ); + + +// +// Function prototypes +// + +EFI_STATUS +VisitAllInstancesOfProtocol ( + IN EFI_GUID *Id, + IN PROTOCOL_INSTANCE_CALLBACK CallBackFunction, + IN VOID *Context + ); + +EFI_STATUS +VisitAllPciInstancesOfProtocol ( + IN VISIT_PCI_INSTANCE_CALLBACK CallBackFunction + ); + +VOID +InstallDevicePathCallback ( + VOID + ); + +EFI_STATUS +EFIAPI +ConnectRootBridge ( + IN EFI_HANDLE RootBridgeHandle, + IN VOID *Instance, + IN VOID *Context + ); + + +VOID +PlatformRegisterFvBootOption ( + EFI_GUID *FileGuid, + CHAR16 *Description, + UINT32 Attributes + ) +{ + EFI_STATUS Status; + INTN OptionIndex; + EFI_BOOT_MANAGER_LOAD_OPTION NewOption; + EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; + UINTN BootOptionCount; + MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode; + EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + Status =3D gBS->HandleProtocol ( + gImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID **) &LoadedImage + ); + ASSERT_EFI_ERROR (Status); + + EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid); + DevicePath =3D DevicePathFromHandle (LoadedImage->DeviceHandle); + ASSERT (DevicePath !=3D NULL); + DevicePath =3D AppendDevicePathNode ( + DevicePath, + (EFI_DEVICE_PATH_PROTOCOL *) &FileNode + ); + ASSERT (DevicePath !=3D NULL); + + Status =3D EfiBootManagerInitializeLoadOption ( + &NewOption, + LoadOptionNumberUnassigned, + LoadOptionTypeBoot, + Attributes, + Description, + DevicePath, + NULL, + 0 + ); + ASSERT_EFI_ERROR (Status); + FreePool (DevicePath); + + BootOptions =3D EfiBootManagerGetLoadOptions ( + &BootOptionCount, LoadOptionTypeBoot + ); + + OptionIndex =3D EfiBootManagerFindLoadOption ( + &NewOption, BootOptions, BootOptionCount + ); + + if (OptionIndex =3D=3D -1) { + Status =3D EfiBootManagerAddLoadOptionVariable (&NewOption, MAX_UINTN); + ASSERT_EFI_ERROR (Status); + } + EfiBootManagerFreeLoadOption (&NewOption); + EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); +} + +/** + Remove all MemoryMapped(...)/FvFile(...) and Fv(...)/FvFile(...) boot op= tions + whose device paths do not resolve exactly to an FvFile in the system. + + This removes any boot options that point to binaries built into the firm= ware + and have become stale due to any of the following: + - DXEFV's base address or size changed (historical), + - DXEFV's FvNameGuid changed, + - the FILE_GUID of the pointed-to binary changed, + - the referenced binary is no longer built into the firmware. + + EfiBootManagerFindLoadOption() used in PlatformRegisterFvBootOption() on= ly + avoids exact duplicates. +**/ +VOID +RemoveStaleFvFileOptions ( + VOID + ) +{ + EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; + UINTN BootOptionCount; + UINTN Index; + + BootOptions =3D EfiBootManagerGetLoadOptions (&BootOptionCount, + LoadOptionTypeBoot); + + for (Index =3D 0; Index < BootOptionCount; ++Index) { + EFI_DEVICE_PATH_PROTOCOL *Node1, *Node2, *SearchNode; + EFI_STATUS Status; + EFI_HANDLE FvHandle; + + // + // If the device path starts with neither MemoryMapped(...) nor Fv(...= ), + // then keep the boot option. + // + Node1 =3D BootOptions[Index].FilePath; + if (!(DevicePathType (Node1) =3D=3D HARDWARE_DEVICE_PATH && + DevicePathSubType (Node1) =3D=3D HW_MEMMAP_DP) && + !(DevicePathType (Node1) =3D=3D MEDIA_DEVICE_PATH && + DevicePathSubType (Node1) =3D=3D MEDIA_PIWG_FW_VOL_DP)) { + continue; + } + + // + // If the second device path node is not FvFile(...), then keep the bo= ot + // option. + // + Node2 =3D NextDevicePathNode (Node1); + if (DevicePathType (Node2) !=3D MEDIA_DEVICE_PATH || + DevicePathSubType (Node2) !=3D MEDIA_PIWG_FW_FILE_DP) { + continue; + } + + // + // Locate the Firmware Volume2 protocol instance that is denoted by the + // boot option. If this lookup fails (i.e., the boot option references= a + // firmware volume that doesn't exist), then we'll proceed to delete t= he + // boot option. + // + SearchNode =3D Node1; + Status =3D gBS->LocateDevicePath (&gEfiFirmwareVolume2ProtocolGuid, + &SearchNode, &FvHandle); + + if (!EFI_ERROR (Status)) { + // + // The firmware volume was found; now let's see if it contains the F= vFile + // identified by GUID. + // + EFI_FIRMWARE_VOLUME2_PROTOCOL *FvProtocol; + MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFileNode; + UINTN BufferSize; + EFI_FV_FILETYPE FoundType; + EFI_FV_FILE_ATTRIBUTES FileAttributes; + UINT32 AuthenticationStatus; + + Status =3D gBS->HandleProtocol (FvHandle, &gEfiFirmwareVolume2Protoc= olGuid, + (VOID **)&FvProtocol); + ASSERT_EFI_ERROR (Status); + + FvFileNode =3D (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)Node2; + // + // Buffer=3D=3DNULL means we request metadata only: BufferSize, Foun= dType, + // FileAttributes. + // + Status =3D FvProtocol->ReadFile ( + FvProtocol, + &FvFileNode->FvFileName, // NameGuid + NULL, // Buffer + &BufferSize, + &FoundType, + &FileAttributes, + &AuthenticationStatus + ); + if (!EFI_ERROR (Status)) { + // + // The FvFile was found. Keep the boot option. + // + continue; + } + } + + // + // Delete the boot option. + // + Status =3D EfiBootManagerDeleteLoadOptionVariable ( + BootOptions[Index].OptionNumber, LoadOptionTypeBoot); + DEBUG_CODE ( + CHAR16 *DevicePathString; + + DevicePathString =3D ConvertDevicePathToText(BootOptions[Index].File= Path, + FALSE, FALSE); + DEBUG (( + EFI_ERROR (Status) ? EFI_D_WARN : DEBUG_VERBOSE, + "%a: removing stale Boot#%04x %s: %r\n", + __FUNCTION__, + (UINT32)BootOptions[Index].OptionNumber, + DevicePathString =3D=3D NULL ? L"" : DevicePathString, + Status + )); + if (DevicePathString !=3D NULL) { + FreePool (DevicePathString); + } + ); + } + + EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); +} + +VOID +PlatformRegisterOptionsAndKeys ( + VOID + ) +{ + EFI_STATUS Status; + EFI_INPUT_KEY Enter; + EFI_INPUT_KEY F2; + EFI_INPUT_KEY Esc; + EFI_BOOT_MANAGER_LOAD_OPTION BootOption; + + // + // Register ENTER as CONTINUE key + // + Enter.ScanCode =3D SCAN_NULL; + Enter.UnicodeChar =3D CHAR_CARRIAGE_RETURN; + Status =3D EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL); + ASSERT_EFI_ERROR (Status); + DEBUG ((DEBUG_INFO, "PlatformRegisterOptionsAndKeys\n")); + if (EFI_ERROR(Status)){ + return; + } + // + // Map F2 to Boot Manager Menu + // + F2.ScanCode =3D SCAN_F2; + F2.UnicodeChar =3D CHAR_NULL; + Esc.ScanCode =3D SCAN_ESC; + Esc.UnicodeChar =3D CHAR_NULL; + Status =3D EfiBootManagerGetBootManagerMenu (&BootOption); + ASSERT_EFI_ERROR (Status); + Status =3D EfiBootManagerAddKeyOptionVariable ( + NULL, (UINT16) BootOption.OptionNumber, 0, &F2, NULL + ); + ASSERT (Status =3D=3D EFI_SUCCESS || Status =3D=3D EFI_ALREADY_STARTED); + Status =3D EfiBootManagerAddKeyOptionVariable ( + NULL, (UINT16) BootOption.OptionNumber, 0, &Esc, NULL + ); + ASSERT (Status =3D=3D EFI_SUCCESS || Status =3D=3D EFI_ALREADY_STARTED); +} + + +/** + Add IsaKeyboard to ConIn; add IsaSerial to ConOut, ConIn, ErrOut. + + @param[in] DeviceHandle Handle of the LPC Bridge device. + + @retval EFI_SUCCESS Console devices on the LPC bridge have been added to + ConOut, ConIn, and ErrOut. + + @return Error codes, due to EFI_DEVICE_PATH_PROTOCOL missing + from DeviceHandle. +**/ +EFI_STATUS +EFIAPI +ConnectRootBridge ( + IN EFI_HANDLE RootBridgeHandle, + IN VOID *Instance, + IN VOID *Context + ) +{ + EFI_STATUS Status; + + // + // Make the PCI bus driver connect the root bridge, non-recursively. This + // will produce a number of child handles with PciIo on them. + // + Status =3D gBS->ConnectController ( + RootBridgeHandle, // ControllerHandle + NULL, // DriverImageHandle + NULL, // RemainingDevicePath -- produce all + // children + FALSE // Recursive + ); + return Status; +} + + +/** + Add IsaKeyboard to ConIn; add IsaSerial to ConOut, ConIn, ErrOut. + + @param[in] DeviceHandle Handle of the LPC Bridge device. + + @retval EFI_SUCCESS Console devices on the LPC bridge have been added to + ConOut, ConIn, and ErrOut. + + @return Error codes, due to EFI_DEVICE_PATH_PROTOCOL missing + from DeviceHandle. +**/ +EFI_STATUS +PrepareLpcBridgeDevicePath ( + IN EFI_HANDLE DeviceHandle + ) +{ + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; + CHAR16 *DevPathStr; + + DevicePath =3D NULL; + Status =3D gBS->HandleProtocol ( + DeviceHandle, + &gEfiDevicePathProtocolGuid, + (VOID*)&DevicePath + ); + if (EFI_ERROR (Status)) { + return Status; + } + TempDevicePath =3D DevicePath; + + // + // Register Keyboard + // + DevicePath =3D AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOC= OL *)&gPnpPs2KeyboardDeviceNode); + + EfiBootManagerUpdateConsoleVariable (ConIn, DevicePath, NULL); + + // + // Register COM1 + // + DevicePath =3D TempDevicePath; + gPnp16550ComPortDeviceNode.UID =3D 0; + + DevicePath =3D AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOC= OL *)&gPnp16550ComPortDeviceNode); + DevicePath =3D AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOC= OL *)&gUartDeviceNode); + DevicePath =3D AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOC= OL *)&gTerminalTypeDeviceNode); + + // + // Print Device Path + // + DevPathStr =3D ConvertDevicePathToText (DevicePath, FALSE, FALSE); + if (DevPathStr !=3D NULL) { + DEBUG(( + DEBUG_INFO, + "BdsPlatform.c+%d: COM%d DevPath: %s\n", + __LINE__, + gPnp16550ComPortDeviceNode.UID + 1, + DevPathStr + )); + FreePool(DevPathStr); + } + + EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL); + EfiBootManagerUpdateConsoleVariable (ConIn, DevicePath, NULL); + EfiBootManagerUpdateConsoleVariable (ErrOut, DevicePath, NULL); + + // + // Register COM2 + // + DevicePath =3D TempDevicePath; + gPnp16550ComPortDeviceNode.UID =3D 1; + + DevicePath =3D AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOC= OL *)&gPnp16550ComPortDeviceNode); + DevicePath =3D AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOC= OL *)&gUartDeviceNode); + DevicePath =3D AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOC= OL *)&gTerminalTypeDeviceNode); + + // + // Print Device Path + // + DevPathStr =3D ConvertDevicePathToText (DevicePath, FALSE, FALSE); + if (DevPathStr !=3D NULL) { + DEBUG(( + DEBUG_INFO, + "BdsPlatform.c+%d: COM%d DevPath: %s\n", + __LINE__, + gPnp16550ComPortDeviceNode.UID + 1, + DevPathStr + )); + FreePool(DevPathStr); + } + + EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL); + EfiBootManagerUpdateConsoleVariable (ConIn, DevicePath, NULL); + EfiBootManagerUpdateConsoleVariable (ErrOut, DevicePath, NULL); + + return EFI_SUCCESS; +} + +EFI_STATUS +GetGopDevicePath ( + IN EFI_DEVICE_PATH_PROTOCOL *PciDevicePath, + OUT EFI_DEVICE_PATH_PROTOCOL **GopDevicePath + ) +{ + UINTN Index; + EFI_STATUS Status; + EFI_HANDLE PciDeviceHandle; + EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; + EFI_DEVICE_PATH_PROTOCOL *TempPciDevicePath; + UINTN GopHandleCount; + EFI_HANDLE *GopHandleBuffer; + + if (PciDevicePath =3D=3D NULL || GopDevicePath =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // Initialize the GopDevicePath to be PciDevicePath + // + *GopDevicePath =3D PciDevicePath; + TempPciDevicePath =3D PciDevicePath; + + Status =3D gBS->LocateDevicePath ( + &gEfiDevicePathProtocolGuid, + &TempPciDevicePath, + &PciDeviceHandle + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Try to connect this handle, so that GOP driver could start on this + // device and create child handles with GraphicsOutput Protocol installed + // on them, then we get device paths of these child handles and select + // them as possible console device. + // + gBS->ConnectController (PciDeviceHandle, NULL, NULL, FALSE); + + Status =3D gBS->LocateHandleBuffer ( + ByProtocol, + &gEfiGraphicsOutputProtocolGuid, + NULL, + &GopHandleCount, + &GopHandleBuffer + ); + if (!EFI_ERROR (Status)) { + // + // Add all the child handles as possible Console Device + // + for (Index =3D 0; Index < GopHandleCount; Index++) { + Status =3D gBS->HandleProtocol (GopHandleBuffer[Index], &gEfiDeviceP= athProtocolGuid, (VOID*)&TempDevicePath); + if (EFI_ERROR (Status)) { + continue; + } + if (CompareMem ( + PciDevicePath, + TempDevicePath, + GetDevicePathSize (PciDevicePath) - END_DEVICE_PATH_LENGTH + ) =3D=3D 0) { + // + // In current implementation, we only enable one of the child hand= les + // as console device, i.e. sotre one of the child handle's device + // path to variable "ConOut" + // In future, we could select all child handles to be console devi= ce + // + + *GopDevicePath =3D TempDevicePath; + + // + // Delete the PCI device's path that added by + // GetPlugInPciVgaDevicePath(). Add the integrity GOP device path. + // + EfiBootManagerUpdateConsoleVariable (ConOutDev, NULL, PciDevicePat= h); + EfiBootManagerUpdateConsoleVariable (ConOutDev, TempDevicePath, NU= LL); + } + } + gBS->FreePool (GopHandleBuffer); + } + + return EFI_SUCCESS; +} + +/** + Add PCI display to ConOut. + + @param[in] DeviceHandle Handle of the PCI display device. + + @retval EFI_SUCCESS The PCI display device has been added to ConOut. + + @return Error codes, due to EFI_DEVICE_PATH_PROTOCOL missing + from DeviceHandle. +**/ +EFI_STATUS +PreparePciDisplayDevicePath ( + IN EFI_HANDLE DeviceHandle + ) +{ + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + EFI_DEVICE_PATH_PROTOCOL *GopDevicePath; + + DevicePath =3D NULL; + GopDevicePath =3D NULL; + Status =3D gBS->HandleProtocol ( + DeviceHandle, + &gEfiDevicePathProtocolGuid, + (VOID*)&DevicePath + ); + if (EFI_ERROR (Status)) { + return Status; + } + + GetGopDevicePath (DevicePath, &GopDevicePath); + DevicePath =3D GopDevicePath; + + EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL); + + return EFI_SUCCESS; +} + +/** + Add PCI Serial to ConOut, ConIn, ErrOut. + + @param[in] DeviceHandle Handle of the PCI serial device. + + @retval EFI_SUCCESS The PCI serial device has been added to ConOut, Con= In, + ErrOut. + + @return Error codes, due to EFI_DEVICE_PATH_PROTOCOL missing + from DeviceHandle. +**/ +EFI_STATUS +PreparePciSerialDevicePath ( + IN EFI_HANDLE DeviceHandle + ) +{ + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + DevicePath =3D NULL; + Status =3D gBS->HandleProtocol ( + DeviceHandle, + &gEfiDevicePathProtocolGuid, + (VOID*)&DevicePath + ); + if (EFI_ERROR (Status)) { + return Status; + } + + DevicePath =3D AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOC= OL *)&gUartDeviceNode); + DevicePath =3D AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOC= OL *)&gTerminalTypeDeviceNode); + + EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL); + EfiBootManagerUpdateConsoleVariable (ConIn, DevicePath, NULL); + EfiBootManagerUpdateConsoleVariable (ErrOut, DevicePath, NULL); + + return EFI_SUCCESS; +} + +EFI_STATUS +VisitAllInstancesOfProtocol ( + IN EFI_GUID *Id, + IN PROTOCOL_INSTANCE_CALLBACK CallBackFunction, + IN VOID *Context + ) +{ + EFI_STATUS Status; + UINTN HandleCount; + EFI_HANDLE *HandleBuffer; + UINTN Index; + VOID *Instance; + + // + // Start to check all the PciIo to find all possible device + // + HandleCount =3D 0; + HandleBuffer =3D NULL; + Status =3D gBS->LocateHandleBuffer ( + ByProtocol, + Id, + NULL, + &HandleCount, + &HandleBuffer + ); + if (EFI_ERROR (Status)) { + return Status; + } + + for (Index =3D 0; Index < HandleCount; Index++) { + Status =3D gBS->HandleProtocol (HandleBuffer[Index], Id, &Instance); + if (EFI_ERROR (Status)) { + continue; + } + + Status =3D (*CallBackFunction) ( + HandleBuffer[Index], + Instance, + Context + ); + } + + gBS->FreePool (HandleBuffer); + + return EFI_SUCCESS; +} + + +EFI_STATUS +EFIAPI +VisitingAPciInstance ( + IN EFI_HANDLE Handle, + IN VOID *Instance, + IN VOID *Context + ) +{ + EFI_STATUS Status; + EFI_PCI_IO_PROTOCOL *PciIo; + PCI_TYPE00 Pci; + + PciIo =3D (EFI_PCI_IO_PROTOCOL*) Instance; + + // + // Check for all PCI device + // + Status =3D PciIo->Pci.Read ( + PciIo, + EfiPciIoWidthUint32, + 0, + sizeof (Pci) / sizeof (UINT32), + &Pci + ); + if (EFI_ERROR (Status)) { + return Status; + } + + return (*(VISIT_PCI_INSTANCE_CALLBACK)(UINTN) Context) ( + Handle, + PciIo, + &Pci + ); + +} + + + +EFI_STATUS +VisitAllPciInstances ( + IN VISIT_PCI_INSTANCE_CALLBACK CallBackFunction + ) +{ + return VisitAllInstancesOfProtocol ( + &gEfiPciIoProtocolGuid, + VisitingAPciInstance, + (VOID*)(UINTN) CallBackFunction + ); +} + + +/** + Do platform specific PCI Device check and add them to + ConOut, ConIn, ErrOut. + + @param[in] Handle - Handle of PCI device instance + @param[in] PciIo - PCI IO protocol instance + @param[in] Pci - PCI Header register block + + @retval EFI_SUCCESS - PCI Device check and Console variable update + successfully. + @retval EFI_STATUS - PCI Device check or Console variable update fail. + +**/ +EFI_STATUS +EFIAPI +DetectAndPreparePlatformPciDevicePath ( + IN EFI_HANDLE Handle, + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN PCI_TYPE00 *Pci + ) +{ + EFI_STATUS Status; + + Status =3D PciIo->Attributes ( + PciIo, + EfiPciIoAttributeOperationEnable, + EFI_PCI_DEVICE_ENABLE, + NULL + ); + ASSERT_EFI_ERROR (Status); + + if (!mDetectVgaOnly) { + // + // Here we decide whether it is LPC Bridge + // + if ((IS_PCI_LPC (Pci)) || + ((IS_PCI_ISA_PDECODE (Pci)) && + (Pci->Hdr.VendorId =3D=3D 0x8086) && + (Pci->Hdr.DeviceId =3D=3D 0x7000) + ) + ) { + // + // Add IsaKeyboard to ConIn, + // add IsaSerial to ConOut, ConIn, ErrOut + // + DEBUG ((DEBUG_INFO, "Found LPC Bridge device\n")); + PrepareLpcBridgeDevicePath (Handle); + return EFI_SUCCESS; + } + // + // Here we decide which Serial device to enable in PCI bus + // + if (IS_PCI_16550SERIAL (Pci)) { + // + // Add them to ConOut, ConIn, ErrOut. + // + DEBUG ((DEBUG_INFO, "Found PCI 16550 SERIAL device\n")); + PreparePciSerialDevicePath (Handle); + return EFI_SUCCESS; + } + } + + // + // Here we decide which display device to enable in PCI bus + // + if (IS_PCI_DISPLAY (Pci)) { + // + // Add them to ConOut. + // + DEBUG ((DEBUG_INFO, "Found PCI display device\n")); + PreparePciDisplayDevicePath (Handle); + return EFI_SUCCESS; + } + + return Status; +} + + +/** + Do platform specific PCI Device check and add them to ConOut, ConIn, Err= Out + + @param[in] DetectVgaOnly - Only detect VGA device if it's TRUE. + + @retval EFI_SUCCESS - PCI Device check and Console variable update succe= ssfully. + @retval EFI_STATUS - PCI Device check or Console variable update fail. + +**/ +EFI_STATUS +DetectAndPreparePlatformPciDevicePaths ( + BOOLEAN DetectVgaOnly + ) +{ + mDetectVgaOnly =3D DetectVgaOnly; + return VisitAllPciInstances (DetectAndPreparePlatformPciDevicePath); +} + +/** + Connect the predefined platform default console device. + + Always try to find and enable PCI display devices. + + @param[in] PlatformConsole Predefined platform default console device a= rray. +**/ +VOID +PlatformInitializeConsole ( + IN PLATFORM_CONSOLE_CONNECT_ENTRY *PlatformConsole + ) +{ + UINTN Index; + EFI_DEVICE_PATH_PROTOCOL *VarConout; + EFI_DEVICE_PATH_PROTOCOL *VarConin; + + // + // Connect RootBridge + // + GetEfiGlobalVariable2 (EFI_CON_OUT_VARIABLE_NAME, (VOID **) &VarConout, = NULL); + GetEfiGlobalVariable2 (EFI_CON_IN_VARIABLE_NAME, (VOID **) &VarConin, NU= LL); + + if (VarConout =3D=3D NULL || VarConin =3D=3D NULL) { + // + // Do platform specific PCI Device check and add them to ConOut, ConIn= , ErrOut + // + DetectAndPreparePlatformPciDevicePaths (FALSE); + DetectAndPreparePlatformPciDevicePaths(TRUE); + // + // Have chance to connect the platform default console, + // the platform default console is the minimue device group + // the platform should support + // + for (Index =3D 0; PlatformConsole[Index].DevicePath !=3D NULL; ++Index= ) { + // + // Update the console variable with the connect type + // + if ((PlatformConsole[Index].ConnectType & CONSOLE_IN) =3D=3D CONSOLE= _IN) { + EfiBootManagerUpdateConsoleVariable (ConIn, PlatformConsole[Index]= .DevicePath, NULL); + } + if ((PlatformConsole[Index].ConnectType & CONSOLE_OUT) =3D=3D CONSOL= E_OUT) { + EfiBootManagerUpdateConsoleVariable (ConOut, PlatformConsole[Index= ].DevicePath, NULL); + } + if ((PlatformConsole[Index].ConnectType & STD_ERROR) =3D=3D STD_ERRO= R) { + EfiBootManagerUpdateConsoleVariable (ErrOut, PlatformConsole[Index= ].DevicePath, NULL); + } + } + } else { + // + // Only detect VGA device and add them to ConOut + // + DetectAndPreparePlatformPciDevicePaths (TRUE); + } +} + + +/** + Configure PCI Interrupt Line register for applicable devices + Ported from SeaBIOS, src/fw/pciinit.c, *_pci_slot_get_irq() + + @param[in] Handle - Handle of PCI device instance + @param[in] PciIo - PCI IO protocol instance + @param[in] PciHdr - PCI Header register block + + @retval EFI_SUCCESS - PCI Interrupt Line register configured successfull= y. + +**/ +EFI_STATUS +EFIAPI +SetPciIntLine ( + IN EFI_HANDLE Handle, + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN PCI_TYPE00 *PciHdr + ) +{ + EFI_DEVICE_PATH_PROTOCOL *DevPathNode; + EFI_DEVICE_PATH_PROTOCOL *DevPath; + UINTN RootSlot; + UINTN Idx; + UINT8 IrqLine; + EFI_STATUS Status; + UINT32 RootBusNumber; + + Status =3D EFI_SUCCESS; + + if (PciHdr->Device.InterruptPin !=3D 0) { + + DevPathNode =3D DevicePathFromHandle (Handle); + ASSERT (DevPathNode !=3D NULL); + DevPath =3D DevPathNode; + + RootBusNumber =3D 0; + if (DevicePathType (DevPathNode) =3D=3D ACPI_DEVICE_PATH && + DevicePathSubType (DevPathNode) =3D=3D ACPI_DP && + ((ACPI_HID_DEVICE_PATH *)DevPathNode)->HID =3D=3D EISA_PNP_ID(0x0A= 03)) { + RootBusNumber =3D ((ACPI_HID_DEVICE_PATH *)DevPathNode)->UID; + } + + // + // Compute index into PciHostIrqs[] table by walking + // the device path and adding up all device numbers + // + Status =3D EFI_NOT_FOUND; + RootSlot =3D 0; + Idx =3D PciHdr->Device.InterruptPin - 1; + while (!IsDevicePathEnd (DevPathNode)) { + if (DevicePathType (DevPathNode) =3D=3D HARDWARE_DEVICE_PATH && + DevicePathSubType (DevPathNode) =3D=3D HW_PCI_DP) { + + Idx +=3D ((PCI_DEVICE_PATH *)DevPathNode)->Device; + + // + // Unlike SeaBIOS, which starts climbing from the leaf device + // up toward the root, we traverse the device path starting at + // the root moving toward the leaf node. + // The slot number of the top-level parent bridge is needed + // with more than 24 slots on the root bus. + // + if (Status !=3D EFI_SUCCESS) { + Status =3D EFI_SUCCESS; + RootSlot =3D ((PCI_DEVICE_PATH *)DevPathNode)->Device; + } + } + + DevPathNode =3D NextDevicePathNode (DevPathNode); + } + if (EFI_ERROR (Status)) { + return Status; + } + if (RootBusNumber =3D=3D 0 && RootSlot =3D=3D 0) { + return Status; //bugbug: workaround; need SIMICS change B0/D0/F0 PCI= _IntPin reg(0x3D) =3D 0X0 +// DEBUG(( +// DEBUG_ERROR, +// "%a: PCI host bridge (00:00.0) should have no interrupts!\n", +// __FUNCTION__ +// )); +// ASSERT (FALSE); + } + + // + // Final PciHostIrqs[] index calculation depends on the platform + // and should match SeaBIOS src/fw/pciinit.c *_pci_slot_get_irq() + // + switch (mHostBridgeDevId) { + case INTEL_82441_DEVICE_ID: + Idx -=3D 1; + break; + case INTEL_ICH10_DEVICE_ID: + // + // SeaBIOS contains the following comment: + // "Slots 0-24 rotate slot:pin mapping similar to piix above, but + // with a different starting index. + // + // Slots 25-31 all use LNKA mapping (or LNKE, but A:D =3D E:H)" + // + if (RootSlot > 24) { + // + // in this case, subtract back out RootSlot from Idx + // (SeaBIOS never adds it to begin with, but that would make our + // device path traversal loop above too awkward) + // + Idx -=3D RootSlot; + } + break; + default: + ASSERT (FALSE); // should never get here + } + Idx %=3D ARRAY_SIZE (PciHostIrqs); + IrqLine =3D PciHostIrqs[Idx]; + + DEBUG_CODE_BEGIN (); + { + CHAR16 *DevPathString; + STATIC CHAR16 Fallback[] =3D L""; + UINTN Segment, Bus, Device, Function; + + DevPathString =3D ConvertDevicePathToText (DevPath, FALSE, FALSE); + if (DevPathString =3D=3D NULL) { + DevPathString =3D Fallback; + } + Status =3D PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Func= tion); + ASSERT_EFI_ERROR (Status); + + DEBUG ((DEBUG_VERBOSE, "%a: [%02x:%02x.%x] %s -> 0x%02x\n", __FUNCTI= ON__, + (UINT32)Bus, (UINT32)Device, (UINT32)Function, DevPathString, + IrqLine)); + + if (DevPathString !=3D Fallback) { + FreePool (DevPathString); + } + } + DEBUG_CODE_END (); + + // + // Set PCI Interrupt Line register for this device to PciHostIrqs[Idx] + // + Status =3D PciIo->Pci.Write ( + PciIo, + EfiPciIoWidthUint8, + PCI_INT_LINE_OFFSET, + 1, + &IrqLine + ); + } + + return Status; +} + +/** +Write to mask and edge/level triggered registers of master and slave 8259 = PICs. + +@param[in] Mask low byte for master PIC mask register, +high byte for slave PIC mask register. +@param[in] EdgeLevel low byte for master PIC edge/level triggered regist= er, +high byte for slave PIC edge/level triggered register. + +**/ +VOID +Interrupt8259WriteMask( + IN UINT16 Mask, + IN UINT16 EdgeLevel +) +{ + IoWrite8(LEGACY_8259_MASK_REGISTER_MASTER, (UINT8)Mask); + IoWrite8(LEGACY_8259_MASK_REGISTER_SLAVE, (UINT8)(Mask >> 8)); + IoWrite8(LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_MASTER, (UINT8)EdgeLe= vel); + IoWrite8(LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_SLAVE, (UINT8)(EdgeLe= vel >> 8)); +} + +VOID +PciAcpiInitialization ( + VOID + ) +{ + UINTN Pmba; + + // + // Query Host Bridge DID to determine platform type + // + mHostBridgeDevId =3D PcdGet16 (PcdSimicsX58HostBridgePciDevId); + switch (mHostBridgeDevId) { + case INTEL_82441_DEVICE_ID: + Pmba =3D POWER_MGMT_REGISTER_PIIX4 (PIIX4_PMBA); + // + // 00:01.0 ISA Bridge (PIIX4) LNK routing targets + // + PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x60), 0x0b); // A + PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x61), 0x0b); // B + PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x62), 0x0a); // C + PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x63), 0x0a); // D + break; + case INTEL_ICH10_DEVICE_ID: + Pmba =3D POWER_MGMT_REGISTER_ICH10 (ICH10_PMBASE); + // + // 00:1f.0 LPC Bridge LNK routing targets + // + PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x60), 0x0a); // A + PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x61), 0x0a); // B + PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x62), 0x0b); // C + PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x63), 0x0b); // D + PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x68), 0x0a); // E + PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x69), 0x0a); // F + PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x6a), 0x0b); // G + PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x6b), 0x0b); // H + break; + default: + DEBUG ((DEBUG_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n", + __FUNCTION__, mHostBridgeDevId)); + ASSERT (FALSE); + return; + } + + // + // Initialize PCI_INTERRUPT_LINE for applicable present PCI devices + // + VisitAllPciInstances (SetPciIntLine); + + // + // Set ACPI SCI_EN bit in PMCNTRL + // + IoOr16 ((PciRead32 (Pmba) & ~BIT0) + 4, BIT0); + // + // Set all 8259 interrupts to edge triggered and disabled + // + Interrupt8259WriteMask(0xFFFF, 0x0000); +} + +EFI_STATUS +EFIAPI +ConnectRecursivelyIfPciMassStorage ( + IN EFI_HANDLE Handle, + IN EFI_PCI_IO_PROTOCOL *Instance, + IN PCI_TYPE00 *PciHeader + ) +{ + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + CHAR16 *DevPathStr; + + // + // Recognize PCI Mass Storage + // + if (IS_CLASS1 (PciHeader, PCI_CLASS_MASS_STORAGE)) { + DevicePath =3D NULL; + Status =3D gBS->HandleProtocol ( + Handle, + &gEfiDevicePathProtocolGuid, + (VOID*)&DevicePath + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Print Device Path + // + DevPathStr =3D ConvertDevicePathToText (DevicePath, FALSE, FALSE); + if (DevPathStr !=3D NULL) { + DEBUG(( DEBUG_INFO, "Found Mass Storage device: %s\n", DevPathStr)); + FreePool(DevPathStr); + } + + Status =3D gBS->ConnectController (Handle, NULL, NULL, TRUE); + if (EFI_ERROR (Status)) { + return Status; + } + + } + + return EFI_SUCCESS; +} + + +/** + This notification function is invoked when the + EMU Variable FVB has been changed. + + @param Event The event that occurred + @param Context For EFI compatibility. Not used. + +**/ +VOID +EFIAPI +EmuVariablesUpdatedCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + DEBUG ((DEBUG_INFO, "%a called\n", __FUNCTION__)); + UpdateNvVarsOnFileSystem (); +} + + +EFI_STATUS +EFIAPI +VisitingFileSystemInstance ( + IN EFI_HANDLE Handle, + IN VOID *Instance, + IN VOID *Context + ) +{ + EFI_STATUS Status; + STATIC BOOLEAN ConnectedToFileSystem =3D FALSE; + + if (ConnectedToFileSystem) { + return EFI_ALREADY_STARTED; + } + + Status =3D ConnectNvVarsToFileSystem (Handle); + if (EFI_ERROR (Status)) { + return Status; + } + + ConnectedToFileSystem =3D TRUE; + mEmuVariableEvent =3D + EfiCreateProtocolNotifyEvent ( + &gEfiDevicePathProtocolGuid, + TPL_CALLBACK, + EmuVariablesUpdatedCallback, + NULL, + &mEmuVariableEventReg + ); + PcdSet64 (PcdEmuVariableEvent, (UINT64)(UINTN) mEmuVariableEvent); + + return EFI_SUCCESS; +} + + +VOID +PlatformBdsRestoreNvVarsFromHardDisk ( + ) +{ + VisitAllPciInstances (ConnectRecursivelyIfPciMassStorage); + VisitAllInstancesOfProtocol ( + &gEfiSimpleFileSystemProtocolGuid, + VisitingFileSystemInstance, + NULL + ); +} + +/** + Connect with predefined platform connect sequence. + + The OEM/IBV can customize with their own connect sequence. +**/ +VOID +PlatformBdsConnectSequence ( + VOID + ) +{ + UINTN Index; + + DEBUG ((DEBUG_INFO, "%a called\n", __FUNCTION__)); + + Index =3D 0; + + // + // Here we can get the customized platform connect sequence + // Notes: we can connect with new variable which record the + // last time boots connect device path sequence + // + while (gPlatformConnectSequence[Index] !=3D NULL) { + // + // Build the platform boot option + // + EfiBootManagerConnectDevicePath (gPlatformConnectSequence[Index], NULL= ); + Index++; + } + + // + // Just use the simple policy to connect all devices + // + DEBUG ((DEBUG_INFO, "EfiBootManagerConnectAll\n")); + EfiBootManagerConnectAll (); + + PciAcpiInitialization (); +} + +/** + Do the platform specific action after the console is ready + + Possible things that can be done in PlatformBootManagerAfterConsole: + + > Console post action: + > Dynamically switch output mode from 100x31 to 80x25 for certain sena= rino + > Signal console ready platform customized event + > Run diagnostics like memory testing + > Connect certain devices + > Dispatch aditional option roms + > Special boot: e.g.: USB boot, enter UI +**/ +// VOID +// EFIAPI +// PlatformBootManagerAfterConsole ( +// VOID +// ) +// { + +// } + +/** + This notification function is invoked when an instance of the + EFI_DEVICE_PATH_PROTOCOL is produced. + + @param Event The event that occurred + @param Context For EFI compatibility. Not used. + +**/ +VOID +EFIAPI +NotifyDevPath ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_HANDLE Handle; + EFI_STATUS Status; + UINTN BufferSize; + EFI_DEVICE_PATH_PROTOCOL *DevPathNode; + ATAPI_DEVICE_PATH *Atapi; + + // + // Examine all new handles + // + for (;;) { + // + // Get the next handle + // + BufferSize =3D sizeof (Handle); + Status =3D gBS->LocateHandle ( + ByRegisterNotify, + NULL, + mEfiDevPathNotifyReg, + &BufferSize, + &Handle + ); + + // + // If not found, we're done + // + if (EFI_NOT_FOUND =3D=3D Status) { + break; + } + + if (EFI_ERROR (Status)) { + continue; + } + + // + // Get the DevicePath protocol on that handle + // + Status =3D gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (= VOID **)&DevPathNode); + ASSERT_EFI_ERROR (Status); + + while (!IsDevicePathEnd (DevPathNode)) { + // + // Find the handler to dump this device path node + // + if ( + (DevicePathType(DevPathNode) =3D=3D MESSAGING_DEVICE_PATH) && + (DevicePathSubType(DevPathNode) =3D=3D MSG_ATAPI_DP) + ) { + Atapi =3D (ATAPI_DEVICE_PATH*) DevPathNode; + PciOr16 ( + PCI_LIB_ADDRESS ( + 0, + 1, + 1, + (Atapi->PrimarySecondary =3D=3D 1) ? 0x42: 0x40 + ), + BIT15 + ); + } + + // + // Next device path node + // + DevPathNode =3D NextDevicePathNode (DevPathNode); + } + } + + return; +} + + +VOID +InstallDevicePathCallback ( + VOID + ) +{ + DEBUG ((DEBUG_INFO, "Registered NotifyDevPath Event\n")); + mEfiDevPathEvent =3D EfiCreateProtocolNotifyEvent ( + &gEfiDevicePathProtocolGuid, + TPL_CALLBACK, + NotifyDevPath, + NULL, + &mEfiDevPathNotifyReg + ); +} + + + +/** + ReadyToBoot callback to set video and text mode for internal shell boot. + That will not connect USB controller while CSM and FastBoot are disabled= , we need to connect them + before booting to Shell for showing USB devices in Shell. + + When FastBoot is enabled and Windows Console is the chosen Console behav= ior, input devices will not be connected + by default. Hence, when booting to EFI shell, connecting input consoles = are required. + + @param Event Pointer to this event + @param Context Event hanlder private data + + @retval None. +**/ +VOID +EFIAPI +BdsReadyToBootCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + DEBUG ((DEBUG_INFO, "%a called\n", __FUNCTION__)); +} + + +/** + This is the callback function for PCI ENUMERATION COMPLETE. + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +EFIAPI +BdsSmmReadyToLockCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + + VOID *ProtocolPointer; + EFI_STATUS Status; + + // + // Check if this is first time called by EfiCreateProtocolNotifyEvent() = or not, + // if it is, we will skip it until real event is triggered + // + Status =3D gBS->LocateProtocol (&gEfiDxeSmmReadyToLockProtocolGuid, NULL= , (VOID **) &ProtocolPointer); + if (EFI_SUCCESS !=3D Status) { + return; + } + + DEBUG ((DEBUG_INFO, "%a called\n", __FUNCTION__)); + + // + // Dispatch the deferred 3rd party images. + // + EfiBootManagerDispatchDeferredImages (); + + // + // For non-trusted console it must be handled here. + // + //UpdateGraphicConOut (FALSE); +} + + +/** + This is the callback function for PCI ENUMERATION COMPLETE. + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +EFIAPI +BdsPciEnumCompleteCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + VOID *ProtocolPointer; + EFI_STATUS Status; + PLATFORM_CONSOLE_CONNECT_ENTRY PlatformConsole[3]; + UINTN PlatformConsoleCount; + UINTN MaxCount; + // + // Check if this is first time called by EfiCreateProtocolNotifyEvent() = or not, + // if it is, we will skip it until real event is triggered + // + Status =3D gBS->LocateProtocol (&gEfiPciEnumerationCompleteProtocolGuid,= NULL, (VOID **) &ProtocolPointer); + if (EFI_SUCCESS !=3D Status) { + return; + } + + PlatformConsoleCount =3D 0; + MaxCount =3D ARRAY_SIZE(PlatformConsole); + + if (PcdGetSize (PcdTrustedConsoleOutputDevicePath) >=3D sizeof(EFI_DEVIC= E_PATH_PROTOCOL)) { + PlatformConsole[PlatformConsoleCount].ConnectType =3D ConOut; + PlatformConsole[PlatformConsoleCount].DevicePath =3D PcdGetPtr (PcdTru= stedConsoleOutputDevicePath); + PlatformConsoleCount++; + } + if (PcdGetSize (PcdTrustedConsoleInputDevicePath) >=3D sizeof(EFI_DEVICE= _PATH_PROTOCOL) && + PlatformConsoleCount < MaxCount) { + PlatformConsole[PlatformConsoleCount].ConnectType =3D ConIn; + PlatformConsole[PlatformConsoleCount].DevicePath =3D PcdGetPtr (PcdTru= stedConsoleInputDevicePath); + PlatformConsoleCount++; + } + + if (PlatformConsoleCount < MaxCount){ + PlatformConsole[PlatformConsoleCount].ConnectType =3D 0; + PlatformConsole[PlatformConsoleCount].DevicePath =3D NULL; + }else{ + PlatformConsole[MaxCount - 1].ConnectType =3D 0; + PlatformConsole[MaxCount - 1].DevicePath =3D NULL; + } + + DEBUG ((DEBUG_INFO, "%a called\n", __FUNCTION__)); + + PlatformInitializeConsole (PlatformConsole); +} + + +/** + Before console after trusted console event callback + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +EFIAPI +BdsBeforeConsoleAfterTrustedConsoleCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_BOOT_MANAGER_LOAD_OPTION *NvBootOptions; + UINTN NvBootOptionCount; + UINTN Index; + EFI_STATUS Status; + + DEBUG ((DEBUG_INFO, "%a called\n", __FUNCTION__)); + + NvBootOptions =3D EfiBootManagerGetLoadOptions (&NvBootOptionCount, Load= OptionTypeBoot); + for (Index =3D 0; Index < NvBootOptionCount; Index++) { + Status =3D EfiBootManagerDeleteLoadOptionVariable (NvBootOptions[Index= ].OptionNumber, LoadOptionTypeBoot); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: removing Boot#%04x %r\n", + __FUNCTION__, + (UINT32) NvBootOptions[Index].OptionNumber, + Status + )); + } + } + + InstallDevicePathCallback (); + + VisitAllInstancesOfProtocol (&gEfiPciRootBridgeIoProtocolGuid, ConnectRo= otBridge, NULL); + // + // Enable LPC + // + PciOr16 (POWER_MGMT_REGISTER_ICH10(0x04), BIT0 | BIT1 | BIT2); + + PlatformRegisterOptionsAndKeys (); +} + + +/** + Before console before end of DXE event callback + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +EFIAPI +BdsBeforeConsoleBeforeEndOfDxeGuidCallback ( + IN EFI_EVENT Event, + IN VOID *Context +){ + DEBUG ((DEBUG_INFO, "%a called\n", __FUNCTION__)); +} + +/** + After console ready before boot option event callback + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registered to the Even= t. +**/ +VOID +EFIAPI +BdsAfterConsoleReadyBeforeBootOptionCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_BOOT_MODE BootMode; + + DEBUG ((DEBUG_INFO, "%a called\n", __FUNCTION__)); + + if (PcdGetBool (PcdOvmfFlashVariablesEnable)) { + DEBUG ((DEBUG_INFO, "PlatformBdsPolicyBehavior: not restoring NvVars " + "from disk since flash variables appear to be supported.\n")); + } else { + // + // Try to restore variables from the hard disk early so + // they can be used for the other BDS connect operations. + // + PlatformBdsRestoreNvVarsFromHardDisk (); + } + + // + // Get current Boot Mode + // + BootMode =3D GetBootModeHob (); + DEBUG ((DEBUG_ERROR, "Boot Mode:%x\n", BootMode)); + + // + // Go the different platform policy with different boot mode + // Notes: this part code can be change with the table policy + // + ASSERT (BootMode =3D=3D BOOT_WITH_FULL_CONFIGURATION); + + // + // Perform some platform specific connect sequence + // + PlatformBdsConnectSequence (); + + // + // Logo show + // + EnableBootLogo(PcdGetPtr(PcdLogoFile)); + + EfiBootManagerRefreshAllBootOption (); + + // + // Register UEFI Shell + // + PlatformRegisterFvBootOption ( + PcdGetPtr (PcdShellFile), L"EFI Internal Shell", LOAD_OPTION_ACTIVE + ); + + RemoveStaleFvFileOptions (); +} diff --git a/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBdsHookLib/Boar= dBdsHookLib.inf b/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBdsHookLib= /BoardBdsHookLib.inf new file mode 100644 index 0000000000..a77edf2699 --- /dev/null +++ b/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBdsHookLib/BoardBdsHoo= kLib.inf @@ -0,0 +1,81 @@ +## @file +# Board BDS hook Library definition file. +# +# Copyright (c) 2019 Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D BoardBdsHookLib + FILE_GUID =3D 285AB0B8-D0D2-4D83-BF20-F85ED040383E + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D BoardBdsHookLib|DXE_DRIVER + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 EBC +# + +[Sources] + BoardBdsHookLib.c + BoardBdsHook.h + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + MinPlatformPkg/MinPlatformPkg.dec + BoardModulePkg/BoardModulePkg.dec + SimicsOpenBoardPkg/OpenBoardPkg.dec + OvmfPkg/OvmfPkg.dec + SimicsIch10Pkg/Ich10Pkg.dec + +[LibraryClasses] + BaseLib + MemoryAllocationLib + UefiBootServicesTableLib + BaseMemoryLib + DebugLib + PcdLib + UefiBootManagerLib + BootLogoLib + DevicePathLib + PciLib + NvVarsFileLib + DxeLoadLinuxLib + UefiLib + LogoLib + +[Pcd] + gSimicsOpenBoardPkgTokenSpaceGuid.PcdEmuVariableEvent + gSimicsOpenBoardPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable + gSimicsOpenBoardPkgTokenSpaceGuid.PcdSimicsX58HostBridgePciDevId + gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut + gSimicsOpenBoardPkgTokenSpaceGuid.PcdShellFile + gSimicsOpenBoardPkgTokenSpaceGuid.PcdLogoFile + gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleInputDevicePath ## CONSU= MES + gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleOutputDevicePath ## CONSU= MES + gMinPlatformPkgTokenSpaceGuid.PcdTrustedStorageDevicePath ## CONSU= MES + +[Pcd.IA32, Pcd.X64] + gEfiMdePkgTokenSpaceGuid.PcdFSBClock + +[Protocols] + gEfiDecompressProtocolGuid + gEfiPciRootBridgeIoProtocolGuid + gEfiS3SaveStateProtocolGuid # PROTOCOL SOMETIMES_CONSU= MED + gEfiDxeSmmReadyToLockProtocolGuid # PROTOCOL SOMETIMES_PRODU= CED + gEfiLoadedImageProtocolGuid # PROTOCOL SOMETIMES_PRODU= CED + gEfiFirmwareVolume2ProtocolGuid # PROTOCOL SOMETIMES_CONSU= MED + gEfiPciEnumerationCompleteProtocolGuid # PROTOCOL SOMETIMES_CONSU= MED + + +[Guids] + gEfiEndOfDxeEventGroupGuid + +[Depex] + TRUE --=20 2.19.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52229): https://edk2.groups.io/g/devel/message/52229 Mute This Topic: https://groups.io/mt/68590735/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Tue Nov 26 12:31:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52232+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52232+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1576287162; cv=none; d=zohomail.com; s=zohoarc; b=NNdKnSkFdMXnmSttI2IRaljwTwk9yHjkuoZ4mASW3giHYoyAqimdyRMl+ENBqYlPRln69sNJdpt9TftOSqfdFj1tSsfrLuY8yNnrKDlB88AO98l+vv8IAjSvN5ljpwKfdRH/G+skEJQ8MWTJ1Jfdc680cTTGHgZqATz9jwu2VDM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576287162; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=vG+Avm0YReyyEqHCw0ymErKysylq3fmKEN3J4wXl3Qo=; b=lbFqjpuvdcy+WatvcruEp/RS2Ou8exq8uCu7PAOyup4gg5dIw1GcJXFeT8AU5PEmaPo6zo2i/f8LJcnPCzfaOET1aAj8Scb7V4OT9IjsiSDjxeSHN1gX3vyos59gVjt5AB9HwmthDdGsSSQeBSLtiWTMNAAzbBRJycw4k1mBH58= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52232+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1576287162796317.2780286598239; Fri, 13 Dec 2019 17:32:42 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id lK8LYY1788612xwmW7U9XY9P; Fri, 13 Dec 2019 17:32:41 -0800 X-Received: from mga04.intel.com (mga04.intel.com []) by mx.groups.io with SMTP id smtpd.web09.2403.1576287159525865036 for ; Fri, 13 Dec 2019 17:32:40 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 17:32:39 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,311,1571727600"; d="scan'208";a="297091535" X-Received: from paagyema-desk2.amr.corp.intel.com ([10.24.15.84]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2019 17:32:38 -0800 From: "Agyeman, Prince" To: devel@edk2.groups.io Cc: Nate DeSimone , Michael Kubacki Subject: [edk2-devel] [edk2-platforms] [PATCH 10/11] SimicsOpenBoardPkg: Add BDS Board Boot Manager library Date: Fri, 13 Dec 2019 17:32:36 -0800 Message-Id: <6c40c7b6ebde73fcaa110be9ff55de3e58f7bb47.1576282834.git.prince.agyeman@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,prince.agyeman@intel.com X-Gm-Message-State: bWJrnpHlTHBKP6bBE7yFht42x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1576287161; bh=SphqkBhdsDvmZpHO6Sklsr/baClvOzb1dyDHM1Dx88Y=; h=Cc:Date:From:Reply-To:Subject:To; b=PRA527hlxe6OvJuVcYN86SRqN2mmZNVbrkJSUhc7eMLX62huBg6OolJioSbIMNu6tfy ihNxvBwCwhxtlmrSr+zMFuj8xlQoJCEYr5xn6y0HuubuyLXeTuOIvLPz+L1d8qMDOlPGG R/l4B4HUIHI/cNzzk1yKo8ElkMmt7pzU7rM= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2336 This library implements PlatformBootManagerWaitCallback and PlatformBootManagerUnableToBoot which can be linked Minplatform's PlatformBootManager libary instance. Cc: Nate DeSimone Cc: Michael Kubacki Signed-off-by: Prince Agyeman Reviewed-by: Nate DeSimone --- .../BoardBootManagerLib/BoardBootManager.c | 67 +++++++++++++++++++ .../BoardBootManagerLib.inf | 45 +++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 Platform/Intel/SimicsOpenBoardPkg/Library/BoardBootMana= gerLib/BoardBootManager.c create mode 100644 Platform/Intel/SimicsOpenBoardPkg/Library/BoardBootMana= gerLib/BoardBootManagerLib.inf diff --git a/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBootManagerLib/= BoardBootManager.c b/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBootMan= agerLib/BoardBootManager.c new file mode 100644 index 0000000000..58035f2766 --- /dev/null +++ b/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBootManagerLib/BoardBo= otManager.c @@ -0,0 +1,67 @@ +/** @file + The Board Boot Manager Library implements BoardBootManagerWaitCallback + and BoardBootManagerUnableToBoot callback, which is linked to the + Platform Boot Manager Library + + Copyright (c) 2019 Intel Corporation. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + This function is called each second during the boot manager waits the + timeout. + + @param TimeoutRemain The remaining timeout. +**/ +VOID +EFIAPI +BoardBootManagerWaitCallback ( + UINT16 TimeoutRemain + ) +{ + EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Black; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION White; + UINT16 Timeout; + + Timeout =3D PcdGet16 (PcdPlatformBootTimeOut); + + Black.Raw =3D 0x00000000; + White.Raw =3D 0x00FFFFFF; + + BootLogoUpdateProgress ( + White.Pixel, + Black.Pixel, + L"Start boot option", + White.Pixel, + (Timeout - TimeoutRemain) * 100 / Timeout, + 0 + ); +} + +/** + 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 attempts to enter an infinite loop. +**/ +VOID +EFIAPI +BoardBootManagerUnableToBoot ( + VOID + ) +{ + +} diff --git a/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBootManagerLib/= BoardBootManagerLib.inf b/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBo= otManagerLib/BoardBootManagerLib.inf new file mode 100644 index 0000000000..20778981bc --- /dev/null +++ b/Platform/Intel/SimicsOpenBoardPkg/Library/BoardBootManagerLib/BoardBo= otManagerLib.inf @@ -0,0 +1,45 @@ +## @file +# Definition file for the Board Boot Manager Library. +# +# Copyright (c) 2019 Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D BoardBootManagerLib + FILE_GUID =3D EBBB176A-3883-4BA4-A74D-1510D0C35B37 + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D BoardBootManagerLib|DXE_DRIVER + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 EBC +# + +[Sources] + BoardBootManager.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + MinPlatformPkg/MinPlatformPkg.dec + +[LibraryClasses] + BaseLib + UefiBootServicesTableLib + DebugLib + UefiLib + HobLib + UefiBootManagerLib + TimerLib + BoardBootManagerLib + BootLogoLib + PcdLib + +[Pcd] + gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut --=20 2.19.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52232): https://edk2.groups.io/g/devel/message/52232 Mute This Topic: https://groups.io/mt/68590740/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Tue Nov 26 12:31:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52233+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52233+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1576287163; cv=none; d=zohomail.com; s=zohoarc; b=ka5219U1w9W1wb/ZeEF5ASJyaKLAwZQ3DVY+Xrs0v11LpTARE2oLzLZ2PImtC+OBDIT5FwiW+ofpdVM/T7oeRjvsgL+RRPus8gScO483WAP9dG6tW+aTWanWQVUGp+W/YgTDsUOhrnXnYCgBbctZs9X0UwLh0Erht4gGFRx/M5w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576287163; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=p8zPZBLeLmgHanBQBsNq3Ao16vX1do0dmNAGEaEpcyI=; b=U2cmbpnfbpELj76c1ukBLOVqOPWf/3piZ/sV5cZOghri4OI0sYWgQzZNtQQJYx2HnpUmOG+cpnAmHRMqbb62mU/wjKz226429F5wEUNAiEbT3WGAEHQfRofxgtWnF6LiyZU0DXnxGNfH76/wh9TGjzPon2/ryuy8aSP83rz1qb0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52233+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1576287163174995.4261176615353; Fri, 13 Dec 2019 17:32:43 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id ALm2YY1788612xkoYJGEyjer; Fri, 13 Dec 2019 17:32:42 -0800 X-Received: from mga01.intel.com (mga01.intel.com []) by mx.groups.io with SMTP id smtpd.web10.2430.1576287158438932734 for ; Fri, 13 Dec 2019 17:32:40 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 17:32:39 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,311,1571727600"; d="scan'208";a="297091537" X-Received: from paagyema-desk2.amr.corp.intel.com ([10.24.15.84]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2019 17:32:38 -0800 From: "Agyeman, Prince" To: devel@edk2.groups.io Cc: Michael Kubacki , Chasel Chiu , Nate DeSimone Subject: [edk2-devel] [edk2-platforms] [PATCH 11/11] SimicsOpenBoardPkg: Add Bds Hook Points Date: Fri, 13 Dec 2019 17:32:37 -0800 Message-Id: <3ef9d5be91ce7f2442cec09dd93c66bcb9a03447.1576282834.git.prince.agyeman@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,prince.agyeman@intel.com X-Gm-Message-State: zc5juVV6AFWfPB1vvGnfqB8dx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1576287162; bh=8pQp1fYXYKmwLgTMhzgBMF2mMJGNMwYCdBvW9aRktyM=; h=Cc:Date:From:Reply-To:Subject:To; b=HXMy1z6Dc7XZIfO9v7vuw13HWi26Pr50jRWCNbzUc40uV2TCipn65vhIijdAAoNaOwg p6G2W4g2cYofsF0bgcSL7BFTuF2AwPYLo0raidh8WTidVXaL1RxKszM23ROFFK0ZrTvFk dfhKfgvc/36BGxi9oJJh613pbFxeyuElE4Y= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2336 Added a DXE driver that registers the minimum platform BDS hook points, to BoardX58Ich10 board. These hooks are triggered on the BDS hook events What was done: * Included a board specific instance of BoardBdsHookLib and BoardBootManagerLib * Included Minplatforms PlatformBootManagerLib instance. This Library instance signals the Bds event groups * Included BoardBdsHookDxe to register the callbacks implemented in BoardBdsHookLib Cc: Michael Kubacki Cc: Chasel Chiu Cc: Nate DeSimone Signed-off-by: Prince Agyeman Reviewed-by: Nate DeSimone --- .../SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkg.dsc | 10 +++++++++- .../SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkg.fdf | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Platform/Intel/SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkg.d= sc b/Platform/Intel/SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkg.dsc index 7576648d57..350a75a313 100644 --- a/Platform/Intel/SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkg.dsc +++ b/Platform/Intel/SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkg.dsc @@ -146,10 +146,17 @@ SetCacheMtrrLib|$(PLATFORM_PACKAGE)/Library/SetCacheMtrrLib/SetCacheMtrr= Lib.inf =20 [LibraryClasses.common.DXE_DRIVER] + + ##################################### + # Platform Package + ##################################### + PlatformBootManagerLib|$(PLATFORM_PACKAGE)/Bds/Library/DxePlatformBootMa= nagerLib/DxePlatformBootManagerLib.inf + ####################################### # Board Package ####################################### - PlatformBootManagerLib|$(BOARD_PKG)/Library/PlatformBootManagerLib/Platf= ormBootManagerLib.inf + BoardBdsHookLib|$(BOARD_PKG)/Library/BoardBdsHookLib/BoardBdsHookLib.inf + BoardBootManagerLib|$(BOARD_PKG)/Library/BoardBootManagerLib/BoardBootMa= nagerLib.inf =20 [LibraryClasses.common.DXE_SMM_DRIVER] ####################################### @@ -294,3 +301,4 @@ $(BOARD_PKG)/SimicsVideoDxe/SimicsVideoDxe.inf $(BOARD_PKG)/SmbiosPlatformDxe/SmbiosPlatformDxe.inf BoardModulePkg/LegacySioDxe/LegacySioDxe.inf + BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.inf diff --git a/Platform/Intel/SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkg.f= df b/Platform/Intel/SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkg.fdf index e0a1daddee..99bf607775 100644 --- a/Platform/Intel/SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkg.fdf +++ b/Platform/Intel/SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkg.fdf @@ -213,6 +213,7 @@ INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf INF MinPlatformPkg/Flash/SpiFvbService/SpiFvbServiceSmm.inf INF MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf INF BoardModulePkg/LegacySioDxe/LegacySioDxe.inf +INF BoardModulePkg/BoardBdsHookDxe/BoardBdsHookDxe.inf =20 INF MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KeyboardDxe.inf =20 --=20 2.19.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52233): https://edk2.groups.io/g/devel/message/52233 Mute This Topic: https://groups.io/mt/68590741/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-