)\r
{\r
EFI_STATUS Status;\r
- EFI_DEVICE_PATH* FdtDevicePath;\r
EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL* EfiDevicePathFromTextProtocol;\r
UINT32 LoaderType;\r
ARM_BDS_LOADER_OPTIONAL_DATA* OptionalData;\r
UINTN InitrdSize;\r
EFI_DEVICE_PATH* Initrd;\r
\r
+ if (IS_ARM_BDS_BOOTENTRY (BootOption)) {\r
Status = EFI_UNSUPPORTED;\r
OptionalData = BootOption->OptionalData;\r
LoaderType = ReadUnaligned32 ((CONST UINT32*)&OptionalData->Header.LoaderType);\r
Initrd, // Initrd\r
(CHAR8*)(LinuxArguments + 1),\r
FdtDevicePath);\r
+ }\r
+ } else {\r
+ Status = BdsStartEfiApplication (mImageHandle, BootOption->FilePathList);\r
+ }\r
\r
return Status;\r
}\r
IN OUT LIST_ENTRY *BootOptionList\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINT16 *BootOrder;\r
- UINTN BootOrderSize;\r
- BDS_LOAD_OPTION *BdsLoadOption;\r
+ EFI_STATUS Status;\r
+ UINTN Index;\r
+ UINT16* BootOrder;\r
+ UINTN BootOrderSize;\r
+ BDS_LOAD_OPTION* BdsLoadOption;\r
+ BDS_LOAD_OPTION_ENTRY* BdsLoadOptionEntry;\r
\r
InitializeListHead (BootOptionList);\r
\r
for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {\r
Status = BootOptionFromLoadOptionVariable (BootOrder[Index],&BdsLoadOption);\r
if (!EFI_ERROR(Status)) {\r
- InsertTailList (BootOptionList,&BdsLoadOption->Link);\r
+ BdsLoadOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool(sizeof(BDS_LOAD_OPTION_ENTRY));\r
+ BdsLoadOptionEntry->BdsLoadOption = BdsLoadOption;\r
+ InsertTailList (BootOptionList,&BdsLoadOptionEntry->Link);\r
}\r
}\r
\r
IN EFI_DEVICE_PATH_PROTOCOL* DevicePath,\r
IN ARM_BDS_LOADER_TYPE BootType,\r
IN ARM_BDS_LOADER_ARGUMENTS* BootArguments,\r
- OUT BDS_LOAD_OPTION **BdsLoadOption\r
+ OUT BDS_LOAD_OPTION** BdsLoadOption\r
)\r
{\r
- EFI_STATUS Status;\r
- BDS_LOAD_OPTION *BootOption;\r
- CHAR16 BootVariableName[9];\r
- UINT16 *BootOrder;\r
- UINTN BootOrderSize;\r
+ EFI_STATUS Status;\r
+ BDS_LOAD_OPTION_ENTRY* BootOptionEntry;\r
+ BDS_LOAD_OPTION* BootOption;\r
+ CHAR16 BootVariableName[9];\r
+ UINT16* BootOrder;\r
+ UINTN BootOrderSize;\r
\r
//\r
// Allocate and fill the memory for the BDS Load Option structure\r
//\r
- BootOption = (BDS_LOAD_OPTION*)AllocateZeroPool(sizeof(BDS_LOAD_OPTION));\r
+ BootOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool (sizeof (BDS_LOAD_OPTION_ENTRY));\r
+ InitializeListHead (&BootOptionEntry->Link);\r
+ BootOptionEntry->BdsLoadOption = (BDS_LOAD_OPTION*)AllocateZeroPool (sizeof(BDS_LOAD_OPTION));\r
\r
- InitializeListHead (&BootOption->Link);\r
+ BootOption = BootOptionEntry->BdsLoadOption;\r
BootOptionSetFields (BootOption, Attributes, BootDescription, DevicePath, BootType, BootArguments);\r
\r
//\r
IN BDS_LOAD_OPTION *BootOption\r
)\r
{\r
- UINTN Index;\r
- UINTN BootOrderSize;\r
- UINT16* BootOrder;\r
- UINTN BootOrderCount;\r
- EFI_STATUS Status;\r
-\r
- // If the Boot Optiono was attached to a list remove it\r
- if (!IsListEmpty (&BootOption->Link)) {\r
- // Remove the entry from the list\r
- RemoveEntryList (&BootOption->Link);\r
- }\r
+ UINTN Index;\r
+ UINTN BootOrderSize;\r
+ UINT16* BootOrder;\r
+ UINTN BootOrderCount;\r
+ EFI_STATUS Status;\r
\r
// Remove the entry from the BootOrder environment variable\r
Status = GetEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder);\r