+ ARM_BDS_LOADER_OPTIONAL_DATA* OptionalData;\r
+ ARM_BDS_LINUX_ARGUMENTS* LinuxArguments;\r
+ EFI_DEVICE_PATH_PROTOCOL* FdtDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL* DefaultFdtDevicePath;\r
+ UINTN FdtDevicePathSize;\r
+ UINTN CmdLineSize;\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
+\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, 0, NULL);\r
+ } else if (LoaderType == BDS_LOADER_KERNEL_LINUX_ATAG) {\r
+ LinuxArguments = &(OptionalData->Arguments.LinuxArguments);\r
+ CmdLineSize = ReadUnaligned16 ((CONST UINT16*)&LinuxArguments->CmdLineSize);\r
+ InitrdSize = ReadUnaligned16 ((CONST UINT16*)&LinuxArguments->InitrdSize);\r
+\r
+ if (InitrdSize > 0) {\r
+ Initrd = GetAlignedDevicePath ((EFI_DEVICE_PATH*)((UINTN)(LinuxArguments + 1) + CmdLineSize));\r
+ } else {\r
+ Initrd = NULL;\r
+ }\r
+\r
+ Status = BdsBootLinux (BootOption->FilePathList,\r
+ Initrd, // Initrd\r
+ (CHAR8*)(LinuxArguments + 1), // CmdLine\r
+ NULL);\r
+ } else if (LoaderType == BDS_LOADER_KERNEL_LINUX_FDT) {\r
+ LinuxArguments = &(OptionalData->Arguments.LinuxArguments);\r
+ CmdLineSize = ReadUnaligned16 ((CONST UINT16*)&LinuxArguments->CmdLineSize);\r
+ InitrdSize = ReadUnaligned16 ((CONST UINT16*)&LinuxArguments->InitrdSize);\r
+\r
+ if (InitrdSize > 0) {\r
+ Initrd = GetAlignedDevicePath ((EFI_DEVICE_PATH*)((UINTN)(LinuxArguments + 1) + CmdLineSize));\r
+ } else {\r
+ Initrd = NULL;\r
+ }\r