audk/MdeModulePkg/Library/BootDiscoveryPolicyUiLib/BootDiscoveryPolicyUiLib.c

160 lines
4.0 KiB
C

/** @file
Boot Discovery Policy UI for Boot Maintenance menu.
Copyright (c) 2021, ARM Ltd. All rights reserved.<BR>
Copyright (c) 2021, Semihalf All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <Guid/BootDiscoveryPolicy.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/BaseLib.h>
#include <Library/DevicePathLib.h>
#include <Library/DebugLib.h>
#include <Library/HiiLib.h>
#include <Library/UefiLib.h>
#include <Library/BaseMemoryLib.h>
#include <Include/Library/PcdLib.h>
///
/// 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;
}