mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-10 14:23:31 +01:00
818 lines
27 KiB
C
818 lines
27 KiB
C
|
/** @file
|
||
|
Provide Boot Manager related library APIs.
|
||
|
|
||
|
Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.<BR>
|
||
|
(C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
|
||
|
#ifndef _UEFI_BOOT_MANAGER_LIB_H_
|
||
|
#define _UEFI_BOOT_MANAGER_LIB_H_
|
||
|
|
||
|
#include <Protocol/DriverHealth.h>
|
||
|
#include <Library/SortLib.h>
|
||
|
|
||
|
//
|
||
|
// Boot Manager load option library functions.
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Load Option Type
|
||
|
//
|
||
|
typedef enum {
|
||
|
LoadOptionTypeDriver,
|
||
|
LoadOptionTypeSysPrep,
|
||
|
LoadOptionTypeBoot,
|
||
|
LoadOptionTypePlatformRecovery,
|
||
|
LoadOptionTypeMax
|
||
|
} EFI_BOOT_MANAGER_LOAD_OPTION_TYPE;
|
||
|
|
||
|
typedef enum {
|
||
|
LoadOptionNumberMax = 0x10000,
|
||
|
LoadOptionNumberUnassigned = LoadOptionNumberMax
|
||
|
} EFI_BOOT_MANAGER_LOAD_OPTION_NUMBER;
|
||
|
|
||
|
//
|
||
|
// Common structure definition for DriverOption and BootOption
|
||
|
//
|
||
|
typedef struct {
|
||
|
//
|
||
|
// Data read from UEFI NV variables
|
||
|
//
|
||
|
UINTN OptionNumber; // #### numerical value, could be LoadOptionNumberUnassigned
|
||
|
EFI_BOOT_MANAGER_LOAD_OPTION_TYPE OptionType; // LoadOptionTypeBoot or LoadOptionTypeDriver
|
||
|
UINT32 Attributes; // Load Option Attributes
|
||
|
CHAR16 *Description; // Load Option Description
|
||
|
EFI_DEVICE_PATH_PROTOCOL *FilePath; // Load Option Device Path
|
||
|
UINT8 *OptionalData; // Load Option optional data to pass into image
|
||
|
UINT32 OptionalDataSize; // Load Option size of OptionalData
|
||
|
EFI_GUID VendorGuid;
|
||
|
|
||
|
//
|
||
|
// Used at runtime
|
||
|
//
|
||
|
EFI_STATUS Status; // Status returned from boot attempt gBS->StartImage ()
|
||
|
CHAR16 *ExitData; // Exit data returned from gBS->StartImage ()
|
||
|
UINTN ExitDataSize; // Size of ExitData
|
||
|
} EFI_BOOT_MANAGER_LOAD_OPTION;
|
||
|
|
||
|
/**
|
||
|
Returns an array of load options based on the EFI variable
|
||
|
L"BootOrder"/L"DriverOrder" and the L"Boot####"/L"Driver####" variables impled by it.
|
||
|
#### is the hex value of the UINT16 in each BootOrder/DriverOrder entry.
|
||
|
|
||
|
@param LoadOptionCount Returns number of entries in the array.
|
||
|
@param LoadOptionType The type of the load option.
|
||
|
|
||
|
@retval NULL No load options exist.
|
||
|
@retval !NULL Array of load option entries.
|
||
|
|
||
|
**/
|
||
|
EFI_BOOT_MANAGER_LOAD_OPTION *
|
||
|
EFIAPI
|
||
|
EfiBootManagerGetLoadOptions (
|
||
|
OUT UINTN *LoadOptionCount,
|
||
|
IN EFI_BOOT_MANAGER_LOAD_OPTION_TYPE LoadOptionType
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Free an array of load options returned from EfiBootManagerGetLoadOptions().
|
||
|
|
||
|
@param LoadOptions Pointer to the array of load options to free.
|
||
|
@param LoadOptionCount Number of array entries in LoadOptions.
|
||
|
|
||
|
@return EFI_SUCCESS LoadOptions was freed.
|
||
|
@return EFI_INVALID_PARAMETER LoadOptions is NULL.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerFreeLoadOptions (
|
||
|
IN EFI_BOOT_MANAGER_LOAD_OPTION *LoadOptions,
|
||
|
IN UINTN LoadOptionCount
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Initialize a load option.
|
||
|
|
||
|
@param Option Pointer to the load option to be initialized.
|
||
|
@param OptionNumber Option number of the load option.
|
||
|
@param OptionType Type of the load option.
|
||
|
@param Attributes Attributes of the load option.
|
||
|
@param Description Description of the load option.
|
||
|
@param FilePath Device path of the load option.
|
||
|
@param OptionalData Optional data of the load option.
|
||
|
@param OptionalDataSize Size of the optional data of the load option.
|
||
|
|
||
|
@retval EFI_SUCCESS The load option was initialized successfully.
|
||
|
@retval EFI_INVALID_PARAMETER Option, Description or FilePath is NULL.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerInitializeLoadOption (
|
||
|
IN OUT EFI_BOOT_MANAGER_LOAD_OPTION *Option,
|
||
|
IN UINTN OptionNumber,
|
||
|
IN EFI_BOOT_MANAGER_LOAD_OPTION_TYPE OptionType,
|
||
|
IN UINT32 Attributes,
|
||
|
IN CHAR16 *Description,
|
||
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
|
||
|
IN UINT8 *OptionalData,
|
||
|
IN UINT32 OptionalDataSize
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Free a load option created by EfiBootManagerInitializeLoadOption()
|
||
|
or EfiBootManagerVariableToLoadOption().
|
||
|
|
||
|
@param LoadOption Pointer to the load option to free.
|
||
|
CONCERN: Check Boot#### instead of BootOrder, optimize, spec clarify
|
||
|
@return EFI_SUCCESS LoadOption was freed.
|
||
|
@return EFI_INVALID_PARAMETER LoadOption is NULL.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerFreeLoadOption (
|
||
|
IN EFI_BOOT_MANAGER_LOAD_OPTION *LoadOption
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Initialize the load option from the VariableName.
|
||
|
|
||
|
@param VariableName EFI Variable name which could be Boot#### or
|
||
|
Driver####
|
||
|
@param LoadOption Pointer to the load option to be initialized
|
||
|
|
||
|
@retval EFI_SUCCESS The option was created
|
||
|
@retval EFI_INVALID_PARAMETER VariableName or LoadOption is NULL.
|
||
|
@retval EFI_NOT_FOUND The variable specified by VariableName cannot be found.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerVariableToLoadOption (
|
||
|
IN CHAR16 *VariableName,
|
||
|
IN OUT EFI_BOOT_MANAGER_LOAD_OPTION *LoadOption
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Create the Boot#### or Driver#### variable from the load option.
|
||
|
|
||
|
@param LoadOption Pointer to the load option.
|
||
|
|
||
|
@retval EFI_SUCCESS The variable was created.
|
||
|
@retval Others Error status returned by RT->SetVariable.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerLoadOptionToVariable (
|
||
|
IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *LoadOption
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This function will register the new Boot####, Driver#### or SysPrep#### option.
|
||
|
After the *#### is updated, the *Order will also be updated.
|
||
|
|
||
|
@param Option Pointer to load option to add. If on input
|
||
|
Option->OptionNumber is LoadOptionNumberUnassigned,
|
||
|
then on output Option->OptionNumber is updated to
|
||
|
the number of the new Boot####,
|
||
|
Driver#### or SysPrep#### option.
|
||
|
@param Position Position of the new load option to put in the ****Order variable.
|
||
|
|
||
|
@retval EFI_SUCCESS The *#### have been successfully registered.
|
||
|
@retval EFI_INVALID_PARAMETER The option number exceeds 0xFFFF.
|
||
|
@retval EFI_ALREADY_STARTED The option number of Option is being used already.
|
||
|
Note: this API only adds new load option, no replacement support.
|
||
|
@retval EFI_OUT_OF_RESOURCES There is no free option number that can be used when the
|
||
|
option number specified in the Option is LoadOptionNumberUnassigned.
|
||
|
@return Status codes of gRT->SetVariable ().
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerAddLoadOptionVariable (
|
||
|
IN OUT EFI_BOOT_MANAGER_LOAD_OPTION *Option,
|
||
|
IN UINTN Position
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Delete the load option according to the OptionNumber and OptionType.
|
||
|
|
||
|
Only the BootOrder/DriverOrder is updated to remove the reference of the OptionNumber.
|
||
|
|
||
|
@param OptionNumber Option number of the load option.
|
||
|
@param OptionType Type of the load option.
|
||
|
|
||
|
@retval EFI_NOT_FOUND The load option cannot be found.
|
||
|
@retval EFI_SUCCESS The load option was deleted.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerDeleteLoadOptionVariable (
|
||
|
IN UINTN OptionNumber,
|
||
|
IN EFI_BOOT_MANAGER_LOAD_OPTION_TYPE OptionType
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Sort the load options. The DriverOrder/BootOrder variables will be re-created to
|
||
|
reflect the new order.
|
||
|
|
||
|
@param OptionType The type of the load option.
|
||
|
@param CompareFunction The comparator function pointer.
|
||
|
**/
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
EfiBootManagerSortLoadOptionVariable (
|
||
|
IN EFI_BOOT_MANAGER_LOAD_OPTION_TYPE OptionType,
|
||
|
IN SORT_COMPARE CompareFunction
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Return the index of the load option in the load option array.
|
||
|
|
||
|
The function consider two load options are equal when the
|
||
|
OptionType, Attributes, Description, FilePath and OptionalData are equal.
|
||
|
|
||
|
@param Key Pointer to the load option to be found.
|
||
|
@param Array Pointer to the array of load options to be found.
|
||
|
@param Count Number of entries in the Array.
|
||
|
|
||
|
@retval -1 Key wasn't found in the Array.
|
||
|
@retval 0 ~ Count-1 The index of the Key in the Array.
|
||
|
**/
|
||
|
INTN
|
||
|
EFIAPI
|
||
|
EfiBootManagerFindLoadOption (
|
||
|
IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Key,
|
||
|
IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Array,
|
||
|
IN UINTN Count
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Boot Manager hot key library functions.
|
||
|
//
|
||
|
|
||
|
#pragma pack(1)
|
||
|
///
|
||
|
/// EFI Key Option.
|
||
|
///
|
||
|
typedef struct {
|
||
|
///
|
||
|
/// Specifies options about how the key will be processed.
|
||
|
///
|
||
|
EFI_BOOT_KEY_DATA KeyData;
|
||
|
///
|
||
|
/// The CRC-32 which should match the CRC-32 of the entire EFI_LOAD_OPTION to
|
||
|
/// which BootOption refers. If the CRC-32s do not match this value, then this key
|
||
|
/// option is ignored.
|
||
|
///
|
||
|
UINT32 BootOptionCrc;
|
||
|
///
|
||
|
/// The Boot#### option which will be invoked if this key is pressed and the boot option
|
||
|
/// is active (LOAD_OPTION_ACTIVE is set).
|
||
|
///
|
||
|
UINT16 BootOption;
|
||
|
///
|
||
|
/// The key codes to compare against those returned by the
|
||
|
/// EFI_SIMPLE_TEXT_INPUT and EFI_SIMPLE_TEXT_INPUT_EX protocols.
|
||
|
/// The number of key codes (0-3) is specified by the EFI_KEY_CODE_COUNT field in KeyOptions.
|
||
|
///
|
||
|
EFI_INPUT_KEY Keys[3];
|
||
|
UINT16 OptionNumber;
|
||
|
} EFI_BOOT_MANAGER_KEY_OPTION;
|
||
|
#pragma pack()
|
||
|
|
||
|
/**
|
||
|
Start the hot key service so that the key press can trigger the boot option.
|
||
|
|
||
|
@param HotkeyTriggered Return the waitable event and it will be signaled
|
||
|
when a valid hot key is pressed.
|
||
|
|
||
|
@retval EFI_SUCCESS The hot key service is started.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerStartHotkeyService (
|
||
|
IN EFI_EVENT *HotkeyTriggered
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Modifier for EfiBootManagerAddKeyOptionVariable and EfiBootManagerDeleteKeyOptionVariable
|
||
|
//
|
||
|
#define EFI_BOOT_MANAGER_SHIFT_PRESSED 0x00000001
|
||
|
#define EFI_BOOT_MANAGER_CONTROL_PRESSED 0x00000002
|
||
|
#define EFI_BOOT_MANAGER_ALT_PRESSED 0x00000004
|
||
|
#define EFI_BOOT_MANAGER_LOGO_PRESSED 0x00000008
|
||
|
#define EFI_BOOT_MANAGER_MENU_KEY_PRESSED 0x00000010
|
||
|
#define EFI_BOOT_MANAGER_SYS_REQ_PRESSED 0x00000020
|
||
|
|
||
|
/**
|
||
|
Add the key option.
|
||
|
It adds the key option variable and the key option takes affect immediately.
|
||
|
|
||
|
@param AddedOption Return the added key option.
|
||
|
@param BootOptionNumber The boot option number for the key option.
|
||
|
@param Modifier Key shift state.
|
||
|
@param ... Parameter list of pointer of EFI_INPUT_KEY.
|
||
|
|
||
|
@retval EFI_SUCCESS The key option is added.
|
||
|
@retval EFI_ALREADY_STARTED The hot key is already used by certain key option.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerAddKeyOptionVariable (
|
||
|
OUT EFI_BOOT_MANAGER_KEY_OPTION *AddedOption, OPTIONAL
|
||
|
IN UINT16 BootOptionNumber,
|
||
|
IN UINT32 Modifier,
|
||
|
...
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Delete the Key Option variable and unregister the hot key
|
||
|
|
||
|
@param DeletedOption Return the deleted key options.
|
||
|
@param Modifier Key shift state.
|
||
|
@param ... Parameter list of pointer of EFI_INPUT_KEY.
|
||
|
|
||
|
@retval EFI_SUCCESS The key option is deleted.
|
||
|
@retval EFI_NOT_FOUND The key option cannot be found.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerDeleteKeyOptionVariable (
|
||
|
IN EFI_BOOT_MANAGER_KEY_OPTION *DeletedOption, OPTIONAL
|
||
|
IN UINT32 Modifier,
|
||
|
...
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Register the key option to exit the waiting of the Boot Manager timeout.
|
||
|
Platform should ensure that the continue key option isn't conflict with
|
||
|
other boot key options.
|
||
|
|
||
|
@param Modifier Key shift state.
|
||
|
@param ... Parameter list of pointer of EFI_INPUT_KEY.
|
||
|
|
||
|
@retval EFI_SUCCESS Successfully register the continue key option.
|
||
|
@retval EFI_ALREADY_STARTED The continue key option is already registered.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerRegisterContinueKeyOption (
|
||
|
IN UINT32 Modifier,
|
||
|
...
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Try to boot the boot option triggered by hot key.
|
||
|
**/
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
EfiBootManagerHotkeyBoot (
|
||
|
VOID
|
||
|
);
|
||
|
//
|
||
|
// Boot Manager boot library functions.
|
||
|
//
|
||
|
|
||
|
/**
|
||
|
The function creates boot options for all possible bootable medias in the following order:
|
||
|
1. Removable BlockIo - The boot option only points to the removable media
|
||
|
device, like USB key, DVD, Floppy etc.
|
||
|
2. Fixed BlockIo - The boot option only points to a Fixed blockIo device,
|
||
|
like HardDisk.
|
||
|
3. Non-BlockIo SimpleFileSystem - The boot option points to a device supporting
|
||
|
SimpleFileSystem Protocol, but not supporting BlockIo
|
||
|
protocol.
|
||
|
4. LoadFile - The boot option points to the media supporting
|
||
|
LoadFile protocol.
|
||
|
Reference: UEFI Spec chapter 3.3 Boot Option Variables Default Boot Behavior
|
||
|
|
||
|
The function won't delete the boot option not added by itself.
|
||
|
**/
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
EfiBootManagerRefreshAllBootOption (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Attempt to boot the EFI boot option. This routine sets L"BootCurent" and
|
||
|
signals the EFI ready to boot event. If the device path for the option starts
|
||
|
with a BBS device path a legacy boot is attempted. Short form device paths are
|
||
|
also supported via this rountine. A device path starting with
|
||
|
MEDIA_HARDDRIVE_DP, MSG_USB_WWID_DP, MSG_USB_CLASS_DP gets expaned out
|
||
|
to find the first device that matches. If the BootOption Device Path
|
||
|
fails the removable media boot algorithm is attempted (\EFI\BOOTIA32.EFI,
|
||
|
\EFI\BOOTX64.EFI,... only one file type is tried per processor type)
|
||
|
|
||
|
@param BootOption Boot Option to try and boot.
|
||
|
On return, BootOption->Status contains the boot status:
|
||
|
EFI_SUCCESS BootOption was booted
|
||
|
EFI_UNSUPPORTED BootOption isn't supported.
|
||
|
EFI_NOT_FOUND The BootOption was not found on the system
|
||
|
Others BootOption failed with this error status
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
EfiBootManagerBoot (
|
||
|
IN EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Return the boot option corresponding to the Boot Manager Menu.
|
||
|
It may automatically create one if the boot option hasn't been created yet.
|
||
|
|
||
|
@param BootOption Return the Boot Manager Menu.
|
||
|
|
||
|
@retval EFI_SUCCESS The Boot Manager Menu is successfully returned.
|
||
|
@retval EFI_NOT_FOUND The Boot Manager Menu cannot be found.
|
||
|
@retval others Return status of gRT->SetVariable (). BootOption still points
|
||
|
to the Boot Manager Menu even the Status is not EFI_SUCCESS
|
||
|
and EFI_NOT_FOUND.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerGetBootManagerMenu (
|
||
|
EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Get the next possible full path pointing to the load option.
|
||
|
The routine doesn't guarantee the returned full path points to an existing
|
||
|
file, and it also doesn't guarantee the existing file is a valid load option.
|
||
|
BmGetNextLoadOptionBuffer() guarantees.
|
||
|
|
||
|
@param FilePath The device path pointing to a load option.
|
||
|
It could be a short-form device path.
|
||
|
@param FullPath The full path returned by the routine in last call.
|
||
|
Set to NULL in first call.
|
||
|
|
||
|
@return The next possible full path pointing to the load option.
|
||
|
Caller is responsible to free the memory.
|
||
|
**/
|
||
|
EFI_DEVICE_PATH_PROTOCOL *
|
||
|
EFIAPI
|
||
|
EfiBootManagerGetNextLoadOptionDevicePath (
|
||
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
|
||
|
IN EFI_DEVICE_PATH_PROTOCOL *FullPath
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Get the load option by its device path.
|
||
|
|
||
|
@param FilePath The device path pointing to a load option.
|
||
|
It could be a short-form device path.
|
||
|
@param FullPath Return the full device path of the load option after
|
||
|
short-form device path expanding.
|
||
|
Caller is responsible to free it.
|
||
|
@param FileSize Return the load option size.
|
||
|
|
||
|
@return The load option buffer. Caller is responsible to free the memory.
|
||
|
**/
|
||
|
VOID *
|
||
|
EFIAPI
|
||
|
EfiBootManagerGetLoadOptionBuffer (
|
||
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
|
||
|
OUT EFI_DEVICE_PATH_PROTOCOL **FullPath,
|
||
|
OUT UINTN *FileSize
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
The function enumerates all the legacy boot options, creates them and
|
||
|
registers them in the BootOrder variable.
|
||
|
**/
|
||
|
typedef
|
||
|
VOID
|
||
|
(EFIAPI *EFI_BOOT_MANAGER_REFRESH_LEGACY_BOOT_OPTION) (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
The function boots a legacy boot option.
|
||
|
**/
|
||
|
typedef
|
||
|
VOID
|
||
|
(EFIAPI *EFI_BOOT_MANAGER_LEGACY_BOOT) (
|
||
|
IN EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
The function registers the legacy boot support capabilities.
|
||
|
|
||
|
@param RefreshLegacyBootOption The function pointer to create all the legacy boot options.
|
||
|
@param LegacyBoot The function pointer to boot the legacy boot option.
|
||
|
**/
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
EfiBootManagerRegisterLegacyBootSupport (
|
||
|
EFI_BOOT_MANAGER_REFRESH_LEGACY_BOOT_OPTION RefreshLegacyBootOption,
|
||
|
EFI_BOOT_MANAGER_LEGACY_BOOT LegacyBoot
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Return the platform provided boot option description for the controller.
|
||
|
|
||
|
@param Handle Controller handle.
|
||
|
@param DefaultDescription Default boot description provided by core.
|
||
|
|
||
|
@return The callee allocated description string
|
||
|
or NULL if the handler wants to use DefaultDescription.
|
||
|
**/
|
||
|
typedef
|
||
|
CHAR16 *
|
||
|
(EFIAPI *EFI_BOOT_MANAGER_BOOT_DESCRIPTION_HANDLER) (
|
||
|
IN EFI_HANDLE Handle,
|
||
|
IN CONST CHAR16 *DefaultDescription
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Register the platform provided boot description handler.
|
||
|
|
||
|
@param Handler The platform provided boot description handler
|
||
|
|
||
|
@retval EFI_SUCCESS The handler was registered successfully.
|
||
|
@retval EFI_ALREADY_STARTED The handler was already registered.
|
||
|
@retval EFI_OUT_OF_RESOURCES There is not enough resource to perform the registration.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerRegisterBootDescriptionHandler (
|
||
|
IN EFI_BOOT_MANAGER_BOOT_DESCRIPTION_HANDLER Handler
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Boot Manager connect and disconnect library functions
|
||
|
//
|
||
|
|
||
|
/**
|
||
|
This function will connect all the system driver to controller
|
||
|
first, and then special connect the default console, this make
|
||
|
sure all the system controller available and the platform default
|
||
|
console connected.
|
||
|
**/
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
EfiBootManagerConnectAll (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This function will create all handles associate with every device
|
||
|
path node. If the handle associate with one device path node can not
|
||
|
be created successfully, then still give chance to do the dispatch,
|
||
|
which load the missing drivers if possible.
|
||
|
|
||
|
@param DevicePathToConnect The device path which will be connected, it can be
|
||
|
a multi-instance device path
|
||
|
@param MatchingHandle Return the controller handle closest to the DevicePathToConnect
|
||
|
|
||
|
@retval EFI_SUCCESS All handles associate with every device path node
|
||
|
have been created.
|
||
|
@retval EFI_OUT_OF_RESOURCES There is no resource to create new handles.
|
||
|
@retval EFI_NOT_FOUND Create the handle associate with one device path
|
||
|
node failed.
|
||
|
@retval EFI_SECURITY_VIOLATION The user has no permission to start UEFI device
|
||
|
drivers on the DevicePath.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerConnectDevicePath (
|
||
|
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect,
|
||
|
OUT EFI_HANDLE *MatchingHandle OPTIONAL
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This function will disconnect all current system handles.
|
||
|
|
||
|
gBS->DisconnectController() is invoked for each handle exists in system handle buffer.
|
||
|
If handle is a bus type handle, all childrens also are disconnected recursively by
|
||
|
gBS->DisconnectController().
|
||
|
**/
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
EfiBootManagerDisconnectAll (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Boot Manager console library functions
|
||
|
//
|
||
|
|
||
|
typedef enum {
|
||
|
ConIn,
|
||
|
ConOut,
|
||
|
ErrOut,
|
||
|
ConInDev,
|
||
|
ConOutDev,
|
||
|
ErrOutDev,
|
||
|
ConsoleTypeMax
|
||
|
} CONSOLE_TYPE;
|
||
|
|
||
|
/**
|
||
|
This function will connect all the console devices base on the console
|
||
|
device variable ConIn, ConOut and ErrOut.
|
||
|
|
||
|
@retval EFI_DEVICE_ERROR All the consoles were not connected due to an error.
|
||
|
@retval EFI_SUCCESS Success connect any one instance of the console
|
||
|
device path base on the variable ConVarName.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerConnectAllDefaultConsoles (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This function updates the console variable based on ConVarName. It can
|
||
|
add or remove one specific console device path from the variable
|
||
|
|
||
|
@param ConsoleType ConIn, ConOut, ErrOut, ConInDev, ConOutDev or ErrOutDev.
|
||
|
@param CustomizedConDevicePath The console device path to be added to
|
||
|
the console variable. Cannot be multi-instance.
|
||
|
@param ExclusiveDevicePath The console device path to be removed
|
||
|
from the console variable. Cannot be multi-instance.
|
||
|
|
||
|
@retval EFI_UNSUPPORTED The added device path is the same as a removed one.
|
||
|
@retval EFI_SUCCESS Successfully added or removed the device path from the
|
||
|
console variable.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerUpdateConsoleVariable (
|
||
|
IN CONSOLE_TYPE ConsoleType,
|
||
|
IN EFI_DEVICE_PATH_PROTOCOL *CustomizedConDevicePath,
|
||
|
IN EFI_DEVICE_PATH_PROTOCOL *ExclusiveDevicePath
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Connect the console device base on the variable ConVarName, if
|
||
|
device path of the ConVarName is multi-instance device path, if
|
||
|
anyone of the instances is connected success, then this function
|
||
|
will return success.
|
||
|
|
||
|
@param ConsoleType ConIn, ConOut or ErrOut.
|
||
|
|
||
|
@retval EFI_NOT_FOUND There is not any console devices connected
|
||
|
success
|
||
|
@retval EFI_SUCCESS Success connect any one instance of the console
|
||
|
device path base on the variable ConVarName.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerConnectConsoleVariable (
|
||
|
IN CONSOLE_TYPE ConsoleType
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Query all the children of VideoController and return the device paths of all the
|
||
|
children that support GraphicsOutput protocol.
|
||
|
|
||
|
@param VideoController PCI handle of video controller.
|
||
|
|
||
|
@return Device paths of all the children that support GraphicsOutput protocol.
|
||
|
**/
|
||
|
EFI_DEVICE_PATH_PROTOCOL *
|
||
|
EFIAPI
|
||
|
EfiBootManagerGetGopDevicePath (
|
||
|
IN EFI_HANDLE VideoController
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Connect the platform active active video controller.
|
||
|
|
||
|
@param VideoController PCI handle of video controller.
|
||
|
|
||
|
@retval EFI_NOT_FOUND There is no active video controller.
|
||
|
@retval EFI_SUCCESS The video controller is connected.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerConnectVideoController (
|
||
|
EFI_HANDLE VideoController OPTIONAL
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Boot Manager driver health library functions.
|
||
|
//
|
||
|
|
||
|
typedef struct {
|
||
|
EFI_DRIVER_HEALTH_PROTOCOL *DriverHealth;
|
||
|
|
||
|
///
|
||
|
/// Driver relative handles
|
||
|
///
|
||
|
EFI_HANDLE DriverHealthHandle;
|
||
|
EFI_HANDLE ControllerHandle;
|
||
|
EFI_HANDLE ChildHandle;
|
||
|
|
||
|
///
|
||
|
/// Driver health messages of the specify Driver
|
||
|
///
|
||
|
EFI_DRIVER_HEALTH_HII_MESSAGE *MessageList;
|
||
|
|
||
|
///
|
||
|
/// HII relative handles
|
||
|
///
|
||
|
EFI_HII_HANDLE HiiHandle;
|
||
|
|
||
|
///
|
||
|
/// Driver Health status
|
||
|
///
|
||
|
EFI_DRIVER_HEALTH_STATUS HealthStatus;
|
||
|
} EFI_BOOT_MANAGER_DRIVER_HEALTH_INFO;
|
||
|
|
||
|
/**
|
||
|
Return all the Driver Health information.
|
||
|
|
||
|
When the cumulative health status of all the controllers managed by the
|
||
|
driver who produces the EFI_DRIVER_HEALTH_PROTOCOL is healthy, only one
|
||
|
EFI_BOOT_MANAGER_DRIVER_HEALTH_INFO entry is created for such
|
||
|
EFI_DRIVER_HEALTH_PROTOCOL instance.
|
||
|
Otherwise, every controller creates one EFI_BOOT_MANAGER_DRIVER_HEALTH_INFO
|
||
|
entry. Additionally every child controller creates one
|
||
|
EFI_BOOT_MANAGER_DRIVER_HEALTH_INFO entry if the driver is a bus driver.
|
||
|
|
||
|
@param Count Return the count of the Driver Health information.
|
||
|
|
||
|
@retval NULL No Driver Health information is returned.
|
||
|
@retval !NULL Pointer to the Driver Health information array.
|
||
|
**/
|
||
|
EFI_BOOT_MANAGER_DRIVER_HEALTH_INFO *
|
||
|
EFIAPI
|
||
|
EfiBootManagerGetDriverHealthInfo (
|
||
|
UINTN *Count
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Free the Driver Health information array.
|
||
|
|
||
|
@param DriverHealthInfo Pointer to array of the Driver Health information.
|
||
|
@param Count Count of the array.
|
||
|
|
||
|
@retval EFI_SUCCESS The array is freed.
|
||
|
@retval EFI_INVALID_PARAMETER The array is NULL.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerFreeDriverHealthInfo (
|
||
|
EFI_BOOT_MANAGER_DRIVER_HEALTH_INFO *DriverHealthInfo,
|
||
|
UINTN Count
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Process (load and execute) the load option.
|
||
|
|
||
|
@param LoadOption Pointer to the load option.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETER The load option type is invalid,
|
||
|
or the load option file path doesn't point to a valid file.
|
||
|
@retval EFI_UNSUPPORTED The load option type is of LoadOptionTypeBoot.
|
||
|
@retval EFI_SUCCESS The load option is inactive, or successfully loaded and executed.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerProcessLoadOption (
|
||
|
EFI_BOOT_MANAGER_LOAD_OPTION *LoadOption
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Check whether the VariableName is a valid load option variable name
|
||
|
and return the load option type and option number.
|
||
|
|
||
|
@param VariableName The name of the load option variable.
|
||
|
@param OptionType Return the load option type.
|
||
|
@param OptionNumber Return the load option number.
|
||
|
|
||
|
@retval TRUE The variable name is valid; The load option type and
|
||
|
load option number are returned.
|
||
|
@retval FALSE The variable name is NOT valid.
|
||
|
**/
|
||
|
BOOLEAN
|
||
|
EFIAPI
|
||
|
EfiBootManagerIsValidLoadOptionVariableName (
|
||
|
IN CHAR16 *VariableName,
|
||
|
OUT EFI_BOOT_MANAGER_LOAD_OPTION_TYPE *OptionType OPTIONAL,
|
||
|
OUT UINT16 *OptionNumber OPTIONAL
|
||
|
);
|
||
|
|
||
|
|
||
|
/**
|
||
|
Dispatch the deferred images that are returned from all DeferredImageLoad instances.
|
||
|
|
||
|
@retval EFI_SUCCESS At least one deferred image is loaded successfully and started.
|
||
|
@retval EFI_NOT_FOUND There is no deferred image.
|
||
|
@retval EFI_ACCESS_DENIED There are deferred images but all of them are failed to load.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
EfiBootManagerDispatchDeferredImages (
|
||
|
VOID
|
||
|
);
|
||
|
#endif
|