--- /dev/null
+/** @file\r
+ Generic BDS library defines general interfaces for a BDS driver, including:\r
+ 1) BDS boot policy interface.\r
+ 2) BDS boot device connect interface.\r
+ 3) BDS Misc interfaces for mainting boot variable, ouput string.\r
+\r
+Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials are licensed and made available under \r
+the terms and conditions of the BSD License that accompanies this distribution. \r
+The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php. \r
+ \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _GENERIC_BDS_LIB_H_\r
+#define _GENERIC_BDS_LIB_H_\r
+\r
+#include <Protocol/UserManager.h>\r
+\r
+///\r
+/// Constants which are variable names used to access variables.\r
+///\r
+#define VAR_LEGACY_DEV_ORDER L"LegacyDevOrder"\r
+\r
+///\r
+/// Data structures and defines.\r
+///\r
+#define FRONT_PAGE_QUESTION_ID 0x0000\r
+#define FRONT_PAGE_DATA_WIDTH 0x01\r
+\r
+///\r
+/// ConnectType\r
+///\r
+#define CONSOLE_OUT 0x00000001\r
+#define STD_ERROR 0x00000002\r
+#define CONSOLE_IN 0x00000004\r
+#define CONSOLE_ALL (CONSOLE_OUT | CONSOLE_IN | STD_ERROR)\r
+\r
+///\r
+/// Load Option Attributes\r
+///\r
+#define LOAD_OPTION_ACTIVE 0x00000001\r
+#define LOAD_OPTION_FORCE_RECONNECT 0x00000002\r
+\r
+#define LOAD_OPTION_HIDDEN 0x00000008\r
+#define LOAD_OPTION_CATEGORY 0x00001F00\r
+\r
+#define LOAD_OPTION_CATEGORY_BOOT 0x00000000\r
+#define LOAD_OPTION_CATEGORY_APP 0x00000100\r
+\r
+#define EFI_BOOT_OPTION_SUPPORT_KEY 0x00000001\r
+#define EFI_BOOT_OPTION_SUPPORT_APP 0x00000002\r
+\r
+#define IS_LOAD_OPTION_TYPE(_c, _Mask) (BOOLEAN) (((_c) & (_Mask)) != 0)\r
+\r
+///\r
+/// Define the maximum characters that will be accepted.\r
+///\r
+#define MAX_CHAR 480\r
+#define MAX_CHAR_SIZE (MAX_CHAR * 2)\r
+\r
+///\r
+/// Define maximum characters for boot option variable "BootXXXX".\r
+///\r
+#define BOOT_OPTION_MAX_CHAR 10\r
+\r
+//\r
+// This data structure is the part of BDS_CONNECT_ENTRY\r
+//\r
+#define BDS_LOAD_OPTION_SIGNATURE SIGNATURE_32 ('B', 'd', 'C', 'O')\r
+\r
+typedef struct {\r
+\r
+ UINTN Signature;\r
+ LIST_ENTRY Link;\r
+\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+\r
+ CHAR16 *OptionName;\r
+ UINTN OptionNumber;\r
+ UINT16 BootCurrent;\r
+ UINT32 Attribute;\r
+ CHAR16 *Description;\r
+ VOID *LoadOptions;\r
+ UINT32 LoadOptionsSize;\r
+ CHAR16 *StatusString;\r
+\r
+} BDS_COMMON_OPTION;\r
+\r
+typedef struct {\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ UINTN ConnectType;\r
+} BDS_CONSOLE_CONNECT_ENTRY;\r
+\r
+//\r
+// Bds boot related lib functions\r
+//\r
+/**\r
+ Boot from the UEFI spec defined "BootNext" variable.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BdsLibBootNext (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Process the boot option according to the UEFI specification. The legacy boot option device path includes BBS_DEVICE_PATH.\r
+\r
+ @param Option The boot option to be processed.\r
+ @param DevicePath The device path describing where to load the\r
+ boot image or the legcy BBS device path to boot\r
+ the legacy OS.\r
+ @param ExitDataSize The size of exit data.\r
+ @param ExitData Data returned when Boot image failed.\r
+\r
+ @retval EFI_SUCCESS Boot from the input boot option succeeded.\r
+ @retval EFI_NOT_FOUND The Device Path is not found in the system.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibBootViaBootOption (\r
+ IN BDS_COMMON_OPTION * Option,\r
+ IN EFI_DEVICE_PATH_PROTOCOL * DevicePath,\r
+ OUT UINTN *ExitDataSize,\r
+ OUT CHAR16 **ExitData OPTIONAL\r
+ );\r
+\r
+\r
+/**\r
+ This function will enumerate all possible boot devices in the system, and\r
+ automatically create boot options for Network, Shell, Removable BlockIo, \r
+ and Non-BlockIo Simplefile devices. \r
+ \r
+ BDS separates EFI boot options into six types:\r
+ 1. Network - The boot option points to the SimpleNetworkProtocol device. \r
+ Bds will try to automatically create this type of boot option during enumeration.\r
+ 2. Shell - The boot option points to internal flash shell. \r
+ Bds will try to automatically create this type of boot option during enumeration.\r
+ 3. Removable BlockIo - The boot option points to a removable media\r
+ device, such as a USB flash drive or DVD drive.\r
+ These devices should contain a *removable* blockIo\r
+ protocol in their device handle.\r
+ Bds will try to automatically create this type boot option \r
+ when enumerate.\r
+ 4. Fixed BlockIo - The boot option points to a Fixed blockIo device, \r
+ such as a hard disk.\r
+ These devices should contain a *fixed* blockIo\r
+ protocol in their device handle.\r
+ BDS will skip fixed blockIo devices, and not\r
+ automatically create boot option for them. But BDS \r
+ will help to delete those fixed blockIo boot options, \r
+ whose description rules conflict with other auto-created\r
+ boot options.\r
+ 5. Non-BlockIo Simplefile - The boot option points to a device whose handle \r
+ has SimpleFileSystem Protocol, but has no blockio\r
+ protocol. These devices do not offer blockIo\r
+ protocol, but BDS still can get the \r
+ \EFI\BOOT\boot{machinename}.EFI by SimpleFileSystem\r
+ Protocol.\r
+ 6. File - The boot option points to a file. These boot options are usually \r
+ created by the user, either manually or with an OS loader. BDS will not delete or modify\r
+ these boot options. \r
+ \r
+ This function will enumerate all possible boot devices in the system, and\r
+ automatically create boot options for Network, Shell, Removable BlockIo, \r
+ and Non-BlockIo Simplefile devices.\r
+ It will excute once every boot.\r
+ \r
+ @param BdsBootOptionList The header of the linked list that indexed all\r
+ current boot options.\r
+\r
+ @retval EFI_SUCCESS Finished all the boot device enumerations and \r
+ created the boot option based on the boot device.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES Failed to enumerate the boot device and create \r
+ the boot option list.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibEnumerateAllBootOption (\r
+ IN OUT LIST_ENTRY *BdsBootOptionList\r
+ );\r
+\r
+/**\r
+ Build the boot option with the handle parsed in.\r
+\r
+ @param Handle The handle representing the device path for which \r
+ to create a boot option.\r
+ @param BdsBootOptionList The header of the link list that indexed all\r
+ current boot options.\r
+ @param String The description of the boot option.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BdsLibBuildOptionFromHandle (\r
+ IN EFI_HANDLE Handle,\r
+ IN LIST_ENTRY *BdsBootOptionList,\r
+ IN CHAR16 *String\r
+ );\r
+\r
+\r
+/**\r
+ Build the on flash shell boot option with the handle parsed in.\r
+\r
+ @param Handle The handle which present the device path to create\r
+ the on flash shell boot option.\r
+ @param BdsBootOptionList The header of the link list that indexed all\r
+ current boot options.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BdsLibBuildOptionFromShell (\r
+ IN EFI_HANDLE Handle,\r
+ IN OUT LIST_ENTRY *BdsBootOptionList\r
+ );\r
+\r
+//\r
+// Bds misc lib functions\r
+//\r
+/**\r
+ Get boot mode by looking up the configuration table and parsing the HOB list.\r
+\r
+ @param BootMode The boot mode from PEI handoff HOB.\r
+\r
+ @retval EFI_SUCCESS Successfully got boot mode.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibGetBootMode (\r
+ OUT EFI_BOOT_MODE *BootMode\r
+ );\r
+\r
+\r
+/**\r
+ The function will go through the driver option link list, and then load and start\r
+ every driver to which the driver option device path points.\r
+\r
+ @param BdsDriverLists The header of the current driver option link list.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BdsLibLoadDrivers (\r
+ IN LIST_ENTRY *BdsDriverLists\r
+ );\r
+\r
+\r
+/**\r
+ This function processes BootOrder or DriverOrder variables, by calling\r
+\r
+ BdsLibVariableToOption () for each UINT16 in the variables.\r
+\r
+ @param BdsCommonOptionList The header of the option list base on the variable\r
+ VariableName.\r
+ @param VariableName An EFI Variable name indicate the BootOrder or\r
+ DriverOrder.\r
+\r
+ @retval EFI_SUCCESS Successfully created the boot option or driver option\r
+ list.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to get the boot option or the driver option list.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibBuildOptionFromVar (\r
+ IN LIST_ENTRY *BdsCommonOptionList,\r
+ IN CHAR16 *VariableName\r
+ );\r
+\r
+/**\r
+ This function reads the EFI variable (VendorGuid/Name) and returns a dynamically allocated\r
+ buffer and the size of the buffer. If it fails, return NULL.\r
+\r
+ @param Name The string part of the EFI variable name.\r
+ @param VendorGuid The GUID part of the EFI variable name.\r
+ @param VariableSize Returns the size of the EFI variable that was read.\r
+\r
+ @return Dynamically allocated memory that contains a copy \r
+ of the EFI variable. The caller is responsible for \r
+ freeing the buffer.\r
+ @retval NULL The variable was not read.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+BdsLibGetVariableAndSize (\r
+ IN CHAR16 *Name,\r
+ IN EFI_GUID *VendorGuid,\r
+ OUT UINTN *VariableSize\r
+ );\r
+\r
+\r
+/**\r
+ This function prints a series of strings.\r
+\r
+ @param ConOut A pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.\r
+ @param ... A variable argument list containing a series of\r
+ strings, the last string must be NULL.\r
+\r
+ @retval EFI_SUCCESS Successfully printed out the string using ConOut.\r
+ @retval EFI_STATUS Return the status of the ConOut->OutputString ().\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibOutputStrings (\r
+ IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut,\r
+ ...\r
+ );\r
+\r
+/**\r
+ Build the boot#### or driver#### option from the VariableName. The\r
+ build boot#### or driver#### will also be linked to BdsCommonOptionList.\r
+\r
+ @param BdsCommonOptionList The header of the boot#### or driver#### option\r
+ link list.\r
+ @param VariableName EFI Variable name, indicates if it is boot#### or\r
+ driver####.\r
+\r
+ @retval BDS_COMMON_OPTION The option that was created.\r
+ @retval NULL Failed to get the new option.\r
+\r
+**/\r
+BDS_COMMON_OPTION *\r
+EFIAPI\r
+BdsLibVariableToOption (\r
+ IN OUT LIST_ENTRY *BdsCommonOptionList,\r
+ IN CHAR16 *VariableName\r
+ );\r
+\r
+/**\r
+ This function registers the new boot#### or driver#### option based on\r
+ the VariableName. The new registered boot#### or driver#### will be linked\r
+ to BdsOptionList and also update to the VariableName. After the boot#### or\r
+ driver#### updated, the BootOrder or DriverOrder will also be updated.\r
+\r
+ @param BdsOptionList The header of the boot#### or driver#### link list.\r
+ @param DevicePath The device path that the boot#### or driver####\r
+ option present.\r
+ @param String The description of the boot#### or driver####.\r
+ @param VariableName Indicate if the boot#### or driver#### option.\r
+\r
+ @retval EFI_SUCCESS The boot#### or driver#### have been successfully\r
+ registered.\r
+ @retval EFI_STATUS Return the status of gRS->SetVariable ().\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibRegisterNewOption (\r
+ IN LIST_ENTRY *BdsOptionList,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+ IN CHAR16 *String,\r
+ IN CHAR16 *VariableName\r
+ );\r
+\r
+//\r
+// Bds connect and disconnect driver lib funcions\r
+//\r
+/**\r
+ This function connects all system drivers with the corresponding controllers. \r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BdsLibConnectAllDriversToAllControllers (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ This function connects all system drivers to controllers.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BdsLibConnectAll (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ This function creates all handles associated with the given device\r
+ path node. If the handle associated with one device path node cannot\r
+ be created, then it tries to execute the dispatch to load the missing drivers. \r
+\r
+ @param DevicePathToConnect The device path to be connected. Can be\r
+ a multi-instance device path.\r
+\r
+ @retval EFI_SUCCESS All handles associates with every device path node\r
+ were created.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough resources to create new handles.\r
+ @retval EFI_NOT_FOUND At least one handle could not be created.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibConnectDevicePath (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect\r
+ );\r
+\r
+/**\r
+ This function will connect all current system handles recursively. \r
+ gBS->ConnectController() service is invoked for each handle exist in system handler buffer. \r
+ If the handle is bus type handler, all childrens also will be connected recursively by gBS->ConnectController().\r
+ \r
+ @retval EFI_SUCCESS All handles and child handles have been\r
+ connected. \r
+ @retval EFI_STATUS Return the status of gBS->LocateHandleBuffer().\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibConnectAllEfi (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ This function will disconnect all current system handles. \r
+ gBS->DisconnectController() is invoked for each handle exists in system handle buffer. \r
+ If handle is a bus type handle, all childrens also are disconnected recursively by gBS->DisconnectController().\r
+ \r
+ @retval EFI_SUCCESS All handles have been disconnected.\r
+ @retval EFI_STATUS Error status returned by of gBS->LocateHandleBuffer().\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibDisconnectAllEfi (\r
+ VOID\r
+ );\r
+\r
+//\r
+// Bds console related lib functions\r
+//\r
+/**\r
+ This function will search every simpletxt device in the current system,\r
+ and make every simpletxt device a potential console device.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BdsLibConnectAllConsoles (\r
+ VOID\r
+ );\r
+\r
+\r
+/**\r
+ This function will connect console device based on the console\r
+ device variable ConIn, ConOut and ErrOut.\r
+\r
+ @retval EFI_SUCCESS At least one of the ConIn and ConOut devices have\r
+ been connected.\r
+ @retval EFI_STATUS Return the status of BdsLibConnectConsoleVariable ().\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibConnectAllDefaultConsoles (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ This function updates the console variable based on ConVarName. It can\r
+ add or remove one specific console device path from the variable\r
+\r
+ @param ConVarName The console-related variable name: ConIn, ConOut,\r
+ ErrOut.\r
+ @param CustomizedConDevicePath The console device path to be added to\r
+ the console variable ConVarName. Cannot be multi-instance.\r
+ @param ExclusiveDevicePath The console device path to be removed\r
+ from the console variable ConVarName. Cannot be multi-instance.\r
+\r
+ @retval EFI_UNSUPPORTED The added device path is the same as a removed one.\r
+ @retval EFI_SUCCESS Successfully added or removed the device path from the\r
+ console variable.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibUpdateConsoleVariable (\r
+ IN CHAR16 *ConVarName,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *CustomizedConDevicePath,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *ExclusiveDevicePath\r
+ );\r
+\r
+/**\r
+ Connect the console device base on the variable ConVarName. If\r
+ ConVarName is a multi-instance device path, and at least one\r
+ instance connects successfully, then this function\r
+ will return success.\r
+\r
+ @param ConVarName The console related variable name: ConIn, ConOut,\r
+ ErrOut.\r
+\r
+ @retval EFI_NOT_FOUND No console devices were connected successfully\r
+ @retval EFI_SUCCESS Connected at least one instance of the console\r
+ device path based on the variable ConVarName.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibConnectConsoleVariable (\r
+ IN CHAR16 *ConVarName\r
+ );\r
+\r
+//\r
+// Bds device path related lib functions\r
+//\r
+/**\r
+ Delete the instance in Multi that overlaps with Single. \r
+\r
+ @param Multi A pointer to a multi-instance device path data\r
+ structure.\r
+ @param Single A pointer to a single-instance device path data\r
+ structure.\r
+\r
+ @return This function removes the device path instances in Multi that overlap\r
+ Single, and returns the resulting device path. If there is no\r
+ remaining device path as a result, this function will return NULL.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+EFIAPI\r
+BdsLibDelPartMatchInstance (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *Multi,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *Single\r
+ );\r
+\r
+/**\r
+ This function compares a device path data structure to that of all the nodes of a\r
+ second device path instance.\r
+\r
+ @param Multi A pointer to a multi-instance device path data\r
+ structure.\r
+ @param Single A pointer to a single-instance device path data\r
+ structure.\r
+\r
+ @retval TRUE If the Single device path is contained within a \r
+ Multi device path.\r
+ @retval FALSE The Single device path is not contained within a \r
+ Multi device path.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BdsLibMatchDevicePaths (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *Multi,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *Single\r
+ );\r
+\r
+/**\r
+ This function converts an input device structure to a Unicode string.\r
+\r
+ @param DevPath A pointer to the device path structure.\r
+\r
+ @return A newly allocated Unicode string that represents the device path.\r
+\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+DevicePathToStr (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
+ );\r
+\r
+//\r
+// Internal definitions\r
+//\r
+typedef struct {\r
+ CHAR16 *Str;\r
+ UINTN Len;\r
+ UINTN Maxlen;\r
+} POOL_PRINT;\r
+\r
+typedef\r
+VOID\r
+(*DEV_PATH_FUNCTION) (\r
+ IN OUT POOL_PRINT *Str,\r
+ IN VOID *DevPath\r
+ );\r
+\r
+typedef struct {\r
+ UINT8 Type;\r
+ UINT8 SubType;\r
+ DEV_PATH_FUNCTION Function;\r
+} DEVICE_PATH_STRING_TABLE;\r
+\r
+typedef struct {\r
+ EFI_DEVICE_PATH_PROTOCOL Header;\r
+ EFI_GUID Guid;\r
+ UINT8 VendorDefinedData[1];\r
+} VENDOR_DEVICE_PATH_WITH_DATA;\r
+\r
+typedef struct {\r
+ EFI_DEVICE_PATH_PROTOCOL Header;\r
+ UINT16 NetworkProtocol;\r
+ UINT16 LoginOption;\r
+ UINT64 Lun;\r
+ UINT16 TargetPortalGroupTag;\r
+ CHAR16 TargetName[1];\r
+} ISCSI_DEVICE_PATH_WITH_NAME;\r
+\r
+//\r
+// BBS support macros and functions\r
+//\r
+\r
+#if defined(MDE_CPU_IA32) || defined(MDE_CPU_X64)\r
+#define REFRESH_LEGACY_BOOT_OPTIONS \\r
+ BdsDeleteAllInvalidLegacyBootOptions ();\\r
+ BdsAddNonExistingLegacyBootOptions (); \\r
+ BdsUpdateLegacyDevOrder ()\r
+#else\r
+#define REFRESH_LEGACY_BOOT_OPTIONS\r
+#endif\r
+\r
+/**\r
+ Delete all the invalid legacy boot options.\r
+\r
+ @retval EFI_SUCCESS All invalid legacy boot options are deleted.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate necessary memory.\r
+ @retval EFI_NOT_FOUND Failed to retrieve variable of boot order.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsDeleteAllInvalidLegacyBootOptions (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Add the legacy boot options from BBS table if they do not exist.\r
+\r
+ @retval EFI_SUCCESS The boot options were added successfully, \r
+ or they are already in boot options.\r
+ @retval EFI_NOT_FOUND No legacy boot options is found.\r
+ @retval EFI_OUT_OF_RESOURCE No enough memory.\r
+ @return Other value LegacyBoot options are not added.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsAddNonExistingLegacyBootOptions (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Add the legacy boot devices from BBS table into \r
+ the legacy device boot order.\r
+\r
+ @retval EFI_SUCCESS The boot devices were added successfully.\r
+ @retval EFI_NOT_FOUND The legacy boot devices are not found.\r
+ @retval EFI_OUT_OF_RESOURCES Memory or storage is not enough.\r
+ @retval EFI_DEVICE_ERROR Failed to add the legacy device boot order into EFI variable\r
+ because of a hardware error.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsUpdateLegacyDevOrder (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Refresh the boot priority for BBS entries based on boot option entry and boot order.\r
+\r
+ @param Entry The boot option is to be checked for a refreshed BBS table.\r
+ \r
+ @retval EFI_SUCCESS The boot priority for BBS entries refreshed successfully.\r
+ @retval EFI_NOT_FOUND BBS entries can't be found.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to get the legacy device boot order.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsRefreshBbsTableForBoot (\r
+ IN BDS_COMMON_OPTION *Entry\r
+ );\r
+\r
+/**\r
+ Delete the Boot Option from EFI Variable. The Boot Order Arrray\r
+ is also updated.\r
+\r
+ @param OptionNumber The number of Boot options wanting to be deleted.\r
+ @param BootOrder The Boot Order array.\r
+ @param BootOrderSize The size of the Boot Order Array.\r
+\r
+ @retval EFI_SUCCESS The Boot Option Variable was found and removed.\r
+ @retval EFI_UNSUPPORTED The Boot Option Variable store was inaccessible.\r
+ @retval EFI_NOT_FOUND The Boot Option Variable was not found.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsDeleteBootOption (\r
+ IN UINTN OptionNumber,\r
+ IN OUT UINT16 *BootOrder,\r
+ IN OUT UINTN *BootOrderSize\r
+ );\r
+\r
+//\r
+//The interface functions related to the Setup Browser Reset Reminder feature\r
+//\r
+/**\r
+ Enable the setup browser reset reminder feature.\r
+ This routine is used in a platform tip. If the platform policy needs the feature, use the routine to enable it.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EnableResetReminderFeature (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Disable the setup browser reset reminder feature.\r
+ This routine is used in a platform tip. If the platform policy does not want the feature, use the routine to disable it.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+DisableResetReminderFeature (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Record the info that a reset is required.\r
+ A module boolean variable is used to record whether a reset is required.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EnableResetRequired (\r
+ VOID\r
+ );\r
+\r
+\r
+/**\r
+ Record the info that no reset is required.\r
+ A module boolean variable is used to record whether a reset is required.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+DisableResetRequired (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Check whether platform policy enables the reset reminder feature. The default is enabled.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsResetReminderFeatureEnable (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Check if the user changed any option setting that needs a system reset to be effective.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsResetRequired (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Check whether a reset is needed, and finish the reset reminder feature.\r
+ If a reset is needed, pop up a menu to notice user, and finish the feature\r
+ according to the user selection.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetupResetReminder (\r
+ VOID\r
+ );\r
+\r
+\r
+///\r
+/// Define the boot type with which to classify the boot option type.\r
+/// Different boot option types could have different boot behaviors.\r
+/// Use their device path node (Type + SubType) as the type value.\r
+/// The boot type here can be added according to requirements.\r
+///\r
+\r
+///\r
+/// ACPI boot type. For ACPI devices, using sub-types to distinguish devices is not allowed, so hardcode their values.\r
+///\r
+#define BDS_EFI_ACPI_FLOPPY_BOOT 0x0201\r
+///\r
+/// Message boot type\r
+/// If a device path of boot option only points to a message node, the boot option is a message boot type.\r
+///\r
+#define BDS_EFI_MESSAGE_ATAPI_BOOT 0x0301 // Type 03; Sub-Type 01\r
+#define BDS_EFI_MESSAGE_SCSI_BOOT 0x0302 // Type 03; Sub-Type 02\r
+#define BDS_EFI_MESSAGE_USB_DEVICE_BOOT 0x0305 // Type 03; Sub-Type 05\r
+#define BDS_EFI_MESSAGE_SATA_BOOT 0x0312 // Type 03; Sub-Type 18\r
+#define BDS_EFI_MESSAGE_MAC_BOOT 0x030b // Type 03; Sub-Type 11\r
+#define BDS_EFI_MESSAGE_MISC_BOOT 0x03FF\r
+\r
+///\r
+/// Media boot type\r
+/// If a device path of boot option contains a media node, the boot option is media boot type.\r
+///\r
+#define BDS_EFI_MEDIA_HD_BOOT 0x0401 // Type 04; Sub-Type 01\r
+#define BDS_EFI_MEDIA_CDROM_BOOT 0x0402 // Type 04; Sub-Type 02\r
+///\r
+/// BBS boot type\r
+/// If a device path of boot option contains a BBS node, the boot option is BBS boot type.\r
+///\r
+#define BDS_LEGACY_BBS_BOOT 0x0501 // Type 05; Sub-Type 01\r
+\r
+#define BDS_EFI_UNSUPPORT 0xFFFF\r
+\r
+/**\r
+ Check whether an instance in BlockIoDevicePath has the same partition node as the HardDriveDevicePath device path.\r
+\r
+ @param BlockIoDevicePath Multi device path instances to check.\r
+ @param HardDriveDevicePath A device path starting with a hard drive media\r
+ device path.\r
+\r
+ @retval TRUE There is a matched device path instance.\r
+ @retval FALSE There is no matched device path instance.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+MatchPartitionDevicePathNode (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *BlockIoDevicePath,\r
+ IN HARDDRIVE_DEVICE_PATH *HardDriveDevicePath\r
+ );\r
+\r
+\r
+/**\r
+ Expand a device path that starts with a hard drive media device path node to be a\r
+ full device path that includes the full hardware path to the device. This function enables the device to boot. \r
+ To avoid requiring a connect on every boot, the front match is saved in a variable (the part point\r
+ to the partition node. E.g. ACPI() /PCI()/ATA()/Partition() ).\r
+ All successful history device paths\r
+ that point to the front part of the partition node will be saved.\r
+\r
+ @param HardDriveDevicePath EFI Device Path to boot, if it starts with a hard\r
+ drive media device path.\r
+ @return A Pointer to the full device path, or NULL if a valid Hard Drive devic path\r
+ cannot be found.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+EFIAPI\r
+BdsExpandPartitionPartialDevicePathToFull (\r
+ IN HARDDRIVE_DEVICE_PATH *HardDriveDevicePath\r
+ );\r
+ \r
+/**\r
+ Return the bootable media handle.\r
+ First, check whether the device is connected.\r
+ Second, check whether the device path points to a device that supports SimpleFileSystemProtocol.\r
+ Third, detect the the default boot file in the Media, and return the removable Media handle.\r
+\r
+ @param DevicePath The Device Path to a bootable device.\r
+\r
+ @return The bootable media handle. If the media on the DevicePath is not bootable, NULL will return.\r
+\r
+**/\r
+EFI_HANDLE\r
+EFIAPI\r
+BdsLibGetBootableHandle (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ );\r
+ \r
+\r
+/**\r
+ Checks whether the Device path in a boot option points to a valid bootable device, and if the device\r
+ is ready to boot now.\r
+\r
+ @param DevPath The Device path in a boot option.\r
+ @param CheckMedia If TRUE, check whether the device is ready to boot now.\r
+\r
+ @retval TRUE The Device path is valid.\r
+ @retval FALSE The Device path is invalid.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BdsLibIsValidEFIBootOptDevicePath (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevPath,\r
+ IN BOOLEAN CheckMedia\r
+ );\r
+\r
+/**\r
+ Checks whether the Device path in a boot option points to a valid bootable device, and if the device\r
+ is ready to boot now.\r
+ If Description is not NULL and the device path points to a fixed BlockIo\r
+ device, this function checks whether the description conflicts with other auto-created\r
+ boot options.\r
+\r
+ @param DevPath The Device path in a boot option.\r
+ @param CheckMedia If TRUE, checks if the device is ready to boot now.\r
+ @param Description The description of a boot option.\r
+\r
+ @retval TRUE The Device path is valid.\r
+ @retval FALSE The Device path is invalid.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BdsLibIsValidEFIBootOptDevicePathExt (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevPath,\r
+ IN BOOLEAN CheckMedia,\r
+ IN CHAR16 *Description\r
+ );\r
+\r
+/**\r
+ For a bootable Device path, return its boot type.\r
+\r
+ @param DevicePath The bootable device Path to check.\r
+\r
+ @retval BDS_EFI_MEDIA_HD_BOOT The given device path contains MEDIA_DEVICE_PATH type device path node,\r
+ whose subtype is MEDIA_HARDDRIVE_DP. \r
+ @retval BDS_EFI_MEDIA_CDROM_BOOT If given device path contains MEDIA_DEVICE_PATH type device path node, \r
+ whose subtype is MEDIA_CDROM_DP. \r
+ @retval BDS_EFI_ACPI_FLOPPY_BOOT A given device path contains ACPI_DEVICE_PATH type device path node, \r
+ whose HID is floppy device. \r
+ @retval BDS_EFI_MESSAGE_ATAPI_BOOT A given device path contains MESSAGING_DEVICE_PATH type device path node, \r
+ and its last device path node's subtype is MSG_ATAPI_DP. \r
+ @retval BDS_EFI_MESSAGE_SCSI_BOOT A given device path contains MESSAGING_DEVICE_PATH type device path node,\r
+ and its last device path node's subtype is MSG_SCSI_DP. \r
+ @retval BDS_EFI_MESSAGE_USB_DEVICE_BOOT A given device path contains MESSAGING_DEVICE_PATH type device path node, \r
+ and its last device path node's subtype is MSG_USB_DP.\r
+ @retval BDS_EFI_MESSAGE_MISC_BOOT The device path does not contain any media device path node, and \r
+ its last device path node points to a message device path node. \r
+ @retval BDS_LEGACY_BBS_BOOT A given device path contains BBS_DEVICE_PATH type device path node. \r
+ @retval BDS_EFI_UNSUPPORT An EFI Removable BlockIO device path does not point to a media and message device. \r
+\r
+ **/\r
+UINT32\r
+EFIAPI\r
+BdsGetBootTypeFromDevicePath (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ );\r
+\r
+\r
+/**\r
+ This routine registers a function to adjust the different types of memory page numbers\r
+ just before booting, and saves the updated info into the variable for the next boot to use.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BdsLibSaveMemoryTypeInformation (\r
+ VOID\r
+ );\r
+ \r
+/**\r
+ Identify a user and, if authenticated, returns the current user profile handle.\r
+\r
+ @param[out] User Points to the user profile handle.\r
+ \r
+ @retval EFI_SUCCESS The user is successfully identified, or user identification\r
+ is not supported.\r
+ @retval EFI_ACCESS_DENIED The user was not successfully identified.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibUserIdentify (\r
+ OUT EFI_USER_PROFILE_HANDLE *User\r
+ ); \r
+\r
+/**\r
+ This function checks if a Fv file device path is valid, according to a file GUID. If it is invalid,\r
+ it tries to return the valid device path.\r
+ FV address maybe changes for memory layout adjust from time to time, use this funciton\r
+ could promise the Fv file device path is right.\r
+\r
+ @param DevicePath On input, the Fv file device path to check. On\r
+ output, the updated valid Fv file device path\r
+ @param FileGuid the Fv file GUID.\r
+\r
+ @retval EFI_INVALID_PARAMETER The input DevicePath or FileGuid is invalid.\r
+ @retval EFI_UNSUPPORTED The input DevicePath does not contain an Fv file\r
+ GUID at all.\r
+ @retval EFI_ALREADY_STARTED The input DevicePath has pointed to the Fv file and is\r
+ valid.\r
+ @retval EFI_SUCCESS Successfully updated the invalid DevicePath\r
+ and returned the updated device path in DevicePath.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibUpdateFvFileDevicePath (\r
+ IN OUT EFI_DEVICE_PATH_PROTOCOL ** DevicePath,\r
+ IN EFI_GUID *FileGuid\r
+ );\r
+\r
+\r
+/**\r
+ Connect the specific USB device that matches the RemainingDevicePath,\r
+ and whose bus is determined by Host Controller (Uhci or Ehci).\r
+\r
+ @param HostControllerPI Uhci (0x00) or Ehci (0x20) or Both uhci and ehci\r
+ (0xFF).\r
+ @param RemainingDevicePath A short-form device path that starts with the first\r
+ element being a USB WWID or a USB Class device\r
+ path.\r
+\r
+ @retval EFI_SUCCESS The specific Usb device is connected successfully.\r
+ @retval EFI_INVALID_PARAMETER Invalid HostControllerPi (not 0x00, 0x20 or 0xFF) \r
+ or RemainingDevicePath is not the USB class device path.\r
+ @retval EFI_NOT_FOUND The device specified by device path is not found.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsLibConnectUsbDevByShortFormDP(\r
+ IN UINT8 HostControllerPI,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ );\r
+ \r
+\r
+//\r
+// The implementation of this function is provided by Platform code.\r
+//\r
+/**\r
+ Convert Vendor device path to a device name.\r
+\r
+ @param Str The buffer storing device name.\r
+ @param DevPath The pointer to vendor device path.\r
+\r
+**/\r
+VOID\r
+DevPathVendor (\r
+ IN OUT POOL_PRINT *Str,\r
+ IN VOID *DevPath\r
+ );\r
+\r
+/**\r
+ Concatenates a formatted unicode string to an allocated pool.\r
+ The caller must free the resulting buffer.\r
+\r
+ @param Str Tracks the allocated pool, size in use, and amount of pool allocated.\r
+ @param Fmt The format string.\r
+ @param ... The data will be printed.\r
+\r
+ @return Allocated buffer with the formatted string printed in it.\r
+ The caller must free the allocated buffer.\r
+ The buffer allocation is not packed.\r
+\r
+**/\r
+\r
+CHAR16 *\r
+EFIAPI\r
+CatPrint (\r
+ IN OUT POOL_PRINT *Str,\r
+ IN CHAR16 *Fmt,\r
+ ...\r
+ );\r
+\r
+/**\r
+ Use SystemTable ConOut to stop video based Simple Text Out consoles from going\r
+ to the video device. Put up LogoFile on every video device that is a console.\r
+\r
+ @param[in] LogoFile The file name of logo to display on the center of the screen.\r
+\r
+ @retval EFI_SUCCESS ConsoleControl has been flipped to graphics and logo displayed.\r
+ @retval EFI_UNSUPPORTED Logo not found.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EnableQuietBoot (\r
+ IN EFI_GUID *LogoFile\r
+ );\r
+\r
+\r
+/**\r
+ Use SystemTable ConOut to turn on video based Simple Text Out consoles. The \r
+ Simple Text Out screens will now be synced up with all non-video output devices.\r
+\r
+ @retval EFI_SUCCESS UGA devices are back in text mode and synced up.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DisableQuietBoot (\r
+ VOID\r
+ );\r
+\r
+#endif\r
+\r