On 21 November 2016 at 12:28, Ard Biesheuvel <[email protected]> wrote: > When booting the kernel via Fastboot, invoke the kernel image directly > rather than passing it to the LinuxLoader app. This requires the kernel > image to be built with UEFI stub support. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ard Biesheuvel <[email protected]> > --- > Build tested only. > > EmbeddedPkg/Application/AndroidFastboot/Arm/BootAndroidBootImg.c | 70 > ++++++-------------- > 1 file changed, 22 insertions(+), 48 deletions(-) > > diff --git a/EmbeddedPkg/Application/AndroidFastboot/Arm/BootAndroidBootImg.c > b/EmbeddedPkg/Application/AndroidFastboot/Arm/BootAndroidBootImg.c > index acedd3e0e3cd..46a7ceb3a41c 100644 > --- a/EmbeddedPkg/Application/AndroidFastboot/Arm/BootAndroidBootImg.c > +++ b/EmbeddedPkg/Application/AndroidFastboot/Arm/BootAndroidBootImg.c > @@ -21,11 +21,6 @@ > #include <Library/UefiBootServicesTableLib.h> > #include <Library/UefiLib.h> > > -#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"));
This comment has nothing to do with your change, but this DEBUG message hasn't been true since commit bd9a5182a59696870690b54aaa63632c80694000 removed the call to BdsBootLinuxFdt :-/ > return EFI_SUCCESS; > + > +FreeLoadOptions: > + FreePool (LoadOptions); > + return Status; > } > -- > 2.7.4 > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

