#define BOOT_DEVICE_OPTION_MAX 300\r
#define BOOT_DEVICE_ADDRESS_MAX 20\r
\r
+#define ARM_BDS_OPTIONAL_DATA_SIGNATURE SIGNATURE_32('a', 'b', 'o', 'd')\r
+\r
+#define IS_ARM_BDS_BOOTENTRY(ptr) (ReadUnaligned32 ((CONST UINT32*)&((ARM_BDS_LOADER_OPTIONAL_DATA*)((ptr)->OptionalData))->Header.Signature) == ARM_BDS_OPTIONAL_DATA_SIGNATURE)\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
+} ARM_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
+typedef struct {\r
+ UINT16 CmdLineSize;\r
+ UINT16 InitrdSize;\r
+ \r
+ // These following fields have variable length and are packed:\r
+ //CHAR8 *CmdLine;\r
+ //EFI_DEVICE_PATH_PROTOCOL *InitrdPathList;\r
+} ARM_BDS_LINUX_ARGUMENTS;\r
\r
typedef union {\r
- BDS_LINUX_ATAG_ARGUMENTS LinuxAtagArguments;\r
-} BDS_LOADER_ARGUMENTS;\r
+ ARM_BDS_LINUX_ARGUMENTS LinuxArguments;\r
+} ARM_BDS_LOADER_ARGUMENTS;\r
\r
typedef struct {\r
- BDS_LOADER_TYPE LoaderType;\r
- BDS_LOADER_ARGUMENTS Arguments;\r
-} BDS_LOADER_OPTIONAL_DATA;\r
+ UINT32 Signature;\r
+ ARM_BDS_LOADER_TYPE LoaderType;\r
+} ARM_BDS_LOADER_OPTIONAL_DATA_HEADER;\r
+\r
+typedef struct {\r
+ ARM_BDS_LOADER_OPTIONAL_DATA_HEADER Header;\r
+ ARM_BDS_LOADER_ARGUMENTS Arguments;\r
+} ARM_BDS_LOADER_OPTIONAL_DATA;\r
\r
typedef enum {\r
BDS_DEVICE_FILESYSTEM = 0,\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
+ EFI_STATUS (*CreateDevicePathNode)(IN BDS_SUPPORTED_DEVICE* BdsLoadOption, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNode, OUT ARM_BDS_LOADER_TYPE *BootType, OUT UINT32 *Attributes);\r
+ EFI_STATUS (*UpdateDevicePathNode)(IN EFI_DEVICE_PATH *OldDevicePath, OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath, OUT ARM_BDS_LOADER_TYPE *BootType, OUT UINT32 *Attributes);\r
} BDS_LOAD_OPTION_SUPPORT;\r
\r
#define LOAD_OPTION_FROM_LINK(a) BASE_CR(a, BDS_LOAD_OPTION, Link)\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 ARM_BDS_LOADER_TYPE BootType,\r
+ IN ARM_BDS_LOADER_ARGUMENTS* BootArguments,\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 ARM_BDS_LOADER_TYPE BootType,\r
+ IN ARM_BDS_LOADER_ARGUMENTS* BootArguments\r
);\r
\r
EFI_STATUS\r