From 2755d844f9ccc57108b49d5f91f38085de01760a Mon Sep 17 00:00:00 2001 From: oliviermartin Date: Fri, 9 Sep 2011 10:53:42 +0000 Subject: [PATCH] ArmPkg/BdsLib: Add support to pass argument to a loaded EFI application OptionalData argument has to be set in the Loaded Image Protocol of the new EFI application. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12313 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmPkg/Include/Library/BdsLib.h | 8 ++++++-- ArmPkg/Library/BdsLib/BdsAppLoader.c | 6 ++++-- ArmPkg/Library/BdsLib/BdsFilePath.c | 19 +++++++++++++++++-- ArmPlatformPkg/Bds/BootMenu.c | 2 +- ArmPlatformPkg/Bds/BootOption.c | 2 +- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/ArmPkg/Include/Library/BdsLib.h b/ArmPkg/Include/Library/BdsLib.h index 91c67e726e..bbbdae895b 100644 --- a/ArmPkg/Include/Library/BdsLib.h +++ b/ArmPkg/Include/Library/BdsLib.h @@ -100,7 +100,9 @@ BdsBootLinux ( EFI_STATUS BdsStartEfiApplication ( IN EFI_HANDLE ParentImageHandle, - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, + IN UINTN LoadOptionsSize, + IN VOID* LoadOptions ); /** @@ -116,7 +118,9 @@ BdsStartEfiApplication ( EFI_STATUS BdsLoadApplication ( IN EFI_HANDLE ParentImageHandle, - IN CHAR16* EfiApp + IN CHAR16* EfiApp, + IN UINTN LoadOptionsSize, + IN VOID* LoadOptions ); #endif diff --git a/ArmPkg/Library/BdsLib/BdsAppLoader.c b/ArmPkg/Library/BdsLib/BdsAppLoader.c index 8b778b27f7..4f359cda10 100644 --- a/ArmPkg/Library/BdsLib/BdsAppLoader.c +++ b/ArmPkg/Library/BdsLib/BdsAppLoader.c @@ -105,7 +105,9 @@ BdsLoadFileFromFirmwareVolume ( EFI_STATUS BdsLoadApplication ( IN EFI_HANDLE ParentImageHandle, - IN CHAR16* EfiApp + IN CHAR16* EfiApp, + IN UINTN LoadOptionsSize, + IN VOID* LoadOptions ) { EFI_STATUS Status; @@ -133,7 +135,7 @@ BdsLoadApplication ( Status = BdsLoadFileFromFirmwareVolume (Handles[HandleIndex], EfiApp, EFI_FV_FILETYPE_APPLICATION, &EfiAppDevicePath); if (!EFI_ERROR (Status)) { // Start the application - Status = BdsStartEfiApplication (ParentImageHandle, EfiAppDevicePath); + Status = BdsStartEfiApplication (ParentImageHandle, EfiAppDevicePath, LoadOptionsSize, LoadOptions); return Status; } } diff --git a/ArmPkg/Library/BdsLib/BdsFilePath.c b/ArmPkg/Library/BdsLib/BdsFilePath.c index 720ae7b9da..9136941ede 100644 --- a/ArmPkg/Library/BdsLib/BdsFilePath.c +++ b/ArmPkg/Library/BdsLib/BdsFilePath.c @@ -16,6 +16,7 @@ #include #include +#include #define IS_DEVICE_PATH_NODE(node,type,subtype) (((node)->Type == (type)) && ((node)->SubType == (subtype))) @@ -856,16 +857,19 @@ BdsLoadImage ( EFI_STATUS BdsStartEfiApplication ( IN EFI_HANDLE ParentImageHandle, - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, + IN UINTN LoadOptionsSize, + IN VOID* LoadOptions ) { EFI_STATUS Status; EFI_HANDLE ImageHandle; EFI_PHYSICAL_ADDRESS BinaryBuffer; UINTN BinarySize; + EFI_LOADED_IMAGE_PROTOCOL* LoadedImage; // Find the nearest supported file loader - Status = BdsLoadImage (DevicePath, AllocateAnyPages,&BinaryBuffer,&BinarySize); + Status = BdsLoadImage (DevicePath, AllocateAnyPages, &BinaryBuffer, &BinarySize); if (EFI_ERROR(Status)) { return Status; } @@ -876,6 +880,17 @@ BdsStartEfiApplication ( return Status; } + // Passed LoadOptions to the EFI Application + if (LoadOptionsSize != 0) { + Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &LoadedImage); + if (EFI_ERROR(Status)) { + return Status; + } + + LoadedImage->LoadOptionsSize = LoadOptionsSize; + LoadedImage->LoadOptions = LoadOptions; + } + // Before calling the image, enable the Watchdog Timer for the 5 Minute period gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL); // Start the image diff --git a/ArmPlatformPkg/Bds/BootMenu.c b/ArmPlatformPkg/Bds/BootMenu.c index d583c02256..ad2e914554 100644 --- a/ArmPlatformPkg/Bds/BootMenu.c +++ b/ArmPlatformPkg/Bds/BootMenu.c @@ -478,7 +478,7 @@ BootEBL ( EFI_STATUS Status; // Start EFI Shell - Status = BdsLoadApplication(mImageHandle, L"Ebl"); + Status = BdsLoadApplication (mImageHandle, L"Ebl", 0, NULL); if (Status == EFI_NOT_FOUND) { Print (L"Error: EFI Application not found.\n"); } else if (EFI_ERROR(Status)) { diff --git a/ArmPlatformPkg/Bds/BootOption.c b/ArmPlatformPkg/Bds/BootOption.c index 6a5f010abe..9354e01d26 100644 --- a/ArmPlatformPkg/Bds/BootOption.c +++ b/ArmPlatformPkg/Bds/BootOption.c @@ -85,7 +85,7 @@ BootOptionStart ( FdtDevicePath); } } else { - Status = BdsStartEfiApplication (mImageHandle, BootOption->FilePathList); + Status = BdsStartEfiApplication (mImageHandle, BootOption->FilePathList, BootOption->OptionalDataSize, BootOption->OptionalData); } return Status; -- 2.39.2