/** @file\r
*\r
-* Copyright (c) 2011, ARM Limited. All rights reserved.\r
+* Copyright (c) 2011-2015, ARM Limited. All rights reserved.\r
*\r
* This program and the accompanying materials\r
* are licensed and made available under the terms and conditions of the BSD License\r
#include <PiDxe.h>\r
#include <Library/BaseMemoryLib.h>\r
#include <Library/BdsLib.h>\r
-#include <Library/BdsUnixLib.h>\r
#include <Library/DebugLib.h>\r
#include <Library/DevicePathLib.h>\r
#include <Library/UefiLib.h>\r
#include <Protocol/DevicePathToText.h>\r
\r
#include <Guid/GlobalVariable.h>\r
+#include <Guid/Fdt.h>\r
\r
#define BOOT_DEVICE_DESCRIPTION_MAX 100\r
#define BOOT_DEVICE_FILEPATH_MAX 100\r
#define BOOT_DEVICE_OPTION_MAX 300\r
-#define BOOT_DEVICE_ADDRESS_MAX 20\r
+#define BOOT_DEVICE_ADDRESS_MAX (sizeof(L"0x0000000000000000"))\r
\r
-typedef enum {\r
- BDS_LOADER_EFI_APPLICATION = 0,\r
- BDS_LOADER_KERNEL_LINUX_ATAG,\r
- BDS_LOADER_KERNEL_LINUX_FDT,\r
-} BDS_LOADER_TYPE;\r
-\r
-typedef struct{\r
- UINT16 InitrdPathListLength;\r
- EFI_DEVICE_PATH_PROTOCOL *InitrdPathList;\r
- CHAR8 CmdLine[BOOT_DEVICE_OPTION_MAX + 1];\r
-} BDS_LINUX_ATAG_ARGUMENTS;\r
-\r
-typedef union {\r
- BDS_LINUX_ATAG_ARGUMENTS LinuxAtagArguments;\r
-} BDS_LOADER_ARGUMENTS;\r
+#define UPDATE_BOOT_ENTRY L"Update entry: "\r
+#define DELETE_BOOT_ENTRY L"Delete entry: "\r
+#define MOVE_BOOT_ENTRY L"Move entry: "\r
\r
typedef struct {\r
- BDS_LOADER_TYPE LoaderType;\r
- BDS_LOADER_ARGUMENTS Arguments;\r
-} BDS_LOADER_OPTIONAL_DATA;\r
+ LIST_ENTRY Link;\r
+ BDS_LOAD_OPTION* BdsLoadOption;\r
+} BDS_LOAD_OPTION_ENTRY;\r
\r
typedef enum {\r
BDS_DEVICE_FILESYSTEM = 0,\r
} BDS_SUPPORTED_DEVICE_TYPE;\r
\r
typedef struct {\r
- LIST_ENTRY Link;\r
- CHAR16 Description[BOOT_DEVICE_DESCRIPTION_MAX];\r
- EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol;\r
+ LIST_ENTRY Link;\r
+ CHAR16 Description[BOOT_DEVICE_DESCRIPTION_MAX];\r
+ EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol;\r
struct _BDS_LOAD_OPTION_SUPPORT* Support;\r
} BDS_SUPPORTED_DEVICE;\r
\r
#define SUPPORTED_BOOT_DEVICE_FROM_LINK(a) BASE_CR(a, BDS_SUPPORTED_DEVICE, Link)\r
\r
-typedef UINT8* EFI_LOAD_OPTION;\r
-\r
-/* This is defined by the UEFI specs, don't change it */\r
-typedef struct {\r
- LIST_ENTRY Link;\r
-\r
- UINT16 LoadOptionIndex;\r
- EFI_LOAD_OPTION LoadOption;\r
- UINTN LoadOptionSize;\r
-\r
- UINT32 Attributes;\r
- UINT16 FilePathListLength;\r
- CHAR16 *Description;\r
- EFI_DEVICE_PATH_PROTOCOL *FilePathList;\r
- BDS_LOADER_OPTIONAL_DATA *OptionalData;\r
-} BDS_LOAD_OPTION;\r
-\r
typedef struct _BDS_LOAD_OPTION_SUPPORT {\r
BDS_SUPPORTED_DEVICE_TYPE Type;\r
EFI_STATUS (*ListDevices)(IN OUT LIST_ENTRY* BdsLoadOptionList);\r
- BOOLEAN (*IsSupported)(IN BDS_LOAD_OPTION* BdsLoadOption);\r
- EFI_STATUS (*CreateDevicePathNode)(IN BDS_SUPPORTED_DEVICE* BdsLoadOption, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNode, OUT BDS_LOADER_TYPE *BootType, OUT UINT32 *Attributes);\r
- EFI_STATUS (*UpdateDevicePathNode)(IN EFI_DEVICE_PATH *OldDevicePath, OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath, OUT BDS_LOADER_TYPE *BootType, OUT UINT32 *Attributes);\r
+ BOOLEAN (*IsSupported)(IN EFI_DEVICE_PATH *DevicePath);\r
+ EFI_STATUS (*CreateDevicePathNode)(IN CHAR16* FileName, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes);\r
+ EFI_STATUS (*UpdateDevicePathNode)(IN EFI_DEVICE_PATH *OldDevicePath, IN CHAR16* FileName, OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath);\r
+\r
+ /// Define if the boot menu should request if the file is a EFI binary or a Linux kernel\r
+ /// Example: PXE boot always deliver a UEFI application.\r
+ BOOLEAN RequestBootType;\r
} BDS_LOAD_OPTION_SUPPORT;\r
\r
-#define LOAD_OPTION_FROM_LINK(a) BASE_CR(a, BDS_LOAD_OPTION, Link)\r
+#define LOAD_OPTION_ENTRY_FROM_LINK(a) BASE_CR(a, BDS_LOAD_OPTION_ENTRY, Link)\r
+#define LOAD_OPTION_FROM_LINK(a) ((BDS_LOAD_OPTION_ENTRY*)BASE_CR(a, BDS_LOAD_OPTION_ENTRY, Link))->BdsLoadOption\r
\r
-EFI_STATUS\r
-GetEnvironmentVariable (\r
- IN CONST CHAR16* VariableName,\r
- IN VOID* DefaultValue,\r
- IN OUT UINTN* Size,\r
- OUT VOID** Value\r
- );\r
+// GUID of the EFI Linux Loader\r
+extern CONST EFI_GUID mLinuxLoaderAppGuid;\r
+\r
+// Device path of the EFI Linux Loader in the Firmware Volume\r
+extern EFI_DEVICE_PATH* mLinuxLoaderDevicePath;\r
\r
EFI_STATUS\r
BootDeviceListSupportedInit (\r
\r
EFI_STATUS\r
BootDeviceGetDeviceSupport (\r
- IN BDS_LOAD_OPTION *BootOption,\r
- OUT BDS_LOAD_OPTION_SUPPORT** DeviceSupport\r
+ IN EFI_DEVICE_PATH *DevicePath,\r
+ OUT BDS_LOAD_OPTION_SUPPORT **DeviceSupport\r
);\r
\r
EFI_STATUS\r
);\r
\r
EFI_STATUS\r
-GetHIInputBoolean (\r
- OUT BOOLEAN *Value\r
+EditHIInputIP (\r
+ IN EFI_IP_ADDRESS *InIpAddr,\r
+ OUT EFI_IP_ADDRESS *OutIpAddr\r
);\r
\r
-BOOLEAN\r
-HasFilePathEfiExtension (\r
- IN CHAR16* FilePath\r
+EFI_STATUS\r
+GetHIInputBoolean (\r
+ OUT BOOLEAN *Value\r
);\r
\r
EFI_DEVICE_PATH*\r
IN CHAR16* BootOption\r
);\r
\r
+UINTN\r
+GetUnalignedDevicePathSize (\r
+ IN EFI_DEVICE_PATH* DevicePath\r
+ );\r
+\r
+EFI_DEVICE_PATH*\r
+GetAlignedDevicePath (\r
+ IN EFI_DEVICE_PATH* DevicePath\r
+ );\r
+\r
EFI_STATUS\r
GenerateDeviceDescriptionName (\r
IN EFI_HANDLE Handle,\r
\r
EFI_STATUS\r
BootOptionCreate (\r
- IN UINT32 Attributes,\r
- IN CHAR16* BootDescription,\r
+ IN UINT32 Attributes,\r
+ IN CHAR16* BootDescription,\r
IN EFI_DEVICE_PATH_PROTOCOL* DevicePath,\r
- IN BDS_LOADER_TYPE BootType,\r
- IN BDS_LOADER_ARGUMENTS *BootArguments,\r
- OUT BDS_LOAD_OPTION **BdsLoadOption\r
+ IN UINT8* OptionalData,\r
+ IN UINTN OptionalDataSize,\r
+ OUT BDS_LOAD_OPTION** BdsLoadOption\r
);\r
\r
EFI_STATUS\r
BootOptionUpdate (\r
- IN BDS_LOAD_OPTION *BdsLoadOption,\r
- IN UINT32 Attributes,\r
- IN CHAR16* BootDescription,\r
+ IN BDS_LOAD_OPTION* BdsLoadOption,\r
+ IN UINT32 Attributes,\r
+ IN CHAR16* BootDescription,\r
IN EFI_DEVICE_PATH_PROTOCOL* DevicePath,\r
- IN BDS_LOADER_TYPE BootType,\r
- IN BDS_LOADER_ARGUMENTS *BootArguments\r
+ IN UINT8* OptionalData,\r
+ IN UINTN OptionalDataSize\r
);\r
\r
EFI_STATUS\r
VOID\r
);\r
\r
+BOOLEAN\r
+IsUnicodeString (\r
+ IN VOID* String\r
+ );\r
+\r
+/*\r
+ * Try to detect if the given string is an ASCII or Unicode string\r
+ *\r
+ * There are actually few limitation to this function but it is mainly to give\r
+ * a user friendly output.\r
+ *\r
+ * Some limitations:\r
+ * - it only supports unicode string that use ASCII character (< 0x100)\r
+ * - single character ASCII strings are interpreted as Unicode string\r
+ * - string cannot be longer than 2 x BOOT_DEVICE_OPTION_MAX (600 bytes)\r
+ *\r
+ * @param String Buffer that might contain a Unicode or Ascii string\r
+ * @param IsUnicode If not NULL this boolean value returns if the string is an\r
+ * ASCII or Unicode string.\r
+ */\r
+BOOLEAN\r
+IsPrintableString (\r
+ IN VOID* String,\r
+ OUT BOOLEAN *IsUnicode\r
+ );\r
+\r
+/**\r
+ An empty function to pass error checking of CreateEventEx ().\r
+\r
+ @param Event Event whose notification function is being invoked.\r
+ @param Context Pointer to the notification function's context,\r
+ which is implementation-dependent.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EmptyCallbackFunction (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ );\r
+\r
+/**\r
+ * This function check if the DevicePath defines an EFI binary\r
+ *\r
+ * This function is used when the BDS support Linux loader to\r
+ * detect if the binary is an EFI application or potentially a\r
+ * Linux kernel.\r
+ */\r
+EFI_STATUS\r
+IsEfiBinary (\r
+ IN EFI_DEVICE_PATH* DevicePath,\r
+ OUT BOOLEAN *EfiBinary\r
+ );\r
+\r
#endif /* _BDSINTERNAL_H_ */\r