X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EmbeddedPkg%2FApplication%2FAndroidFastboot%2FArm%2FBootAndroidBootImg.c;h=46a7ceb3a41c2ebd54a159f1d0ccf7988b1dfe60;hp=acedd3e0e3cdd674a4794ca91f4c6a86abf7bbce;hb=34e0bceabf623342cccfc49fcf6cfcb3654cd8c8;hpb=45b18ce5b121849b01ac982c338565b9dcd8e2f4 diff --git a/EmbeddedPkg/Application/AndroidFastboot/Arm/BootAndroidBootImg.c b/EmbeddedPkg/Application/AndroidFastboot/Arm/BootAndroidBootImg.c index acedd3e0e3..46a7ceb3a4 100644 --- a/EmbeddedPkg/Application/AndroidFastboot/Arm/BootAndroidBootImg.c +++ b/EmbeddedPkg/Application/AndroidFastboot/Arm/BootAndroidBootImg.c @@ -21,11 +21,6 @@ #include #include -#define LINUX_LOADER_COMMAND_LINE L"%s -f %s -c %s" - -// This GUID is defined in the INGF file of ArmPkg/Application/LinuxLoader -CONST EFI_GUID mLinuxLoaderAppGuid = { 0x701f54f2, 0x0d70, 0x4b89, { 0xbc, 0x0a, 0xd9, 0xca, 0x25, 0x37, 0x90, 0x59 }}; - // Device Path representing an image in memory #pragma pack(1) typedef struct { @@ -68,11 +63,7 @@ BootAndroidBootImg ( VOID *Ramdisk; UINTN RamdiskSize; MEMORY_DEVICE_PATH KernelDevicePath; - MEMORY_DEVICE_PATH* RamdiskDevicePath; - CHAR16* KernelDevicePathTxt; - CHAR16* RamdiskDevicePathTxt; - EFI_DEVICE_PATH* LinuxLoaderDevicePath; - CHAR16* LoadOptions; + CHAR16 *LoadOptions, *NewLoadOptions; Status = ParseAndroidBootImg ( Buffer, @@ -93,55 +84,38 @@ BootAndroidBootImg ( KernelDevicePath.Node1.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Kernel; KernelDevicePath.Node1.EndingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Kernel + KernelSize; - RamdiskDevicePath = NULL; - if (RamdiskSize != 0) { - RamdiskDevicePath = (MEMORY_DEVICE_PATH*)DuplicateDevicePath ((EFI_DEVICE_PATH_PROTOCOL*) &MemoryDevicePathTemplate); - - RamdiskDevicePath->Node1.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Ramdisk; - RamdiskDevicePath->Node1.EndingAddress = ((EFI_PHYSICAL_ADDRESS)(UINTN) Ramdisk) + RamdiskSize; - } - - // - // Boot Linux using the Legacy Linux Loader - // - - Status = LocateEfiApplicationInFvByGuid (&mLinuxLoaderAppGuid, &LinuxLoaderDevicePath); - if (EFI_ERROR (Status)) { - Print (L"Couldn't Boot Linux: %d\n", Status); - return EFI_DEVICE_ERROR; - } - - KernelDevicePathTxt = ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL *) &KernelDevicePath, FALSE, FALSE); - if (KernelDevicePathTxt == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - RamdiskDevicePathTxt = ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL *) RamdiskDevicePath, FALSE, FALSE); - if (RamdiskDevicePathTxt == NULL) { + // Initialize Linux command line + LoadOptions = CatSPrint (NULL, L"%a", KernelArgs); + if (LoadOptions == NULL) { return EFI_OUT_OF_RESOURCES; } - // Initialize Legacy Linux loader command line - LoadOptions = CatSPrint (NULL, LINUX_LOADER_COMMAND_LINE, KernelDevicePathTxt, RamdiskDevicePathTxt, KernelArgs); - if (LoadOptions == NULL) { - return EFI_OUT_OF_RESOURCES; + if (RamdiskSize != 0) { + NewLoadOptions = CatSPrint (LoadOptions, L" initrd=0x%x,0x%x", + (UINTN)Ramdisk, RamdiskSize); + FreePool (LoadOptions); + if (NewLoadOptions == NULL) { + return EFI_OUT_OF_RESOURCES; + } + LoadOptions = NewLoadOptions; } - Status = BdsStartEfiApplication (gImageHandle, LinuxLoaderDevicePath, StrSize (LoadOptions), LoadOptions); + Status = BdsStartEfiApplication (gImageHandle, + (EFI_DEVICE_PATH_PROTOCOL *) &KernelDevicePath, + StrSize (LoadOptions), + LoadOptions); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "Couldn't Boot Linux: %d\n", Status)); - return EFI_DEVICE_ERROR; - } - - if (RamdiskDevicePath) { - FreePool (RamdiskDevicePathTxt); - FreePool (RamdiskDevicePath); + Status = EFI_DEVICE_ERROR; + goto FreeLoadOptions; } - FreePool (KernelDevicePathTxt); - // If we got here we do a confused face because BootLinuxFdt returned, // reporting success. DEBUG ((EFI_D_ERROR, "WARNING: BdsBootLinuxFdt returned EFI_SUCCESS.\n")); return EFI_SUCCESS; + +FreeLoadOptions: + FreePool (LoadOptions); + return Status; }