mirror of https://github.com/acidanthera/audk.git
188 lines
4.8 KiB
C
188 lines
4.8 KiB
C
/** @file
|
|
Implementation for PlatformBootManagerLib library class interfaces.
|
|
|
|
Copyright (C) 2015-2016, Red Hat, Inc.
|
|
Copyright (c) 2014 - 2019, ARM Ltd. All rights reserved.<BR>
|
|
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
|
|
Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
|
|
Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR>
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#include <Uefi.h>
|
|
|
|
#include <Guid/EventGroup.h>
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/DevicePathLib.h>
|
|
#include <Library/MemoryAllocationLib.h>
|
|
#include <Library/PcdLib.h>
|
|
#include <Library/UefiBootManagerLib.h>
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
#include <Library/UefiLib.h>
|
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
|
#include <Protocol/LoadedImage.h>
|
|
#include <Protocol/PlatformBootManager.h>
|
|
|
|
/**
|
|
Register a boot option using a file GUID in the FV.
|
|
|
|
@param FileGuid The file GUID name in the FV.
|
|
@param Description The description of the boot option.
|
|
@param Attributes The attributes of the boot option.
|
|
|
|
**/
|
|
STATIC
|
|
VOID
|
|
PlatformRegisterFvBootOption (
|
|
CONST EFI_GUID *FileGuid,
|
|
CHAR16 *Description,
|
|
UINT32 Attributes
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
INTN OptionIndex;
|
|
EFI_BOOT_MANAGER_LOAD_OPTION NewOption;
|
|
EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions;
|
|
UINTN BootOptionCount;
|
|
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode;
|
|
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
|
|
|
Status = gBS->HandleProtocol (
|
|
gImageHandle,
|
|
&gEfiLoadedImageProtocolGuid,
|
|
(VOID **)&LoadedImage
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid);
|
|
DevicePath = DevicePathFromHandle (LoadedImage->DeviceHandle);
|
|
ASSERT (DevicePath != NULL);
|
|
DevicePath = AppendDevicePathNode (
|
|
DevicePath,
|
|
(EFI_DEVICE_PATH_PROTOCOL *)&FileNode
|
|
);
|
|
ASSERT (DevicePath != NULL);
|
|
|
|
Status = EfiBootManagerInitializeLoadOption (
|
|
&NewOption,
|
|
LoadOptionNumberUnassigned,
|
|
LoadOptionTypeBoot,
|
|
Attributes,
|
|
Description,
|
|
DevicePath,
|
|
NULL,
|
|
0
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
FreePool (DevicePath);
|
|
|
|
BootOptions = EfiBootManagerGetLoadOptions (
|
|
&BootOptionCount,
|
|
LoadOptionTypeBoot
|
|
);
|
|
|
|
OptionIndex = EfiBootManagerFindLoadOption (
|
|
&NewOption,
|
|
BootOptions,
|
|
BootOptionCount
|
|
);
|
|
|
|
if (OptionIndex == -1) {
|
|
Status = EfiBootManagerAddLoadOptionVariable (&NewOption, MAX_UINTN);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
|
|
EfiBootManagerFreeLoadOption (&NewOption);
|
|
EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount);
|
|
}
|
|
|
|
/**
|
|
Do the platform specific action before the console is connected.
|
|
|
|
Such as:
|
|
Update console variable;
|
|
Register new Driver#### or Boot####;
|
|
Signal ReadyToLock event.
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
PlatformBootManagerBeforeConsole (
|
|
VOID
|
|
)
|
|
{
|
|
//
|
|
// Signal EndOfDxe PI Event
|
|
//
|
|
EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid);
|
|
}
|
|
|
|
/**
|
|
Do the platform specific action after the console is connected.
|
|
|
|
Such as:
|
|
Dynamically switch output mode;
|
|
Signal console ready platform customized event;
|
|
Run diagnostics like memory testing;
|
|
Connect certain devices;
|
|
Dispatch additional option roms.
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
PlatformBootManagerAfterConsole (
|
|
VOID
|
|
)
|
|
{
|
|
EFI_GUID LinuxBootFileGuid;
|
|
|
|
CopyGuid (&LinuxBootFileGuid, PcdGetPtr (PcdLinuxBootFileGuid));
|
|
|
|
if (!CompareGuid (&LinuxBootFileGuid, &gZeroGuid)) {
|
|
//
|
|
// Register LinuxBoot
|
|
//
|
|
PlatformRegisterFvBootOption (
|
|
&LinuxBootFileGuid,
|
|
L"LinuxBoot",
|
|
LOAD_OPTION_ACTIVE
|
|
);
|
|
} else {
|
|
DEBUG ((DEBUG_ERROR, "%a: PcdLinuxBootFileGuid was not set!\n", __func__));
|
|
}
|
|
}
|
|
|
|
/**
|
|
This function is called each second during the boot manager waits the
|
|
timeout.
|
|
|
|
@param TimeoutRemain The remaining timeout.
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
PlatformBootManagerWaitCallback (
|
|
UINT16 TimeoutRemain
|
|
)
|
|
{
|
|
return;
|
|
}
|
|
|
|
/**
|
|
The function is called when no boot option could be launched,
|
|
including platform recovery options and options pointing to applications
|
|
built into firmware volumes.
|
|
|
|
If this function returns, BDS attempts to enter an infinite loop.
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
PlatformBootManagerUnableToBoot (
|
|
VOID
|
|
)
|
|
{
|
|
return;
|
|
}
|