- EFI_STATUS Status;\r
- EFI_DEVICE_PATH* FdtDevicePath;\r
- EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL* EfiDevicePathFromTextProtocol;\r
- UINT32 LoaderType;\r
-\r
- Status = EFI_UNSUPPORTED;\r
- LoaderType = ReadUnaligned32 (&BootOption->OptionalData->LoaderType);\r
-\r
- if (LoaderType == BDS_LOADER_EFI_APPLICATION) {\r
- // Need to connect every drivers to ensure no dependencies are missing for the application\r
- BdsConnectAllDrivers();\r
-\r
- Status = BdsStartEfiApplication (mImageHandle, BootOption->FilePathList);\r
- } else if (LoaderType == BDS_LOADER_KERNEL_LINUX_ATAG) {\r
- Status = BdsBootLinux (BootOption->FilePathList, BootOption->OptionalData->Arguments, NULL);\r
- } else if (LoaderType == BDS_LOADER_KERNEL_LINUX_FDT) {\r
- // Convert the FDT path into a Device Path\r
- Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, (VOID **)&EfiDevicePathFromTextProtocol);\r
- ASSERT_EFI_ERROR(Status);\r
- FdtDevicePath = EfiDevicePathFromTextProtocol->ConvertTextToDevicePath ((CHAR16*)PcdGetPtr(PcdFdtDevicePath));\r
-\r
- Status = BdsBootLinux (BootOption->FilePathList, BootOption->OptionalData->Arguments, FdtDevicePath);\r
- FreePool(FdtDevicePath);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-BootOptionParseLoadOption (\r
- IN EFI_LOAD_OPTION EfiLoadOption,\r
- IN UINTN EfiLoadOptionSize,\r
- OUT BDS_LOAD_OPTION **BdsLoadOption\r
- )\r
-{\r
- BDS_LOAD_OPTION *LoadOption;\r
- UINTN FilePathListLength;\r
- UINTN DescriptionLength;\r
-\r
- if (EfiLoadOption == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (EfiLoadOptionSize < sizeof(UINT32) + sizeof(UINT16) + sizeof(CHAR16) + sizeof(EFI_DEVICE_PATH_PROTOCOL)) {\r
- return EFI_BAD_BUFFER_SIZE;\r
- }\r