/** @file Boot Discovery Policy UI for Boot Maintenance menu. Copyright (c) 2021, ARM Ltd. All rights reserved.
Copyright (c) 2021, Semihalf All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include /// /// HII specific Vendor Device Path definition. /// typedef struct { VENDOR_DEVICE_PATH VendorDevicePath; EFI_DEVICE_PATH_PROTOCOL End; } HII_VENDOR_DEVICE_PATH; extern UINT8 BootDiscoveryPolicyUiLibVfrBin[]; EFI_HII_HANDLE mBPHiiHandle = NULL; EFI_HANDLE mBPDriverHandle = NULL; STATIC HII_VENDOR_DEVICE_PATH mVendorDevicePath = { { { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { (UINT8)(sizeof (VENDOR_DEVICE_PATH)), (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8) } }, BOOT_DISCOVERY_POLICY_MGR_FORMSET_GUID }, { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { (UINT8)(END_DEVICE_PATH_LENGTH), (UINT8)((END_DEVICE_PATH_LENGTH) >> 8) } } }; /** Initialize Boot Maintenance Menu library. @param ImageHandle The image handle. @param SystemTable The system table. @retval EFI_SUCCESS Install Boot manager menu success. @retval Other Return error status.gBPDisplayLibGuid **/ EFI_STATUS EFIAPI BootDiscoveryPolicyUiLibConstructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; UINTN Size; UINT32 BootDiscoveryPolicy; Size = sizeof (UINT32); Status = gRT->GetVariable ( BOOT_DISCOVERY_POLICY_VAR, &gBootDiscoveryPolicyMgrFormsetGuid, NULL, &Size, &BootDiscoveryPolicy ); if (EFI_ERROR (Status)) { Status = PcdSet32S (PcdBootDiscoveryPolicy, PcdGet32 (PcdBootDiscoveryPolicy)); ASSERT_EFI_ERROR (Status); } Status = gBS->InstallMultipleProtocolInterfaces ( &mBPDriverHandle, &gEfiDevicePathProtocolGuid, &mVendorDevicePath, NULL ); if (EFI_ERROR (Status)) { return Status; } // // Publish our HII data // mBPHiiHandle = HiiAddPackages ( &gBootDiscoveryPolicyMgrFormsetGuid, mBPDriverHandle, BootDiscoveryPolicyUiLibVfrBin, BootDiscoveryPolicyUiLibStrings, NULL ); if (mBPHiiHandle == NULL) { gBS->UninstallMultipleProtocolInterfaces ( mBPDriverHandle, &gEfiDevicePathProtocolGuid, &mVendorDevicePath, NULL ); return EFI_OUT_OF_RESOURCES; } return EFI_SUCCESS; } /** Destructor of Boot Maintenance menu library. @param ImageHandle The firmware allocated handle for the EFI image. @param SystemTable A pointer to the EFI System Table. @retval EFI_SUCCESS The destructor completed successfully. @retval Other value The destructor did not complete successfully. **/ EFI_STATUS EFIAPI BootDiscoveryPolicyUiLibDestructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { if (mBPDriverHandle != NULL) { gBS->UninstallProtocolInterface ( mBPDriverHandle, &gEfiDevicePathProtocolGuid, &mVendorDevicePath ); mBPDriverHandle = NULL; } if (mBPHiiHandle != NULL) { HiiRemovePackages (mBPHiiHandle); mBPHiiHandle = NULL; } return EFI_SUCCESS; }