From nobody Sat May 4 12:22:33 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+84424+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+84424+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1638823989; cv=none; d=zohomail.com; s=zohoarc; b=cUKDwrekrPDo6/UJ688GyRC8rFDc6ecQUDXoqoRopYjLlrMWWVmPMsOmYZ+tgFXEHG0T+N7ZkkK+7//o2rBzBdor/MAv8E3EpZimLr67YB8XFUhbRfs55uP8CMAvFfKOs9y85Juv459oItz7QlWwOoPgd/kfY0mQzZUgh7MYHZY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1638823989; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To; bh=ySmWOqtOvHbIeaJG3+ZlgMsAE6jv0f4akivIv3h65EU=; b=K8BdPO041620smEoXtZNBPsetV8gqdsEQO/GvTp9QkhQzZ4O5wzmhN20NZliLc3lI0heFrMi0fYv1B3henWcSU7RN0dIhco7FpEn0IGZD9JrksS+OMc+zB/eA1ltJRUl5WqKOdGPqLm6mfxvo9zaHZBGyteNs0WOvgHUdPIXP/4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+84424+1787277+3901457@groups.io Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1638823989159179.5221533645514; Mon, 6 Dec 2021 12:53:09 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id B756YY1788612xBBxd7dBDDN; Mon, 06 Dec 2021 12:53:08 -0800 X-Received: from atlmailgw2.ami.com (atlmailgw2.ami.com [63.147.10.42]) by mx.groups.io with SMTP id smtpd.web11.57748.1638823982381189034 for ; Mon, 06 Dec 2021 12:53:03 -0800 X-AuditID: ac10606f-e1d4570000004e9d-ab-61ae782ce68d X-Received: from atlms1.us.megatrends.com (atlms1.us.megatrends.com [172.16.96.144]) (using TLS with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (Client did not present a certificate) by atlmailgw2.ami.com (Symantec Messaging Gateway) with SMTP id 9D.86.20125.C287EA16; Mon, 6 Dec 2021 15:53:00 -0500 (EST) X-Received: from MANIC-WIN10.us.megatrends.com (172.16.98.169) by atlms1.us.megatrends.com (172.16.96.144) with Microsoft SMTP Server id 14.3.498.0; Mon, 6 Dec 2021 15:52:59 -0500 From: "manickavasakam karpagavinayagam via groups.io" To: CC: , , , , , Subject: [edk2-devel] [edk2-platforms] [PATCH V1] PurleyOpenBoardPkg : Linux Boot Improvements Date: Mon, 6 Dec 2021 15:52:59 -0500 Message-ID: <20211206205259.16556-1-manickavasakamk@ami.com> MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrIIsWRmVeSWpSXmKPExsWyRiBhgq5OxbpEgwUTjC3aJ8xms+hfcYzV 4vivD8wOzB7bv19g9Fi85yVTAFNUA6NNYl5efkliSapCSmpxsq1SQFFmWWJypZJCZoqtkqGS QkFOYnJqbmpeia1SYkFBal6Kkh2XAgawASrLzFNIzUvOT8nMS7dV8gz217WwMLXUNVSyC8lI VcjMS8svyk0syczPU0jOzysBqk5NAYoqJHRzZnz41cdW0H+Hq2LdvQOMDYwvb7B3MXJwSAiY SGxaZNLFyMUhJLCLSeL34YnsEM5WRolPZ5YwdjFycrAJ2EtsnzqbHcQWEZCSmHJgJhNIEbPA HEaJ5v3fWUESwgKBElf7LjGB2CwCKhLzzpxmBrF5BWwktm7fBBaXENCUuDrzGhtEXFDi5Mwn LCA2s4C2xLKFr5khbAmJgy9eMINcJwQ058kxhwmMfLOQdMxC0jELSccCRuZVjEKJJTm5iZk5 6eVGeom5mXrJ+bmbGCHxlb+D8eNH80OMTByMhxglOJiVRHjVHq5NFOJNSaysSi3Kjy8qzUkt PsToBHT/RGYpblAQAuMk3tjAQEoUxjE0MTMxNzI3tDQxNzZWEudd5X40XkggHRi32ampBalF MEOYODilGhj7tph87Lsq15R65uS0x2vtejMrfXxShArs/31QratzmK5nt51ZyJXvxfW4kgQR l4OXvnVdNi1qdJkzL3VRtU/Yb2PWnv4bWyZVFOevNWV/xH7Ho6mKR/7u5Gq31vrWxxs2BJuZ sW6dKRdbesr/y9TrJx1F47QvBVbbxu5ZUGustiWff1GEuhJLcUaioRZzUXEiAEjtKqjEAgAA Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: 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,manickavasakamk@ami.com X-Gm-Message-State: CrkImNhJQyhd4JL87x9JHLHRx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1638823988; bh=7Ce+Fc/DwDFemVBR7lfOn2Z4NSG2VM/iGwEPT+OrctE=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=XVc836PSXuq+ecXQkJi0Kz5UzwODe2HjJZ/IqW67Ia5ygViL6kjBW5x2m2H68SPUpQP Iph68Gsp3RzZEZC9RSd5eMsPl6A/yhJLB1i0stxxq1uGpl3yaBVtOlUEnGofYC76dXIiz +UXh2fV3sfr5EFvjVu1kmjgOM0ygp+sVyTw= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1638823991328100001 Content-Type: text/plain; charset="utf-8" Linux Boot : Remove separate initrd file. Linux Binaries build with an Inte= grated Initrd Synced edk2-platforms\Platform\Intel\PurleyOpenBoardPkg\Override\Platform\I= ntel\MinPlatformPkg\Bds with the latest edk2-platforms\Platform\Intel\MinPlatformPkg\Bds Applied and moved earlier overrides done in DxePlatformBootManagerLib to Bo= ardBdsHookLib Cc: Nate DeSimone Cc: Isaac Oram Cc: Harikrishna Doppalapudi Cc: Manish Jha Cc: Manickavasakam Karpagavinayagam Cc: Zachary Bobroff Signed-off-by: Manickavasakam Karpagavinayagam Reviewed-by: Isaac Oram --- Platform/Intel/PurleyOpenBoardPkg/Acpi/BoardAcpiDxe/AmlOffsetTable.c = = | 1 + Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclude.dsc = = | 5 +- Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootInclude.fdf = = | 5 +- Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.dsc = = | 6 +- Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.fdf = = | 17 +- Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBinaries/initrd.= cpio.xz = | Bin 16 -> 0 bytes Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBoot.c = = | 63 - Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Readme.md = = | 11 +- Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/BoardModulePkg/L= ibrary/BoardBdsHookLib/BoardBdsHook.h = | 211 +++ Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/BoardModulePkg/L= ibrary/BoardBdsHookLib/BoardBdsHookLib.c = | 1400 ++++++++++++++++++++ Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/BoardModulePkg/L= ibrary/BoardBdsHookLib/BoardBdsHookLib.inf = | 99 ++ Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/{MinPlatformPkg/= Bds/Library/DxePlatformBootManagerLib/PlatformBootOption.c =3D> BoardModule= Pkg/Library/BoardBdsHookLib/BoardBootOption.c} | 1146 ++++++++-------- Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/{MinPlatformPkg/= Bds/Library/DxePlatformBootManagerLib/MemoryTest.c =3D> BoardModulePkg/Libr= ary/BoardBdsHookLib/BoardMemoryTest.c} | 171 +-- Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformPkg/B= ds/Library/DxePlatformBootManagerLib/BdsPlatform.c = | 1281 ++---------------- Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformPkg/B= ds/Library/DxePlatformBootManagerLib/BdsPlatform.h = | 181 +-- Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformPkg/B= ds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf = | 60 +- 16 files changed, 2526 insertions(+), 2131 deletions(-) diff --git a/Platform/Intel/PurleyOpenBoardPkg/Acpi/BoardAcpiDxe/AmlOffsetT= able.c b/Platform/Intel/PurleyOpenBoardPkg/Acpi/BoardAcpiDxe/AmlOffsetTable= .c index 4fdc9ac94e..97c4548fd6 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Acpi/BoardAcpiDxe/AmlOffsetTable.c +++ b/Platform/Intel/PurleyOpenBoardPkg/Acpi/BoardAcpiDxe/AmlOffsetTable.c @@ -289,3 +289,4 @@ AML_OFFSET_TABLE_ENTRY DSDT_PLATWFP__OffsetTable[] = =3D {NULL,0,0,0,0,0} /* Table terminator */ }; =20 +=1A \ No newline at end of file diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclud= e.dsc b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclude.dsc index e653287d05..6ddd3734dc 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclude.dsc +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclude.dsc @@ -101,6 +101,8 @@ !endif #MdeModulePkg/Universal/Console/GraphicsOutputDxe/GraphicsOutputDxe.inf MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf + MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf + MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf =20 !if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D FALSE MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf @@ -108,9 +110,6 @@ =20 MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf =20 - MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf - - MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf =20 MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootI= nclude.fdf b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootI= nclude.fdf index 78f0a31a4d..dc6e9e8bc6 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootInclude.= fdf +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootInclude.= fdf @@ -67,6 +67,9 @@ INF FatPkg/EnhancedFatDxe/Fat.inf =20 #INF MdeModulePkg/Universal/Console/GraphicsOutputDxe/GraphicsOutputDxe.i= nf INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.= inf +INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf +INF MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe= .inf + =20 !if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D FALSE INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf @@ -74,9 +77,7 @@ INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSpl= itterDxe.inf =20 INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf =20 -INF MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe= .inf =20 -INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf INF MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf =20 diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.= dsc b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.dsc index 3bac6d394e..8fe4cb7e97 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.dsc +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.dsc @@ -89,7 +89,7 @@ [Components.$(DXE_ARCH)] #TiogaPass Override START : Added Board Specific changes in core drivers #!include $(PLATFORM_PACKAGE)/Include/Dsc/CoreDxeInclude.dsc -!include CoreDxeInclude.dsc +!include CoreDxeInclude.dsc=20 #TiogaPass Override END =20 ####################################### @@ -155,7 +155,11 @@ !endif TestPointLib|$(PLATFORM_PACKAGE)/Test/Library/TestPointLib/DxeTestPointL= ib.inf BoardBootManagerLib|$(PLATFORM_PACKAGE)/Bds/Library/BoardBootManagerLibN= ull/BoardBootManagerLibNull.inf +!if gPlatformTokenSpaceGuid.PcdFastBoot =3D=3D FALSE =20 BoardBdsHookLib|BoardModulePkg/Library/BoardBdsHookLib/BoardBdsHookLib.i= nf +!else =20 + BoardBdsHookLib|$(PLATFORM_BOARD_PACKAGE)/Override/Platform/Intel/BoardM= odulePkg/Library/BoardBdsHookLib/BoardBdsHookLib.inf +!endif =20 !if gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiFeatureEnable =3D=3D TRUE IpmiBaseLib|OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib/IpmiB= aseLib.inf !endif diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.= fdf b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.fdf index b162483c44..b49c7c0a34 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.fdf +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.fdf @@ -22,15 +22,15 @@ !if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D TRUE =20 SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedOffset =3D 0x= 00000000 # Flash addr (0xFF840000) -SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedSize =3D 0x= 00300000 # -SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityOffset =3D 0x= 00300000 # Flash addr (0xFF8A0000) -SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecuritySize =3D 0x= 00100000 # -SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootOffset =3D 0x= 00400000 # Flash addr (0xFF910000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedSize =3D 0x= 00200000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityOffset =3D 0x= 00200000 # Flash addr (0xFF8A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecuritySize =3D 0x= 000F0000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootOffset =3D 0x= 002F0000 # Flash addr (0xFF910000) SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootSize =3D 0x= 00100000 # -SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUOffset =3D 0x= 00500000 # Flash addr (0xFFE00000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUOffset =3D 0x= 003F0000 # Flash addr (0xFFE00000) SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUSize =3D 0x= 00100000 # -SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootOffset =3D 0x= 00600000 # Flash addr (0xFF9A0000) -SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootSize =3D 0x= 00600000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootOffset =3D 0x= 004F0000 # Flash addr (0xFF9A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootSize =3D 0x= 00710000 # SET gMinPlatformPkgTokenSpaceGuid.PcdFlashNvStorageVariableOffset =3D 0x= 00C00000 # Flash addr (0xFF800000) SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize =3D 0x= 0007C000 # =20 @@ -345,9 +345,6 @@ FILE DRIVER =3D 81339b04-fa8c-4be0-9ca7-916fc5319eb5 { SECTION PE32 =3D $(PLATFORM_BOARD_PACKAGE)/Features/LinuxBoot/LinuxBin= aries/linux.efi } =20 -FILE FREEFORM =3D 16b60e5d-f1c5-42f0-9b34-08C81C430473 { - SECTION RAW =3D $(PLATFORM_BOARD_PACKAGE)/Features/LinuxBoot/LinuxBinari= es/initrd.cpio.xz -} =20 !endif =20 diff --git a/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBina= ries/initrd.cpio.xz b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/= LinuxBinaries/initrd.cpio.xz deleted file mode 100644 index 01d633b27e8ea9b17084fc911d0c8cc43a4170a9..000000000000000000000000000= 0000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16 KcmZQzKm`B*5C8!H diff --git a/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBoot= .c b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBoot.c index 366d97c125..b30559772d 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBoot.c +++ b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBoot.c @@ -26,12 +26,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include "LinuxBoot.h" =20 -//16b60e5d-f1c5-42f0-9b34-08C81C430473 -#define LINUX_BOOT_INITRD_GUID \ - { \ - 0x16b60e5d, 0xf1c5, 0x42f0, {0x9b, 0x34, 0x08, 0xc8, 0x1c, 0x43, 0x04,= 0x73} \ - } - #define LINUX_BOOT_KERNEL_GUID \ { \ 0x81339b04, 0xfa8c, 0x4be0, {0x9c, 0xa7, 0x91, 0x6f, 0xc5, 0x31, 0x9e,= 0xb5} \ @@ -78,15 +72,6 @@ LoadLinux ( IN OUT VOID *KernelSetup ); =20 -VOID* -EFIAPI -LoadLinuxAllocateInitrdPages ( - IN VOID *KernelSetup, - IN UINTN Pages - ); - -EFI_GUID gLinuxBootInitrdFileGuid =3D LINUX_BOOT_INITRD_GUID; - EFI_GUID gLinuxBootKernelFileGuid =3D LINUX_BOOT_KERNEL_GUID; =20 //------------------------------------------------------------------------= --- @@ -189,9 +174,6 @@ LoadAndLaunchKernel ( VOID *KernelBuffer =3D NULL; VOID *KernelFfsBuffer =3D NULL; UINTN KernelFfsSize =3D 0; - VOID *InitrdData =3D NULL; - VOID *InitrdBuffer =3D NULL; - UINTN InitrdSize =3D 0; struct BootParams *BootParams =3D NULL; struct BootParams *HandoverParams =3D NULL; UINT32 StartOffset =3D 0; @@ -301,49 +283,6 @@ LoadAndLaunchKernel ( =20 DEBUG((DEBUG_INFO, "Kernel loaded.\n")); =20 - // - // Initrd load and preparation - // - DEBUG((DEBUG_INFO, "Preparing the initrd...\n")); - - // Retrieve the initrd from the firmware volume - Status =3D GetSectionFromAnyFv( - &gLinuxBootInitrdFileGuid, - EFI_SECTION_RAW, - 0, - &InitrdBuffer, - &InitrdSize - ); - - if (EFI_ERROR(Status)) { - DEBUG((DEBUG_ERROR, "Could not retrieve initrd; %r.\n", Status)); - goto FatalError; - } - - DEBUG((DEBUG_INFO, "Loaded initrd to buffer at 0x%p with size 0x%X.\n"= , InitrdBuffer, InitrdSize)); - DEBUG((DEBUG_INFO, "Printing first 0x%X bytes:\n", MIN(0x100, InitrdSi= ze))); - DumpHex(2, 0, MIN(0x100, InitrdSize), InitrdBuffer); - - // Allocate the initrd for the kernel and copy it in - InitrdData =3D LoadLinuxAllocateInitrdPages(HandoverParams, EFI_SIZE_T= O_PAGES(InitrdSize)); - if (InitrdData =3D=3D NULL) { - DEBUG((DEBUG_ERROR, "Unable to allocate memory for initrd.\n")); - goto FatalError; - } - - gBS->CopyMem(InitrdData, InitrdBuffer, InitrdSize); - - HandoverParams->Hdr.RamDiskStart =3D (UINT32)(UINTN) InitrdData; - HandoverParams->Hdr.RamDiskLen =3D (UINT32) InitrdSize; - - DEBUG((DEBUG_INFO, "Initrd loaded.\n")); - DEBUG((DEBUG_INFO, "Printing first 0x%X bytes of initrd buffer:\n", MI= N(0x100, InitrdSize))); - DumpHex(2, 0, MIN(0x100, InitrdSize), InitrdData); - - // General cleanup before launching the kernel - gBS->FreePool(InitrdBuffer); - InitrdBuffer =3D NULL; - gBS->UnloadImage(KernelHandle); gBS->FreePool(KernelFfsBuffer); KernelFfsBuffer =3D NULL; @@ -367,10 +306,8 @@ LoadAndLaunchKernel ( =20 FatalError: // Free everything - if (InitrdData !=3D NULL) gBS->FreePages((EFI_PHYSICAL_ADDRESS) Initrd= Data, EFI_SIZE_TO_PAGES(InitrdSize)); if (KernelBuffer !=3D NULL) gBS->FreePages((EFI_PHYSICAL_ADDRESS) Kern= elBuffer, EFI_SIZE_TO_PAGES(HandoverParams->Hdr.InitSize)); if (HandoverParams !=3D NULL) gBS->FreePages((EFI_PHYSICAL_ADDRESS) Ha= ndoverParams, EFI_SIZE_TO_PAGES(KERNEL_SETUP_SIZE)); - if (InitrdBuffer !=3D NULL) gBS->FreePool(InitrdBuffer); if (KernelHandle !=3D NULL) gBS->UnloadImage(KernelHandle); if (KernelFfsBuffer !=3D NULL) gBS->FreePool(KernelFfsBuffer); =20 diff --git a/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Readme.md= b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Readme.md index 04bf550104..8d8c67b659 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Readme.md +++ b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Readme.md @@ -1,9 +1,8 @@ =20 -linux.efi/initrd.cpio.xz are dummy files.=20 -These dummy files needs to be replaced by building the Linux Kernel. +linux.efi is a dummy files.=20 +These dummy files needs to be replaced by building the Linux Kernel with a= n Integrated Initrd. =20 -1. Follow directions on http://osresearch.net/Building/ to compile the hea= ds kernel and initrd for qemu-system_x86_64=20 -2. Copy the following built files=20 -(1) initrd.cpio.xz to LinuxBoot/LinuxBinaries/initrd.cpio.xz=20 -(2) bzimage to LinuxBoot/LinuxBinaries/linux.efi +1. Follow u-root https://github.com/u-root/u-root#readme to compile an in= itrd +2. Follow directions on http://osresearch.net/Building/ to integrate initr= d and compile the heads kernel +3. Copy bzimage with integrated initrd to LinuxBoot/LinuxBinaries/linux.efi =20 diff --git a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/Boar= dModulePkg/Library/BoardBdsHookLib/BoardBdsHook.h b/Platform/Intel/PurleyOp= enBoardPkg/Override/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLib/B= oardBdsHook.h new file mode 100644 index 0000000000..5f41fd49c7 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/BoardModule= Pkg/Library/BoardBdsHookLib/BoardBdsHook.h @@ -0,0 +1,211 @@ +/** @file + Header file for BDS Hook Library + +Copyright (c) 2020, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _BOARD_BDS_HOOK_H_ +#define _BOARD_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/PurleyOpenBoardPkg/Override/Platform/Intel/Boar= dModulePkg/Library/BoardBdsHookLib/BoardBdsHookLib.c b/Platform/Intel/Purle= yOpenBoardPkg/Override/Platform/Intel/BoardModulePkg/Library/BoardBdsHookLi= b/BoardBdsHookLib.c new file mode 100644 index 0000000000..f19720f814 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/BoardModule= Pkg/Library/BoardBdsHookLib/BoardBdsHookLib.c @@ -0,0 +1,1400 @@ +/** @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.
+ Copyright (c) 2021, American Megatrends International LLC.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "BoardBdsHook.h" + +#define IS_FIRST_BOOT_VAR_NAME L"IsFirstBoot" + +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 (); +} + +/** + 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); + + if (PcdGetBool (PcdUpdateConsoleInBds) =3D=3D TRUE) { + + DEBUG ((DEBUG_INFO, "Event BdsPciEnumCompleteCallback callback starts\n")= ); + + gBootMode =3D GetBootModeHob (); + + // + // 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 drop= to Full Configuration boot mode in non-first boot + // + if (VarConOut =3D=3D NULL || VarConIn =3D=3D NULL) { + if (PcdGetSize (PcdTrustedConsoleOutputDevicePath) >=3D sizeof(EFI_DEVI= CE_PATH_PROTOCOL)) { + AddConsoleVariable (ConOut, PcdGetPtr (PcdTrustedConsoleOutputDevicePa= th)); + } + if (PcdGetSize (PcdTrustedConsoleInputDevicePath) >=3D sizeof(EFI_DEVIC= E_PATH_PROTOCOL)) { + AddConsoleVariable (ConIn, PcdGetPtr (PcdTrustedConsoleInputDevicePath= )); + } + } + } + + // + // 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 Ex= itPmAuth. + // SMM may consume these information. + // + MemoryTest((EXTENDMEM_COVERAGE_LEVEL) PcdGet32 (PcdPlatformMemoryCheckLev= el)); +} + +/** + 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 (); + + if (PcdGetBool (PcdUpdateConsoleInBds) =3D=3D TRUE) { + // + // 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")); + + // + // Connect Root Bridge to make PCI BAR resource allocated and all PciIo = created + // + ConnectRootBridge (FALSE); +} + + +/** + 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; + EFI_STATUS Status; + BOOLEAN IsFirstBoot; + UINTN DataSize; + + 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 + // + if (PcdGetBool (PcdFastBoot) =3D=3D FALSE) { + 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 + // + + EfiBootManagerRefreshAllBootOption (); + DataSize =3D sizeof (BOOLEAN); + Status =3D gRT->GetVariable ( + IS_FIRST_BOOT_VAR_NAME, + &gEfiCallerIdGuid, + NULL, + &DataSize, + &IsFirstBoot + ); + if (EFI_ERROR (Status)) { + // + // If can't find the variable, see it as the first boot + // + IsFirstBoot =3D TRUE; + } + + if (IsFirstBoot) { + // + // In the first boot, sort the boot option + // + EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareB= ootOption); + IsFirstBoot =3D FALSE; + Status =3D gRT->SetVariable ( + IS_FIRST_BOOT_VAR_NAME, + &gEfiCallerIdGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVI= CE_ACCESS, + sizeof (BOOLEAN), + &IsFirstBoot + ); + } + + break; + } + + if (PcdGetBool (PcdFastBoot) =3D=3D FALSE) { + Print (L"Press F2 for Setup, or F7 for BootMenu!\n"); + } + + +} diff --git a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/Boar= dModulePkg/Library/BoardBdsHookLib/BoardBdsHookLib.inf b/Platform/Intel/Pur= leyOpenBoardPkg/Override/Platform/Intel/BoardModulePkg/Library/BoardBdsHook= Lib/BoardBdsHookLib.inf new file mode 100644 index 0000000000..a664380c39 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/BoardModule= Pkg/Library/BoardBdsHookLib/BoardBdsHookLib.inf @@ -0,0 +1,99 @@ +### @file +# Module Information file for the Bds Hook Library. +# +# Copyright (c) 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2021, American Megatrends International LLC.
+# +# 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 + PurleyOpenBoardPkg/OpenBoardPkg.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 + gPlatformTokenSpaceGuid.PcdUpdateConsoleInBds ## CON= SUMES + gPlatformTokenSpaceGuid.PcdFastBoot ## 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/PurleyOpenBoardPkg/Override/Platform/Intel/MinP= latformPkg/Bds/Library/DxePlatformBootManagerLib/PlatformBootOption.c b/Pla= tform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/BoardModulePkg/Libra= ry/BoardBdsHookLib/BoardBootOption.c similarity index 87% rename from Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPl= atformPkg/Bds/Library/DxePlatformBootManagerLib/PlatformBootOption.c rename to Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/BoardMo= dulePkg/Library/BoardBdsHookLib/BoardBootOption.c index 84aa097d58..cb461ae041 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/PlatformBootOption.c +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/BoardModule= Pkg/Library/BoardBdsHookLib/BoardBootOption.c @@ -1,559 +1,587 @@ -/** @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); -} - +/** @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; +UINTN mSetupOptionNumber; + + +/** + 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)); + } + + // + // Boot Manager Menu + // + mSetupOptionNumber =3D RegisterFvBootOption (&mUiFile, L"Enter Setup", (= UINTN) -1, LOAD_OPTION_CATEGORY_APP | LOAD_OPTION_ACTIVE | LOAD_OPTION_HIDD= EN, NULL, 0); +} + +/** + 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; + + 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] + // + if (mSetupOptionNumber !=3D LoadOptionNumberUnassigned) { + 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; + RegisterBootOptionHotkey ((UINT16) mSetupOptionNumber, &F2.Key, TRUE); + } + + 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/PurleyOpenBoardPkg/Override/Platform/Intel/MinP= latformPkg/Bds/Library/DxePlatformBootManagerLib/MemoryTest.c b/Platform/In= tel/PurleyOpenBoardPkg/Override/Platform/Intel/BoardModulePkg/Library/Board= BdsHookLib/BoardMemoryTest.c similarity index 93% rename from Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPl= atformPkg/Bds/Library/DxePlatformBootManagerLib/MemoryTest.c rename to Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/BoardMo= dulePkg/Library/BoardBdsHookLib/BoardMemoryTest.c index e6445fecf8..4f93e9e142 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/MemoryTest.c +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/BoardModule= Pkg/Library/BoardBdsHookLib/BoardMemoryTest.c @@ -1,85 +1,86 @@ -/** @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; - } - - if (PcdGetBool (PcdFastBoot) =3D=3D FALSE) { - 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; -} +/** @file + Perform the platform memory test + +Copyright (c) 2019, Intel Corporation. All rights reserved.
+Copyright (c) 2021, American Megatrends International LLC.
+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; + } + + if (PcdGetBool (PcdFastBoot) =3D=3D FALSE) { + 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/PurleyOpenBoardPkg/Override/Platform/Intel/MinP= latformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c b/Platform/I= ntel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformPkg/Bds/Library/= DxePlatformBootManagerLib/BdsPlatform.c index bd0509ab10..a7e5c78469 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c @@ -1,138 +1,21 @@ /** @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.
Copyright (c) 2021, American Megatrends International LLC.
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; +extern UINTN mBootMenuOptionNumber; =20 EFI_STATUS LinuxBootStart ( VOID ); =20 - -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; -} - VOID ExitPmAuth ( VOID @@ -152,7 +35,7 @@ ExitPmAuth ( Status =3D gBS->CreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, - InternalBdsEmptyCallbackFuntion, + EfiEventEmptyFunction, NULL, &gEfiEndOfDxeEventGroupGuid, &EndOfDxeEvent @@ -179,918 +62,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; + Creates an EFI event in the BDS Event Group. =20 - 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; - } + @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 - FreePool (Instance); - } while (TempDevicePath !=3D NULL); + @retval EFI_SUCCESS Event was created. + @retval Other Event was not created. =20 - FreePool (ConsoleDevice); - - 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; - } - - 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 +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; - } + ASSERT (BdsConsoleEvent !=3D NULL); =20 - 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, + 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 + gEfiEventGuid, + BdsConsoleEvent ); - 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 - ); - 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; -} =20 -/** - 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); - - 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. + Create, Signal, and Close the Bds Event Before Console After + Trusted Console event using CreateBdsEvent(). =20 - @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; - - // - // 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++) { + Status =3D CreateBdsEvent ( + TPL_CALLBACK, + &gBdsEventBeforeConsoleAfterTrustedConsoleGuid, + &BdsConsoleEvent + ); =20 - 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); + 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 ( +EFIAPI +BdsSignalEventBeforeConsoleBeforeEndOfDxe ( VOID ) { - if (IsMorBitSet ()) { - ConnectTrustedConsole(); - ConnectTrustedStorage(); - } -} + EFI_STATUS Status; + EFI_EVENT BdsConsoleEvent; =20 -/** - Check if current BootCurrent variable is internal shell boot option. + DEBUG ((DEBUG_INFO, "%a \n", __FUNCTION__)); =20 - @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; + Status =3D CreateBdsEvent ( + TPL_CALLBACK, + &gBdsEventBeforeConsoleBeforeEndOfDxeGuid, + &BdsConsoleEvent + ); =20 - BootOption =3D NULL; - Result =3D FALSE; + ASSERT_EFI_ERROR (Status); =20 - // - // 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; + 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; + EFI_STATUS Status; + EFI_EVENT BdsConsoleEvent; =20 - Status =3D gBS->HandleProtocol ( - gST->ConsoleOutHandle, - &gEfiGraphicsOutputProtocolGuid, - (VOID**)&GraphicsOutput - ); - if (EFI_ERROR (Status)) { - GraphicsOutput =3D NULL; - } + DEBUG ((DEBUG_INFO, "%a \n", __FUNCTION__)); =20 - Status =3D gBS->HandleProtocol ( - gST->ConsoleOutHandle, - &gEfiSimpleTextOutProtocolGuid, - (VOID**)&SimpleTextOut - ); - if (EFI_ERROR (Status)) { - SimpleTextOut =3D NULL; - } + Status =3D CreateBdsEvent ( + TPL_CALLBACK, + &gBdsEventAfterConsoleReadyBeforeBootOptionGuid, + &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); - - 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); - } - } + 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 @@ -1102,153 +201,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. + // Trusted console can be added in a PciEnumComplete callback // - mShellHorizontalResolution =3D PcdGet32 (PcdSetupVideoHorizontalResoluti= on); - mShellVerticalResolution =3D PcdGet32 (PcdSetupVideoVerticalResolution= ); - mShellModeColumn =3D PcdGet32 (PcdSetupConOutColumn); - mShellModeRow =3D PcdGet32 (PcdSetupConOutRow); - - if (PcdGetBool (PcdUpdateConsoleInBds) =3D=3D TRUE) { - // - // Create event to set proper video resolution and text mode for inter= nal shell. - // - Status =3D EfiCreateEventReadyToBootEx ( - TPL_CALLBACK, - OnReadyToBootCallBack, - NULL, - &Event - ); - ASSERT_EFI_ERROR (Status); - - // - // Connect Root Bridge to make PCI BAR resource allocated and all PciI= o 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 (V= arConIn !=3D NULL) { FreePool (VarConIn); } - - // - // Only fill ConIn/ConOut when ConIn/ConOut is empty because we may = drop to Full Configuration boot mode in non-first boot - // - if (VarConOut =3D=3D NULL || VarConIn =3D=3D NULL) { - if (PcdGetSize (PcdTrustedConsoleOutputDevicePath) >=3D sizeof(EFI= _DEVICE_PATH_PROTOCOL)) { - AddConsoleVariable (ConOut, PcdGetPtr (PcdTrustedConsoleOutputDe= vicePath)); - } - if (PcdGetSize (PcdTrustedConsoleInputDevicePath) >=3D sizeof(EFI_= DEVICE_PATH_PROTOCOL)) { - AddConsoleVariable (ConIn, PcdGetPtr (PcdTrustedConsoleInputDevi= cePath)); - } - } - } - - EnumUsbKeyboard (); - // - // For trusted console it must be handled here. - // - UpdateGraphicConOut (TRUE); - - // - // Dynamically register hot key: F2/F7/Enter - // - RegisterDefaultBootOption (); - RegisterStaticHotkey (); - } - =20 - PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7010); - if (PcdGetBool (PcdTpm2Enable)) { - ProcessTcgPp (); - ProcessTcgMor (); - } - PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7011); =20 // - // We should make all UEFI memory and GCD information populated before E= xitPmAuth. - // SMM may consume these information. + // Signal Before Console, after Trusted console 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); + BdsSignalEventBeforeConsoleAfterTrustedConsole (); =20 // - // Dispatch the deferred 3rd party images. + // Signal Before Console, before End of Dxe // - EfiBootManagerDispatchDeferredImages (); + BdsSignalEventBeforeConsoleBeforeEndOfDxe (); =20 // - // For non-trusted console it must be handled here. + // Signal End Of Dxe Event // - if (PcdGetBool (PcdUpdateConsoleInBds) =3D=3D TRUE) { - UpdateGraphicConOut (FALSE); - } -} - - -/** - 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); + PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7020); + ExitPmAuth (); + PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7021); =20 // - // If setup is the first priority in boot option, we need to sort boot o= ption. + // Deferred 3rd party images can be dispatched in + // an SmmReadyToLock callback // - 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; } =20 + /** 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 @@ -1265,71 +248,11 @@ PlatformBootManagerAfterConsole ( VOID ) { - EFI_BOOT_MODE LocalBootMode; - DEBUG ((EFI_D_INFO, "PlatformBootManagerAfterConsole\n")); - - // - // Get current Boot Mode - // - LocalBootMode =3D gBootMode; - DEBUG ((DEBUG_INFO, "Current local bootmode - %x\n", LocalBootMode)); - - LinuxBootStart(); =20 - // - // 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 - // - if (PcdGetBool (PcdFastBoot) =3D=3D FALSE) { - 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; - } - - if (PcdGetBool (PcdFastBoot) =3D=3D FALSE) { - Print (L"Press F7 for BootMenu!\n"); + LinuxBootStart(); =20 - EfiBootManagerRefreshAllBootOption (); - EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBootO= ption); - } + BdsSignalEventAfterConsoleReadyBeforeBootOption (); } =20 /** @@ -1345,19 +268,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/PurleyOpenBoardPkg/Override/Platform/Intel/MinP= latformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.h b/Platform/I= ntel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformPkg/Bds/Library/= DxePlatformBootManagerLib/BdsPlatform.h index 360a00d7d7..031676cdc3 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.h +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.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/PurleyOpenBoardPkg/Override/Platform/Intel/MinP= latformPkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.= inf b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf index 21ac65257c..c795418c02 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf @@ -1,12 +1,12 @@ -## @file +### @file # Component name for module DxePlatformBootManagerLib # -# Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.
+# Copyright (c) 2017, Intel Corporation. All rights reserved.
# Copyright (c) 2021, American Megatrends International LLC.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # -## +### =20 [Defines] INF_VERSION =3D 0x00010017 @@ -24,23 +24,13 @@ =20 [LibraryClasses] BaseLib - MemoryAllocationLib UefiBootServicesTableLib - UefiRuntimeServicesTableLib - BaseMemoryLib DebugLib - PcdLib - PrintLib - DevicePathLib UefiLib HobLib - DxeServicesLib - DxeServicesTableLib - HiiLib UefiBootManagerLib PerformanceLib - TimerLib - Tcg2PhysicalPresenceLib + BoardBootManagerLib LinuxBootLib =20 [Packages] @@ -48,51 +38,19 @@ MdeModulePkg/MdeModulePkg.dec SecurityPkg/SecurityPkg.dec MinPlatformPkg/MinPlatformPkg.dec - PurleyOpenBoardPkg/OpenBoardPkg.dec - -[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 - gPlatformTokenSpaceGuid.PcdUpdateConsoleInBds ## CONSU= MES - gPlatformTokenSpaceGuid.PcdFastBoot ## CONSU= MES =20 [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 -- 2.25.0.windows.1 Please consider the environment before printing this email. The information contained in this message may be confidential and proprieta= ry to American Megatrends (AMI). This communication is intended to be read= only by the individual or entity to whom it is addressed or by their desig= nee. If the reader of this message is not the intended recipient, you are o= n notice that any distribution of this message, in any form, is strictly pr= ohibited. Please promptly notify the sender by reply e-mail or by telephon= e at 770-246-8600, and then delete or destroy all copies of the transmissio= n. -=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 (#84424): https://edk2.groups.io/g/devel/message/84424 Mute This Topic: https://groups.io/mt/87550393/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-