From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from hqnvemgate24.nvidia.com (hqnvemgate24.nvidia.com [216.228.121.143]) by mx.groups.io with SMTP id smtpd.web12.1438.1576613929623273404 for ; Tue, 17 Dec 2019 12:18:49 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@nvidia.com header.s=n1 header.b=aWVZAymG; spf=pass (domain: nvidia.com, ip: 216.228.121.143, mailfrom: ashishsingha@nvidia.com) Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqnvemgate24.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Tue, 17 Dec 2019 12:18:16 -0800 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Tue, 17 Dec 2019 12:18:43 -0800 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Tue, 17 Dec 2019 12:18:43 -0800 Received: from HQMAIL109.nvidia.com (172.20.187.15) by HQMAIL105.nvidia.com (172.20.187.12) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Tue, 17 Dec 2019 20:18:43 +0000 Received: from hqnvemgw03.nvidia.com (10.124.88.68) by HQMAIL109.nvidia.com (172.20.187.15) with Microsoft SMTP Server (TLS) id 15.0.1473.3 via Frontend Transport; Tue, 17 Dec 2019 20:18:43 +0000 Received: from ashishsingha-lnx.nvidia.com (Not Verified[10.28.48.147]) by hqnvemgw03.nvidia.com with Trustwave SEG (v7,5,8,10121) id ; Tue, 17 Dec 2019 12:18:43 -0800 From: "Ashish Singhal" To: , , , , CC: Ashish Singhal Subject: [PATCH] MdeModulePkg: Add Platform Boot Options Protocol Date: Tue, 17 Dec 2019 13:18:40 -0700 Message-ID: <5a8fcc073c37a2432167a0ea80f5ad5dad224c61.1576613592.git.ashishsingha@nvidia.com> X-Mailer: git-send-email 2.7.4 X-NVConfidentiality: public Return-Path: ashishsingha@nvidia.com MIME-Version: 1.0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1576613896; bh=d9o/IEckEg3v6nR03/aPkc1jlkplyCmToZ8egwegk/E=; h=X-PGP-Universal:From:To:CC:Subject:Date:Message-ID:X-Mailer: X-NVConfidentiality:MIME-Version:Content-Type; b=aWVZAymG1CoIgVitjXcl/lQ1jWlyqGjy1tOQIJJI4R7RzboDYQHtFLYOJx0EDNz7U jXiNgaXMEh6RYP8RZRL7bkGq/h+TDclld8pAB1z4ATK/AB7OGOKp1/m2zfHbhXjUDs myElFtsvN90mscEs3Yahs8/5wzBt/19QiNha2Jp3Imaguh0QVJI6Ct/BOR7P7HTcUZ gy7IrXlOnmazlFXQuyJ9nYpeVGDCH88bTXnFgR1qXGKLBU6XSk5p3jxz8m96ck2s6j JdrKuXpZoPL9AaA56/IOHgPa51tc3RLOoDif3qzdvWrDXw8w6FM+h5mIyhp0aFGBjx 0kJxag7Q5AIWQ== Content-Type: text/plain Add platform boot options protocol which would have platform specific overrides to the auto enumerated boot options during the call to EfiBootManagerRefreshAllBootOption function in UefiBootManagerLib. Signed-off-by: Ashish Singhal --- .../Include/Protocol/PlatformBootOptions.h | 114 +++++++++++++++++++++ MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c | 52 ++++++++-- .../Library/UefiBootManagerLib/InternalBm.h | 2 + .../UefiBootManagerLib/UefiBootManagerLib.inf | 2 + MdeModulePkg/MdeModulePkg.dec | 4 + 5 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 MdeModulePkg/Include/Protocol/PlatformBootOptions.h diff --git a/MdeModulePkg/Include/Protocol/PlatformBootOptions.h b/MdeModulePkg/Include/Protocol/PlatformBootOptions.h new file mode 100644 index 0000000..801188a --- /dev/null +++ b/MdeModulePkg/Include/Protocol/PlatformBootOptions.h @@ -0,0 +1,114 @@ +/** @file + + Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef __PLATFORM_BOOT_OPTIONS_PROTOCOL_H__ +#define __PLATFORM_BOOT_OPTIONS_PROTOCOL_H__ + +#include + +// +// Platform Boot Options Protocol GUID value +// +#define EDKII_PLATFORM_BOOT_OPTIONS_PROTOCOL_GUID \ + { \ + 0xaa17add4, 0x756c, 0x460d, { 0x94, 0xb8, 0x43, 0x88, 0xd7, 0xfb, 0x3e, 0x59 } \ + } + +// +// Protocol interface structure +// +typedef struct _PLATFORM_BOOT_OPTIONS_PROTOCOL PLATFORM_BOOT_OPTIONS_PROTOCOL; + +// +// Revision The revision to which the protocol interface adheres. +// All future revisions must be backwards compatible. +// If a future version is not back wards compatible it is not the same GUID. +// +#define EDKII_PLATFORM_BOOT_OPTIONS_PROTOCOL_REVISION 0x00000001 + +// +// Function Prototypes +// + +/* + This function allows overrides to auto enumerated boot options for platform. + + @param[in const] BootOptionsCount The number of elements in BootOptions. + + @param[in const] BootOptions An array of auto enumerated platform boot options. + This array will be freed by caller upon successful + exit of this function and output array would be used. + + @param[out] UpdatedBootOptionsCount The number of elements in UpdatedBootOptions. + + @param[out] UpdatedBootOptions An array of boot options that have been customized + for the platform on top of input boot options. This + array would be freed by caller after processing. + + + @retval EFI_SUCCESS Platform overrides to input BootOptions and + BootCount have been done. + + @retval EFI_OUT_OF_RESOURCES Memory allocation failed. + + @retval EFI_INVALID_PARAMETER Input is not correct. + + @retval EFI_UNSUPPORTED Platform specific overrides are not supported. +*/ +typedef +EFI_STATUS +(EFIAPI *OVERRIDE_PLATFORM_BOOT_OPTIONS) ( + IN CONST UINTN BootOptionsCount, + IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions, + OUT UINTN *UpdatedBootOptionsCount, + OUT EFI_BOOT_MANAGER_LOAD_OPTION **UpdatedBootOptions + ); + +/* + This function allows to remove invalid platform specific boot options from NV. + + @param[in const] NvBootOptionsCount The number of elements in NvBootOptions. + + @param[in const] NvBootOptions An array of current boot options in NV store. + This array will be freed by caller upon successful + exit of this function and output array would be used. + + @param[out] UpdatedBootOptionsCount The number of elements in UpdatedBootOptions. + + @param[out] UpdatedBootOptions An array of NV boot options that have been cleaned up + for the platform on top of input NV boot options. This + array would be freed by caller after processing. + + + @retval EFI_SUCCESS Platform cleanup to input NvBootOptions and + NvBootCount have been done. + + @retval EFI_OUT_OF_RESOURCES Memory allocation failed. + + @retval EFI_INVALID_PARAMETER Input is not correct. + + @retval EFI_UNSUPPORTED Platform specific overrides are not supported. +*/ +typedef +EFI_STATUS +(EFIAPI *REMOVE_INVALID_PLATFORM_NV_BOOT_OPTIONS) ( + IN CONST UINTN NvBootOptionsCount, + IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *NvBootOptions, + OUT UINTN *UpdatedBootOptionsCount, + OUT EFI_BOOT_MANAGER_LOAD_OPTION **UpdatedBootOptions + ); + +struct _PLATFORM_BOOT_OPTIONS_PROTOCOL { + UINT64 Revision; + OVERRIDE_PLATFORM_BOOT_OPTIONS OverridePlatformBootOptions; + REMOVE_INVALID_PLATFORM_NV_BOOT_OPTIONS RemoveInvalidPlatformNvBootOptions; +}; + +extern EFI_GUID gEdkiiPlatformBootOptionsProtocolGuid; + +#endif /* __PLATFORM_BOOT_OPTIONS_PROTOCOL_H__ */ diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c index 760d764..41e09d5 100644 --- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c @@ -1,6 +1,7 @@ /** @file Library functions which relates with booting. +Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.
(C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -2258,12 +2259,15 @@ EfiBootManagerRefreshAllBootOption ( VOID ) { - EFI_STATUS Status; - EFI_BOOT_MANAGER_LOAD_OPTION *NvBootOptions; - UINTN NvBootOptionCount; - EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; - UINTN BootOptionCount; - UINTN Index; + EFI_STATUS Status; + EFI_BOOT_MANAGER_LOAD_OPTION *NvBootOptions; + UINTN NvBootOptionCount; + EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; + UINTN BootOptionCount; + EFI_BOOT_MANAGER_LOAD_OPTION *UpdatedBootOptions; + UINTN UpdatedBootOptionCount; + UINTN Index; + PLATFORM_BOOT_OPTIONS_PROTOCOL *PlatformBootOptions; // // Optionally refresh the legacy boot option @@ -2284,6 +2288,42 @@ EfiBootManagerRefreshAllBootOption ( } // + // Locate Platform Boot Options Protocol + // + PlatformBootOptions = NULL; + Status = gBS->LocateProtocol (&gEdkiiPlatformBootOptionsProtocolGuid, + NULL, + (VOID **)&PlatformBootOptions); + if (!EFI_ERROR (Status)) { + // + // If found, call platform specific overrides to auto enumerated + // boot options. + // + Status = PlatformBootOptions->OverridePlatformBootOptions ((CONST UINTN)BootOptionCount, + (CONST EFI_BOOT_MANAGER_LOAD_OPTION *)BootOptions, + &UpdatedBootOptionCount, + &UpdatedBootOptions); + if (!EFI_ERROR (Status)) { + EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); + BootOptions = UpdatedBootOptions; + BootOptionCount = UpdatedBootOptionCount; + } + + // + // Call platform specific override to remove invalid boot options from NV + // + Status = PlatformBootOptions->RemoveInvalidPlatformNvBootOptions ((CONST UINTN)NvBootOptionCount, + (CONST EFI_BOOT_MANAGER_LOAD_OPTION *)NvBootOptions, + &UpdatedBootOptionCount, + &UpdatedBootOptions); + if (!EFI_ERROR (Status)) { + EfiBootManagerFreeLoadOptions (NvBootOptions, NvBootOptionCount); + NvBootOptions = UpdatedBootOptions; + NvBootOptionCount = UpdatedBootOptionCount; + } + } + + // // Remove invalid EFI boot options from NV // for (Index = 0; Index < NvBootOptionCount; Index++) { diff --git a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h index 027eb25..1f65860 100644 --- a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h +++ b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h @@ -1,6 +1,7 @@ /** @file BDS library definition, include the file and data structure +Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
(C) Copyright 2015 Hewlett Packard Enterprise Development LP
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -41,6 +42,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include #include #include diff --git a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf index ed6b467..d839252 100644 --- a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf +++ b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf @@ -5,6 +5,7 @@ # manipulation, hotkey registration, UEFI boot, connect/disconnect, console # manipulation, driver health checking and etc. # +# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
# (C) Copyright 2016 Hewlett Packard Enterprise Development LP
# SPDX-License-Identifier: BSD-2-Clause-Patent @@ -107,6 +108,7 @@ gEfiFormBrowser2ProtocolGuid ## SOMETIMES_CONSUMES gEfiRamDiskProtocolGuid ## SOMETIMES_CONSUMES gEfiDeferredImageLoadProtocolGuid ## SOMETIMES_CONSUMES + gEdkiiPlatformBootOptionsProtocolGuid ## SOMETIMES_CONSUMES [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange ## SOMETIMES_CONSUMES diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 41b9e70..bb9fa8b 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -3,6 +3,7 @@ # It also provides the definitions(including PPIs/PROTOCOLs/GUIDs and library classes) # and libraries instances, which are used for those modules. # +# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. # Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.
# Copyright (c) 2016, Linaro Ltd. All rights reserved.
# (C) Copyright 2016 - 2019 Hewlett Packard Enterprise Development LP
@@ -609,6 +610,9 @@ ## Include/Protocol/PeCoffImageEmulator.h gEdkiiPeCoffImageEmulatorProtocolGuid = { 0x96f46153, 0x97a7, 0x4793, { 0xac, 0xc1, 0xfa, 0x19, 0xbf, 0x78, 0xea, 0x97 } } + ## Include/Protocol/PlatformBootOptions.h + gEdkiiPlatformBootOptionsProtocolGuid = { 0xaa17add4, 0x756c, 0x460d, { 0x94, 0xb8, 0x43, 0x88, 0xd7, 0xfb, 0x3e, 0x59 } } + # # [Error.gEfiMdeModulePkgTokenSpaceGuid] # 0x80000001 | Invalid value provided. -- 2.7.4