mirror of https://github.com/acidanthera/audk.git
160 lines
4.0 KiB
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;
|
|
}
|