Message ID | 1477415818-11404-1-git-send-email-ard.biesheuvel@linaro.org |
---|---|
State | Accepted |
Commit | c133041fa66474b153cba3c7f0fef74ea0ecf429 |
Headers | show |
On Tue, Oct 25, 2016 at 06:16:58PM +0100, Ard Biesheuvel wrote: > This is no longer used, and does not belong in a reference code base, > so remove it. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Unless Ryan screams loudly - 100x: Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org> > --- > > Note that the OpenPlatformPkg version of Beagle will still need to be > brought in line with the EDK2 version (after switching to the generic > BDS) Right ... given that we now appear to have a clear migration path to edk2-platforms, I'd actually be OK with nuking the OpenPlatformPkg Beagle clone. / Leif > ArmPlatformPkg/Bds/Bds.c | 561 --------- > ArmPlatformPkg/Bds/Bds.inf | 90 -- > ArmPlatformPkg/Bds/BdsHelper.c | 465 -------- > ArmPlatformPkg/Bds/BdsInternal.h | 277 ----- > ArmPlatformPkg/Bds/BootLinux.c | 124 -- > ArmPlatformPkg/Bds/BootMenu.c | 1101 ------------------ > ArmPlatformPkg/Bds/BootOption.c | 316 ------ > ArmPlatformPkg/Bds/BootOptionSupport.c | 1195 -------------------- > 8 files changed, 4129 deletions(-) > > diff --git a/ArmPlatformPkg/Bds/Bds.c b/ArmPlatformPkg/Bds/Bds.c > deleted file mode 100644 > index 4cea3cd531bb..000000000000 > --- a/ArmPlatformPkg/Bds/Bds.c > +++ /dev/null > @@ -1,561 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011-2015, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#include "BdsInternal.h" > - > -#include <Library/PcdLib.h> > -#include <Library/PerformanceLib.h> > - > -#include <Protocol/Bds.h> > - > -#include <Guid/EventGroup.h> > - > -#define EFI_SET_TIMER_TO_SECOND 10000000 > - > -STATIC > -EFI_STATUS > -GetConsoleDevicePathFromVariable ( > - IN CHAR16* ConsoleVarName, > - IN CHAR16* DefaultConsolePaths, > - OUT EFI_DEVICE_PATH** DevicePaths > - ) > -{ > - EFI_STATUS Status; > - UINTN Size; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathInstances; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathInstance; > - CHAR16* DevicePathStr; > - CHAR16* NextDevicePathStr; > - EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *EfiDevicePathFromTextProtocol; > - > - Status = GetGlobalEnvironmentVariable (ConsoleVarName, NULL, NULL, (VOID**)&DevicePathInstances); > - if (EFI_ERROR(Status)) { > - // In case no default console device path has been defined we assume a driver handles the console (eg: SimpleTextInOutSerial) > - if ((DefaultConsolePaths == NULL) || (DefaultConsolePaths[0] == L'\0')) { > - *DevicePaths = NULL; > - return EFI_SUCCESS; > - } > - > - Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, (VOID **)&EfiDevicePathFromTextProtocol); > - ASSERT_EFI_ERROR(Status); > - > - DevicePathInstances = NULL; > - > - // Extract the Device Path instances from the multi-device path string > - while ((DefaultConsolePaths != NULL) && (DefaultConsolePaths[0] != L'\0')) { > - NextDevicePathStr = StrStr (DefaultConsolePaths, L";"); > - if (NextDevicePathStr == NULL) { > - DevicePathStr = DefaultConsolePaths; > - DefaultConsolePaths = NULL; > - } else { > - DevicePathStr = (CHAR16*)AllocateCopyPool ((NextDevicePathStr - DefaultConsolePaths + 1) * sizeof(CHAR16), DefaultConsolePaths); > - *(DevicePathStr + (NextDevicePathStr - DefaultConsolePaths)) = L'\0'; > - DefaultConsolePaths = NextDevicePathStr; > - if (DefaultConsolePaths[0] == L';') { > - DefaultConsolePaths++; > - } > - } > - > - DevicePathInstance = EfiDevicePathFromTextProtocol->ConvertTextToDevicePath (DevicePathStr); > - ASSERT(DevicePathInstance != NULL); > - DevicePathInstances = AppendDevicePathInstance (DevicePathInstances, DevicePathInstance); > - > - if (NextDevicePathStr != NULL) { > - FreePool (DevicePathStr); > - } > - FreePool (DevicePathInstance); > - } > - > - // Set the environment variable with this device path multi-instances > - Size = GetDevicePathSize (DevicePathInstances); > - if (Size > 0) { > - gRT->SetVariable ( > - ConsoleVarName, > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - Size, > - DevicePathInstances > - ); > - } else { > - Status = EFI_INVALID_PARAMETER; > - } > - } > - > - if (!EFI_ERROR(Status)) { > - *DevicePaths = DevicePathInstances; > - } > - return Status; > -} > - > -STATIC > -EFI_STATUS > -InitializeConsolePipe ( > - IN EFI_DEVICE_PATH *ConsoleDevicePaths, > - IN EFI_GUID *Protocol, > - OUT EFI_HANDLE *Handle, > - OUT VOID* *Interface > - ) > -{ > - EFI_STATUS Status; > - UINTN Size; > - UINTN NoHandles; > - EFI_HANDLE *Buffer; > - EFI_DEVICE_PATH_PROTOCOL* DevicePath; > - > - // Connect all the Device Path Consoles > - while (ConsoleDevicePaths != NULL) { > - DevicePath = GetNextDevicePathInstance (&ConsoleDevicePaths, &Size); > - > - Status = BdsConnectDevicePath (DevicePath, Handle, NULL); > - DEBUG_CODE_BEGIN(); > - if (EFI_ERROR(Status)) { > - // We convert back to the text representation of the device Path > - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; > - CHAR16* DevicePathTxt; > - EFI_STATUS Status; > - > - Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); > - if (!EFI_ERROR(Status)) { > - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (DevicePath, TRUE, TRUE); > - > - DEBUG((EFI_D_ERROR,"Fail to start the console with the Device Path '%s'. (Error '%r')\n", DevicePathTxt, Status)); > - > - FreePool (DevicePathTxt); > - } > - } > - DEBUG_CODE_END(); > - > - // If the console splitter driver is not supported by the platform then use the first Device Path > - // instance for the console interface. > - if (!EFI_ERROR(Status) && (*Interface == NULL)) { > - Status = gBS->HandleProtocol (*Handle, Protocol, Interface); > - } > - } > - > - // No Device Path has been defined for this console interface. We take the first protocol implementation > - if (*Interface == NULL) { > - Status = gBS->LocateHandleBuffer (ByProtocol, Protocol, NULL, &NoHandles, &Buffer); > - if (EFI_ERROR (Status)) { > - BdsConnectAllDrivers(); > - Status = gBS->LocateHandleBuffer (ByProtocol, Protocol, NULL, &NoHandles, &Buffer); > - } > - > - if (!EFI_ERROR(Status)) { > - *Handle = Buffer[0]; > - Status = gBS->HandleProtocol (*Handle, Protocol, Interface); > - ASSERT_EFI_ERROR(Status); > - FreePool (Buffer); > - } > - } else { > - Status = EFI_SUCCESS; > - } > - > - return Status; > -} > - > -EFI_STATUS > -InitializeConsole ( > - VOID > - ) > -{ > - EFI_STATUS Status; > - EFI_DEVICE_PATH* ConOutDevicePaths; > - EFI_DEVICE_PATH* ConInDevicePaths; > - EFI_DEVICE_PATH* ConErrDevicePaths; > - > - // By getting the Console Device Paths from the environment variables before initializing the console pipe, we > - // create the 3 environment variables (ConIn, ConOut, ConErr) that allows to initialize all the console interface > - // of newly installed console drivers > - Status = GetConsoleDevicePathFromVariable (L"ConOut", (CHAR16*)PcdGetPtr(PcdDefaultConOutPaths), &ConOutDevicePaths); > - ASSERT_EFI_ERROR (Status); > - Status = GetConsoleDevicePathFromVariable (L"ConIn", (CHAR16*)PcdGetPtr(PcdDefaultConInPaths), &ConInDevicePaths); > - ASSERT_EFI_ERROR (Status); > - Status = GetConsoleDevicePathFromVariable (L"ErrOut", (CHAR16*)PcdGetPtr(PcdDefaultConOutPaths), &ConErrDevicePaths); > - ASSERT_EFI_ERROR (Status); > - > - // Initialize the Consoles > - Status = InitializeConsolePipe (ConOutDevicePaths, &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **)&gST->ConOut); > - ASSERT_EFI_ERROR (Status); > - Status = InitializeConsolePipe (ConInDevicePaths, &gEfiSimpleTextInProtocolGuid, &gST->ConsoleInHandle, (VOID **)&gST->ConIn); > - ASSERT_EFI_ERROR (Status); > - Status = InitializeConsolePipe (ConErrDevicePaths, &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **)&gST->StdErr); > - if (EFI_ERROR(Status)) { > - // In case of error, we reuse the console output for the error output > - gST->StandardErrorHandle = gST->ConsoleOutHandle; > - gST->StdErr = gST->ConOut; > - } > - > - // Free Memory allocated for reading the UEFI Variables > - if (ConOutDevicePaths) { > - FreePool (ConOutDevicePaths); > - } > - if (ConInDevicePaths) { > - FreePool (ConInDevicePaths); > - } > - if (ConErrDevicePaths) { > - FreePool (ConErrDevicePaths); > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -DefineDefaultBootEntries ( > - VOID > - ) > -{ > - BDS_LOAD_OPTION* BdsLoadOption; > - UINTN Size; > - EFI_STATUS Status; > - EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL* EfiDevicePathFromTextProtocol; > - EFI_DEVICE_PATH* BootDevicePath; > - UINTN CmdLineSize; > - UINTN CmdLineAsciiSize; > - CHAR16* DefaultBootArgument; > - CHAR8* AsciiDefaultBootArgument; > - > - // > - // If Boot Order does not exist then create a default entry > - // > - Size = 0; > - Status = gRT->GetVariable (L"BootOrder", &gEfiGlobalVariableGuid, NULL, &Size, NULL); > - if (Status == EFI_NOT_FOUND) { > - if ((PcdGetPtr(PcdDefaultBootDevicePath) == NULL) || (StrLen ((CHAR16*)PcdGetPtr(PcdDefaultBootDevicePath)) == 0)) { > - return EFI_UNSUPPORTED; > - } > - > - Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, (VOID **)&EfiDevicePathFromTextProtocol); > - if (EFI_ERROR(Status)) { > - // You must provide an implementation of DevicePathFromTextProtocol in your firmware (eg: DevicePathDxe) > - DEBUG((EFI_D_ERROR,"Error: Bds requires DevicePathFromTextProtocol\n")); > - return Status; > - } > - BootDevicePath = EfiDevicePathFromTextProtocol->ConvertTextToDevicePath ((CHAR16*)PcdGetPtr(PcdDefaultBootDevicePath)); > - > - DEBUG_CODE_BEGIN(); > - // We convert back to the text representation of the device Path to see if the initial text is correct > - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; > - CHAR16* DevicePathTxt; > - > - Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); > - ASSERT_EFI_ERROR(Status); > - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (BootDevicePath, TRUE, TRUE); > - > - if (StrCmp ((CHAR16*)PcdGetPtr (PcdDefaultBootDevicePath), DevicePathTxt) != 0) { > - DEBUG ((EFI_D_ERROR, "Device Path given: '%s' Device Path expected: '%s'\n", > - (CHAR16*)PcdGetPtr (PcdDefaultBootDevicePath), DevicePathTxt)); > - ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); > - } > - > - FreePool (DevicePathTxt); > - DEBUG_CODE_END(); > - > - // Create the entry is the Default values are correct > - if (BootDevicePath != NULL) { > - // We do not support NULL pointer > - ASSERT (PcdGetPtr (PcdDefaultBootArgument) != NULL); > - > - // > - // Logic to handle ASCII or Unicode default parameters > - // > - if (*(CHAR8*)PcdGetPtr (PcdDefaultBootArgument) == '\0') { > - CmdLineSize = 0; > - CmdLineAsciiSize = 0; > - DefaultBootArgument = NULL; > - AsciiDefaultBootArgument = NULL; > - } else if (IsUnicodeString ((CHAR16*)PcdGetPtr (PcdDefaultBootArgument))) { > - // The command line is a Unicode string > - DefaultBootArgument = (CHAR16*)PcdGetPtr (PcdDefaultBootArgument); > - CmdLineSize = StrSize (DefaultBootArgument); > - > - // Initialize ASCII variables > - CmdLineAsciiSize = CmdLineSize / 2; > - AsciiDefaultBootArgument = AllocatePool (CmdLineAsciiSize); > - if (AsciiDefaultBootArgument == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - UnicodeStrToAsciiStr ((CHAR16*)PcdGetPtr (PcdDefaultBootArgument), AsciiDefaultBootArgument); > - } else { > - // The command line is a ASCII string > - AsciiDefaultBootArgument = (CHAR8*)PcdGetPtr (PcdDefaultBootArgument); > - CmdLineAsciiSize = AsciiStrSize (AsciiDefaultBootArgument); > - > - // Initialize ASCII variables > - CmdLineSize = CmdLineAsciiSize * 2; > - DefaultBootArgument = AllocatePool (CmdLineSize); > - if (DefaultBootArgument == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - AsciiStrToUnicodeStr (AsciiDefaultBootArgument, DefaultBootArgument); > - } > - > - BootOptionCreate (LOAD_OPTION_ACTIVE | LOAD_OPTION_CATEGORY_BOOT, > - (CHAR16*)PcdGetPtr (PcdDefaultBootDescription), > - BootDevicePath, > - (UINT8 *)DefaultBootArgument, // OptionalData > - CmdLineSize, // OptionalDataSize > - &BdsLoadOption > - ); > - FreePool (BdsLoadOption); > - > - if (DefaultBootArgument == (CHAR16*)PcdGetPtr (PcdDefaultBootArgument)) { > - FreePool (AsciiDefaultBootArgument); > - } else if (DefaultBootArgument != NULL) { > - FreePool (DefaultBootArgument); > - } > - } else { > - Status = EFI_UNSUPPORTED; > - } > - } > - > - return Status; > -} > - > -EFI_STATUS > -StartDefaultBootOnTimeout ( > - VOID > - ) > -{ > - UINTN Size; > - UINT16 Timeout; > - UINT16 *TimeoutPtr; > - EFI_EVENT WaitList[2]; > - UINTN WaitIndex; > - UINT16 *BootOrder; > - UINTN BootOrderSize; > - UINTN Index; > - CHAR16 BootVariableName[9]; > - EFI_STATUS Status; > - EFI_INPUT_KEY Key; > - > - Size = sizeof(UINT16); > - Timeout = (UINT16)PcdGet16 (PcdPlatformBootTimeOut); > - Status = GetGlobalEnvironmentVariable (L"Timeout", &Timeout, &Size, (VOID**)&TimeoutPtr); > - if (!EFI_ERROR (Status)) { > - Timeout = *TimeoutPtr; > - FreePool (TimeoutPtr); > - } > - > - if (Timeout != 0xFFFF) { > - if (Timeout > 0) { > - // Create the waiting events (keystroke and 1sec timer) > - gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &WaitList[0]); > - gBS->SetTimer (WaitList[0], TimerPeriodic, EFI_SET_TIMER_TO_SECOND); > - WaitList[1] = gST->ConIn->WaitForKey; > - > - // Start the timer > - WaitIndex = 0; > - Print(L"The default boot selection will start in "); > - while ((Timeout > 0) && (WaitIndex == 0)) { > - Print(L"%3d seconds",Timeout); > - gBS->WaitForEvent (2, WaitList, &WaitIndex); > - if (WaitIndex == 0) { > - Print(L"\b\b\b\b\b\b\b\b\b\b\b"); > - Timeout--; > - } > - } > - // Discard key in the buffer > - do { > - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); > - } while(!EFI_ERROR(Status)); > - gBS->CloseEvent (WaitList[0]); > - Print(L"\n\r"); > - } > - > - // In case of Timeout we start the default boot selection > - if (Timeout == 0) { > - // Get the Boot Option Order from the environment variable (a default value should have been created) > - GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder); > - > - for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) { > - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BootOrder[Index]); > - Status = BdsStartBootOption (BootVariableName); > - if(!EFI_ERROR(Status)){ > - // Boot option returned successfully, hence don't need to start next boot option > - break; > - } > - // In case of success, we should not return from this call. > - } > - FreePool (BootOrder); > - } > - } > - return EFI_SUCCESS; > -} > - > -/** > - An empty function to pass error checking of CreateEventEx (). > - > - @param Event Event whose notification function is being invoked. > - @param Context Pointer to the notification function's context, > - which is implementation-dependent. > - > -**/ > -VOID > -EFIAPI > -EmptyCallbackFunction ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - return; > -} > - > -/** > - This function uses policy data from the platform to determine what operating > - system or system utility should be loaded and invoked. This function call > - also optionally make the use of user input to determine the operating system > - or system utility to be loaded and invoked. When the DXE Core has dispatched > - all the drivers on the dispatch queue, this function is called. This > - function will attempt to connect the boot devices required to load and invoke > - the selected operating system or system utility. During this process, > - additional firmware volumes may be discovered that may contain addition DXE > - drivers that can be dispatched by the DXE Core. If a boot device cannot be > - fully connected, this function calls the DXE Service Dispatch() to allow the > - DXE drivers from any newly discovered firmware volumes to be dispatched. > - Then the boot device connection can be attempted again. If the same boot > - device connection operation fails twice in a row, then that boot device has > - failed, and should be skipped. This function should never return. > - > - @param This The EFI_BDS_ARCH_PROTOCOL instance. > - > - @return None. > - > -**/ > -VOID > -EFIAPI > -BdsEntry ( > - IN EFI_BDS_ARCH_PROTOCOL *This > - ) > -{ > - UINTN Size; > - EFI_STATUS Status; > - UINT16 *BootNext; > - UINTN BootNextSize; > - CHAR16 BootVariableName[9]; > - EFI_EVENT EndOfDxeEvent; > - > - // > - // Signal EndOfDxe PI Event > - // > - Status = gBS->CreateEventEx ( > - EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - EmptyCallbackFunction, > - NULL, > - &gEfiEndOfDxeEventGroupGuid, > - &EndOfDxeEvent > - ); > - if (!EFI_ERROR (Status)) { > - gBS->SignalEvent (EndOfDxeEvent); > - } > - > - PERF_END (NULL, "DXE", NULL, 0); > - > - // > - // Declare the Firmware Vendor > - // > - if (FixedPcdGetPtr(PcdFirmwareVendor) != NULL) { > - Size = 0x100; > - gST->FirmwareVendor = AllocateRuntimePool (Size); > - ASSERT (gST->FirmwareVendor != NULL); > - UnicodeSPrint (gST->FirmwareVendor, Size, L"%a EFI %a %a", PcdGetPtr(PcdFirmwareVendor), __DATE__, __TIME__); > - } > - > - // > - // Fixup Table CRC after we updated Firmware Vendor > - // > - gST->Hdr.CRC32 = 0; > - Status = gBS->CalculateCrc32 ((VOID*)gST, gST->Hdr.HeaderSize, &gST->Hdr.CRC32); > - ASSERT_EFI_ERROR (Status); > - > - // Now we need to setup the EFI System Table with information about the console devices. > - InitializeConsole (); > - > - // If BootNext environment variable is defined then we just load it ! > - BootNextSize = sizeof(UINT16); > - Status = GetGlobalEnvironmentVariable (L"BootNext", NULL, &BootNextSize, (VOID**)&BootNext); > - if (!EFI_ERROR(Status)) { > - ASSERT(BootNextSize == sizeof(UINT16)); > - > - // Generate the requested Boot Entry variable name > - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", *BootNext); > - > - // Set BootCurrent variable > - gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, > - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - BootNextSize, BootNext); > - > - FreePool (BootNext); > - > - // Start the requested Boot Entry > - Status = BdsStartBootOption (BootVariableName); > - if (Status != EFI_NOT_FOUND) { > - // BootNext has not been succeeded launched > - if (EFI_ERROR(Status)) { > - Print(L"Fail to start BootNext.\n"); > - } > - > - // Delete the BootNext environment variable > - gRT->SetVariable (L"BootNext", &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - 0, NULL); > - } > - > - // Clear BootCurrent variable > - gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, > - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - 0, NULL); > - } > - > - // If Boot Order does not exist then create a default entry > - DefineDefaultBootEntries (); > - > - // > - // Update the CRC32 in the EFI System Table header > - // > - gST->Hdr.CRC32 = 0; > - Status = gBS->CalculateCrc32 ((VOID*)gST, gST->Hdr.HeaderSize, &gST->Hdr.CRC32); > - ASSERT_EFI_ERROR (Status); > - > - // Timer before initiating the default boot selection > - StartDefaultBootOnTimeout (); > - > - // Start the Boot Menu > - Status = BootMenuMain (); > - ASSERT_EFI_ERROR (Status); > - > -} > - > -EFI_BDS_ARCH_PROTOCOL gBdsProtocol = { > - BdsEntry, > -}; > - > -EFI_STATUS > -EFIAPI > -BdsInitialize ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ) > -{ > - EFI_STATUS Status; > - > - Status = gBS->InstallMultipleProtocolInterfaces ( > - &ImageHandle, > - &gEfiBdsArchProtocolGuid, &gBdsProtocol, > - NULL > - ); > - ASSERT_EFI_ERROR (Status); > - > - return Status; > -} > diff --git a/ArmPlatformPkg/Bds/Bds.inf b/ArmPlatformPkg/Bds/Bds.inf > deleted file mode 100644 > index 96bec16f0a2e..000000000000 > --- a/ArmPlatformPkg/Bds/Bds.inf > +++ /dev/null > @@ -1,90 +0,0 @@ > -#/** @file > -# > -# Component description file for Bds module > -# > -# Copyright (c) 2011-2015, ARM Ltd. All rights reserved.<BR> > -# > -# This program and the accompanying materials > -# are licensed and made available under the terms and conditions of the BSD License > -# which accompanies this distribution. The full text of the license may be found at > -# http://opensource.org/licenses/bsd-license.php > -# > -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -# > -#**/ > - > - > -[Defines] > - INF_VERSION = 0x00010005 > - BASE_NAME = ArmPlatformBds > - FILE_GUID = 5a50aa81-c3ae-4608-a0e3-41a2e69baf94 > - MODULE_TYPE = DXE_DRIVER > - VERSION_STRING = 1.0 > - > - ENTRY_POINT = BdsInitialize > - > -[Sources] > - Bds.c > - BdsHelper.c > - BootLinux.c > - BootMenu.c > - BootOption.c > - BootOptionSupport.c > - > -[Packages] > - MdePkg/MdePkg.dec > - MdeModulePkg/MdeModulePkg.dec > - ArmPkg/ArmPkg.dec > - ArmPlatformPkg/ArmPlatformPkg.dec > - EmbeddedPkg/EmbeddedPkg.dec > - IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec > - > -[Guids] > - gFdtTableGuid > - > -[LibraryClasses] > - BdsLib > - UefiBootServicesTableLib > - DxeServicesTableLib > - UefiDriverEntryPoint > - DebugLib > - PerformanceLib > - PrintLib > - BaseLib > - FdtLib > - NetLib > - > -[Guids] > - gEfiEndOfDxeEventGroupGuid > - gEfiFileSystemInfoGuid > - gFdtVariableGuid > - > -[Protocols] > - gEfiBdsArchProtocolGuid > - gEfiBlockIoProtocolGuid > - gEfiSimpleTextInProtocolGuid > - gEfiPxeBaseCodeProtocolGuid > - gEfiSimpleNetworkProtocolGuid > - gEfiDevicePathToTextProtocolGuid > - gEfiFirmwareVolumeBlockProtocolGuid > - gEfiFirmwareVolumeBlock2ProtocolGuid > - gEfiDhcp4ServiceBindingProtocolGuid > - gEfiMtftp4ServiceBindingProtocolGuid > - > -[FeaturePcd] > - gArmPlatformTokenSpaceGuid.PcdBdsLinuxSupport > - > -[Pcd] > - gArmPlatformTokenSpaceGuid.PcdFirmwareVendor > - gArmPlatformTokenSpaceGuid.PcdDefaultBootDescription > - gArmPlatformTokenSpaceGuid.PcdDefaultBootDevicePath > - gArmPlatformTokenSpaceGuid.PcdDefaultBootArgument > - gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut > - gArmPlatformTokenSpaceGuid.PcdDefaultConInPaths > - gArmPlatformTokenSpaceGuid.PcdDefaultConOutPaths > - > - gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile > - > -[Depex] > - TRUE > diff --git a/ArmPlatformPkg/Bds/BdsHelper.c b/ArmPlatformPkg/Bds/BdsHelper.c > deleted file mode 100644 > index 732292cdb94a..000000000000 > --- a/ArmPlatformPkg/Bds/BdsHelper.c > +++ /dev/null > @@ -1,465 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011 - 2014, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#include <Library/NetLib.h> > -#include "BdsInternal.h" > - > -EFI_STATUS > -EditHIInputStr ( > - IN OUT CHAR16 *CmdLine, > - IN UINTN MaxCmdLine > - ) > -{ > - UINTN CmdLineIndex; > - UINTN WaitIndex; > - CHAR8 Char; > - EFI_INPUT_KEY Key; > - EFI_STATUS Status; > - > - // The command line must be at least one character long > - ASSERT (MaxCmdLine > 0); > - > - // Ensure the last character of the buffer is the NULL character > - CmdLine[MaxCmdLine - 1] = '\0'; > - > - Print (CmdLine); > - > - // To prevent a buffer overflow, we only allow to enter (MaxCmdLine-1) characters > - for (CmdLineIndex = StrLen (CmdLine); CmdLineIndex < MaxCmdLine; ) { > - Status = gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &WaitIndex); > - ASSERT_EFI_ERROR (Status); > - > - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); > - ASSERT_EFI_ERROR (Status); > - > - // Unicode character is valid when Scancode is NUll > - if (Key.ScanCode == SCAN_NULL) { > - // Scan code is NUll, hence read Unicode character > - Char = (CHAR8)Key.UnicodeChar; > - } else { > - Char = CHAR_NULL; > - } > - > - if ((Char == CHAR_LINEFEED) || (Char == CHAR_CARRIAGE_RETURN) || (Char == 0x7f)) { > - CmdLine[CmdLineIndex] = '\0'; > - Print (L"\r\n"); > - > - return EFI_SUCCESS; > - } else if ((Key.UnicodeChar == L'\b') || (Key.ScanCode == SCAN_LEFT) || (Key.ScanCode == SCAN_DELETE)){ > - if (CmdLineIndex != 0) { > - CmdLineIndex--; > - Print (L"\b \b"); > - } > - } else if ((Key.ScanCode == SCAN_ESC) || (Char == 0x1B) || (Char == 0x0)) { > - return EFI_INVALID_PARAMETER; > - } else if (CmdLineIndex < (MaxCmdLine-1)) { > - CmdLine[CmdLineIndex++] = Key.UnicodeChar; > - Print (L"%c", Key.UnicodeChar); > - } > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -GetHIInputStr ( > - IN OUT CHAR16 *CmdLine, > - IN UINTN MaxCmdLine > - ) > -{ > - EFI_STATUS Status; > - > - // For a new input just passed an empty string > - CmdLine[0] = L'\0'; > - > - Status = EditHIInputStr (CmdLine, MaxCmdLine); > - > - return Status; > -} > - > -EFI_STATUS > -EditHIInputAscii ( > - IN OUT CHAR8 *CmdLine, > - IN UINTN MaxCmdLine > - ) > -{ > - CHAR16* Str; > - EFI_STATUS Status; > - > - Str = (CHAR16*)AllocatePool (MaxCmdLine * sizeof(CHAR16)); > - AsciiStrToUnicodeStr (CmdLine, Str); > - > - Status = EditHIInputStr (Str, MaxCmdLine); > - if (!EFI_ERROR(Status)) { > - UnicodeStrToAsciiStr (Str, CmdLine); > - } > - FreePool (Str); > - > - return Status; > -} > - > -EFI_STATUS > -GetHIInputAscii ( > - IN OUT CHAR8 *CmdLine, > - IN UINTN MaxCmdLine > - ) > -{ > - // For a new input just passed an empty string > - CmdLine[0] = '\0'; > - > - return EditHIInputAscii (CmdLine,MaxCmdLine); > -} > - > -EFI_STATUS > -GetHIInputInteger ( > - OUT UINTN *Integer > - ) > -{ > - CHAR16 CmdLine[255]; > - EFI_STATUS Status; > - > - CmdLine[0] = '\0'; > - Status = EditHIInputStr (CmdLine, 255); > - if (!EFI_ERROR(Status)) { > - *Integer = StrDecimalToUintn (CmdLine); > - } > - > - return Status; > -} > - > -/** > - Get an IPv4 address > - > - The function asks the user for an IPv4 address. If the input > - string defines a valid IPv4 address, the four bytes of the > - corresponding IPv4 address are extracted from the string and returned by > - the function. As long as the user does not define a valid IP > - address, he is asked for one. He can always escape by > - pressing ESC. > - > - @param[out] EFI_IP_ADDRESS OutIpAddr Returned IPv4 address. Valid if > - and only if the returned value > - is equal to EFI_SUCCESS > - > - @retval EFI_SUCCESS Input completed > - @retval EFI_ABORTED Editing aborted by the user > - @retval EFI_OUT_OF_RESOURCES Fail to perform the operation due to > - lack of resource > -**/ > -EFI_STATUS > -GetHIInputIP ( > - OUT EFI_IP_ADDRESS *OutIpAddr > - ) > -{ > - EFI_STATUS Status; > - CHAR16 CmdLine[48]; > - > - while (TRUE) { > - CmdLine[0] = '\0'; > - Status = EditHIInputStr (CmdLine, 48); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - > - Status = NetLibStrToIp4 (CmdLine, &OutIpAddr->v4); > - if (Status == EFI_INVALID_PARAMETER) { > - Print (L"Invalid address\n"); > - } else { > - return Status; > - } > - } > -} > - > -/** > - Edit an IPv4 address > - > - The function displays as a string following the "%d.%d.%d.%d" format the > - IPv4 address that is passed in and asks the user to modify it. If the > - resulting string defines a valid IPv4 address, the four bytes of the > - corresponding IPv4 address are extracted from the string and returned by > - the function. As long as the user does not define a valid IP > - address, he is asked for one. He can always escape by > - pressing ESC. > - > - @param[in ] EFI_IP_ADDRESS InIpAddr Input IPv4 address > - @param[out] EFI_IP_ADDRESS OutIpAddr Returned IPv4 address. Valid if > - and only if the returned value > - is equal to EFI_SUCCESS > - > - @retval EFI_SUCCESS Update completed > - @retval EFI_ABORTED Editing aborted by the user > - @retval EFI_INVALID_PARAMETER The string returned by the user is > - mal-formated > - @retval EFI_OUT_OF_RESOURCES Fail to perform the operation due to > - lack of resource > -**/ > -EFI_STATUS > -EditHIInputIP ( > - IN EFI_IP_ADDRESS *InIpAddr, > - OUT EFI_IP_ADDRESS *OutIpAddr > - ) > -{ > - EFI_STATUS Status; > - CHAR16 CmdLine[48]; > - > - while (TRUE) { > - UnicodeSPrint ( > - CmdLine, 48, L"%d.%d.%d.%d", > - InIpAddr->v4.Addr[0], InIpAddr->v4.Addr[1], > - InIpAddr->v4.Addr[2], InIpAddr->v4.Addr[3] > - ); > - > - Status = EditHIInputStr (CmdLine, 48); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - Status = NetLibStrToIp4 (CmdLine, &OutIpAddr->v4); > - if (Status == EFI_INVALID_PARAMETER) { > - Print (L"Invalid address\n"); > - } else { > - return Status; > - } > - } > -} > - > -EFI_STATUS > -GetHIInputBoolean ( > - OUT BOOLEAN *Value > - ) > -{ > - CHAR16 CmdBoolean[2]; > - EFI_STATUS Status; > - > - while(1) { > - Print (L"[y/n] "); > - Status = GetHIInputStr (CmdBoolean, 2); > - if (EFI_ERROR(Status)) { > - return Status; > - } else if ((CmdBoolean[0] == L'y') || (CmdBoolean[0] == L'Y')) { > - if (Value) *Value = TRUE; > - return EFI_SUCCESS; > - } else if ((CmdBoolean[0] == L'n') || (CmdBoolean[0] == L'N')) { > - if (Value) *Value = FALSE; > - return EFI_SUCCESS; > - } > - } > -} > - > -// Return the last non end-type Device Path Node from a Device Path > -EFI_DEVICE_PATH* > -GetLastDevicePathNode ( > - IN EFI_DEVICE_PATH* DevicePath > - ) > -{ > - EFI_DEVICE_PATH* PrevDevicePathNode; > - > - PrevDevicePathNode = DevicePath; > - while (!IsDevicePathEndType (DevicePath)) { > - PrevDevicePathNode = DevicePath; > - DevicePath = NextDevicePathNode (DevicePath); > - } > - > - return PrevDevicePathNode; > -} > - > -EFI_STATUS > -GenerateDeviceDescriptionName ( > - IN EFI_HANDLE Handle, > - IN OUT CHAR16* Description > - ) > -{ > - EFI_STATUS Status; > - EFI_COMPONENT_NAME_PROTOCOL* ComponentName2Protocol; > - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; > - CHAR16* DriverName; > - CHAR16* DevicePathTxt; > - EFI_DEVICE_PATH* DevicePathNode; > - > - ComponentName2Protocol = NULL; > - Status = gBS->HandleProtocol (Handle, &gEfiComponentName2ProtocolGuid, (VOID **)&ComponentName2Protocol); > - if (!EFI_ERROR(Status)) { > - //TODO: Fixme. we must find the best langague > - Status = ComponentName2Protocol->GetDriverName (ComponentName2Protocol,"en",&DriverName); > - if (!EFI_ERROR(Status)) { > - StrnCpy (Description, DriverName, BOOT_DEVICE_DESCRIPTION_MAX); > - } > - } > - > - if (EFI_ERROR(Status)) { > - // Use the lastest non null entry of the Device path as a description > - Status = gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID **)&DevicePathProtocol); > - if (EFI_ERROR(Status)) { > - return Status; > - } > - > - // Convert the last non end-type Device Path Node in text for the description > - DevicePathNode = GetLastDevicePathNode (DevicePathProtocol); > - Status = gBS->LocateProtocol (&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); > - ASSERT_EFI_ERROR(Status); > - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (DevicePathNode, TRUE, TRUE); > - StrnCpy (Description, DevicePathTxt, BOOT_DEVICE_DESCRIPTION_MAX); > - FreePool (DevicePathTxt); > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BdsStartBootOption ( > - IN CHAR16* BootOption > - ) > -{ > - EFI_STATUS Status; > - BDS_LOAD_OPTION *BdsLoadOption; > - > - Status = BootOptionFromLoadOptionVariable (BootOption, &BdsLoadOption); > - if (!EFI_ERROR(Status)) { > - Status = BootOptionStart (BdsLoadOption); > - FreePool (BdsLoadOption); > - > - if (!EFI_ERROR(Status)) { > - Status = EFI_SUCCESS; > - } else { > - Status = EFI_NOT_STARTED; > - } > - } else { > - Status = EFI_NOT_FOUND; > - } > - return Status; > -} > - > -UINTN > -GetUnalignedDevicePathSize ( > - IN EFI_DEVICE_PATH* DevicePath > - ) > -{ > - UINTN Size; > - EFI_DEVICE_PATH* AlignedDevicePath; > - > - if ((UINTN)DevicePath & 0x1) { > - AlignedDevicePath = DuplicateDevicePath (DevicePath); > - Size = GetDevicePathSize (AlignedDevicePath); > - FreePool (AlignedDevicePath); > - } else { > - Size = GetDevicePathSize (DevicePath); > - } > - return Size; > -} > - > -EFI_DEVICE_PATH* > -GetAlignedDevicePath ( > - IN EFI_DEVICE_PATH* DevicePath > - ) > -{ > - if ((UINTN)DevicePath & 0x1) { > - return DuplicateDevicePath (DevicePath); > - } else { > - return DevicePath; > - } > -} > - > -BOOLEAN > -IsUnicodeString ( > - IN VOID* String > - ) > -{ > - // We do not support NULL pointer > - ASSERT (String != NULL); > - > - if (*(CHAR16*)String < 0x100) { > - //Note: We could get issue if the string is an empty Ascii string... > - return TRUE; > - } else { > - return FALSE; > - } > -} > - > -/* > - * Try to detect if the given string is an ASCII or Unicode string > - * > - * There are actually few limitation to this function but it is mainly to give > - * a user friendly output. > - * > - * Some limitations: > - * - it only supports unicode string that use ASCII character (< 0x100) > - * - single character ASCII strings are interpreted as Unicode string > - * - string cannot be longer than BOOT_DEVICE_OPTION_MAX characters and > - * thus (BOOT_DEVICE_OPTION_MAX*2) bytes for an Unicode string and > - * BOOT_DEVICE_OPTION_MAX bytes for an ASCII string. > - * > - * @param String Buffer that might contain a Unicode or Ascii string > - * @param IsUnicode If not NULL this boolean value returns if the string is an > - * ASCII or Unicode string. > - */ > -BOOLEAN > -IsPrintableString ( > - IN VOID* String, > - OUT BOOLEAN *IsUnicode > - ) > -{ > - BOOLEAN UnicodeDetected; > - BOOLEAN IsPrintable; > - UINTN Index; > - CHAR16 Character; > - > - // We do not support NULL pointer > - ASSERT (String != NULL); > - > - // Test empty string > - if (*(CHAR16*)String == L'\0') { > - if (IsUnicode) { > - *IsUnicode = TRUE; > - } > - return TRUE; > - } else if (*(CHAR16*)String == '\0') { > - if (IsUnicode) { > - *IsUnicode = FALSE; > - } > - return TRUE; > - } > - > - // Limitation: if the string is an ASCII single character string. This comparison > - // will assume it is a Unicode string. > - if (*(CHAR16*)String < 0x100) { > - UnicodeDetected = TRUE; > - } else { > - UnicodeDetected = FALSE; > - } > - > - IsPrintable = FALSE; > - for (Index = 0; Index < BOOT_DEVICE_OPTION_MAX; Index++) { > - if (UnicodeDetected) { > - Character = ((CHAR16*)String)[Index]; > - } else { > - Character = ((CHAR8*)String)[Index]; > - } > - > - if (Character == '\0') { > - // End of the string > - IsPrintable = TRUE; > - break; > - } else if ((Character < 0x20) || (Character > 0x7f)) { > - // We only support the range of printable ASCII character > - IsPrintable = FALSE; > - break; > - } > - } > - > - if (IsPrintable && IsUnicode) { > - *IsUnicode = UnicodeDetected; > - } > - > - return IsPrintable; > -} > diff --git a/ArmPlatformPkg/Bds/BdsInternal.h b/ArmPlatformPkg/Bds/BdsInternal.h > deleted file mode 100644 > index ddf5308e8b23..000000000000 > --- a/ArmPlatformPkg/Bds/BdsInternal.h > +++ /dev/null > @@ -1,277 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011-2015, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#ifndef _BDSINTERNAL_H_ > -#define _BDSINTERNAL_H_ > - > -#include <PiDxe.h> > -#include <Library/BaseMemoryLib.h> > -#include <Library/BdsLib.h> > -#include <Library/DebugLib.h> > -#include <Library/DevicePathLib.h> > -#include <Library/UefiLib.h> > -#include <Library/PrintLib.h> > -#include <Library/PcdLib.h> > -#include <Library/MemoryAllocationLib.h> > -#include <Library/UefiBootServicesTableLib.h> > -#include <Library/UefiRuntimeServicesTableLib.h> > - > -#include <Protocol/DevicePathFromText.h> > -#include <Protocol/DevicePathToText.h> > - > -#include <Guid/GlobalVariable.h> > -#include <Guid/Fdt.h> > - > -#define BOOT_DEVICE_DESCRIPTION_MAX 100 > -#define BOOT_DEVICE_FILEPATH_MAX 100 > -#define BOOT_DEVICE_OPTION_MAX 300 > -#define BOOT_DEVICE_ADDRESS_MAX (sizeof(L"0x0000000000000000")) > - > -#define UPDATE_BOOT_ENTRY L"Update entry: " > -#define DELETE_BOOT_ENTRY L"Delete entry: " > -#define MOVE_BOOT_ENTRY L"Move entry: " > - > -typedef struct { > - LIST_ENTRY Link; > - BDS_LOAD_OPTION* BdsLoadOption; > -} BDS_LOAD_OPTION_ENTRY; > - > -typedef enum { > - BDS_DEVICE_FILESYSTEM = 0, > - BDS_DEVICE_MEMMAP, > - BDS_DEVICE_PXE, > - BDS_DEVICE_TFTP, > - BDS_DEVICE_MAX > -} BDS_SUPPORTED_DEVICE_TYPE; > - > -typedef struct { > - LIST_ENTRY Link; > - CHAR16 Description[BOOT_DEVICE_DESCRIPTION_MAX]; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; > - struct _BDS_LOAD_OPTION_SUPPORT* Support; > -} BDS_SUPPORTED_DEVICE; > - > -#define SUPPORTED_BOOT_DEVICE_FROM_LINK(a) BASE_CR(a, BDS_SUPPORTED_DEVICE, Link) > - > -typedef struct _BDS_LOAD_OPTION_SUPPORT { > - BDS_SUPPORTED_DEVICE_TYPE Type; > - EFI_STATUS (*ListDevices)(IN OUT LIST_ENTRY* BdsLoadOptionList); > - BOOLEAN (*IsSupported)(IN EFI_DEVICE_PATH *DevicePath); > - EFI_STATUS (*CreateDevicePathNode)(IN CHAR16* FileName, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes); > - EFI_STATUS (*UpdateDevicePathNode)(IN EFI_DEVICE_PATH *OldDevicePath, IN CHAR16* FileName, OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath); > - > - /// Define if the boot menu should request if the file is a EFI binary or a Linux kernel > - /// Example: PXE boot always deliver a UEFI application. > - BOOLEAN RequestBootType; > -} BDS_LOAD_OPTION_SUPPORT; > - > -#define LOAD_OPTION_ENTRY_FROM_LINK(a) BASE_CR(a, BDS_LOAD_OPTION_ENTRY, Link) > -#define LOAD_OPTION_FROM_LINK(a) ((BDS_LOAD_OPTION_ENTRY*)BASE_CR(a, BDS_LOAD_OPTION_ENTRY, Link))->BdsLoadOption > - > -// GUID of the EFI Linux Loader > -extern CONST EFI_GUID mLinuxLoaderAppGuid; > - > -// Device path of the EFI Linux Loader in the Firmware Volume > -extern EFI_DEVICE_PATH* mLinuxLoaderDevicePath; > - > -EFI_STATUS > -BootDeviceListSupportedInit ( > - IN OUT LIST_ENTRY *SupportedDeviceList > - ); > - > -EFI_STATUS > -BootDeviceListSupportedFree ( > - IN LIST_ENTRY *SupportedDeviceList, > - IN BDS_SUPPORTED_DEVICE *Except > - ); > - > -EFI_STATUS > -BootDeviceGetDeviceSupport ( > - IN EFI_DEVICE_PATH *DevicePath, > - OUT BDS_LOAD_OPTION_SUPPORT **DeviceSupport > - ); > - > -EFI_STATUS > -GetHIInputStr ( > - IN OUT CHAR16 *CmdLine, > - IN UINTN MaxCmdLine > - ); > - > -EFI_STATUS > -EditHIInputStr ( > - IN OUT CHAR16 *CmdLine, > - IN UINTN MaxCmdLine > - ); > - > -EFI_STATUS > -GetHIInputAscii ( > - IN OUT CHAR8 *CmdLine, > - IN UINTN MaxCmdLine > - ); > - > -EFI_STATUS > -EditHIInputAscii ( > - IN OUT CHAR8 *CmdLine, > - IN UINTN MaxCmdLine > - ); > - > -EFI_STATUS > -GetHIInputInteger ( > - IN OUT UINTN *Integer > - ); > - > -EFI_STATUS > -GetHIInputIP ( > - OUT EFI_IP_ADDRESS *Ip > - ); > - > -EFI_STATUS > -EditHIInputIP ( > - IN EFI_IP_ADDRESS *InIpAddr, > - OUT EFI_IP_ADDRESS *OutIpAddr > - ); > - > -EFI_STATUS > -GetHIInputBoolean ( > - OUT BOOLEAN *Value > - ); > - > -EFI_DEVICE_PATH* > -GetLastDevicePathNode ( > - IN EFI_DEVICE_PATH* DevicePath > - ); > - > -EFI_STATUS > -BdsStartBootOption ( > - IN CHAR16* BootOption > - ); > - > -UINTN > -GetUnalignedDevicePathSize ( > - IN EFI_DEVICE_PATH* DevicePath > - ); > - > -EFI_DEVICE_PATH* > -GetAlignedDevicePath ( > - IN EFI_DEVICE_PATH* DevicePath > - ); > - > -EFI_STATUS > -GenerateDeviceDescriptionName ( > - IN EFI_HANDLE Handle, > - IN OUT CHAR16* Description > - ); > - > -EFI_STATUS > -BootOptionList ( > - IN OUT LIST_ENTRY *BootOptionList > - ); > - > -EFI_STATUS > -BootOptionParseLoadOption ( > - IN EFI_LOAD_OPTION EfiLoadOption, > - IN UINTN EfiLoadOptionSize, > - OUT BDS_LOAD_OPTION **BdsLoadOption > - ); > - > -EFI_STATUS > -BootOptionStart ( > - IN BDS_LOAD_OPTION *BootOption > - ); > - > -EFI_STATUS > -BootOptionCreate ( > - IN UINT32 Attributes, > - IN CHAR16* BootDescription, > - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, > - IN UINT8* OptionalData, > - IN UINTN OptionalDataSize, > - OUT BDS_LOAD_OPTION** BdsLoadOption > - ); > - > -EFI_STATUS > -BootOptionUpdate ( > - IN BDS_LOAD_OPTION* BdsLoadOption, > - IN UINT32 Attributes, > - IN CHAR16* BootDescription, > - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, > - IN UINT8* OptionalData, > - IN UINTN OptionalDataSize > - ); > - > -EFI_STATUS > -BootOptionDelete ( > - IN BDS_LOAD_OPTION *BootOption > - ); > - > -EFI_STATUS > -BootMenuMain ( > - VOID > - ); > - > -BOOLEAN > -IsUnicodeString ( > - IN VOID* String > - ); > - > -/* > - * Try to detect if the given string is an ASCII or Unicode string > - * > - * There are actually few limitation to this function but it is mainly to give > - * a user friendly output. > - * > - * Some limitations: > - * - it only supports unicode string that use ASCII character (< 0x100) > - * - single character ASCII strings are interpreted as Unicode string > - * - string cannot be longer than 2 x BOOT_DEVICE_OPTION_MAX (600 bytes) > - * > - * @param String Buffer that might contain a Unicode or Ascii string > - * @param IsUnicode If not NULL this boolean value returns if the string is an > - * ASCII or Unicode string. > - */ > -BOOLEAN > -IsPrintableString ( > - IN VOID* String, > - OUT BOOLEAN *IsUnicode > - ); > - > -/** > - An empty function to pass error checking of CreateEventEx (). > - > - @param Event Event whose notification function is being invoked. > - @param Context Pointer to the notification function's context, > - which is implementation-dependent. > - > -**/ > -VOID > -EFIAPI > -EmptyCallbackFunction ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ); > - > -/** > - * This function check if the DevicePath defines an EFI binary > - * > - * This function is used when the BDS support Linux loader to > - * detect if the binary is an EFI application or potentially a > - * Linux kernel. > - */ > -EFI_STATUS > -IsEfiBinary ( > - IN EFI_DEVICE_PATH* DevicePath, > - OUT BOOLEAN *EfiBinary > - ); > - > -#endif /* _BDSINTERNAL_H_ */ > diff --git a/ArmPlatformPkg/Bds/BootLinux.c b/ArmPlatformPkg/Bds/BootLinux.c > deleted file mode 100644 > index 0445e894e153..000000000000 > --- a/ArmPlatformPkg/Bds/BootLinux.c > +++ /dev/null > @@ -1,124 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011 - 2015, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#include "BdsInternal.h" > - > -// 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 of the EFI Linux Loader in the Firmware Volume > -EFI_DEVICE_PATH* mLinuxLoaderDevicePath = NULL; > - > -STATIC > -BOOLEAN > -HasFilePathEfiExtension ( > - IN CHAR16* FilePath > - ) > -{ > - return (StrCmp (FilePath + (StrSize (FilePath) / sizeof (CHAR16)) - 5, L".EFI") == 0) || > - (StrCmp (FilePath + (StrSize (FilePath) / sizeof (CHAR16)) - 5, L".efi") == 0); > -} > - > -/** > - * This function check if the DevicePath defines an EFI binary > - * > - * This function is used when the BDS support Linux loader to > - * detect if the binary is an EFI application or potentially a > - * Linux kernel. > - */ > -EFI_STATUS > -IsEfiBinary ( > - IN EFI_DEVICE_PATH* DevicePath, > - OUT BOOLEAN *EfiBinary > - ) > -{ > - EFI_STATUS Status; > - CHAR16* FileName; > - EFI_DEVICE_PATH* PrevDevicePathNode; > - EFI_DEVICE_PATH* DevicePathNode; > - EFI_PHYSICAL_ADDRESS Image; > - UINTN FileSize; > - EFI_IMAGE_DOS_HEADER* DosHeader; > - UINTN PeCoffHeaderOffset; > - EFI_IMAGE_NT_HEADERS32* NtHeader; > - > - ASSERT (EfiBinary != NULL); > - > - // > - // Check if the last node of the device path is a FilePath node > - // > - PrevDevicePathNode = NULL; > - DevicePathNode = DevicePath; > - while ((DevicePathNode != NULL) && !IsDevicePathEnd (DevicePathNode)) { > - PrevDevicePathNode = DevicePathNode; > - DevicePathNode = NextDevicePathNode (DevicePathNode); > - } > - > - if ((PrevDevicePathNode != NULL) && > - (PrevDevicePathNode->Type == MEDIA_DEVICE_PATH) && > - (PrevDevicePathNode->SubType == MEDIA_FILEPATH_DP)) > - { > - FileName = ((FILEPATH_DEVICE_PATH*)PrevDevicePathNode)->PathName; > - } else { > - FileName = NULL; > - } > - > - if (FileName == NULL) { > - Print (L"Is an EFI Application? "); > - Status = GetHIInputBoolean (EfiBinary); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - } else if (HasFilePathEfiExtension (FileName)) { > - *EfiBinary = TRUE; > - } else { > - // Check if the file exist > - Status = BdsLoadImage (DevicePath, AllocateAnyPages, &Image, &FileSize); > - if (!EFI_ERROR (Status)) { > - > - DosHeader = (EFI_IMAGE_DOS_HEADER *)(UINTN) Image; > - if (DosHeader->e_magic == EFI_IMAGE_DOS_SIGNATURE) { > - // > - // DOS image header is present, > - // so read the PE header after the DOS image header. > - // > - PeCoffHeaderOffset = DosHeader->e_lfanew; > - } else { > - PeCoffHeaderOffset = 0; > - } > - > - // > - // Check PE/COFF image. > - // > - NtHeader = (EFI_IMAGE_NT_HEADERS32 *)(UINTN) (Image + PeCoffHeaderOffset); > - if (NtHeader->Signature != EFI_IMAGE_NT_SIGNATURE) { > - *EfiBinary = FALSE; > - } else { > - *EfiBinary = TRUE; > - } > - > - // Free memory > - gBS->FreePages (Image, EFI_SIZE_TO_PAGES (FileSize)); > - } else { > - // If we did not manage to open it then ask for the type > - Print (L"Is an EFI Application? "); > - Status = GetHIInputBoolean (EfiBinary); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - } > - } > - > - return EFI_SUCCESS; > -} > diff --git a/ArmPlatformPkg/Bds/BootMenu.c b/ArmPlatformPkg/Bds/BootMenu.c > deleted file mode 100644 > index 5cbac1d2dc1a..000000000000 > --- a/ArmPlatformPkg/Bds/BootMenu.c > +++ /dev/null > @@ -1,1101 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011 - 2015, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#include "BdsInternal.h" > - > -#include <libfdt.h> > - > -/** > - Worker function that displays the list of boot options that is passed in. > - > - The function loops over the entries of the list of boot options that is passed > - in. For each entry, the boot option description is displayed on a single line > - along with the position of the option in the list. In debug mode, the UEFI > - device path and the arguments of the boot option are displayed as well in > - subsequent lines. > - > - @param[in] BootOptionsList List of the boot options > - > -**/ > -STATIC > -VOID > -DisplayBootOptions ( > - IN LIST_ENTRY* BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - UINTN BootOptionCount; > - LIST_ENTRY *Entry; > - BDS_LOAD_OPTION *BdsLoadOption; > - BOOLEAN IsUnicode; > - > - BootOptionCount = 0 ; > - for (Entry = GetFirstNode (BootOptionsList); > - !IsNull (BootOptionsList, Entry); > - Entry = GetNextNode (BootOptionsList, Entry) > - ) { > - > - BdsLoadOption = LOAD_OPTION_FROM_LINK (Entry); > - Print (L"[%d] %s\n", ++BootOptionCount, BdsLoadOption->Description); > - > - DEBUG_CODE_BEGIN (); > - CHAR16* DevicePathTxt; > - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; > - > - Status = gBS->LocateProtocol ( > - &gEfiDevicePathToTextProtocolGuid, > - NULL, > - (VOID **)&DevicePathToTextProtocol > - ); > - ASSERT_EFI_ERROR (Status); > - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText ( > - BdsLoadOption->FilePathList, > - TRUE, > - TRUE > - ); > - Print (L"\t- %s\n", DevicePathTxt); > - > - if (IsPrintableString (BdsLoadOption->OptionalData, &IsUnicode)) { > - if (IsUnicode) { > - Print (L"\t- Arguments: %s\n", BdsLoadOption->OptionalData); > - } else { > - AsciiPrint ("\t- Arguments: %a\n", BdsLoadOption->OptionalData); > - } > - } > - > - FreePool (DevicePathTxt); > - DEBUG_CODE_END (); > - } > -} > - > -/** > - Worker function that asks for a boot option to be selected and returns a > - pointer to the structure describing the selected boot option. > - > - @param[in] BootOptionsList List of the boot options > - > - @retval EFI_SUCCESS Selection succeeded > - @retval !EFI_SUCCESS Input error or input cancelled > - > -**/ > -STATIC > -EFI_STATUS > -SelectBootOption ( > - IN LIST_ENTRY* BootOptionsList, > - IN CONST CHAR16* InputStatement, > - OUT BDS_LOAD_OPTION_ENTRY** BdsLoadOptionEntry > - ) > -{ > - EFI_STATUS Status; > - UINTN BootOptionCount; > - UINT16 *BootOrder; > - LIST_ENTRY* Entry; > - UINTN BootOptionSelected; > - UINTN Index; > - > - // Get the number of boot options > - Status = GetGlobalEnvironmentVariable ( > - L"BootOrder", NULL, &BootOptionCount, (VOID**)&BootOrder > - ); > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - FreePool (BootOrder); > - BootOptionCount /= sizeof (UINT16); > - > - // Check if a valid boot option(s) is found > - if (BootOptionCount == 0) { > - if (StrCmp (InputStatement, DELETE_BOOT_ENTRY) == 0) { > - Print (L"Nothing to remove!\n"); > - } else if (StrCmp (InputStatement, UPDATE_BOOT_ENTRY) == 0) { > - Print (L"Nothing to update!\n"); > - } else if (StrCmp (InputStatement, MOVE_BOOT_ENTRY) == 0) { > - Print (L"Nothing to move!\n"); > - } else { > - Print (L"No supported Boot Entry.\n"); > - } > - return EFI_NOT_FOUND; > - } > - > - // Get the index of the boot device to delete > - BootOptionSelected = 0; > - while (BootOptionSelected == 0) { > - Print (InputStatement); > - Status = GetHIInputInteger (&BootOptionSelected); > - if (EFI_ERROR (Status)) { > - Print (L"\n"); > - goto ErrorExit; > - } else if ((BootOptionSelected == 0) || (BootOptionSelected > BootOptionCount)) { > - Print (L"Invalid input (max %d)\n", BootOptionCount); > - BootOptionSelected = 0; > - } > - } > - > - // Get the structure of the Boot device to delete > - Index = 1; > - for (Entry = GetFirstNode (BootOptionsList); > - !IsNull (BootOptionsList, Entry); > - Entry = GetNextNode (BootOptionsList,Entry) > - ) > - { > - if (Index == BootOptionSelected) { > - *BdsLoadOptionEntry = LOAD_OPTION_ENTRY_FROM_LINK (Entry); > - break; > - } > - Index++; > - } > - > -ErrorExit: > - return Status; > -} > - > -STATIC > -EFI_STATUS > -SelectBootDevice ( > - OUT BDS_SUPPORTED_DEVICE** SupportedBootDevice > - ) > -{ > - EFI_STATUS Status; > - LIST_ENTRY SupportedDeviceList; > - UINTN SupportedDeviceCount; > - LIST_ENTRY* Entry; > - UINTN SupportedDeviceSelected; > - UINTN Index; > - > - // > - // List the Boot Devices supported > - // > - > - // Start all the drivers first > - BdsConnectAllDrivers (); > - > - // List the supported devices > - Status = BootDeviceListSupportedInit (&SupportedDeviceList); > - ASSERT_EFI_ERROR(Status); > - > - SupportedDeviceCount = 0; > - for (Entry = GetFirstNode (&SupportedDeviceList); > - !IsNull (&SupportedDeviceList,Entry); > - Entry = GetNextNode (&SupportedDeviceList,Entry) > - ) > - { > - *SupportedBootDevice = SUPPORTED_BOOT_DEVICE_FROM_LINK(Entry); > - Print(L"[%d] %s\n",SupportedDeviceCount+1,(*SupportedBootDevice)->Description); > - > - DEBUG_CODE_BEGIN(); > - CHAR16* DevicePathTxt; > - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; > - > - Status = gBS->LocateProtocol (&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); > - ASSERT_EFI_ERROR(Status); > - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText ((*SupportedBootDevice)->DevicePathProtocol,TRUE,TRUE); > - > - Print(L"\t- %s\n",DevicePathTxt); > - > - FreePool(DevicePathTxt); > - DEBUG_CODE_END(); > - > - SupportedDeviceCount++; > - } > - > - if (SupportedDeviceCount == 0) { > - Print(L"There is no supported device.\n"); > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - // > - // Select the Boot Device > - // > - SupportedDeviceSelected = 0; > - while (SupportedDeviceSelected == 0) { > - Print(L"Select the Boot Device: "); > - Status = GetHIInputInteger (&SupportedDeviceSelected); > - if (EFI_ERROR(Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } else if ((SupportedDeviceSelected == 0) || (SupportedDeviceSelected > SupportedDeviceCount)) { > - Print(L"Invalid input (max %d)\n",SupportedDeviceCount); > - SupportedDeviceSelected = 0; > - } > - } > - > - // > - // Get the Device Path for the selected boot device > - // > - Index = 1; > - for (Entry = GetFirstNode (&SupportedDeviceList); > - !IsNull (&SupportedDeviceList,Entry); > - Entry = GetNextNode (&SupportedDeviceList,Entry) > - ) > - { > - if (Index == SupportedDeviceSelected) { > - *SupportedBootDevice = SUPPORTED_BOOT_DEVICE_FROM_LINK(Entry); > - break; > - } > - Index++; > - } > - > -EXIT: > - BootDeviceListSupportedFree (&SupportedDeviceList, *SupportedBootDevice); > - return Status; > -} > - > -EFI_STATUS > -BootMenuAddBootOption ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - BDS_SUPPORTED_DEVICE* SupportedBootDevice; > - CHAR16 BootDescription[BOOT_DEVICE_DESCRIPTION_MAX]; > - CHAR16 CmdLine[BOOT_DEVICE_OPTION_MAX]; > - UINT32 Attributes; > - BDS_LOAD_OPTION_ENTRY *BdsLoadOptionEntry; > - EFI_DEVICE_PATH *DevicePath; > - EFI_DEVICE_PATH_PROTOCOL *DevicePathNodes; > - UINT8* OptionalData; > - UINTN OptionalDataSize; > - BOOLEAN EfiBinary; > - CHAR16 *LinuxDevicePath; > - > - Attributes = 0; > - SupportedBootDevice = NULL; > - > - // List the Boot Devices supported > - Status = SelectBootDevice (&SupportedBootDevice); > - if (EFI_ERROR(Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - // Create the specific device path node > - if (FeaturePcdGet (PcdBdsLinuxSupport) && mLinuxLoaderDevicePath) { > - Status = SupportedBootDevice->Support->CreateDevicePathNode (L"EFI Application or the kernel", &DevicePathNodes); > - } else { > - Status = SupportedBootDevice->Support->CreateDevicePathNode (L"EFI Application", &DevicePathNodes); > - } > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - // Append the Device Path to the selected device path > - DevicePath = AppendDevicePath (SupportedBootDevice->DevicePathProtocol, (CONST EFI_DEVICE_PATH_PROTOCOL *)DevicePathNodes); > - if (DevicePath == NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - goto EXIT; > - } > - > - // Is it an EFI application? > - if (FeaturePcdGet (PcdBdsLinuxSupport) && mLinuxLoaderDevicePath) { > - Status = IsEfiBinary (DevicePath, &EfiBinary); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - if (EfiBinary == FALSE) { > - Print (L"It is assumed the binary is a Linux kernel and the embedded Linux Loader is going to be used.\n"); > - Print (L"Supported command line formats by the embedded Linux Loader:\n"); > - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\"\n"); > - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\" -f <EFI Device Path of the Linux initrd>\n"); > - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\" -a <Machine Type for ATAG Linux kernel>\n"); > - > - // Copy the Linux path into the command line > - LinuxDevicePath = ConvertDevicePathToText (DevicePath, FALSE, FALSE); > - CopyMem (CmdLine, LinuxDevicePath, MAX (sizeof (CmdLine), StrSize (LinuxDevicePath))); > - FreePool (LinuxDevicePath); > - > - // Free the generated Device Path > - FreePool (DevicePath); > - // and use the embedded Linux Loader as the EFI application > - DevicePath = mLinuxLoaderDevicePath; > - } else { > - CmdLine[0] = L'\0'; > - } > - } else { > - CmdLine[0] = L'\0'; > - } > - > - Print (L"Arguments to pass to the EFI Application: "); > - Status = EditHIInputStr (CmdLine, BOOT_DEVICE_OPTION_MAX); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - OptionalData = (UINT8*)CmdLine; > - OptionalDataSize = StrSize (CmdLine); > - > - Print(L"Description for this new Entry: "); > - Status = GetHIInputStr (BootDescription, BOOT_DEVICE_DESCRIPTION_MAX); > - if (EFI_ERROR(Status)) { > - Status = EFI_ABORTED; > - goto FREE_DEVICE_PATH; > - } > - > - // Create new entry > - BdsLoadOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool (sizeof(BDS_LOAD_OPTION_ENTRY)); > - Status = BootOptionCreate (Attributes, BootDescription, DevicePath, OptionalData, OptionalDataSize, &BdsLoadOptionEntry->BdsLoadOption); > - if (!EFI_ERROR(Status)) { > - InsertTailList (BootOptionsList, &BdsLoadOptionEntry->Link); > - } > - > -FREE_DEVICE_PATH: > - FreePool (DevicePath); > - > -EXIT: > - if (Status == EFI_ABORTED) { > - Print(L"\n"); > - } > - FreePool(SupportedBootDevice); > - return Status; > -} > - > -EFI_STATUS > -BootMenuRemoveBootOption ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - BDS_LOAD_OPTION_ENTRY* BootOptionEntry; > - > - DisplayBootOptions (BootOptionsList); > - Status = SelectBootOption (BootOptionsList, DELETE_BOOT_ENTRY, &BootOptionEntry); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - // If the Boot Option was attached to a list remove it > - if (!IsListEmpty (&BootOptionEntry->Link)) { > - // Remove the entry from the list > - RemoveEntryList (&BootOptionEntry->Link); > - } > - > - // Delete the BDS Load option structures > - BootOptionDelete (BootOptionEntry->BdsLoadOption); > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BootMenuUpdateBootOption ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - BDS_LOAD_OPTION_ENTRY *BootOptionEntry; > - BDS_LOAD_OPTION *BootOption; > - BDS_LOAD_OPTION_SUPPORT* DeviceSupport; > - CHAR16 BootDescription[BOOT_DEVICE_DESCRIPTION_MAX]; > - CHAR8 CmdLine[BOOT_DEVICE_OPTION_MAX]; > - CHAR16 UnicodeCmdLine[BOOT_DEVICE_OPTION_MAX]; > - CHAR16 *LinuxDevicePath; > - EFI_DEVICE_PATH *DevicePath; > - UINT8* OptionalData; > - UINTN OptionalDataSize; > - BOOLEAN IsPrintable; > - BOOLEAN IsUnicode; > - BOOLEAN EfiBinary; > - > - DisplayBootOptions (BootOptionsList); > - Status = SelectBootOption (BootOptionsList, UPDATE_BOOT_ENTRY, &BootOptionEntry); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - BootOption = BootOptionEntry->BdsLoadOption; > - > - // Get the device support for this Boot Option > - Status = BootDeviceGetDeviceSupport (BootOption->FilePathList, &DeviceSupport); > - if (EFI_ERROR(Status)) { > - Print(L"Not possible to retrieve the supported device for the update\n"); > - return EFI_UNSUPPORTED; > - } > - > - EfiBinary = TRUE; > - if (FeaturePcdGet (PcdBdsLinuxSupport) && mLinuxLoaderDevicePath) { > - Status = DeviceSupport->UpdateDevicePathNode (BootOption->FilePathList, L"EFI Application or the kernel", &DevicePath); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - // Is it an EFI application? > - Status = IsEfiBinary (DevicePath, &EfiBinary); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - if (EfiBinary == FALSE) { > - Print (L"It is assumed the binary is a Linux kernel and the embedded Linux Loader is going to be used.\n"); > - Print (L"Supported command line formats by the embedded Linux Loader:\n"); > - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\"\n"); > - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\" -f <EFI Device Path of the Linux initrd>\n"); > - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\" -a <Machine Type for ATAG Linux kernel>\n"); > - > - // Copy the Linux path into the command line > - LinuxDevicePath = ConvertDevicePathToText (DevicePath, FALSE, FALSE); > - CopyMem (UnicodeCmdLine, LinuxDevicePath, MAX (sizeof (UnicodeCmdLine), StrSize (LinuxDevicePath))); > - FreePool (LinuxDevicePath); > - > - // Free the generated Device Path > - FreePool (DevicePath); > - // and use the embedded Linux Loader as the EFI application > - DevicePath = mLinuxLoaderDevicePath; > - > - // The command line is a unicode printable string > - IsPrintable = TRUE; > - IsUnicode = TRUE; > - } > - } else { > - Status = DeviceSupport->UpdateDevicePathNode (BootOption->FilePathList, L"EFI Application", &DevicePath); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - } > - > - Print (L"Arguments to pass to the EFI Application: "); > - > - // When the command line has not been initialized by the embedded Linux loader earlier > - if (EfiBinary) { > - if (BootOption->OptionalDataSize > 0) { > - IsPrintable = IsPrintableString (BootOption->OptionalData, &IsUnicode); > - if (IsPrintable) { > - // > - // The size in bytes of the string, final zero included, should > - // be equal to or at least lower than "BootOption->OptionalDataSize" > - // and the "IsPrintableString()" has already tested that the length > - // in number of characters is smaller than BOOT_DEVICE_OPTION_MAX, > - // final '\0' included. We can thus copy the string for editing > - // using "CopyMem()". Furthermore, note that in the case of an Unicode > - // string "StrnCpy()" and "StrCpy()" can not be used to copy the > - // string because the data pointed to by "BootOption->OptionalData" > - // is not necessarily 2-byte aligned. > - // > - if (IsUnicode) { > - CopyMem ( > - UnicodeCmdLine, BootOption->OptionalData, > - MIN (sizeof (UnicodeCmdLine), > - BootOption->OptionalDataSize) > - ); > - } else { > - CopyMem ( > - CmdLine, BootOption->OptionalData, > - MIN (sizeof (CmdLine), > - BootOption->OptionalDataSize) > - ); > - } > - } > - } else { > - UnicodeCmdLine[0] = L'\0'; > - IsPrintable = TRUE; > - IsUnicode = TRUE; > - } > - } > - > - // We do not request arguments for OptionalData that cannot be printed > - if (IsPrintable) { > - if (IsUnicode) { > - Status = EditHIInputStr (UnicodeCmdLine, BOOT_DEVICE_OPTION_MAX); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto FREE_DEVICE_PATH; > - } > - > - OptionalData = (UINT8*)UnicodeCmdLine; > - OptionalDataSize = StrSize (UnicodeCmdLine); > - } else { > - Status = EditHIInputAscii (CmdLine, BOOT_DEVICE_OPTION_MAX); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto FREE_DEVICE_PATH; > - } > - > - OptionalData = (UINT8*)CmdLine; > - OptionalDataSize = AsciiStrSize (CmdLine); > - } > - } else { > - // We keep the former OptionalData > - OptionalData = BootOption->OptionalData; > - OptionalDataSize = BootOption->OptionalDataSize; > - } > - > - Print(L"Description for this new Entry: "); > - StrnCpy (BootDescription, BootOption->Description, BOOT_DEVICE_DESCRIPTION_MAX); > - Status = EditHIInputStr (BootDescription, BOOT_DEVICE_DESCRIPTION_MAX); > - if (EFI_ERROR(Status)) { > - Status = EFI_ABORTED; > - goto FREE_DEVICE_PATH; > - } > - > - // Update the entry > - Status = BootOptionUpdate (BootOption, BootOption->Attributes, BootDescription, DevicePath, OptionalData, OptionalDataSize); > - > -FREE_DEVICE_PATH: > - FreePool (DevicePath); > - > -EXIT: > - if (Status == EFI_ABORTED) { > - Print(L"\n"); > - } > - return Status; > -} > - > -/** > - Reorder boot options > - > - Ask for the boot option to move and then move it when up or down arrows > - are pressed. This function is called when the user selects the "Reorder Boot > - Device Entries" entry in the boot manager menu. > - The order of the boot options in BootOptionList and in the UEFI BootOrder > - global variable are kept coherent until the user confirm his reordering (ie: > - he does not exit by pressing escape). > - > - @param[in] BootOptionsList List of the boot devices constructed in > - BootMenuMain() > - > - @retval EFI_SUCCESS No error encountered. > - @retval !EFI_SUCCESS An error has occured either in the selection of the > - boot option to move or while interacting with the user. > - > -**/ > -STATIC > -EFI_STATUS > -BootMenuReorderBootOptions ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - BDS_LOAD_OPTION_ENTRY *BootOptionEntry; > - LIST_ENTRY *SelectedEntry; > - LIST_ENTRY *PrevEntry; > - BOOLEAN Move; > - BOOLEAN Save; > - BOOLEAN Cancel; > - UINTN WaitIndex; > - EFI_INPUT_KEY Key; > - LIST_ENTRY *SecondEntry; > - UINTN BootOrderSize; > - UINT16 *BootOrder; > - LIST_ENTRY *Entry; > - UINTN Index; > - > - DisplayBootOptions (BootOptionsList); > - > - // Ask to select the boot option to move > - while (TRUE) { > - Status = SelectBootOption (BootOptionsList, MOVE_BOOT_ENTRY, &BootOptionEntry); > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - > - SelectedEntry = &BootOptionEntry->Link; > - SecondEntry = NULL; > - // Note down the previous entry in the list to be able to cancel changes > - PrevEntry = GetPreviousNode (BootOptionsList, SelectedEntry); > - > - // Start of interaction > - while (TRUE) { > - Print ( > - L"* Use up/down arrows to move the entry '%s'", > - BootOptionEntry->BdsLoadOption->Description > - ); > - > - // Wait for a move, save or cancel request > - Move = FALSE; > - Save = FALSE; > - Cancel = FALSE; > - do { > - Status = gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &WaitIndex); > - if (!EFI_ERROR (Status)) { > - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); > - } > - if (EFI_ERROR (Status)) { > - Print (L"\n"); > - goto ErrorExit; > - } > - > - switch (Key.ScanCode) { > - case SCAN_NULL: > - Save = (Key.UnicodeChar == CHAR_LINEFEED) || > - (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) || > - (Key.UnicodeChar == 0x7f); > - break; > - > - case SCAN_UP: > - SecondEntry = GetPreviousNode (BootOptionsList, SelectedEntry); > - Move = SecondEntry != BootOptionsList; > - break; > - > - case SCAN_DOWN: > - SecondEntry = GetNextNode (BootOptionsList, SelectedEntry); > - Move = SecondEntry != BootOptionsList; > - break; > - > - case SCAN_ESC: > - Cancel = TRUE; > - break; > - } > - } while ((!Move) && (!Save) && (!Cancel)); > - > - if (Move) { > - if ((SelectedEntry != NULL) && (SecondEntry != NULL)) { > - SwapListEntries (SelectedEntry, SecondEntry); > - } > - } else { > - if (Save) { > - Status = GetGlobalEnvironmentVariable ( > - L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder > - ); > - BootOrderSize /= sizeof (UINT16); > - > - if (!EFI_ERROR (Status)) { > - // The order of the boot options in the 'BootOptionsList' is the > - // new order that has been just defined by the user. Save this new > - // order in "BootOrder" UEFI global variable. > - Entry = GetFirstNode (BootOptionsList); > - for (Index = 0; Index < BootOrderSize; Index++) { > - BootOrder[Index] = (LOAD_OPTION_FROM_LINK (Entry))->LoadOptionIndex; > - Entry = GetNextNode (BootOptionsList, Entry); > - } > - Status = gRT->SetVariable ( > - (CHAR16*)L"BootOrder", > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | > - EFI_VARIABLE_BOOTSERVICE_ACCESS | > - EFI_VARIABLE_RUNTIME_ACCESS, > - BootOrderSize * sizeof (UINT16), > - BootOrder > - ); > - FreePool (BootOrder); > - } > - > - if (EFI_ERROR (Status)) { > - Print (L"\nAn error occurred, move not completed!\n"); > - Cancel = TRUE; > - } > - } > - > - if (Cancel) { > - // > - // Restore initial position of the selected boot option > - // > - RemoveEntryList (SelectedEntry); > - InsertHeadList (PrevEntry, SelectedEntry); > - } > - } > - > - Print (L"\n"); > - DisplayBootOptions (BootOptionsList); > - // Saved or cancelled, back to the choice of boot option to move > - if (!Move) { > - break; > - } > - } > - } > - > -ErrorExit: > - return Status ; > -} > - > -EFI_STATUS > -UpdateFdtPath ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - BDS_SUPPORTED_DEVICE *SupportedBootDevice; > - EFI_DEVICE_PATH_PROTOCOL *FdtDevicePathNodes; > - EFI_DEVICE_PATH_PROTOCOL *FdtDevicePath; > - CHAR16 *FdtTextDevicePath; > - EFI_PHYSICAL_ADDRESS FdtBlobBase; > - UINTN FdtBlobSize; > - UINTN NumPages; > - EFI_PHYSICAL_ADDRESS FdtConfigurationTableBase; > - > - SupportedBootDevice = NULL; > - > - Status = SelectBootDevice (&SupportedBootDevice); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - // Create the specific device path node > - Status = SupportedBootDevice->Support->CreateDevicePathNode (L"FDT blob", &FdtDevicePathNodes); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - if (FdtDevicePathNodes != NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - > - FdtDevicePath = AppendDevicePath (SupportedBootDevice->DevicePathProtocol, FdtDevicePathNodes); > - FreePool (FdtDevicePathNodes); > - if (FdtDevicePath == NULL) { > - goto EXIT; > - } > - > - FdtTextDevicePath = ConvertDevicePathToText (FdtDevicePath, TRUE, TRUE); > - if (FdtTextDevicePath == NULL) { > - goto EXIT; > - } > - > - Status = gRT->SetVariable ( > - (CHAR16*)L"Fdt", > - &gFdtVariableGuid, > - EFI_VARIABLE_RUNTIME_ACCESS | > - EFI_VARIABLE_NON_VOLATILE | > - EFI_VARIABLE_BOOTSERVICE_ACCESS, > - StrSize (FdtTextDevicePath), > - FdtTextDevicePath > - ); > - ASSERT_EFI_ERROR (Status); > - FreePool (FdtTextDevicePath); > - } else { > - Status = gRT->SetVariable ( > - (CHAR16*)L"Fdt", > - &gFdtVariableGuid, > - EFI_VARIABLE_RUNTIME_ACCESS | > - EFI_VARIABLE_NON_VOLATILE | > - EFI_VARIABLE_BOOTSERVICE_ACCESS, > - 0, > - NULL > - ); > - ASSERT_EFI_ERROR (Status); > - return Status; > - } > - > - // > - // Try to load FDT from the new EFI Device Path > - // > - > - // > - // Load the FDT given its device path. > - // This operation may fail if the device path is not supported. > - // > - FdtBlobBase = 0; > - NumPages = 0; > - Status = BdsLoadImage (FdtDevicePath, AllocateAnyPages, &FdtBlobBase, &FdtBlobSize); > - FreePool (FdtDevicePath); > - > - if (EFI_ERROR (Status)) { > - goto EXIT_LOAD_FDT; > - } > - > - // Check the FDT header is valid. We only make this check in DEBUG mode in > - // case the FDT header change on production device and this ASSERT() becomes > - // not valid. > - ASSERT (fdt_check_header ((VOID*)(UINTN)FdtBlobBase) == 0); > - > - // > - // Ensure the Size of the Device Tree is smaller than the size of the read file > - // > - ASSERT ((UINTN)fdt_totalsize ((VOID*)(UINTN)FdtBlobBase) <= FdtBlobSize); > - > - // > - // Store the FDT as Runtime Service Data to prevent the Kernel from > - // overwritting its data. > - // > - NumPages = EFI_SIZE_TO_PAGES (FdtBlobSize); > - Status = gBS->AllocatePages ( > - AllocateAnyPages, EfiRuntimeServicesData, > - NumPages, &FdtConfigurationTableBase > - ); > - if (EFI_ERROR (Status)) { > - goto EXIT_LOAD_FDT; > - } > - gBS->CopyMem ( > - (VOID*)(UINTN)FdtConfigurationTableBase, > - (VOID*)(UINTN)FdtBlobBase, > - FdtBlobSize > - ); > - > - // > - // Install the FDT into the Configuration Table > - // > - Status = gBS->InstallConfigurationTable ( > - &gFdtTableGuid, > - (VOID*)(UINTN)FdtConfigurationTableBase > - ); > - if (EFI_ERROR (Status)) { > - gBS->FreePages (FdtConfigurationTableBase, NumPages); > - } > - > -EXIT_LOAD_FDT: > - if (EFI_ERROR (Status)) { > - Print (L"\nWarning: Did not manage to install the new device tree. Try to restart the platform.\n"); > - } > - > - if (FdtBlobBase != 0) { > - gBS->FreePages (FdtBlobBase, NumPages); > - } > - > -EXIT: > - if (Status == EFI_ABORTED) { > - Print (L"\n"); > - } > - > - if (SupportedBootDevice != NULL) { > - FreePool (SupportedBootDevice); > - } > - > - return Status; > -} > - > -/** > - Set boot timeout > - > - Ask for the boot timeout in seconds and if the input succeeds assign the > - input value to the UEFI global variable "Timeout". This function is called > - when the user selects the "Set Boot Timeout" of the boot manager menu. > - > - @param[in] BootOptionsList List of the boot devices, not used here > - > - @retval EFI_SUCCESS Boot timeout in second retrieved from the standard > - input and assigned to the UEFI "Timeout" global > - variable > - @retval !EFI_SUCCESS Either the input or the setting of the UEFI global > - variable "Timeout" has failed. > -**/ > -EFI_STATUS > -STATIC > -BootMenuSetBootTimeout ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - UINTN Input; > - UINT16 Timeout; > - > - Print (L"Timeout duration (in seconds): "); > - Status = GetHIInputInteger (&Input); > - if (EFI_ERROR (Status)) { > - Print (L"\n"); > - goto ErrorExit; > - } > - > - Timeout = Input; > - Status = gRT->SetVariable ( > - (CHAR16*)L"Timeout", > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | > - EFI_VARIABLE_BOOTSERVICE_ACCESS | > - EFI_VARIABLE_RUNTIME_ACCESS, > - sizeof (UINT16), > - &Timeout > - ); > - ASSERT_EFI_ERROR (Status); > - > -ErrorExit: > - return Status; > -} > - > -struct BOOT_MANAGER_ENTRY { > - CONST CHAR16* Description; > - EFI_STATUS (*Callback) (IN LIST_ENTRY *BootOptionsList); > -} BootManagerEntries[] = { > - { L"Add Boot Device Entry", BootMenuAddBootOption }, > - { L"Update Boot Device Entry", BootMenuUpdateBootOption }, > - { L"Remove Boot Device Entry", BootMenuRemoveBootOption }, > - { L"Reorder Boot Device Entries", BootMenuReorderBootOptions }, > - { L"Update FDT path", UpdateFdtPath }, > - { L"Set Boot Timeout", BootMenuSetBootTimeout }, > -}; > - > -EFI_STATUS > -BootMenuManager ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - UINTN Index; > - UINTN OptionSelected; > - UINTN BootManagerEntryCount; > - EFI_STATUS Status; > - > - BootManagerEntryCount = sizeof(BootManagerEntries) / sizeof(struct BOOT_MANAGER_ENTRY); > - > - while (TRUE) { > - // Display Boot Manager menu > - for (Index = 0; Index < BootManagerEntryCount; Index++) { > - Print(L"[%d] %s\n",Index+1,BootManagerEntries[Index]); > - } > - Print(L"[%d] Return to main menu\n",Index+1); > - > - // Select which entry to call > - Print(L"Choice: "); > - Status = GetHIInputInteger (&OptionSelected); > - if (EFI_ERROR(Status) || (OptionSelected == (BootManagerEntryCount+1))) { > - if (EFI_ERROR(Status)) { > - Print(L"\n"); > - } > - return EFI_SUCCESS; > - } else if ((OptionSelected > 0) && (OptionSelected <= BootManagerEntryCount)) { > - BootManagerEntries[OptionSelected-1].Callback (BootOptionsList); > - } > - } > - // Should never go here > -} > - > -EFI_STATUS > -BootShell ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - EFI_DEVICE_PATH* EfiShellDevicePath; > - > - // Find the EFI Shell > - Status = LocateEfiApplicationInFvByName (L"Shell", &EfiShellDevicePath); > - if (Status == EFI_NOT_FOUND) { > - Print (L"Error: EFI Application not found.\n"); > - return Status; > - } else if (EFI_ERROR (Status)) { > - Print (L"Error: Status Code: 0x%X\n", (UINT32)Status); > - return Status; > - } else { > - // Need to connect every drivers to ensure no dependencies are missing for the application > - Status = BdsConnectAllDrivers (); > - if (EFI_ERROR (Status)) { > - DEBUG ((EFI_D_ERROR, "FAIL to connect all drivers\n")); > - return Status; > - } > - > - return BdsStartEfiApplication (gImageHandle, EfiShellDevicePath, 0, NULL); > - } > -} > - > -struct BOOT_MAIN_ENTRY { > - CONST CHAR16* Description; > - EFI_STATUS (*Callback) (IN LIST_ENTRY *BootOptionsList); > -} BootMainEntries[] = { > - { L"Shell", BootShell }, > - { L"Boot Manager", BootMenuManager }, > -}; > - > -EFI_STATUS > -BootMenuMain ( > - VOID > - ) > -{ > - LIST_ENTRY BootOptionsList; > - UINTN OptionCount; > - UINTN BootOptionCount; > - EFI_STATUS Status; > - LIST_ENTRY* Entry; > - BDS_LOAD_OPTION* BootOption; > - UINTN BootOptionSelected; > - UINTN Index; > - UINTN BootMainEntryCount; > - BOOLEAN IsUnicode; > - > - BootOption = NULL; > - BootMainEntryCount = sizeof(BootMainEntries) / sizeof(struct BOOT_MAIN_ENTRY); > - > - if (FeaturePcdGet (PcdBdsLinuxSupport)) { > - // Check Linux Loader is present > - Status = LocateEfiApplicationInFvByGuid (&mLinuxLoaderAppGuid, &mLinuxLoaderDevicePath); > - ASSERT_EFI_ERROR (Status); > - } > - > - while (TRUE) { > - // Get Boot#### list > - BootOptionList (&BootOptionsList); > - > - OptionCount = 1; > - > - // Display the Boot options > - for (Entry = GetFirstNode (&BootOptionsList); > - !IsNull (&BootOptionsList,Entry); > - Entry = GetNextNode (&BootOptionsList,Entry) > - ) > - { > - BootOption = LOAD_OPTION_FROM_LINK(Entry); > - > - Print(L"[%d] %s\n", OptionCount, BootOption->Description); > - > - DEBUG_CODE_BEGIN(); > - CHAR16* DevicePathTxt; > - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; > - > - Status = gBS->LocateProtocol (&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); > - if (EFI_ERROR(Status)) { > - // You must provide an implementation of DevicePathToTextProtocol in your firmware (eg: DevicePathDxe) > - DEBUG((EFI_D_ERROR,"Error: Bds requires DevicePathToTextProtocol\n")); > - return Status; > - } > - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (BootOption->FilePathList, TRUE, TRUE); > - > - Print(L"\t- %s\n",DevicePathTxt); > - > - if (BootOption->OptionalData != NULL) { > - if (IsPrintableString (BootOption->OptionalData, &IsUnicode)) { > - if (IsUnicode) { > - Print (L"\t- Arguments: %s\n", BootOption->OptionalData); > - } else { > - AsciiPrint ("\t- Arguments: %a\n", BootOption->OptionalData); > - } > - } > - } > - FreePool(DevicePathTxt); > - DEBUG_CODE_END(); > - > - OptionCount++; > - } > - BootOptionCount = OptionCount-1; > - > - // Display the hardcoded Boot entries > - for (Index = 0; Index < BootMainEntryCount; Index++) { > - Print(L"[%d] %s\n",OptionCount,BootMainEntries[Index]); > - OptionCount++; > - } > - > - // Request the boot entry from the user > - BootOptionSelected = 0; > - while (BootOptionSelected == 0) { > - Print(L"Start: "); > - Status = GetHIInputInteger (&BootOptionSelected); > - if (EFI_ERROR(Status) || (BootOptionSelected == 0) || (BootOptionSelected > OptionCount)) { > - Print(L"Invalid input (max %d)\n",(OptionCount-1)); > - BootOptionSelected = 0; > - } > - } > - > - // Start the selected entry > - if (BootOptionSelected > BootOptionCount) { > - // Start the hardcoded entry > - Status = BootMainEntries[BootOptionSelected - BootOptionCount - 1].Callback (&BootOptionsList); > - } else { > - // Find the selected entry from the Boot#### list > - Index = 1; > - for (Entry = GetFirstNode (&BootOptionsList); > - !IsNull (&BootOptionsList,Entry); > - Entry = GetNextNode (&BootOptionsList,Entry) > - ) > - { > - if (Index == BootOptionSelected) { > - BootOption = LOAD_OPTION_FROM_LINK(Entry); > - break; > - } > - Index++; > - } > - > - Status = BootOptionStart (BootOption); > - } > - } > - // Should never go here > -} > diff --git a/ArmPlatformPkg/Bds/BootOption.c b/ArmPlatformPkg/Bds/BootOption.c > deleted file mode 100644 > index 32a5679762f9..000000000000 > --- a/ArmPlatformPkg/Bds/BootOption.c > +++ /dev/null > @@ -1,316 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011-2015, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#include "BdsInternal.h" > - > -EFI_STATUS > -BootOptionStart ( > - IN BDS_LOAD_OPTION *BootOption > - ) > -{ > - EFI_STATUS Status; > - UINT16 LoadOptionIndexSize; > - > - // Connect all the drivers if the EFI Application is not a EFI OS Loader > - if ((BootOption->Attributes & LOAD_OPTION_CATEGORY) == LOAD_OPTION_CATEGORY_APP) { > - BdsConnectAllDrivers (); > - } > - > - // Set BootCurrent variable > - LoadOptionIndexSize = sizeof (UINT16); > - gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, > - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - LoadOptionIndexSize, &(BootOption->LoadOptionIndex)); > - > - Status = BdsStartEfiApplication (gImageHandle, BootOption->FilePathList, BootOption->OptionalDataSize, BootOption->OptionalData); > - > - // Clear BootCurrent variable > - LoadOptionIndexSize = sizeof (UINT16); > - gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, > - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - 0, NULL); > - > - return Status; > -} > - > -EFI_STATUS > -BootOptionList ( > - IN OUT LIST_ENTRY *BootOptionList > - ) > -{ > - EFI_STATUS Status; > - UINTN Index; > - UINT16* BootOrder; > - UINTN BootOrderSize; > - BDS_LOAD_OPTION* BdsLoadOption; > - BDS_LOAD_OPTION_ENTRY* BdsLoadOptionEntry; > - > - InitializeListHead (BootOptionList); > - > - // Get the Boot Option Order from the environment variable > - Status = GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder); > - if (EFI_ERROR(Status)) { > - return Status; > - } > - > - for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) { > - Status = BootOptionFromLoadOptionIndex (BootOrder[Index], &BdsLoadOption); > - if (!EFI_ERROR(Status)) { > - BdsLoadOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool(sizeof(BDS_LOAD_OPTION_ENTRY)); > - BdsLoadOptionEntry->BdsLoadOption = BdsLoadOption; > - InsertTailList (BootOptionList,&BdsLoadOptionEntry->Link); > - } > - } > - > - FreePool (BootOrder); > - > - return EFI_SUCCESS; > -} > - > -STATIC > -EFI_STATUS > -BootOptionSetFields ( > - IN BDS_LOAD_OPTION* BootOption, > - IN UINT32 Attributes, > - IN CHAR16* BootDescription, > - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, > - IN UINT8* OptionalData, > - IN UINTN OptionalDataSize > - ) > -{ > - EFI_LOAD_OPTION *EfiLoadOption; > - UINTN EfiLoadOptionSize; > - UINTN BootDescriptionSize; > - UINT16 FilePathListLength; > - UINT8* EfiLoadOptionPtr; > - > - // If we are overwriting an existent Boot Option then we have to free previously allocated memory > - if (BootOption->LoadOption) { > - FreePool (BootOption->LoadOption); > - } > - > - BootDescriptionSize = StrSize (BootDescription); > - > - // Compute the size of the FilePath list > - FilePathListLength = GetUnalignedDevicePathSize (DevicePath); > - > - // Allocate the memory for the EFI Load Option > - EfiLoadOptionSize = sizeof(UINT32) + sizeof(UINT16) + BootDescriptionSize + FilePathListLength + OptionalDataSize; > - EfiLoadOption = (EFI_LOAD_OPTION *)AllocatePool(EfiLoadOptionSize); > - EfiLoadOptionPtr = (UINT8 *)EfiLoadOption; > - > - // > - // Populate the EFI Load Option and BDS Boot Option structures > - // > - > - // Attributes fields > - BootOption->Attributes = Attributes; > - *(UINT32*)EfiLoadOptionPtr = Attributes; > - EfiLoadOptionPtr += sizeof(UINT32); > - > - // FilePath List fields > - BootOption->FilePathListLength = FilePathListLength; > - *(UINT16*)EfiLoadOptionPtr = FilePathListLength; > - EfiLoadOptionPtr += sizeof(UINT16); > - > - // Boot description fields > - BootOption->Description = (CHAR16*)EfiLoadOptionPtr; > - CopyMem (EfiLoadOptionPtr, BootDescription, BootDescriptionSize); > - EfiLoadOptionPtr += BootDescriptionSize; > - > - // File path fields > - BootOption->FilePathList = (EFI_DEVICE_PATH_PROTOCOL*)EfiLoadOptionPtr; > - CopyMem (EfiLoadOptionPtr, DevicePath, FilePathListLength); > - EfiLoadOptionPtr += FilePathListLength; > - > - // Optional Data fields, Do unaligned writes > - BootOption->OptionalData = EfiLoadOptionPtr; > - > - if (OptionalData != NULL) { > - CopyMem (BootOption->OptionalData, OptionalData, OptionalDataSize); > - } > - > - BootOption->OptionalDataSize = OptionalDataSize; > - > - // If this function is called at the creation of the Boot Device entry (not at the update) the > - // BootOption->LoadOptionSize must be zero then we get a new BootIndex for this entry > - if (BootOption->LoadOptionSize == 0) { > - BootOption->LoadOptionIndex = BootOptionAllocateBootIndex (); > - } > - > - // Fill the EFI Load option fields > - BootOption->LoadOption = EfiLoadOption; > - BootOption->LoadOptionSize = EfiLoadOptionSize; > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BootOptionCreate ( > - IN UINT32 Attributes, > - IN CHAR16* BootDescription, > - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, > - IN UINT8* OptionalData, > - IN UINTN OptionalDataSize, > - OUT BDS_LOAD_OPTION** BdsLoadOption > - ) > -{ > - EFI_STATUS Status; > - BDS_LOAD_OPTION_ENTRY* BootOptionEntry; > - BDS_LOAD_OPTION* BootOption; > - CHAR16 BootVariableName[9]; > - UINT16* BootOrder; > - UINTN BootOrderSize; > - > - // > - // Allocate and fill the memory for the BDS Load Option structure > - // > - BootOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool (sizeof (BDS_LOAD_OPTION_ENTRY)); > - InitializeListHead (&BootOptionEntry->Link); > - BootOptionEntry->BdsLoadOption = (BDS_LOAD_OPTION*)AllocateZeroPool (sizeof(BDS_LOAD_OPTION)); > - > - BootOption = BootOptionEntry->BdsLoadOption; > - BootOptionSetFields (BootOption, Attributes, BootDescription, DevicePath, OptionalData, OptionalDataSize); > - > - // > - // Set the related environment variables > - // > - > - // Create Boot#### environment variable > - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BootOption->LoadOptionIndex); > - Status = gRT->SetVariable ( > - BootVariableName, > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - BootOption->LoadOptionSize, > - BootOption->LoadOption > - ); > - > - // Add the new Boot Index to the list > - Status = GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder); > - if (!EFI_ERROR(Status)) { > - BootOrder = ReallocatePool (BootOrderSize, BootOrderSize + sizeof(UINT16), BootOrder); > - // Add the new index at the end > - BootOrder[BootOrderSize / sizeof(UINT16)] = BootOption->LoadOptionIndex; > - BootOrderSize += sizeof(UINT16); > - } else { > - // BootOrder does not exist. Create it > - BootOrderSize = sizeof(UINT16); > - BootOrder = &(BootOption->LoadOptionIndex); > - } > - > - // Update (or Create) the BootOrder environment variable > - Status = gRT->SetVariable ( > - L"BootOrder", > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - BootOrderSize, > - BootOrder > - ); > - > - // We only free it if the UEFI Variable 'BootOrder' was already existing > - if (BootOrderSize > sizeof(UINT16)) { > - FreePool (BootOrder); > - } > - > - *BdsLoadOption = BootOption; > - return Status; > -} > - > -EFI_STATUS > -BootOptionUpdate ( > - IN BDS_LOAD_OPTION* BdsLoadOption, > - IN UINT32 Attributes, > - IN CHAR16* BootDescription, > - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, > - IN UINT8* OptionalData, > - IN UINTN OptionalDataSize > - ) > -{ > - EFI_STATUS Status; > - CHAR16 BootVariableName[9]; > - > - // Update the BDS Load Option structure > - BootOptionSetFields (BdsLoadOption, Attributes, BootDescription, DevicePath, OptionalData, OptionalDataSize); > - > - // Update the related environment variables > - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BdsLoadOption->LoadOptionIndex); > - > - Status = gRT->SetVariable ( > - BootVariableName, > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - BdsLoadOption->LoadOptionSize, > - BdsLoadOption->LoadOption > - ); > - > - return Status; > -} > - > -EFI_STATUS > -BootOptionDelete ( > - IN BDS_LOAD_OPTION *BootOption > - ) > -{ > - UINTN Index; > - UINTN BootOrderSize; > - UINT16* BootOrder; > - UINTN BootOrderCount; > - CHAR16 BootVariableName[9]; > - EFI_STATUS Status; > - > - // Remove the entry from the BootOrder environment variable > - Status = GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder); > - if (!EFI_ERROR(Status)) { > - BootOrderCount = BootOrderSize / sizeof(UINT16); > - > - // Find the index of the removed entry > - for (Index = 0; Index < BootOrderCount; Index++) { > - if (BootOrder[Index] == BootOption->LoadOptionIndex) { > - // If it the last entry we do not need to rearrange the BootOrder list > - if (Index + 1 != BootOrderCount) { > - CopyMem ( > - &BootOrder[Index], > - &BootOrder[Index + 1], > - (BootOrderCount - (Index + 1)) * sizeof(UINT16) > - ); > - } > - break; > - } > - } > - > - // Update the BootOrder environment variable > - Status = gRT->SetVariable ( > - L"BootOrder", > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - BootOrderSize - sizeof(UINT16), > - BootOrder > - ); > - } > - > - // Delete Boot#### environment variable > - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BootOption->LoadOptionIndex); > - Status = gRT->SetVariable ( > - BootVariableName, > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - 0, > - NULL > - ); > - > - FreePool (BootOrder); > - > - return Status; > -} > diff --git a/ArmPlatformPkg/Bds/BootOptionSupport.c b/ArmPlatformPkg/Bds/BootOptionSupport.c > deleted file mode 100644 > index 27faf003c69e..000000000000 > --- a/ArmPlatformPkg/Bds/BootOptionSupport.c > +++ /dev/null > @@ -1,1195 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011-2014, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#include "BdsInternal.h" > - > -#include <Library/NetLib.h> > - > -#include <Protocol/BlockIo.h> > -#include <Protocol/DevicePathToText.h> > -#include <Protocol/FirmwareVolumeBlock.h> > -#include <Protocol/PxeBaseCode.h> > -#include <Protocol/SimpleFileSystem.h> > -#include <Protocol/SimpleNetwork.h> > -#include <Protocol/Dhcp4.h> > -#include <Protocol/Mtftp4.h> > - > -#include <Guid/FileSystemInfo.h> > - > -#define IS_DEVICE_PATH_NODE(node,type,subtype) (((node)->Type == (type)) && ((node)->SubType == (subtype))) > - > -EFI_STATUS > -BdsLoadOptionFileSystemList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ); > - > -EFI_STATUS > -BdsLoadOptionFileSystemCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ); > - > -EFI_STATUS > -BdsLoadOptionFileSystemUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ); > - > -BOOLEAN > -BdsLoadOptionFileSystemIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ); > - > -EFI_STATUS > -BdsLoadOptionMemMapList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ); > - > -EFI_STATUS > -BdsLoadOptionMemMapCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ); > - > -EFI_STATUS > -BdsLoadOptionMemMapUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ); > - > -BOOLEAN > -BdsLoadOptionMemMapIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ); > - > -EFI_STATUS > -BdsLoadOptionPxeList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ); > - > -EFI_STATUS > -BdsLoadOptionPxeCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ); > - > -EFI_STATUS > -BdsLoadOptionPxeUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ); > - > -BOOLEAN > -BdsLoadOptionPxeIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ); > - > -EFI_STATUS > -BdsLoadOptionTftpList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ); > - > -EFI_STATUS > -BdsLoadOptionTftpCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ); > - > -EFI_STATUS > -BdsLoadOptionTftpUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ); > - > -BOOLEAN > -BdsLoadOptionTftpIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ); > - > -BDS_LOAD_OPTION_SUPPORT BdsLoadOptionSupportList[] = { > - { > - BDS_DEVICE_FILESYSTEM, > - BdsLoadOptionFileSystemList, > - BdsLoadOptionFileSystemIsSupported, > - BdsLoadOptionFileSystemCreateDevicePath, > - BdsLoadOptionFileSystemUpdateDevicePath, > - TRUE > - }, > - { > - BDS_DEVICE_MEMMAP, > - BdsLoadOptionMemMapList, > - BdsLoadOptionMemMapIsSupported, > - BdsLoadOptionMemMapCreateDevicePath, > - BdsLoadOptionMemMapUpdateDevicePath, > - TRUE > - }, > - { > - BDS_DEVICE_PXE, > - BdsLoadOptionPxeList, > - BdsLoadOptionPxeIsSupported, > - BdsLoadOptionPxeCreateDevicePath, > - BdsLoadOptionPxeUpdateDevicePath, > - FALSE > - }, > - { > - BDS_DEVICE_TFTP, > - BdsLoadOptionTftpList, > - BdsLoadOptionTftpIsSupported, > - BdsLoadOptionTftpCreateDevicePath, > - BdsLoadOptionTftpUpdateDevicePath, > - TRUE > - } > -}; > - > -EFI_STATUS > -BootDeviceListSupportedInit ( > - IN OUT LIST_ENTRY *SupportedDeviceList > - ) > -{ > - UINTN Index; > - > - // Initialize list of supported devices > - InitializeListHead (SupportedDeviceList); > - > - for (Index = 0; Index < BDS_DEVICE_MAX; Index++) { > - BdsLoadOptionSupportList[Index].ListDevices (SupportedDeviceList); > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BootDeviceListSupportedFree ( > - IN LIST_ENTRY *SupportedDeviceList, > - IN BDS_SUPPORTED_DEVICE *Except > - ) > -{ > - LIST_ENTRY *Entry; > - BDS_SUPPORTED_DEVICE* SupportedDevice; > - > - Entry = GetFirstNode (SupportedDeviceList); > - while (Entry != SupportedDeviceList) { > - SupportedDevice = SUPPORTED_BOOT_DEVICE_FROM_LINK(Entry); > - Entry = RemoveEntryList (Entry); > - if (SupportedDevice != Except) { > - FreePool (SupportedDevice); > - } > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BootDeviceGetDeviceSupport ( > - IN EFI_DEVICE_PATH *DevicePath, > - OUT BDS_LOAD_OPTION_SUPPORT **DeviceSupport > - ) > -{ > - UINTN Index; > - > - // Find which supported device is the most appropriate > - for (Index = 0; Index < BDS_DEVICE_MAX; Index++) { > - if (BdsLoadOptionSupportList[Index].IsSupported (DevicePath)) { > - *DeviceSupport = &BdsLoadOptionSupportList[Index]; > - return EFI_SUCCESS; > - } > - } > - > - return EFI_UNSUPPORTED; > -} > - > -EFI_STATUS > -BdsLoadOptionFileSystemList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ) > -{ > - EFI_STATUS Status; > - UINTN HandleCount; > - EFI_HANDLE *HandleBuffer; > - UINTN Index; > - BDS_SUPPORTED_DEVICE *SupportedDevice; > - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* FileProtocol; > - EFI_FILE_HANDLE Fs; > - UINTN Size; > - EFI_FILE_SYSTEM_INFO* FsInfo; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; > - > - // List all the Simple File System Protocols > - Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSimpleFileSystemProtocolGuid, NULL, &HandleCount, &HandleBuffer); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - for (Index = 0; Index < HandleCount; Index++) { > - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePathProtocol); > - if (!EFI_ERROR(Status)) { > - // Allocate BDS Supported Device structure > - SupportedDevice = (BDS_SUPPORTED_DEVICE*)AllocatePool (sizeof(BDS_SUPPORTED_DEVICE)); > - > - FileProtocol = NULL; > - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiSimpleFileSystemProtocolGuid, (VOID **)&FileProtocol); > - ASSERT_EFI_ERROR(Status); > - > - FileProtocol->OpenVolume (FileProtocol, &Fs); > - > - // Generate a Description from the file system > - Size = 0; > - FsInfo = NULL; > - Status = Fs->GetInfo (Fs, &gEfiFileSystemInfoGuid, &Size, FsInfo); > - if (Status == EFI_BUFFER_TOO_SMALL) { > - FsInfo = AllocatePool (Size); > - Status = Fs->GetInfo (Fs, &gEfiFileSystemInfoGuid, &Size, FsInfo); > - } > - UnicodeSPrint (SupportedDevice->Description,BOOT_DEVICE_DESCRIPTION_MAX,L"%s (%d MB)",FsInfo->VolumeLabel,(UINT32)(FsInfo->VolumeSize / (1024 * 1024))); > - FreePool(FsInfo); > - Fs->Close (Fs); > - > - SupportedDevice->DevicePathProtocol = DevicePathProtocol; > - SupportedDevice->Support = &BdsLoadOptionSupportList[BDS_DEVICE_FILESYSTEM]; > - > - InsertTailList (BdsLoadOptionList,&SupportedDevice->Link); > - } > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BdsLoadOptionFileSystemCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ) > -{ > - EFI_STATUS Status; > - FILEPATH_DEVICE_PATH* FilePathDevicePath; > - CHAR16 BootFilePath[BOOT_DEVICE_FILEPATH_MAX]; > - UINTN BootFilePathSize; > - > - Print(L"File path of the %s: ", FileName); > - Status = GetHIInputStr (BootFilePath, BOOT_DEVICE_FILEPATH_MAX); > - if (EFI_ERROR(Status)) { > - return EFI_ABORTED; > - } > - > - BootFilePathSize = StrSize (BootFilePath); > - if (BootFilePathSize == 2) { > - *DevicePathNodes = NULL; > - return EFI_NOT_FOUND; > - } > - > - // Create the FilePath Device Path node > - FilePathDevicePath = (FILEPATH_DEVICE_PATH*)AllocatePool(SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize + END_DEVICE_PATH_LENGTH); > - FilePathDevicePath->Header.Type = MEDIA_DEVICE_PATH; > - FilePathDevicePath->Header.SubType = MEDIA_FILEPATH_DP; > - SetDevicePathNodeLength (FilePathDevicePath, SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize); > - CopyMem (FilePathDevicePath->PathName, BootFilePath, BootFilePathSize); > - SetDevicePathEndNode ((VOID*)((UINTN)FilePathDevicePath + SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize)); > - *DevicePathNodes = (EFI_DEVICE_PATH_PROTOCOL*)FilePathDevicePath; > - > - return Status; > -} > - > -EFI_STATUS > -BdsLoadOptionFileSystemUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ) > -{ > - EFI_STATUS Status; > - CHAR16 BootFilePath[BOOT_DEVICE_FILEPATH_MAX]; > - UINTN BootFilePathSize; > - FILEPATH_DEVICE_PATH* EndingDevicePath; > - FILEPATH_DEVICE_PATH* FilePathDevicePath; > - EFI_DEVICE_PATH* DevicePath; > - > - DevicePath = DuplicateDevicePath (OldDevicePath); > - > - EndingDevicePath = (FILEPATH_DEVICE_PATH*)GetLastDevicePathNode (DevicePath); > - > - Print(L"File path of the %s: ", FileName); > - StrnCpy (BootFilePath, EndingDevicePath->PathName, BOOT_DEVICE_FILEPATH_MAX); > - Status = EditHIInputStr (BootFilePath, BOOT_DEVICE_FILEPATH_MAX); > - if (EFI_ERROR(Status)) { > - return Status; > - } > - > - BootFilePathSize = StrSize(BootFilePath); > - if (BootFilePathSize == 2) { > - *NewDevicePath = NULL; > - return EFI_NOT_FOUND; > - } > - > - // Create the FilePath Device Path node > - FilePathDevicePath = (FILEPATH_DEVICE_PATH*)AllocatePool(SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize); > - FilePathDevicePath->Header.Type = MEDIA_DEVICE_PATH; > - FilePathDevicePath->Header.SubType = MEDIA_FILEPATH_DP; > - SetDevicePathNodeLength (FilePathDevicePath, SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize); > - CopyMem (FilePathDevicePath->PathName, BootFilePath, BootFilePathSize); > - > - // Generate the new Device Path by replacing the last node by the updated node > - SetDevicePathEndNode (EndingDevicePath); > - *NewDevicePath = AppendDevicePathNode (DevicePath, (CONST EFI_DEVICE_PATH_PROTOCOL *)FilePathDevicePath); > - FreePool(DevicePath); > - > - return EFI_SUCCESS; > -} > - > -/** > - Check if a boot option path is a file system boot option path or not. > - > - The device specified by the beginning of the path has to support the Simple File > - System protocol. Furthermore, the remaining part of the path has to be composed of > - a single node of type MEDIA_DEVICE_PATH and sub-type MEDIA_FILEPATH_DP. > - > - @param[in] DevicePath Complete device path of a boot option. > - > - @retval FALSE The boot option path has not been identified as that of a > - file system boot option. > - @retval TRUE The boot option path is a file system boot option. > -**/ > -BOOLEAN > -BdsLoadOptionFileSystemIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ) > -{ > - EFI_STATUS Status; > - EFI_HANDLE Handle; > - EFI_DEVICE_PATH *RemainingDevicePath; > - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileProtocol; > - > - Status = BdsConnectDevicePath (DevicePath, &Handle, &RemainingDevicePath); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } > - > - Status = gBS->HandleProtocol ( > - Handle, > - &gEfiSimpleFileSystemProtocolGuid, > - (VOID **)(&FileProtocol) > - ); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } > - > - if (!IS_DEVICE_PATH_NODE (RemainingDevicePath, MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP)) > - return FALSE; > - > - return TRUE; > -} > - > -STATIC > -BOOLEAN > -IsParentDevicePath ( > - IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath, > - IN EFI_DEVICE_PATH_PROTOCOL *ChildDevicePath > - ) > -{ > - UINTN ParentSize; > - UINTN ChildSize; > - > - ParentSize = GetDevicePathSize (ParentDevicePath); > - ChildSize = GetDevicePathSize (ChildDevicePath); > - > - if (ParentSize > ChildSize) { > - return FALSE; > - } > - > - if (CompareMem (ParentDevicePath, ChildDevicePath, ParentSize - END_DEVICE_PATH_LENGTH) != 0) { > - return FALSE; > - } > - > - return TRUE; > -} > - > -EFI_STATUS > -BdsLoadOptionMemMapList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ) > -{ > - EFI_STATUS Status; > - UINTN HandleCount; > - EFI_HANDLE *HandleBuffer; > - UINTN DevicePathHandleCount; > - EFI_HANDLE *DevicePathHandleBuffer; > - BOOLEAN IsParent; > - UINTN Index; > - UINTN Index2; > - BDS_SUPPORTED_DEVICE *SupportedDevice; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; > - EFI_DEVICE_PATH* DevicePath; > - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileProtocol; > - EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol; > - > - // List all the BlockIo Protocols > - Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &HandleCount, &HandleBuffer); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - for (Index = 0; Index < HandleCount; Index++) { > - // We only select handles WITH a Device Path AND not part of Media (to > - // avoid duplication with HardDisk, CDROM, etc). Skip handles used by > - // Simple Filesystem or used for Variable Storage. > - > - > - Status = gBS->HandleProtocol (HandleBuffer[Index], > - &gEfiSimpleFileSystemProtocolGuid, > - (VOID *)&FileProtocol); > - if (!EFI_ERROR(Status)) { > - // SimpleFilesystem supported on this handle, skip > - continue; > - } > - > - Status = gBS->HandleProtocol (HandleBuffer[Index], > - &gEfiFirmwareVolumeBlockProtocolGuid, > - (VOID *)&FvbProtocol); > - if (!EFI_ERROR(Status)) { > - // Firmware Volme Block / Variable storage supported on this handle, skip > - continue; > - } > - > - Status = gBS->HandleProtocol (HandleBuffer[Index], > - &gEfiFirmwareVolumeBlock2ProtocolGuid, > - (VOID *)&FvbProtocol); > - if (!EFI_ERROR(Status)) { > - // Firmware Volme Block / Variable storage supported on this handle, skip > - continue; > - } > - > - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePathProtocol); > - if (!EFI_ERROR(Status)) { > - // BlockIo is not part of Media Device Path > - DevicePath = DevicePathProtocol; > - while (!IsDevicePathEndType (DevicePath) && (DevicePathType (DevicePath) != MEDIA_DEVICE_PATH)) { > - DevicePath = NextDevicePathNode (DevicePath); > - } > - if (DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) { > - continue; > - } > - > - // Open all the handle supporting the DevicePath protocol and verify this handle has not got any child > - Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiDevicePathProtocolGuid, NULL, &DevicePathHandleCount, &DevicePathHandleBuffer); > - ASSERT_EFI_ERROR (Status); > - IsParent = FALSE; > - for (Index2 = 0; (Index2 < DevicePathHandleCount) && !IsParent; Index2++) { > - if (HandleBuffer[Index] != DevicePathHandleBuffer[Index2]) { > - gBS->HandleProtocol (DevicePathHandleBuffer[Index2], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePath); > - if (IsParentDevicePath (DevicePathProtocol, DevicePath)) { > - IsParent = TRUE; > - } > - } > - } > - if (IsParent) { > - continue; > - } > - > - // Allocate BDS Supported Device structure > - SupportedDevice = (BDS_SUPPORTED_DEVICE*)AllocatePool(sizeof(BDS_SUPPORTED_DEVICE)); > - > - Status = GenerateDeviceDescriptionName (HandleBuffer[Index], SupportedDevice->Description); > - ASSERT_EFI_ERROR (Status); > - > - SupportedDevice->DevicePathProtocol = DevicePathProtocol; > - SupportedDevice->Support = &BdsLoadOptionSupportList[BDS_DEVICE_MEMMAP]; > - > - InsertTailList (BdsLoadOptionList,&SupportedDevice->Link); > - } > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BdsLoadOptionMemMapCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ) > -{ > - EFI_STATUS Status; > - MEMMAP_DEVICE_PATH *MemMapDevicePath; > - CHAR16 StrStartingAddress[BOOT_DEVICE_ADDRESS_MAX]; > - CHAR16 StrEndingAddress[BOOT_DEVICE_ADDRESS_MAX]; > - > - Print(L"Starting Address of the %s: ", FileName); > - Status = GetHIInputStr (StrStartingAddress, BOOT_DEVICE_ADDRESS_MAX); > - if (EFI_ERROR(Status)) { > - return EFI_ABORTED; > - } > - > - Print(L"Ending Address of the %s: ", FileName); > - Status = GetHIInputStr (StrEndingAddress, BOOT_DEVICE_ADDRESS_MAX); > - if (EFI_ERROR(Status)) { > - return EFI_ABORTED; > - } > - > - // Create the MemMap Device Path Node > - MemMapDevicePath = (MEMMAP_DEVICE_PATH*)AllocatePool (sizeof(MEMMAP_DEVICE_PATH) + END_DEVICE_PATH_LENGTH); > - MemMapDevicePath->Header.Type = HARDWARE_DEVICE_PATH; > - MemMapDevicePath->Header.SubType = HW_MEMMAP_DP; > - SetDevicePathNodeLength (MemMapDevicePath, sizeof(MEMMAP_DEVICE_PATH)); > - MemMapDevicePath->MemoryType = EfiBootServicesData; > - MemMapDevicePath->StartingAddress = StrHexToUint64 (StrStartingAddress); > - MemMapDevicePath->EndingAddress = StrHexToUint64 (StrEndingAddress); > - > - // Set a Device Path End Node after the Memory Map Device Path Node > - SetDevicePathEndNode (MemMapDevicePath + 1); > - *DevicePathNodes = (EFI_DEVICE_PATH_PROTOCOL*)MemMapDevicePath; > - > - return Status; > -} > - > -EFI_STATUS > -BdsLoadOptionMemMapUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ) > -{ > - EFI_STATUS Status; > - CHAR16 StrStartingAddress[BOOT_DEVICE_ADDRESS_MAX]; > - CHAR16 StrEndingAddress[BOOT_DEVICE_ADDRESS_MAX]; > - MEMMAP_DEVICE_PATH* EndingDevicePath; > - EFI_DEVICE_PATH* DevicePath; > - > - DevicePath = DuplicateDevicePath (OldDevicePath); > - EndingDevicePath = (MEMMAP_DEVICE_PATH*)GetLastDevicePathNode (DevicePath); > - > - Print(L"Starting Address of the %s: ", FileName); > - UnicodeSPrint (StrStartingAddress, BOOT_DEVICE_ADDRESS_MAX, L"0x%X", (UINTN)EndingDevicePath->StartingAddress); > - Status = EditHIInputStr (StrStartingAddress, BOOT_DEVICE_ADDRESS_MAX); > - if (EFI_ERROR(Status)) { > - return EFI_ABORTED; > - } > - > - Print(L"Ending Address of the %s: ", FileName); > - UnicodeSPrint (StrEndingAddress, BOOT_DEVICE_ADDRESS_MAX, L"0x%X", (UINTN)EndingDevicePath->EndingAddress); > - Status = EditHIInputStr (StrEndingAddress, BOOT_DEVICE_ADDRESS_MAX); > - if (EFI_ERROR(Status)) { > - return EFI_ABORTED; > - } > - > - EndingDevicePath->StartingAddress = StrHexToUint64 (StrStartingAddress); > - EndingDevicePath->EndingAddress = StrHexToUint64 (StrEndingAddress); > - > - if (EFI_ERROR(Status)) { > - FreePool(DevicePath); > - } else { > - *NewDevicePath = DevicePath; > - } > - > - return Status; > -} > - > -/** > - Check if a boot option path is a memory map boot option path or not. > - > - The device specified by the beginning of the path has to support the BlockIo > - protocol. Furthermore, the remaining part of the path has to be composed of > - a single node of type HARDWARE_DEVICE_PATH and sub-type HW_MEMMAP_DP. > - > - @param[in] DevicePath Complete device path of a boot option. > - > - @retval FALSE The boot option path has not been identified as that of a > - memory map boot option. > - @retval TRUE The boot option path is a a memory map boot option. > -**/ > -BOOLEAN > -BdsLoadOptionMemMapIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ) > -{ > - EFI_STATUS Status; > - EFI_HANDLE Handle; > - EFI_DEVICE_PATH *RemainingDevicePath; > - EFI_BLOCK_IO_PROTOCOL *BlockIoProtocol; > - > - Status = BdsConnectDevicePath (DevicePath, &Handle, &RemainingDevicePath); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } > - > - Status = gBS->HandleProtocol ( > - Handle, > - &gEfiBlockIoProtocolGuid, > - (VOID **)(&BlockIoProtocol) > - ); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } > - > - if (!IS_DEVICE_PATH_NODE (RemainingDevicePath, HARDWARE_DEVICE_PATH, HW_MEMMAP_DP)) > - return FALSE; > - > - return TRUE; > -} > - > -EFI_STATUS > -BdsLoadOptionPxeList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ) > -{ > - EFI_STATUS Status; > - UINTN HandleCount; > - EFI_HANDLE *HandleBuffer; > - UINTN Index; > - BDS_SUPPORTED_DEVICE *SupportedDevice; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; > - EFI_SIMPLE_NETWORK_PROTOCOL* SimpleNet; > - CHAR16 DeviceDescription[BOOT_DEVICE_DESCRIPTION_MAX]; > - EFI_MAC_ADDRESS *Mac; > - > - // List all the PXE Protocols > - Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiPxeBaseCodeProtocolGuid, NULL, &HandleCount, &HandleBuffer); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - for (Index = 0; Index < HandleCount; Index++) { > - // We only select the handle WITH a Device Path AND the PXE Protocol > - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePathProtocol); > - if (!EFI_ERROR(Status)) { > - // Allocate BDS Supported Device structure > - SupportedDevice = (BDS_SUPPORTED_DEVICE*)AllocatePool(sizeof(BDS_SUPPORTED_DEVICE)); > - > - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiSimpleNetworkProtocolGuid, (VOID **)&SimpleNet); > - if (!EFI_ERROR(Status)) { > - Mac = &SimpleNet->Mode->CurrentAddress; > - UnicodeSPrint (DeviceDescription,BOOT_DEVICE_DESCRIPTION_MAX,L"MAC Address: %02x:%02x:%02x:%02x:%02x:%02x", Mac->Addr[0], Mac->Addr[1], Mac->Addr[2], Mac->Addr[3], Mac->Addr[4], Mac->Addr[5]); > - } else { > - Status = GenerateDeviceDescriptionName (HandleBuffer[Index], DeviceDescription); > - ASSERT_EFI_ERROR (Status); > - } > - UnicodeSPrint (SupportedDevice->Description,BOOT_DEVICE_DESCRIPTION_MAX,L"PXE on %s",DeviceDescription); > - > - SupportedDevice->DevicePathProtocol = DevicePathProtocol; > - SupportedDevice->Support = &BdsLoadOptionSupportList[BDS_DEVICE_PXE]; > - > - InsertTailList (BdsLoadOptionList,&SupportedDevice->Link); > - } > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BdsLoadOptionPxeCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ) > -{ > - *DevicePathNodes = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH); > - SetDevicePathEndNode (*DevicePathNodes); > - > - return EFI_SUCCESS; > -} > - > -/** > - Update the parameters of a Pxe boot option > - > - @param[in] OldDevicePath Current complete device path of the Pxe boot option. > - This has to be a valid complete Pxe boot option path. > - @param[in] FileName Description of the file the path is asked for > - @param[out] NewDevicePath Pointer to the new complete device path. > - > - @retval EFI_SUCCESS Update completed > - @retval EFI_OUT_OF_RESOURCES Fail to perform the update due to lack of resource > -**/ > -EFI_STATUS > -BdsLoadOptionPxeUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ) > -{ > - // > - // Make a copy of the complete device path that is made of : > - // the device path of the device supporting the Pxe base code protocol > - // followed by an end node. > - // > - *NewDevicePath = DuplicateDevicePath (OldDevicePath); > - if (*NewDevicePath == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } else { > - return EFI_SUCCESS; > - } > -} > - > -BOOLEAN > -BdsLoadOptionPxeIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ) > -{ > - EFI_STATUS Status; > - EFI_HANDLE Handle; > - EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath; > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBcProtocol; > - > - Status = BdsConnectDevicePath (DevicePath, &Handle, &RemainingDevicePath); > - if (EFI_ERROR(Status)) { > - return FALSE; > - } > - > - if (!IsDevicePathEnd(RemainingDevicePath)) { > - return FALSE; > - } > - > - Status = gBS->HandleProtocol (Handle, &gEfiPxeBaseCodeProtocolGuid, (VOID **)&PxeBcProtocol); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } else { > - return TRUE; > - } > -} > - > -/** > - Add to the list of boot devices the devices allowing a TFTP boot > - > - @param[in] BdsLoadOptionList List of devices to boot from > - > - @retval EFI_SUCCESS Update completed > - @retval EFI_OUT_OF_RESOURCES Fail to perform the update due to lack of resource > -**/ > -EFI_STATUS > -BdsLoadOptionTftpList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ) > -{ > - EFI_STATUS Status; > - UINTN HandleCount; > - EFI_HANDLE *HandleBuffer; > - EFI_HANDLE Handle; > - UINTN Index; > - EFI_DEVICE_PATH_PROTOCOL *DevicePathProtocol; > - VOID *Interface; > - EFI_SIMPLE_NETWORK_PROTOCOL *SimpleNetworkProtocol; > - BDS_SUPPORTED_DEVICE *SupportedDevice; > - EFI_MAC_ADDRESS *Mac; > - > - // > - // List all the handles on which the Simple Network Protocol is installed. > - // > - Status = gBS->LocateHandleBuffer ( > - ByProtocol, > - &gEfiSimpleNetworkProtocolGuid, > - NULL, > - &HandleCount, > - &HandleBuffer > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - for (Index = 0; Index < HandleCount; Index++) { > - Handle = HandleBuffer[Index]; > - // > - // We select the handles that support : > - // . the Device Path Protocol > - // . the MTFTP4 Protocol > - // > - Status = gBS->HandleProtocol ( > - Handle, > - &gEfiDevicePathProtocolGuid, > - (VOID **)&DevicePathProtocol > - ); > - if (EFI_ERROR (Status)) { > - continue; > - } > - > - Status = gBS->HandleProtocol ( > - Handle, > - &gEfiMtftp4ServiceBindingProtocolGuid, > - &Interface > - ); > - if (EFI_ERROR (Status)) { > - continue; > - } > - > - Status = gBS->HandleProtocol ( > - Handle, > - &gEfiSimpleNetworkProtocolGuid, > - (VOID **)&SimpleNetworkProtocol > - ); > - if (EFI_ERROR (Status)) { > - continue; > - } > - > - // Allocate BDS Supported Device structure > - SupportedDevice = (BDS_SUPPORTED_DEVICE*)AllocatePool (sizeof (BDS_SUPPORTED_DEVICE)); > - if (SupportedDevice == NULL) { > - continue; > - } > - > - Mac = &SimpleNetworkProtocol->Mode->CurrentAddress; > - UnicodeSPrint ( > - SupportedDevice->Description, > - BOOT_DEVICE_DESCRIPTION_MAX, > - L"TFTP on MAC Address: %02x:%02x:%02x:%02x:%02x:%02x", > - Mac->Addr[0], Mac->Addr[1], Mac->Addr[2], Mac->Addr[3], Mac->Addr[4], Mac->Addr[5] > - ); > - > - SupportedDevice->DevicePathProtocol = DevicePathProtocol; > - SupportedDevice->Support = &BdsLoadOptionSupportList[BDS_DEVICE_TFTP]; > - > - InsertTailList (BdsLoadOptionList, &SupportedDevice->Link); > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BdsLoadOptionTftpCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ) > -{ > - EFI_STATUS Status; > - BOOLEAN IsDHCP; > - EFI_IP_ADDRESS LocalIp; > - EFI_IP_ADDRESS SubnetMask; > - EFI_IP_ADDRESS GatewayIp; > - EFI_IP_ADDRESS RemoteIp; > - IPv4_DEVICE_PATH *IPv4DevicePathNode; > - FILEPATH_DEVICE_PATH *FilePathDevicePath; > - CHAR16 BootFilePath[BOOT_DEVICE_FILEPATH_MAX]; > - UINTN BootFilePathSize; > - > - Print (L"Get the IP address from DHCP: "); > - Status = GetHIInputBoolean (&IsDHCP); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - > - if (!IsDHCP) { > - Print (L"Local static IP address: "); > - Status = GetHIInputIP (&LocalIp); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - Print (L"Get the network mask: "); > - Status = GetHIInputIP (&SubnetMask); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - Print (L"Get the gateway IP address: "); > - Status = GetHIInputIP (&GatewayIp); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - } > - > - Print (L"Get the TFTP server IP address: "); > - Status = GetHIInputIP (&RemoteIp); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - > - Print (L"File path of the %s : ", FileName); > - Status = GetHIInputStr (BootFilePath, BOOT_DEVICE_FILEPATH_MAX); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - > - BootFilePathSize = StrSize(BootFilePath); > - if (BootFilePathSize == 2) { > - return EFI_NOT_FOUND; > - } > - > - // Allocate the memory for the IPv4 + File Path Device Path Nodes > - IPv4DevicePathNode = (IPv4_DEVICE_PATH*)AllocatePool(sizeof(IPv4_DEVICE_PATH) + SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize + END_DEVICE_PATH_LENGTH); > - > - // Create the IPv4 Device Path > - IPv4DevicePathNode->Header.Type = MESSAGING_DEVICE_PATH; > - IPv4DevicePathNode->Header.SubType = MSG_IPv4_DP; > - SetDevicePathNodeLength (&IPv4DevicePathNode->Header, sizeof(IPv4_DEVICE_PATH)); > - > - if (!IsDHCP) { > - CopyMem (&IPv4DevicePathNode->LocalIpAddress, &LocalIp.v4, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&IPv4DevicePathNode->SubnetMask, &SubnetMask.v4, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&IPv4DevicePathNode->GatewayIpAddress, &GatewayIp.v4, sizeof (EFI_IPv4_ADDRESS)); > - } > - > - CopyMem (&IPv4DevicePathNode->RemoteIpAddress, &RemoteIp.v4, sizeof (EFI_IPv4_ADDRESS)); > - IPv4DevicePathNode->LocalPort = 0; > - IPv4DevicePathNode->RemotePort = 0; > - IPv4DevicePathNode->Protocol = EFI_IP_PROTO_TCP; > - IPv4DevicePathNode->StaticIpAddress = (IsDHCP != TRUE); > - > - // Create the FilePath Device Path node > - FilePathDevicePath = (FILEPATH_DEVICE_PATH*)(IPv4DevicePathNode + 1); > - FilePathDevicePath->Header.Type = MEDIA_DEVICE_PATH; > - FilePathDevicePath->Header.SubType = MEDIA_FILEPATH_DP; > - SetDevicePathNodeLength (FilePathDevicePath, SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize); > - CopyMem (FilePathDevicePath->PathName, BootFilePath, BootFilePathSize); > - > - // Set the End Device Path Node > - SetDevicePathEndNode ((VOID*)((UINTN)FilePathDevicePath + SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize)); > - *DevicePathNodes = (EFI_DEVICE_PATH_PROTOCOL*)IPv4DevicePathNode; > - > - return Status; > -} > - > -/** > - Update the parameters of a TFTP boot option > - > - The function asks sequentially to update the IPv4 parameters as well as the boot file path, > - providing the previously set value if any. > - > - @param[in] OldDevicePath Current complete device path of the Tftp boot option. > - This has to be a valid complete Tftp boot option path. > - By complete, we mean that it is not only the Tftp > - specific end part built by the > - "BdsLoadOptionTftpCreateDevicePath()" function. > - This path is handled as read only. > - @param[in] FileName Description of the file the path is asked for > - @param[out] NewDevicePath Pointer to the new complete device path. > - > - @retval EFI_SUCCESS Update completed > - @retval EFI_ABORTED Update aborted by the user > - @retval EFI_OUT_OF_RESOURCES Fail to perform the update due to lack of resource > -**/ > -EFI_STATUS > -BdsLoadOptionTftpUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16 *FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ) > -{ > - EFI_STATUS Status; > - EFI_DEVICE_PATH *DevicePath; > - EFI_DEVICE_PATH *DevicePathNode; > - UINT8 *Ipv4NodePtr; > - IPv4_DEVICE_PATH Ipv4Node; > - BOOLEAN IsDHCP; > - EFI_IP_ADDRESS OldIp; > - EFI_IP_ADDRESS OldSubnetMask; > - EFI_IP_ADDRESS OldGatewayIp; > - EFI_IP_ADDRESS LocalIp; > - EFI_IP_ADDRESS SubnetMask; > - EFI_IP_ADDRESS GatewayIp; > - EFI_IP_ADDRESS RemoteIp; > - UINT8 *FileNodePtr; > - CHAR16 BootFilePath[BOOT_DEVICE_FILEPATH_MAX]; > - UINTN PathSize; > - UINTN BootFilePathSize; > - FILEPATH_DEVICE_PATH *NewFilePathNode; > - > - Ipv4NodePtr = NULL; > - > - // > - // Make a copy of the complete device path that is made of : > - // the device path of the device that support the Simple Network protocol > - // followed by an IPv4 node (type IPv4_DEVICE_PATH), > - // followed by a file path node (type FILEPATH_DEVICE_PATH) and ended up > - // by an end node. The IPv6 case is not handled yet. > - // > - > - DevicePath = DuplicateDevicePath (OldDevicePath); > - if (DevicePath == NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - goto ErrorExit; > - } > - > - // > - // Because of the check done by "BdsLoadOptionTftpIsSupported()" prior to the > - // call to this function, we know that the device path ends with an IPv4 node > - // followed by a file path node and finally an end node. To get the address of > - // the last IPv4 node, we loop over the whole device path, noting down the > - // address of each encountered IPv4 node. > - // > - > - for (DevicePathNode = DevicePath; > - !IsDevicePathEnd (DevicePathNode); > - DevicePathNode = NextDevicePathNode (DevicePathNode)) > - { > - if (IS_DEVICE_PATH_NODE (DevicePathNode, MESSAGING_DEVICE_PATH, MSG_IPv4_DP)) { > - Ipv4NodePtr = (UINT8*)DevicePathNode; > - } > - } > - > - // Copy for alignment of the IPv4 node data > - CopyMem (&Ipv4Node, Ipv4NodePtr, sizeof (IPv4_DEVICE_PATH)); > - > - Print (L"Get the IP address from DHCP: "); > - Status = GetHIInputBoolean (&IsDHCP); > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - > - if (!IsDHCP) { > - Print (L"Local static IP address: "); > - if (Ipv4Node.StaticIpAddress) { > - CopyMem (&OldIp.v4, &Ipv4Node.LocalIpAddress, sizeof (EFI_IPv4_ADDRESS)); > - Status = EditHIInputIP (&OldIp, &LocalIp); > - } else { > - Status = GetHIInputIP (&LocalIp); > - } > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - > - Print (L"Get the network mask: "); > - if (Ipv4Node.StaticIpAddress) { > - CopyMem (&OldSubnetMask.v4, &Ipv4Node.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); > - Status = EditHIInputIP (&OldSubnetMask, &SubnetMask); > - } else { > - Status = GetHIInputIP (&SubnetMask); > - } > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - > - Print (L"Get the gateway IP address: "); > - if (Ipv4Node.StaticIpAddress) { > - CopyMem (&OldGatewayIp.v4, &Ipv4Node.GatewayIpAddress, sizeof (EFI_IPv4_ADDRESS)); > - Status = EditHIInputIP (&OldGatewayIp, &GatewayIp); > - } else { > - Status = GetHIInputIP (&GatewayIp); > - } > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - } > - > - Print (L"TFTP server IP address: "); > - // Copy remote IPv4 address into IPv4 or IPv6 union > - CopyMem (&OldIp.v4, &Ipv4Node.RemoteIpAddress, sizeof (EFI_IPv4_ADDRESS)); > - > - Status = EditHIInputIP (&OldIp, &RemoteIp); > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - > - // Get the path of the boot file and its size in number of bytes > - FileNodePtr = Ipv4NodePtr + sizeof (IPv4_DEVICE_PATH); > - BootFilePathSize = DevicePathNodeLength (FileNodePtr) - SIZE_OF_FILEPATH_DEVICE_PATH; > - > - // > - // Ask for update of the boot file path > - // > - do { > - // Copy for 2-byte alignment of the Unicode string > - CopyMem ( > - BootFilePath, FileNodePtr + SIZE_OF_FILEPATH_DEVICE_PATH, > - MIN (BootFilePathSize, BOOT_DEVICE_FILEPATH_MAX) > - ); > - BootFilePath[BOOT_DEVICE_FILEPATH_MAX - 1] = L'\0'; > - > - Print (L"File path of the %s: ", FileName); > - Status = EditHIInputStr (BootFilePath, BOOT_DEVICE_FILEPATH_MAX); > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - PathSize = StrSize (BootFilePath); > - if (PathSize > 2) { > - break; > - } > - // Empty string, give the user another try > - Print (L"Empty string - Invalid path\n"); > - } while (PathSize <= 2) ; > - > - // > - // Update the IPv4 node. IPv6 case not handled yet. > - // > - if (IsDHCP) { > - Ipv4Node.StaticIpAddress = FALSE; > - ZeroMem (&Ipv4Node.LocalIpAddress, sizeof (EFI_IPv4_ADDRESS)); > - ZeroMem (&Ipv4Node.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); > - ZeroMem (&Ipv4Node.GatewayIpAddress, sizeof (EFI_IPv4_ADDRESS)); > - } else { > - Ipv4Node.StaticIpAddress = TRUE; > - CopyMem (&Ipv4Node.LocalIpAddress, &LocalIp.v4, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&Ipv4Node.SubnetMask, &SubnetMask.v4, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&Ipv4Node.GatewayIpAddress, &GatewayIp.v4, sizeof (EFI_IPv4_ADDRESS)); > - } > - > - CopyMem (&Ipv4Node.RemoteIpAddress, &RemoteIp.v4, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (Ipv4NodePtr, &Ipv4Node, sizeof (IPv4_DEVICE_PATH)); > - > - // > - // Create the new file path node > - // > - NewFilePathNode = (FILEPATH_DEVICE_PATH*)AllocatePool ( > - SIZE_OF_FILEPATH_DEVICE_PATH + > - PathSize > - ); > - NewFilePathNode->Header.Type = MEDIA_DEVICE_PATH; > - NewFilePathNode->Header.SubType = MEDIA_FILEPATH_DP; > - SetDevicePathNodeLength ( > - NewFilePathNode, > - SIZE_OF_FILEPATH_DEVICE_PATH + PathSize > - ); > - CopyMem (NewFilePathNode->PathName, BootFilePath, PathSize); > - > - // > - // Generate the new Device Path by replacing the file path node at address > - // "FileNodePtr" by the new one "NewFilePathNode" and return its address. > - // > - SetDevicePathEndNode (FileNodePtr); > - *NewDevicePath = AppendDevicePathNode ( > - DevicePath, > - (CONST EFI_DEVICE_PATH_PROTOCOL*)NewFilePathNode > - ); > - > -ErrorExit: > - if (DevicePath != NULL) { > - FreePool (DevicePath) ; > - } > - > - return Status; > -} > - > -BOOLEAN > -BdsLoadOptionTftpIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ) > -{ > - EFI_STATUS Status; > - EFI_HANDLE Handle; > - EFI_DEVICE_PATH *RemainingDevicePath; > - EFI_DEVICE_PATH *NextDevicePath; > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBcProtocol; > - > - Status = BdsConnectDevicePath (DevicePath, &Handle, &RemainingDevicePath); > - if (EFI_ERROR(Status)) { > - return FALSE; > - } > - > - // Validate the Remaining Device Path > - if (IsDevicePathEnd(RemainingDevicePath)) { > - return FALSE; > - } > - if (!IS_DEVICE_PATH_NODE(RemainingDevicePath,MESSAGING_DEVICE_PATH,MSG_IPv4_DP) && > - !IS_DEVICE_PATH_NODE(RemainingDevicePath,MESSAGING_DEVICE_PATH,MSG_IPv6_DP)) { > - return FALSE; > - } > - NextDevicePath = NextDevicePathNode (RemainingDevicePath); > - if (IsDevicePathEnd(NextDevicePath)) { > - return FALSE; > - } > - if (!IS_DEVICE_PATH_NODE(NextDevicePath,MEDIA_DEVICE_PATH,MEDIA_FILEPATH_DP)) { > - return FALSE; > - } > - > - Status = gBS->HandleProtocol (Handle, &gEfiPxeBaseCodeProtocolGuid, (VOID **)&PxeBcProtocol); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } else { > - return TRUE; > - } > -} > -- > 2.7.4 > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
On 25 October 2016 at 18:16, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote: > This is no longer used, and does not belong in a reference code base, > so remove it. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> I tested this along with the series to move to the generic BDS and the additional Juno patch. Tested on Juno R0/1/2, TC2 and FVP AEMv8 and Foundation models. Tested-by: Ryan Harkin <ryan.harkin@linaro.org> And it's simple enough that I can understand what it does: Reviewed-by: Ryan Harkin <ryan.harkin@linaro.org> > --- > > Note that the OpenPlatformPkg version of Beagle will still need to be > brought in line with the EDK2 version (after switching to the generic > BDS) > > ArmPlatformPkg/Bds/Bds.c | 561 --------- > ArmPlatformPkg/Bds/Bds.inf | 90 -- > ArmPlatformPkg/Bds/BdsHelper.c | 465 -------- > ArmPlatformPkg/Bds/BdsInternal.h | 277 ----- > ArmPlatformPkg/Bds/BootLinux.c | 124 -- > ArmPlatformPkg/Bds/BootMenu.c | 1101 ------------------ > ArmPlatformPkg/Bds/BootOption.c | 316 ------ > ArmPlatformPkg/Bds/BootOptionSupport.c | 1195 -------------------- > 8 files changed, 4129 deletions(-) > > diff --git a/ArmPlatformPkg/Bds/Bds.c b/ArmPlatformPkg/Bds/Bds.c > deleted file mode 100644 > index 4cea3cd531bb..000000000000 > --- a/ArmPlatformPkg/Bds/Bds.c > +++ /dev/null > @@ -1,561 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011-2015, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#include "BdsInternal.h" > - > -#include <Library/PcdLib.h> > -#include <Library/PerformanceLib.h> > - > -#include <Protocol/Bds.h> > - > -#include <Guid/EventGroup.h> > - > -#define EFI_SET_TIMER_TO_SECOND 10000000 > - > -STATIC > -EFI_STATUS > -GetConsoleDevicePathFromVariable ( > - IN CHAR16* ConsoleVarName, > - IN CHAR16* DefaultConsolePaths, > - OUT EFI_DEVICE_PATH** DevicePaths > - ) > -{ > - EFI_STATUS Status; > - UINTN Size; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathInstances; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathInstance; > - CHAR16* DevicePathStr; > - CHAR16* NextDevicePathStr; > - EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *EfiDevicePathFromTextProtocol; > - > - Status = GetGlobalEnvironmentVariable (ConsoleVarName, NULL, NULL, (VOID**)&DevicePathInstances); > - if (EFI_ERROR(Status)) { > - // In case no default console device path has been defined we assume a driver handles the console (eg: SimpleTextInOutSerial) > - if ((DefaultConsolePaths == NULL) || (DefaultConsolePaths[0] == L'\0')) { > - *DevicePaths = NULL; > - return EFI_SUCCESS; > - } > - > - Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, (VOID **)&EfiDevicePathFromTextProtocol); > - ASSERT_EFI_ERROR(Status); > - > - DevicePathInstances = NULL; > - > - // Extract the Device Path instances from the multi-device path string > - while ((DefaultConsolePaths != NULL) && (DefaultConsolePaths[0] != L'\0')) { > - NextDevicePathStr = StrStr (DefaultConsolePaths, L";"); > - if (NextDevicePathStr == NULL) { > - DevicePathStr = DefaultConsolePaths; > - DefaultConsolePaths = NULL; > - } else { > - DevicePathStr = (CHAR16*)AllocateCopyPool ((NextDevicePathStr - DefaultConsolePaths + 1) * sizeof(CHAR16), DefaultConsolePaths); > - *(DevicePathStr + (NextDevicePathStr - DefaultConsolePaths)) = L'\0'; > - DefaultConsolePaths = NextDevicePathStr; > - if (DefaultConsolePaths[0] == L';') { > - DefaultConsolePaths++; > - } > - } > - > - DevicePathInstance = EfiDevicePathFromTextProtocol->ConvertTextToDevicePath (DevicePathStr); > - ASSERT(DevicePathInstance != NULL); > - DevicePathInstances = AppendDevicePathInstance (DevicePathInstances, DevicePathInstance); > - > - if (NextDevicePathStr != NULL) { > - FreePool (DevicePathStr); > - } > - FreePool (DevicePathInstance); > - } > - > - // Set the environment variable with this device path multi-instances > - Size = GetDevicePathSize (DevicePathInstances); > - if (Size > 0) { > - gRT->SetVariable ( > - ConsoleVarName, > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - Size, > - DevicePathInstances > - ); > - } else { > - Status = EFI_INVALID_PARAMETER; > - } > - } > - > - if (!EFI_ERROR(Status)) { > - *DevicePaths = DevicePathInstances; > - } > - return Status; > -} > - > -STATIC > -EFI_STATUS > -InitializeConsolePipe ( > - IN EFI_DEVICE_PATH *ConsoleDevicePaths, > - IN EFI_GUID *Protocol, > - OUT EFI_HANDLE *Handle, > - OUT VOID* *Interface > - ) > -{ > - EFI_STATUS Status; > - UINTN Size; > - UINTN NoHandles; > - EFI_HANDLE *Buffer; > - EFI_DEVICE_PATH_PROTOCOL* DevicePath; > - > - // Connect all the Device Path Consoles > - while (ConsoleDevicePaths != NULL) { > - DevicePath = GetNextDevicePathInstance (&ConsoleDevicePaths, &Size); > - > - Status = BdsConnectDevicePath (DevicePath, Handle, NULL); > - DEBUG_CODE_BEGIN(); > - if (EFI_ERROR(Status)) { > - // We convert back to the text representation of the device Path > - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; > - CHAR16* DevicePathTxt; > - EFI_STATUS Status; > - > - Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); > - if (!EFI_ERROR(Status)) { > - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (DevicePath, TRUE, TRUE); > - > - DEBUG((EFI_D_ERROR,"Fail to start the console with the Device Path '%s'. (Error '%r')\n", DevicePathTxt, Status)); > - > - FreePool (DevicePathTxt); > - } > - } > - DEBUG_CODE_END(); > - > - // If the console splitter driver is not supported by the platform then use the first Device Path > - // instance for the console interface. > - if (!EFI_ERROR(Status) && (*Interface == NULL)) { > - Status = gBS->HandleProtocol (*Handle, Protocol, Interface); > - } > - } > - > - // No Device Path has been defined for this console interface. We take the first protocol implementation > - if (*Interface == NULL) { > - Status = gBS->LocateHandleBuffer (ByProtocol, Protocol, NULL, &NoHandles, &Buffer); > - if (EFI_ERROR (Status)) { > - BdsConnectAllDrivers(); > - Status = gBS->LocateHandleBuffer (ByProtocol, Protocol, NULL, &NoHandles, &Buffer); > - } > - > - if (!EFI_ERROR(Status)) { > - *Handle = Buffer[0]; > - Status = gBS->HandleProtocol (*Handle, Protocol, Interface); > - ASSERT_EFI_ERROR(Status); > - FreePool (Buffer); > - } > - } else { > - Status = EFI_SUCCESS; > - } > - > - return Status; > -} > - > -EFI_STATUS > -InitializeConsole ( > - VOID > - ) > -{ > - EFI_STATUS Status; > - EFI_DEVICE_PATH* ConOutDevicePaths; > - EFI_DEVICE_PATH* ConInDevicePaths; > - EFI_DEVICE_PATH* ConErrDevicePaths; > - > - // By getting the Console Device Paths from the environment variables before initializing the console pipe, we > - // create the 3 environment variables (ConIn, ConOut, ConErr) that allows to initialize all the console interface > - // of newly installed console drivers > - Status = GetConsoleDevicePathFromVariable (L"ConOut", (CHAR16*)PcdGetPtr(PcdDefaultConOutPaths), &ConOutDevicePaths); > - ASSERT_EFI_ERROR (Status); > - Status = GetConsoleDevicePathFromVariable (L"ConIn", (CHAR16*)PcdGetPtr(PcdDefaultConInPaths), &ConInDevicePaths); > - ASSERT_EFI_ERROR (Status); > - Status = GetConsoleDevicePathFromVariable (L"ErrOut", (CHAR16*)PcdGetPtr(PcdDefaultConOutPaths), &ConErrDevicePaths); > - ASSERT_EFI_ERROR (Status); > - > - // Initialize the Consoles > - Status = InitializeConsolePipe (ConOutDevicePaths, &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **)&gST->ConOut); > - ASSERT_EFI_ERROR (Status); > - Status = InitializeConsolePipe (ConInDevicePaths, &gEfiSimpleTextInProtocolGuid, &gST->ConsoleInHandle, (VOID **)&gST->ConIn); > - ASSERT_EFI_ERROR (Status); > - Status = InitializeConsolePipe (ConErrDevicePaths, &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **)&gST->StdErr); > - if (EFI_ERROR(Status)) { > - // In case of error, we reuse the console output for the error output > - gST->StandardErrorHandle = gST->ConsoleOutHandle; > - gST->StdErr = gST->ConOut; > - } > - > - // Free Memory allocated for reading the UEFI Variables > - if (ConOutDevicePaths) { > - FreePool (ConOutDevicePaths); > - } > - if (ConInDevicePaths) { > - FreePool (ConInDevicePaths); > - } > - if (ConErrDevicePaths) { > - FreePool (ConErrDevicePaths); > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -DefineDefaultBootEntries ( > - VOID > - ) > -{ > - BDS_LOAD_OPTION* BdsLoadOption; > - UINTN Size; > - EFI_STATUS Status; > - EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL* EfiDevicePathFromTextProtocol; > - EFI_DEVICE_PATH* BootDevicePath; > - UINTN CmdLineSize; > - UINTN CmdLineAsciiSize; > - CHAR16* DefaultBootArgument; > - CHAR8* AsciiDefaultBootArgument; > - > - // > - // If Boot Order does not exist then create a default entry > - // > - Size = 0; > - Status = gRT->GetVariable (L"BootOrder", &gEfiGlobalVariableGuid, NULL, &Size, NULL); > - if (Status == EFI_NOT_FOUND) { > - if ((PcdGetPtr(PcdDefaultBootDevicePath) == NULL) || (StrLen ((CHAR16*)PcdGetPtr(PcdDefaultBootDevicePath)) == 0)) { > - return EFI_UNSUPPORTED; > - } > - > - Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, (VOID **)&EfiDevicePathFromTextProtocol); > - if (EFI_ERROR(Status)) { > - // You must provide an implementation of DevicePathFromTextProtocol in your firmware (eg: DevicePathDxe) > - DEBUG((EFI_D_ERROR,"Error: Bds requires DevicePathFromTextProtocol\n")); > - return Status; > - } > - BootDevicePath = EfiDevicePathFromTextProtocol->ConvertTextToDevicePath ((CHAR16*)PcdGetPtr(PcdDefaultBootDevicePath)); > - > - DEBUG_CODE_BEGIN(); > - // We convert back to the text representation of the device Path to see if the initial text is correct > - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; > - CHAR16* DevicePathTxt; > - > - Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); > - ASSERT_EFI_ERROR(Status); > - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (BootDevicePath, TRUE, TRUE); > - > - if (StrCmp ((CHAR16*)PcdGetPtr (PcdDefaultBootDevicePath), DevicePathTxt) != 0) { > - DEBUG ((EFI_D_ERROR, "Device Path given: '%s' Device Path expected: '%s'\n", > - (CHAR16*)PcdGetPtr (PcdDefaultBootDevicePath), DevicePathTxt)); > - ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); > - } > - > - FreePool (DevicePathTxt); > - DEBUG_CODE_END(); > - > - // Create the entry is the Default values are correct > - if (BootDevicePath != NULL) { > - // We do not support NULL pointer > - ASSERT (PcdGetPtr (PcdDefaultBootArgument) != NULL); > - > - // > - // Logic to handle ASCII or Unicode default parameters > - // > - if (*(CHAR8*)PcdGetPtr (PcdDefaultBootArgument) == '\0') { > - CmdLineSize = 0; > - CmdLineAsciiSize = 0; > - DefaultBootArgument = NULL; > - AsciiDefaultBootArgument = NULL; > - } else if (IsUnicodeString ((CHAR16*)PcdGetPtr (PcdDefaultBootArgument))) { > - // The command line is a Unicode string > - DefaultBootArgument = (CHAR16*)PcdGetPtr (PcdDefaultBootArgument); > - CmdLineSize = StrSize (DefaultBootArgument); > - > - // Initialize ASCII variables > - CmdLineAsciiSize = CmdLineSize / 2; > - AsciiDefaultBootArgument = AllocatePool (CmdLineAsciiSize); > - if (AsciiDefaultBootArgument == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - UnicodeStrToAsciiStr ((CHAR16*)PcdGetPtr (PcdDefaultBootArgument), AsciiDefaultBootArgument); > - } else { > - // The command line is a ASCII string > - AsciiDefaultBootArgument = (CHAR8*)PcdGetPtr (PcdDefaultBootArgument); > - CmdLineAsciiSize = AsciiStrSize (AsciiDefaultBootArgument); > - > - // Initialize ASCII variables > - CmdLineSize = CmdLineAsciiSize * 2; > - DefaultBootArgument = AllocatePool (CmdLineSize); > - if (DefaultBootArgument == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - AsciiStrToUnicodeStr (AsciiDefaultBootArgument, DefaultBootArgument); > - } > - > - BootOptionCreate (LOAD_OPTION_ACTIVE | LOAD_OPTION_CATEGORY_BOOT, > - (CHAR16*)PcdGetPtr (PcdDefaultBootDescription), > - BootDevicePath, > - (UINT8 *)DefaultBootArgument, // OptionalData > - CmdLineSize, // OptionalDataSize > - &BdsLoadOption > - ); > - FreePool (BdsLoadOption); > - > - if (DefaultBootArgument == (CHAR16*)PcdGetPtr (PcdDefaultBootArgument)) { > - FreePool (AsciiDefaultBootArgument); > - } else if (DefaultBootArgument != NULL) { > - FreePool (DefaultBootArgument); > - } > - } else { > - Status = EFI_UNSUPPORTED; > - } > - } > - > - return Status; > -} > - > -EFI_STATUS > -StartDefaultBootOnTimeout ( > - VOID > - ) > -{ > - UINTN Size; > - UINT16 Timeout; > - UINT16 *TimeoutPtr; > - EFI_EVENT WaitList[2]; > - UINTN WaitIndex; > - UINT16 *BootOrder; > - UINTN BootOrderSize; > - UINTN Index; > - CHAR16 BootVariableName[9]; > - EFI_STATUS Status; > - EFI_INPUT_KEY Key; > - > - Size = sizeof(UINT16); > - Timeout = (UINT16)PcdGet16 (PcdPlatformBootTimeOut); > - Status = GetGlobalEnvironmentVariable (L"Timeout", &Timeout, &Size, (VOID**)&TimeoutPtr); > - if (!EFI_ERROR (Status)) { > - Timeout = *TimeoutPtr; > - FreePool (TimeoutPtr); > - } > - > - if (Timeout != 0xFFFF) { > - if (Timeout > 0) { > - // Create the waiting events (keystroke and 1sec timer) > - gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &WaitList[0]); > - gBS->SetTimer (WaitList[0], TimerPeriodic, EFI_SET_TIMER_TO_SECOND); > - WaitList[1] = gST->ConIn->WaitForKey; > - > - // Start the timer > - WaitIndex = 0; > - Print(L"The default boot selection will start in "); > - while ((Timeout > 0) && (WaitIndex == 0)) { > - Print(L"%3d seconds",Timeout); > - gBS->WaitForEvent (2, WaitList, &WaitIndex); > - if (WaitIndex == 0) { > - Print(L"\b\b\b\b\b\b\b\b\b\b\b"); > - Timeout--; > - } > - } > - // Discard key in the buffer > - do { > - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); > - } while(!EFI_ERROR(Status)); > - gBS->CloseEvent (WaitList[0]); > - Print(L"\n\r"); > - } > - > - // In case of Timeout we start the default boot selection > - if (Timeout == 0) { > - // Get the Boot Option Order from the environment variable (a default value should have been created) > - GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder); > - > - for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) { > - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BootOrder[Index]); > - Status = BdsStartBootOption (BootVariableName); > - if(!EFI_ERROR(Status)){ > - // Boot option returned successfully, hence don't need to start next boot option > - break; > - } > - // In case of success, we should not return from this call. > - } > - FreePool (BootOrder); > - } > - } > - return EFI_SUCCESS; > -} > - > -/** > - An empty function to pass error checking of CreateEventEx (). > - > - @param Event Event whose notification function is being invoked. > - @param Context Pointer to the notification function's context, > - which is implementation-dependent. > - > -**/ > -VOID > -EFIAPI > -EmptyCallbackFunction ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - return; > -} > - > -/** > - This function uses policy data from the platform to determine what operating > - system or system utility should be loaded and invoked. This function call > - also optionally make the use of user input to determine the operating system > - or system utility to be loaded and invoked. When the DXE Core has dispatched > - all the drivers on the dispatch queue, this function is called. This > - function will attempt to connect the boot devices required to load and invoke > - the selected operating system or system utility. During this process, > - additional firmware volumes may be discovered that may contain addition DXE > - drivers that can be dispatched by the DXE Core. If a boot device cannot be > - fully connected, this function calls the DXE Service Dispatch() to allow the > - DXE drivers from any newly discovered firmware volumes to be dispatched. > - Then the boot device connection can be attempted again. If the same boot > - device connection operation fails twice in a row, then that boot device has > - failed, and should be skipped. This function should never return. > - > - @param This The EFI_BDS_ARCH_PROTOCOL instance. > - > - @return None. > - > -**/ > -VOID > -EFIAPI > -BdsEntry ( > - IN EFI_BDS_ARCH_PROTOCOL *This > - ) > -{ > - UINTN Size; > - EFI_STATUS Status; > - UINT16 *BootNext; > - UINTN BootNextSize; > - CHAR16 BootVariableName[9]; > - EFI_EVENT EndOfDxeEvent; > - > - // > - // Signal EndOfDxe PI Event > - // > - Status = gBS->CreateEventEx ( > - EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - EmptyCallbackFunction, > - NULL, > - &gEfiEndOfDxeEventGroupGuid, > - &EndOfDxeEvent > - ); > - if (!EFI_ERROR (Status)) { > - gBS->SignalEvent (EndOfDxeEvent); > - } > - > - PERF_END (NULL, "DXE", NULL, 0); > - > - // > - // Declare the Firmware Vendor > - // > - if (FixedPcdGetPtr(PcdFirmwareVendor) != NULL) { > - Size = 0x100; > - gST->FirmwareVendor = AllocateRuntimePool (Size); > - ASSERT (gST->FirmwareVendor != NULL); > - UnicodeSPrint (gST->FirmwareVendor, Size, L"%a EFI %a %a", PcdGetPtr(PcdFirmwareVendor), __DATE__, __TIME__); > - } > - > - // > - // Fixup Table CRC after we updated Firmware Vendor > - // > - gST->Hdr.CRC32 = 0; > - Status = gBS->CalculateCrc32 ((VOID*)gST, gST->Hdr.HeaderSize, &gST->Hdr.CRC32); > - ASSERT_EFI_ERROR (Status); > - > - // Now we need to setup the EFI System Table with information about the console devices. > - InitializeConsole (); > - > - // If BootNext environment variable is defined then we just load it ! > - BootNextSize = sizeof(UINT16); > - Status = GetGlobalEnvironmentVariable (L"BootNext", NULL, &BootNextSize, (VOID**)&BootNext); > - if (!EFI_ERROR(Status)) { > - ASSERT(BootNextSize == sizeof(UINT16)); > - > - // Generate the requested Boot Entry variable name > - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", *BootNext); > - > - // Set BootCurrent variable > - gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, > - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - BootNextSize, BootNext); > - > - FreePool (BootNext); > - > - // Start the requested Boot Entry > - Status = BdsStartBootOption (BootVariableName); > - if (Status != EFI_NOT_FOUND) { > - // BootNext has not been succeeded launched > - if (EFI_ERROR(Status)) { > - Print(L"Fail to start BootNext.\n"); > - } > - > - // Delete the BootNext environment variable > - gRT->SetVariable (L"BootNext", &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - 0, NULL); > - } > - > - // Clear BootCurrent variable > - gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, > - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - 0, NULL); > - } > - > - // If Boot Order does not exist then create a default entry > - DefineDefaultBootEntries (); > - > - // > - // Update the CRC32 in the EFI System Table header > - // > - gST->Hdr.CRC32 = 0; > - Status = gBS->CalculateCrc32 ((VOID*)gST, gST->Hdr.HeaderSize, &gST->Hdr.CRC32); > - ASSERT_EFI_ERROR (Status); > - > - // Timer before initiating the default boot selection > - StartDefaultBootOnTimeout (); > - > - // Start the Boot Menu > - Status = BootMenuMain (); > - ASSERT_EFI_ERROR (Status); > - > -} > - > -EFI_BDS_ARCH_PROTOCOL gBdsProtocol = { > - BdsEntry, > -}; > - > -EFI_STATUS > -EFIAPI > -BdsInitialize ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ) > -{ > - EFI_STATUS Status; > - > - Status = gBS->InstallMultipleProtocolInterfaces ( > - &ImageHandle, > - &gEfiBdsArchProtocolGuid, &gBdsProtocol, > - NULL > - ); > - ASSERT_EFI_ERROR (Status); > - > - return Status; > -} > diff --git a/ArmPlatformPkg/Bds/Bds.inf b/ArmPlatformPkg/Bds/Bds.inf > deleted file mode 100644 > index 96bec16f0a2e..000000000000 > --- a/ArmPlatformPkg/Bds/Bds.inf > +++ /dev/null > @@ -1,90 +0,0 @@ > -#/** @file > -# > -# Component description file for Bds module > -# > -# Copyright (c) 2011-2015, ARM Ltd. All rights reserved.<BR> > -# > -# This program and the accompanying materials > -# are licensed and made available under the terms and conditions of the BSD License > -# which accompanies this distribution. The full text of the license may be found at > -# http://opensource.org/licenses/bsd-license.php > -# > -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -# > -#**/ > - > - > -[Defines] > - INF_VERSION = 0x00010005 > - BASE_NAME = ArmPlatformBds > - FILE_GUID = 5a50aa81-c3ae-4608-a0e3-41a2e69baf94 > - MODULE_TYPE = DXE_DRIVER > - VERSION_STRING = 1.0 > - > - ENTRY_POINT = BdsInitialize > - > -[Sources] > - Bds.c > - BdsHelper.c > - BootLinux.c > - BootMenu.c > - BootOption.c > - BootOptionSupport.c > - > -[Packages] > - MdePkg/MdePkg.dec > - MdeModulePkg/MdeModulePkg.dec > - ArmPkg/ArmPkg.dec > - ArmPlatformPkg/ArmPlatformPkg.dec > - EmbeddedPkg/EmbeddedPkg.dec > - IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec > - > -[Guids] > - gFdtTableGuid > - > -[LibraryClasses] > - BdsLib > - UefiBootServicesTableLib > - DxeServicesTableLib > - UefiDriverEntryPoint > - DebugLib > - PerformanceLib > - PrintLib > - BaseLib > - FdtLib > - NetLib > - > -[Guids] > - gEfiEndOfDxeEventGroupGuid > - gEfiFileSystemInfoGuid > - gFdtVariableGuid > - > -[Protocols] > - gEfiBdsArchProtocolGuid > - gEfiBlockIoProtocolGuid > - gEfiSimpleTextInProtocolGuid > - gEfiPxeBaseCodeProtocolGuid > - gEfiSimpleNetworkProtocolGuid > - gEfiDevicePathToTextProtocolGuid > - gEfiFirmwareVolumeBlockProtocolGuid > - gEfiFirmwareVolumeBlock2ProtocolGuid > - gEfiDhcp4ServiceBindingProtocolGuid > - gEfiMtftp4ServiceBindingProtocolGuid > - > -[FeaturePcd] > - gArmPlatformTokenSpaceGuid.PcdBdsLinuxSupport > - > -[Pcd] > - gArmPlatformTokenSpaceGuid.PcdFirmwareVendor > - gArmPlatformTokenSpaceGuid.PcdDefaultBootDescription > - gArmPlatformTokenSpaceGuid.PcdDefaultBootDevicePath > - gArmPlatformTokenSpaceGuid.PcdDefaultBootArgument > - gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut > - gArmPlatformTokenSpaceGuid.PcdDefaultConInPaths > - gArmPlatformTokenSpaceGuid.PcdDefaultConOutPaths > - > - gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile > - > -[Depex] > - TRUE > diff --git a/ArmPlatformPkg/Bds/BdsHelper.c b/ArmPlatformPkg/Bds/BdsHelper.c > deleted file mode 100644 > index 732292cdb94a..000000000000 > --- a/ArmPlatformPkg/Bds/BdsHelper.c > +++ /dev/null > @@ -1,465 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011 - 2014, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#include <Library/NetLib.h> > -#include "BdsInternal.h" > - > -EFI_STATUS > -EditHIInputStr ( > - IN OUT CHAR16 *CmdLine, > - IN UINTN MaxCmdLine > - ) > -{ > - UINTN CmdLineIndex; > - UINTN WaitIndex; > - CHAR8 Char; > - EFI_INPUT_KEY Key; > - EFI_STATUS Status; > - > - // The command line must be at least one character long > - ASSERT (MaxCmdLine > 0); > - > - // Ensure the last character of the buffer is the NULL character > - CmdLine[MaxCmdLine - 1] = '\0'; > - > - Print (CmdLine); > - > - // To prevent a buffer overflow, we only allow to enter (MaxCmdLine-1) characters > - for (CmdLineIndex = StrLen (CmdLine); CmdLineIndex < MaxCmdLine; ) { > - Status = gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &WaitIndex); > - ASSERT_EFI_ERROR (Status); > - > - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); > - ASSERT_EFI_ERROR (Status); > - > - // Unicode character is valid when Scancode is NUll > - if (Key.ScanCode == SCAN_NULL) { > - // Scan code is NUll, hence read Unicode character > - Char = (CHAR8)Key.UnicodeChar; > - } else { > - Char = CHAR_NULL; > - } > - > - if ((Char == CHAR_LINEFEED) || (Char == CHAR_CARRIAGE_RETURN) || (Char == 0x7f)) { > - CmdLine[CmdLineIndex] = '\0'; > - Print (L"\r\n"); > - > - return EFI_SUCCESS; > - } else if ((Key.UnicodeChar == L'\b') || (Key.ScanCode == SCAN_LEFT) || (Key.ScanCode == SCAN_DELETE)){ > - if (CmdLineIndex != 0) { > - CmdLineIndex--; > - Print (L"\b \b"); > - } > - } else if ((Key.ScanCode == SCAN_ESC) || (Char == 0x1B) || (Char == 0x0)) { > - return EFI_INVALID_PARAMETER; > - } else if (CmdLineIndex < (MaxCmdLine-1)) { > - CmdLine[CmdLineIndex++] = Key.UnicodeChar; > - Print (L"%c", Key.UnicodeChar); > - } > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -GetHIInputStr ( > - IN OUT CHAR16 *CmdLine, > - IN UINTN MaxCmdLine > - ) > -{ > - EFI_STATUS Status; > - > - // For a new input just passed an empty string > - CmdLine[0] = L'\0'; > - > - Status = EditHIInputStr (CmdLine, MaxCmdLine); > - > - return Status; > -} > - > -EFI_STATUS > -EditHIInputAscii ( > - IN OUT CHAR8 *CmdLine, > - IN UINTN MaxCmdLine > - ) > -{ > - CHAR16* Str; > - EFI_STATUS Status; > - > - Str = (CHAR16*)AllocatePool (MaxCmdLine * sizeof(CHAR16)); > - AsciiStrToUnicodeStr (CmdLine, Str); > - > - Status = EditHIInputStr (Str, MaxCmdLine); > - if (!EFI_ERROR(Status)) { > - UnicodeStrToAsciiStr (Str, CmdLine); > - } > - FreePool (Str); > - > - return Status; > -} > - > -EFI_STATUS > -GetHIInputAscii ( > - IN OUT CHAR8 *CmdLine, > - IN UINTN MaxCmdLine > - ) > -{ > - // For a new input just passed an empty string > - CmdLine[0] = '\0'; > - > - return EditHIInputAscii (CmdLine,MaxCmdLine); > -} > - > -EFI_STATUS > -GetHIInputInteger ( > - OUT UINTN *Integer > - ) > -{ > - CHAR16 CmdLine[255]; > - EFI_STATUS Status; > - > - CmdLine[0] = '\0'; > - Status = EditHIInputStr (CmdLine, 255); > - if (!EFI_ERROR(Status)) { > - *Integer = StrDecimalToUintn (CmdLine); > - } > - > - return Status; > -} > - > -/** > - Get an IPv4 address > - > - The function asks the user for an IPv4 address. If the input > - string defines a valid IPv4 address, the four bytes of the > - corresponding IPv4 address are extracted from the string and returned by > - the function. As long as the user does not define a valid IP > - address, he is asked for one. He can always escape by > - pressing ESC. > - > - @param[out] EFI_IP_ADDRESS OutIpAddr Returned IPv4 address. Valid if > - and only if the returned value > - is equal to EFI_SUCCESS > - > - @retval EFI_SUCCESS Input completed > - @retval EFI_ABORTED Editing aborted by the user > - @retval EFI_OUT_OF_RESOURCES Fail to perform the operation due to > - lack of resource > -**/ > -EFI_STATUS > -GetHIInputIP ( > - OUT EFI_IP_ADDRESS *OutIpAddr > - ) > -{ > - EFI_STATUS Status; > - CHAR16 CmdLine[48]; > - > - while (TRUE) { > - CmdLine[0] = '\0'; > - Status = EditHIInputStr (CmdLine, 48); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - > - Status = NetLibStrToIp4 (CmdLine, &OutIpAddr->v4); > - if (Status == EFI_INVALID_PARAMETER) { > - Print (L"Invalid address\n"); > - } else { > - return Status; > - } > - } > -} > - > -/** > - Edit an IPv4 address > - > - The function displays as a string following the "%d.%d.%d.%d" format the > - IPv4 address that is passed in and asks the user to modify it. If the > - resulting string defines a valid IPv4 address, the four bytes of the > - corresponding IPv4 address are extracted from the string and returned by > - the function. As long as the user does not define a valid IP > - address, he is asked for one. He can always escape by > - pressing ESC. > - > - @param[in ] EFI_IP_ADDRESS InIpAddr Input IPv4 address > - @param[out] EFI_IP_ADDRESS OutIpAddr Returned IPv4 address. Valid if > - and only if the returned value > - is equal to EFI_SUCCESS > - > - @retval EFI_SUCCESS Update completed > - @retval EFI_ABORTED Editing aborted by the user > - @retval EFI_INVALID_PARAMETER The string returned by the user is > - mal-formated > - @retval EFI_OUT_OF_RESOURCES Fail to perform the operation due to > - lack of resource > -**/ > -EFI_STATUS > -EditHIInputIP ( > - IN EFI_IP_ADDRESS *InIpAddr, > - OUT EFI_IP_ADDRESS *OutIpAddr > - ) > -{ > - EFI_STATUS Status; > - CHAR16 CmdLine[48]; > - > - while (TRUE) { > - UnicodeSPrint ( > - CmdLine, 48, L"%d.%d.%d.%d", > - InIpAddr->v4.Addr[0], InIpAddr->v4.Addr[1], > - InIpAddr->v4.Addr[2], InIpAddr->v4.Addr[3] > - ); > - > - Status = EditHIInputStr (CmdLine, 48); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - Status = NetLibStrToIp4 (CmdLine, &OutIpAddr->v4); > - if (Status == EFI_INVALID_PARAMETER) { > - Print (L"Invalid address\n"); > - } else { > - return Status; > - } > - } > -} > - > -EFI_STATUS > -GetHIInputBoolean ( > - OUT BOOLEAN *Value > - ) > -{ > - CHAR16 CmdBoolean[2]; > - EFI_STATUS Status; > - > - while(1) { > - Print (L"[y/n] "); > - Status = GetHIInputStr (CmdBoolean, 2); > - if (EFI_ERROR(Status)) { > - return Status; > - } else if ((CmdBoolean[0] == L'y') || (CmdBoolean[0] == L'Y')) { > - if (Value) *Value = TRUE; > - return EFI_SUCCESS; > - } else if ((CmdBoolean[0] == L'n') || (CmdBoolean[0] == L'N')) { > - if (Value) *Value = FALSE; > - return EFI_SUCCESS; > - } > - } > -} > - > -// Return the last non end-type Device Path Node from a Device Path > -EFI_DEVICE_PATH* > -GetLastDevicePathNode ( > - IN EFI_DEVICE_PATH* DevicePath > - ) > -{ > - EFI_DEVICE_PATH* PrevDevicePathNode; > - > - PrevDevicePathNode = DevicePath; > - while (!IsDevicePathEndType (DevicePath)) { > - PrevDevicePathNode = DevicePath; > - DevicePath = NextDevicePathNode (DevicePath); > - } > - > - return PrevDevicePathNode; > -} > - > -EFI_STATUS > -GenerateDeviceDescriptionName ( > - IN EFI_HANDLE Handle, > - IN OUT CHAR16* Description > - ) > -{ > - EFI_STATUS Status; > - EFI_COMPONENT_NAME_PROTOCOL* ComponentName2Protocol; > - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; > - CHAR16* DriverName; > - CHAR16* DevicePathTxt; > - EFI_DEVICE_PATH* DevicePathNode; > - > - ComponentName2Protocol = NULL; > - Status = gBS->HandleProtocol (Handle, &gEfiComponentName2ProtocolGuid, (VOID **)&ComponentName2Protocol); > - if (!EFI_ERROR(Status)) { > - //TODO: Fixme. we must find the best langague > - Status = ComponentName2Protocol->GetDriverName (ComponentName2Protocol,"en",&DriverName); > - if (!EFI_ERROR(Status)) { > - StrnCpy (Description, DriverName, BOOT_DEVICE_DESCRIPTION_MAX); > - } > - } > - > - if (EFI_ERROR(Status)) { > - // Use the lastest non null entry of the Device path as a description > - Status = gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID **)&DevicePathProtocol); > - if (EFI_ERROR(Status)) { > - return Status; > - } > - > - // Convert the last non end-type Device Path Node in text for the description > - DevicePathNode = GetLastDevicePathNode (DevicePathProtocol); > - Status = gBS->LocateProtocol (&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); > - ASSERT_EFI_ERROR(Status); > - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (DevicePathNode, TRUE, TRUE); > - StrnCpy (Description, DevicePathTxt, BOOT_DEVICE_DESCRIPTION_MAX); > - FreePool (DevicePathTxt); > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BdsStartBootOption ( > - IN CHAR16* BootOption > - ) > -{ > - EFI_STATUS Status; > - BDS_LOAD_OPTION *BdsLoadOption; > - > - Status = BootOptionFromLoadOptionVariable (BootOption, &BdsLoadOption); > - if (!EFI_ERROR(Status)) { > - Status = BootOptionStart (BdsLoadOption); > - FreePool (BdsLoadOption); > - > - if (!EFI_ERROR(Status)) { > - Status = EFI_SUCCESS; > - } else { > - Status = EFI_NOT_STARTED; > - } > - } else { > - Status = EFI_NOT_FOUND; > - } > - return Status; > -} > - > -UINTN > -GetUnalignedDevicePathSize ( > - IN EFI_DEVICE_PATH* DevicePath > - ) > -{ > - UINTN Size; > - EFI_DEVICE_PATH* AlignedDevicePath; > - > - if ((UINTN)DevicePath & 0x1) { > - AlignedDevicePath = DuplicateDevicePath (DevicePath); > - Size = GetDevicePathSize (AlignedDevicePath); > - FreePool (AlignedDevicePath); > - } else { > - Size = GetDevicePathSize (DevicePath); > - } > - return Size; > -} > - > -EFI_DEVICE_PATH* > -GetAlignedDevicePath ( > - IN EFI_DEVICE_PATH* DevicePath > - ) > -{ > - if ((UINTN)DevicePath & 0x1) { > - return DuplicateDevicePath (DevicePath); > - } else { > - return DevicePath; > - } > -} > - > -BOOLEAN > -IsUnicodeString ( > - IN VOID* String > - ) > -{ > - // We do not support NULL pointer > - ASSERT (String != NULL); > - > - if (*(CHAR16*)String < 0x100) { > - //Note: We could get issue if the string is an empty Ascii string... > - return TRUE; > - } else { > - return FALSE; > - } > -} > - > -/* > - * Try to detect if the given string is an ASCII or Unicode string > - * > - * There are actually few limitation to this function but it is mainly to give > - * a user friendly output. > - * > - * Some limitations: > - * - it only supports unicode string that use ASCII character (< 0x100) > - * - single character ASCII strings are interpreted as Unicode string > - * - string cannot be longer than BOOT_DEVICE_OPTION_MAX characters and > - * thus (BOOT_DEVICE_OPTION_MAX*2) bytes for an Unicode string and > - * BOOT_DEVICE_OPTION_MAX bytes for an ASCII string. > - * > - * @param String Buffer that might contain a Unicode or Ascii string > - * @param IsUnicode If not NULL this boolean value returns if the string is an > - * ASCII or Unicode string. > - */ > -BOOLEAN > -IsPrintableString ( > - IN VOID* String, > - OUT BOOLEAN *IsUnicode > - ) > -{ > - BOOLEAN UnicodeDetected; > - BOOLEAN IsPrintable; > - UINTN Index; > - CHAR16 Character; > - > - // We do not support NULL pointer > - ASSERT (String != NULL); > - > - // Test empty string > - if (*(CHAR16*)String == L'\0') { > - if (IsUnicode) { > - *IsUnicode = TRUE; > - } > - return TRUE; > - } else if (*(CHAR16*)String == '\0') { > - if (IsUnicode) { > - *IsUnicode = FALSE; > - } > - return TRUE; > - } > - > - // Limitation: if the string is an ASCII single character string. This comparison > - // will assume it is a Unicode string. > - if (*(CHAR16*)String < 0x100) { > - UnicodeDetected = TRUE; > - } else { > - UnicodeDetected = FALSE; > - } > - > - IsPrintable = FALSE; > - for (Index = 0; Index < BOOT_DEVICE_OPTION_MAX; Index++) { > - if (UnicodeDetected) { > - Character = ((CHAR16*)String)[Index]; > - } else { > - Character = ((CHAR8*)String)[Index]; > - } > - > - if (Character == '\0') { > - // End of the string > - IsPrintable = TRUE; > - break; > - } else if ((Character < 0x20) || (Character > 0x7f)) { > - // We only support the range of printable ASCII character > - IsPrintable = FALSE; > - break; > - } > - } > - > - if (IsPrintable && IsUnicode) { > - *IsUnicode = UnicodeDetected; > - } > - > - return IsPrintable; > -} > diff --git a/ArmPlatformPkg/Bds/BdsInternal.h b/ArmPlatformPkg/Bds/BdsInternal.h > deleted file mode 100644 > index ddf5308e8b23..000000000000 > --- a/ArmPlatformPkg/Bds/BdsInternal.h > +++ /dev/null > @@ -1,277 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011-2015, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#ifndef _BDSINTERNAL_H_ > -#define _BDSINTERNAL_H_ > - > -#include <PiDxe.h> > -#include <Library/BaseMemoryLib.h> > -#include <Library/BdsLib.h> > -#include <Library/DebugLib.h> > -#include <Library/DevicePathLib.h> > -#include <Library/UefiLib.h> > -#include <Library/PrintLib.h> > -#include <Library/PcdLib.h> > -#include <Library/MemoryAllocationLib.h> > -#include <Library/UefiBootServicesTableLib.h> > -#include <Library/UefiRuntimeServicesTableLib.h> > - > -#include <Protocol/DevicePathFromText.h> > -#include <Protocol/DevicePathToText.h> > - > -#include <Guid/GlobalVariable.h> > -#include <Guid/Fdt.h> > - > -#define BOOT_DEVICE_DESCRIPTION_MAX 100 > -#define BOOT_DEVICE_FILEPATH_MAX 100 > -#define BOOT_DEVICE_OPTION_MAX 300 > -#define BOOT_DEVICE_ADDRESS_MAX (sizeof(L"0x0000000000000000")) > - > -#define UPDATE_BOOT_ENTRY L"Update entry: " > -#define DELETE_BOOT_ENTRY L"Delete entry: " > -#define MOVE_BOOT_ENTRY L"Move entry: " > - > -typedef struct { > - LIST_ENTRY Link; > - BDS_LOAD_OPTION* BdsLoadOption; > -} BDS_LOAD_OPTION_ENTRY; > - > -typedef enum { > - BDS_DEVICE_FILESYSTEM = 0, > - BDS_DEVICE_MEMMAP, > - BDS_DEVICE_PXE, > - BDS_DEVICE_TFTP, > - BDS_DEVICE_MAX > -} BDS_SUPPORTED_DEVICE_TYPE; > - > -typedef struct { > - LIST_ENTRY Link; > - CHAR16 Description[BOOT_DEVICE_DESCRIPTION_MAX]; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; > - struct _BDS_LOAD_OPTION_SUPPORT* Support; > -} BDS_SUPPORTED_DEVICE; > - > -#define SUPPORTED_BOOT_DEVICE_FROM_LINK(a) BASE_CR(a, BDS_SUPPORTED_DEVICE, Link) > - > -typedef struct _BDS_LOAD_OPTION_SUPPORT { > - BDS_SUPPORTED_DEVICE_TYPE Type; > - EFI_STATUS (*ListDevices)(IN OUT LIST_ENTRY* BdsLoadOptionList); > - BOOLEAN (*IsSupported)(IN EFI_DEVICE_PATH *DevicePath); > - EFI_STATUS (*CreateDevicePathNode)(IN CHAR16* FileName, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes); > - EFI_STATUS (*UpdateDevicePathNode)(IN EFI_DEVICE_PATH *OldDevicePath, IN CHAR16* FileName, OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath); > - > - /// Define if the boot menu should request if the file is a EFI binary or a Linux kernel > - /// Example: PXE boot always deliver a UEFI application. > - BOOLEAN RequestBootType; > -} BDS_LOAD_OPTION_SUPPORT; > - > -#define LOAD_OPTION_ENTRY_FROM_LINK(a) BASE_CR(a, BDS_LOAD_OPTION_ENTRY, Link) > -#define LOAD_OPTION_FROM_LINK(a) ((BDS_LOAD_OPTION_ENTRY*)BASE_CR(a, BDS_LOAD_OPTION_ENTRY, Link))->BdsLoadOption > - > -// GUID of the EFI Linux Loader > -extern CONST EFI_GUID mLinuxLoaderAppGuid; > - > -// Device path of the EFI Linux Loader in the Firmware Volume > -extern EFI_DEVICE_PATH* mLinuxLoaderDevicePath; > - > -EFI_STATUS > -BootDeviceListSupportedInit ( > - IN OUT LIST_ENTRY *SupportedDeviceList > - ); > - > -EFI_STATUS > -BootDeviceListSupportedFree ( > - IN LIST_ENTRY *SupportedDeviceList, > - IN BDS_SUPPORTED_DEVICE *Except > - ); > - > -EFI_STATUS > -BootDeviceGetDeviceSupport ( > - IN EFI_DEVICE_PATH *DevicePath, > - OUT BDS_LOAD_OPTION_SUPPORT **DeviceSupport > - ); > - > -EFI_STATUS > -GetHIInputStr ( > - IN OUT CHAR16 *CmdLine, > - IN UINTN MaxCmdLine > - ); > - > -EFI_STATUS > -EditHIInputStr ( > - IN OUT CHAR16 *CmdLine, > - IN UINTN MaxCmdLine > - ); > - > -EFI_STATUS > -GetHIInputAscii ( > - IN OUT CHAR8 *CmdLine, > - IN UINTN MaxCmdLine > - ); > - > -EFI_STATUS > -EditHIInputAscii ( > - IN OUT CHAR8 *CmdLine, > - IN UINTN MaxCmdLine > - ); > - > -EFI_STATUS > -GetHIInputInteger ( > - IN OUT UINTN *Integer > - ); > - > -EFI_STATUS > -GetHIInputIP ( > - OUT EFI_IP_ADDRESS *Ip > - ); > - > -EFI_STATUS > -EditHIInputIP ( > - IN EFI_IP_ADDRESS *InIpAddr, > - OUT EFI_IP_ADDRESS *OutIpAddr > - ); > - > -EFI_STATUS > -GetHIInputBoolean ( > - OUT BOOLEAN *Value > - ); > - > -EFI_DEVICE_PATH* > -GetLastDevicePathNode ( > - IN EFI_DEVICE_PATH* DevicePath > - ); > - > -EFI_STATUS > -BdsStartBootOption ( > - IN CHAR16* BootOption > - ); > - > -UINTN > -GetUnalignedDevicePathSize ( > - IN EFI_DEVICE_PATH* DevicePath > - ); > - > -EFI_DEVICE_PATH* > -GetAlignedDevicePath ( > - IN EFI_DEVICE_PATH* DevicePath > - ); > - > -EFI_STATUS > -GenerateDeviceDescriptionName ( > - IN EFI_HANDLE Handle, > - IN OUT CHAR16* Description > - ); > - > -EFI_STATUS > -BootOptionList ( > - IN OUT LIST_ENTRY *BootOptionList > - ); > - > -EFI_STATUS > -BootOptionParseLoadOption ( > - IN EFI_LOAD_OPTION EfiLoadOption, > - IN UINTN EfiLoadOptionSize, > - OUT BDS_LOAD_OPTION **BdsLoadOption > - ); > - > -EFI_STATUS > -BootOptionStart ( > - IN BDS_LOAD_OPTION *BootOption > - ); > - > -EFI_STATUS > -BootOptionCreate ( > - IN UINT32 Attributes, > - IN CHAR16* BootDescription, > - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, > - IN UINT8* OptionalData, > - IN UINTN OptionalDataSize, > - OUT BDS_LOAD_OPTION** BdsLoadOption > - ); > - > -EFI_STATUS > -BootOptionUpdate ( > - IN BDS_LOAD_OPTION* BdsLoadOption, > - IN UINT32 Attributes, > - IN CHAR16* BootDescription, > - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, > - IN UINT8* OptionalData, > - IN UINTN OptionalDataSize > - ); > - > -EFI_STATUS > -BootOptionDelete ( > - IN BDS_LOAD_OPTION *BootOption > - ); > - > -EFI_STATUS > -BootMenuMain ( > - VOID > - ); > - > -BOOLEAN > -IsUnicodeString ( > - IN VOID* String > - ); > - > -/* > - * Try to detect if the given string is an ASCII or Unicode string > - * > - * There are actually few limitation to this function but it is mainly to give > - * a user friendly output. > - * > - * Some limitations: > - * - it only supports unicode string that use ASCII character (< 0x100) > - * - single character ASCII strings are interpreted as Unicode string > - * - string cannot be longer than 2 x BOOT_DEVICE_OPTION_MAX (600 bytes) > - * > - * @param String Buffer that might contain a Unicode or Ascii string > - * @param IsUnicode If not NULL this boolean value returns if the string is an > - * ASCII or Unicode string. > - */ > -BOOLEAN > -IsPrintableString ( > - IN VOID* String, > - OUT BOOLEAN *IsUnicode > - ); > - > -/** > - An empty function to pass error checking of CreateEventEx (). > - > - @param Event Event whose notification function is being invoked. > - @param Context Pointer to the notification function's context, > - which is implementation-dependent. > - > -**/ > -VOID > -EFIAPI > -EmptyCallbackFunction ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ); > - > -/** > - * This function check if the DevicePath defines an EFI binary > - * > - * This function is used when the BDS support Linux loader to > - * detect if the binary is an EFI application or potentially a > - * Linux kernel. > - */ > -EFI_STATUS > -IsEfiBinary ( > - IN EFI_DEVICE_PATH* DevicePath, > - OUT BOOLEAN *EfiBinary > - ); > - > -#endif /* _BDSINTERNAL_H_ */ > diff --git a/ArmPlatformPkg/Bds/BootLinux.c b/ArmPlatformPkg/Bds/BootLinux.c > deleted file mode 100644 > index 0445e894e153..000000000000 > --- a/ArmPlatformPkg/Bds/BootLinux.c > +++ /dev/null > @@ -1,124 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011 - 2015, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#include "BdsInternal.h" > - > -// 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 of the EFI Linux Loader in the Firmware Volume > -EFI_DEVICE_PATH* mLinuxLoaderDevicePath = NULL; > - > -STATIC > -BOOLEAN > -HasFilePathEfiExtension ( > - IN CHAR16* FilePath > - ) > -{ > - return (StrCmp (FilePath + (StrSize (FilePath) / sizeof (CHAR16)) - 5, L".EFI") == 0) || > - (StrCmp (FilePath + (StrSize (FilePath) / sizeof (CHAR16)) - 5, L".efi") == 0); > -} > - > -/** > - * This function check if the DevicePath defines an EFI binary > - * > - * This function is used when the BDS support Linux loader to > - * detect if the binary is an EFI application or potentially a > - * Linux kernel. > - */ > -EFI_STATUS > -IsEfiBinary ( > - IN EFI_DEVICE_PATH* DevicePath, > - OUT BOOLEAN *EfiBinary > - ) > -{ > - EFI_STATUS Status; > - CHAR16* FileName; > - EFI_DEVICE_PATH* PrevDevicePathNode; > - EFI_DEVICE_PATH* DevicePathNode; > - EFI_PHYSICAL_ADDRESS Image; > - UINTN FileSize; > - EFI_IMAGE_DOS_HEADER* DosHeader; > - UINTN PeCoffHeaderOffset; > - EFI_IMAGE_NT_HEADERS32* NtHeader; > - > - ASSERT (EfiBinary != NULL); > - > - // > - // Check if the last node of the device path is a FilePath node > - // > - PrevDevicePathNode = NULL; > - DevicePathNode = DevicePath; > - while ((DevicePathNode != NULL) && !IsDevicePathEnd (DevicePathNode)) { > - PrevDevicePathNode = DevicePathNode; > - DevicePathNode = NextDevicePathNode (DevicePathNode); > - } > - > - if ((PrevDevicePathNode != NULL) && > - (PrevDevicePathNode->Type == MEDIA_DEVICE_PATH) && > - (PrevDevicePathNode->SubType == MEDIA_FILEPATH_DP)) > - { > - FileName = ((FILEPATH_DEVICE_PATH*)PrevDevicePathNode)->PathName; > - } else { > - FileName = NULL; > - } > - > - if (FileName == NULL) { > - Print (L"Is an EFI Application? "); > - Status = GetHIInputBoolean (EfiBinary); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - } else if (HasFilePathEfiExtension (FileName)) { > - *EfiBinary = TRUE; > - } else { > - // Check if the file exist > - Status = BdsLoadImage (DevicePath, AllocateAnyPages, &Image, &FileSize); > - if (!EFI_ERROR (Status)) { > - > - DosHeader = (EFI_IMAGE_DOS_HEADER *)(UINTN) Image; > - if (DosHeader->e_magic == EFI_IMAGE_DOS_SIGNATURE) { > - // > - // DOS image header is present, > - // so read the PE header after the DOS image header. > - // > - PeCoffHeaderOffset = DosHeader->e_lfanew; > - } else { > - PeCoffHeaderOffset = 0; > - } > - > - // > - // Check PE/COFF image. > - // > - NtHeader = (EFI_IMAGE_NT_HEADERS32 *)(UINTN) (Image + PeCoffHeaderOffset); > - if (NtHeader->Signature != EFI_IMAGE_NT_SIGNATURE) { > - *EfiBinary = FALSE; > - } else { > - *EfiBinary = TRUE; > - } > - > - // Free memory > - gBS->FreePages (Image, EFI_SIZE_TO_PAGES (FileSize)); > - } else { > - // If we did not manage to open it then ask for the type > - Print (L"Is an EFI Application? "); > - Status = GetHIInputBoolean (EfiBinary); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - } > - } > - > - return EFI_SUCCESS; > -} > diff --git a/ArmPlatformPkg/Bds/BootMenu.c b/ArmPlatformPkg/Bds/BootMenu.c > deleted file mode 100644 > index 5cbac1d2dc1a..000000000000 > --- a/ArmPlatformPkg/Bds/BootMenu.c > +++ /dev/null > @@ -1,1101 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011 - 2015, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#include "BdsInternal.h" > - > -#include <libfdt.h> > - > -/** > - Worker function that displays the list of boot options that is passed in. > - > - The function loops over the entries of the list of boot options that is passed > - in. For each entry, the boot option description is displayed on a single line > - along with the position of the option in the list. In debug mode, the UEFI > - device path and the arguments of the boot option are displayed as well in > - subsequent lines. > - > - @param[in] BootOptionsList List of the boot options > - > -**/ > -STATIC > -VOID > -DisplayBootOptions ( > - IN LIST_ENTRY* BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - UINTN BootOptionCount; > - LIST_ENTRY *Entry; > - BDS_LOAD_OPTION *BdsLoadOption; > - BOOLEAN IsUnicode; > - > - BootOptionCount = 0 ; > - for (Entry = GetFirstNode (BootOptionsList); > - !IsNull (BootOptionsList, Entry); > - Entry = GetNextNode (BootOptionsList, Entry) > - ) { > - > - BdsLoadOption = LOAD_OPTION_FROM_LINK (Entry); > - Print (L"[%d] %s\n", ++BootOptionCount, BdsLoadOption->Description); > - > - DEBUG_CODE_BEGIN (); > - CHAR16* DevicePathTxt; > - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; > - > - Status = gBS->LocateProtocol ( > - &gEfiDevicePathToTextProtocolGuid, > - NULL, > - (VOID **)&DevicePathToTextProtocol > - ); > - ASSERT_EFI_ERROR (Status); > - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText ( > - BdsLoadOption->FilePathList, > - TRUE, > - TRUE > - ); > - Print (L"\t- %s\n", DevicePathTxt); > - > - if (IsPrintableString (BdsLoadOption->OptionalData, &IsUnicode)) { > - if (IsUnicode) { > - Print (L"\t- Arguments: %s\n", BdsLoadOption->OptionalData); > - } else { > - AsciiPrint ("\t- Arguments: %a\n", BdsLoadOption->OptionalData); > - } > - } > - > - FreePool (DevicePathTxt); > - DEBUG_CODE_END (); > - } > -} > - > -/** > - Worker function that asks for a boot option to be selected and returns a > - pointer to the structure describing the selected boot option. > - > - @param[in] BootOptionsList List of the boot options > - > - @retval EFI_SUCCESS Selection succeeded > - @retval !EFI_SUCCESS Input error or input cancelled > - > -**/ > -STATIC > -EFI_STATUS > -SelectBootOption ( > - IN LIST_ENTRY* BootOptionsList, > - IN CONST CHAR16* InputStatement, > - OUT BDS_LOAD_OPTION_ENTRY** BdsLoadOptionEntry > - ) > -{ > - EFI_STATUS Status; > - UINTN BootOptionCount; > - UINT16 *BootOrder; > - LIST_ENTRY* Entry; > - UINTN BootOptionSelected; > - UINTN Index; > - > - // Get the number of boot options > - Status = GetGlobalEnvironmentVariable ( > - L"BootOrder", NULL, &BootOptionCount, (VOID**)&BootOrder > - ); > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - FreePool (BootOrder); > - BootOptionCount /= sizeof (UINT16); > - > - // Check if a valid boot option(s) is found > - if (BootOptionCount == 0) { > - if (StrCmp (InputStatement, DELETE_BOOT_ENTRY) == 0) { > - Print (L"Nothing to remove!\n"); > - } else if (StrCmp (InputStatement, UPDATE_BOOT_ENTRY) == 0) { > - Print (L"Nothing to update!\n"); > - } else if (StrCmp (InputStatement, MOVE_BOOT_ENTRY) == 0) { > - Print (L"Nothing to move!\n"); > - } else { > - Print (L"No supported Boot Entry.\n"); > - } > - return EFI_NOT_FOUND; > - } > - > - // Get the index of the boot device to delete > - BootOptionSelected = 0; > - while (BootOptionSelected == 0) { > - Print (InputStatement); > - Status = GetHIInputInteger (&BootOptionSelected); > - if (EFI_ERROR (Status)) { > - Print (L"\n"); > - goto ErrorExit; > - } else if ((BootOptionSelected == 0) || (BootOptionSelected > BootOptionCount)) { > - Print (L"Invalid input (max %d)\n", BootOptionCount); > - BootOptionSelected = 0; > - } > - } > - > - // Get the structure of the Boot device to delete > - Index = 1; > - for (Entry = GetFirstNode (BootOptionsList); > - !IsNull (BootOptionsList, Entry); > - Entry = GetNextNode (BootOptionsList,Entry) > - ) > - { > - if (Index == BootOptionSelected) { > - *BdsLoadOptionEntry = LOAD_OPTION_ENTRY_FROM_LINK (Entry); > - break; > - } > - Index++; > - } > - > -ErrorExit: > - return Status; > -} > - > -STATIC > -EFI_STATUS > -SelectBootDevice ( > - OUT BDS_SUPPORTED_DEVICE** SupportedBootDevice > - ) > -{ > - EFI_STATUS Status; > - LIST_ENTRY SupportedDeviceList; > - UINTN SupportedDeviceCount; > - LIST_ENTRY* Entry; > - UINTN SupportedDeviceSelected; > - UINTN Index; > - > - // > - // List the Boot Devices supported > - // > - > - // Start all the drivers first > - BdsConnectAllDrivers (); > - > - // List the supported devices > - Status = BootDeviceListSupportedInit (&SupportedDeviceList); > - ASSERT_EFI_ERROR(Status); > - > - SupportedDeviceCount = 0; > - for (Entry = GetFirstNode (&SupportedDeviceList); > - !IsNull (&SupportedDeviceList,Entry); > - Entry = GetNextNode (&SupportedDeviceList,Entry) > - ) > - { > - *SupportedBootDevice = SUPPORTED_BOOT_DEVICE_FROM_LINK(Entry); > - Print(L"[%d] %s\n",SupportedDeviceCount+1,(*SupportedBootDevice)->Description); > - > - DEBUG_CODE_BEGIN(); > - CHAR16* DevicePathTxt; > - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; > - > - Status = gBS->LocateProtocol (&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); > - ASSERT_EFI_ERROR(Status); > - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText ((*SupportedBootDevice)->DevicePathProtocol,TRUE,TRUE); > - > - Print(L"\t- %s\n",DevicePathTxt); > - > - FreePool(DevicePathTxt); > - DEBUG_CODE_END(); > - > - SupportedDeviceCount++; > - } > - > - if (SupportedDeviceCount == 0) { > - Print(L"There is no supported device.\n"); > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - // > - // Select the Boot Device > - // > - SupportedDeviceSelected = 0; > - while (SupportedDeviceSelected == 0) { > - Print(L"Select the Boot Device: "); > - Status = GetHIInputInteger (&SupportedDeviceSelected); > - if (EFI_ERROR(Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } else if ((SupportedDeviceSelected == 0) || (SupportedDeviceSelected > SupportedDeviceCount)) { > - Print(L"Invalid input (max %d)\n",SupportedDeviceCount); > - SupportedDeviceSelected = 0; > - } > - } > - > - // > - // Get the Device Path for the selected boot device > - // > - Index = 1; > - for (Entry = GetFirstNode (&SupportedDeviceList); > - !IsNull (&SupportedDeviceList,Entry); > - Entry = GetNextNode (&SupportedDeviceList,Entry) > - ) > - { > - if (Index == SupportedDeviceSelected) { > - *SupportedBootDevice = SUPPORTED_BOOT_DEVICE_FROM_LINK(Entry); > - break; > - } > - Index++; > - } > - > -EXIT: > - BootDeviceListSupportedFree (&SupportedDeviceList, *SupportedBootDevice); > - return Status; > -} > - > -EFI_STATUS > -BootMenuAddBootOption ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - BDS_SUPPORTED_DEVICE* SupportedBootDevice; > - CHAR16 BootDescription[BOOT_DEVICE_DESCRIPTION_MAX]; > - CHAR16 CmdLine[BOOT_DEVICE_OPTION_MAX]; > - UINT32 Attributes; > - BDS_LOAD_OPTION_ENTRY *BdsLoadOptionEntry; > - EFI_DEVICE_PATH *DevicePath; > - EFI_DEVICE_PATH_PROTOCOL *DevicePathNodes; > - UINT8* OptionalData; > - UINTN OptionalDataSize; > - BOOLEAN EfiBinary; > - CHAR16 *LinuxDevicePath; > - > - Attributes = 0; > - SupportedBootDevice = NULL; > - > - // List the Boot Devices supported > - Status = SelectBootDevice (&SupportedBootDevice); > - if (EFI_ERROR(Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - // Create the specific device path node > - if (FeaturePcdGet (PcdBdsLinuxSupport) && mLinuxLoaderDevicePath) { > - Status = SupportedBootDevice->Support->CreateDevicePathNode (L"EFI Application or the kernel", &DevicePathNodes); > - } else { > - Status = SupportedBootDevice->Support->CreateDevicePathNode (L"EFI Application", &DevicePathNodes); > - } > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - // Append the Device Path to the selected device path > - DevicePath = AppendDevicePath (SupportedBootDevice->DevicePathProtocol, (CONST EFI_DEVICE_PATH_PROTOCOL *)DevicePathNodes); > - if (DevicePath == NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - goto EXIT; > - } > - > - // Is it an EFI application? > - if (FeaturePcdGet (PcdBdsLinuxSupport) && mLinuxLoaderDevicePath) { > - Status = IsEfiBinary (DevicePath, &EfiBinary); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - if (EfiBinary == FALSE) { > - Print (L"It is assumed the binary is a Linux kernel and the embedded Linux Loader is going to be used.\n"); > - Print (L"Supported command line formats by the embedded Linux Loader:\n"); > - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\"\n"); > - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\" -f <EFI Device Path of the Linux initrd>\n"); > - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\" -a <Machine Type for ATAG Linux kernel>\n"); > - > - // Copy the Linux path into the command line > - LinuxDevicePath = ConvertDevicePathToText (DevicePath, FALSE, FALSE); > - CopyMem (CmdLine, LinuxDevicePath, MAX (sizeof (CmdLine), StrSize (LinuxDevicePath))); > - FreePool (LinuxDevicePath); > - > - // Free the generated Device Path > - FreePool (DevicePath); > - // and use the embedded Linux Loader as the EFI application > - DevicePath = mLinuxLoaderDevicePath; > - } else { > - CmdLine[0] = L'\0'; > - } > - } else { > - CmdLine[0] = L'\0'; > - } > - > - Print (L"Arguments to pass to the EFI Application: "); > - Status = EditHIInputStr (CmdLine, BOOT_DEVICE_OPTION_MAX); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - OptionalData = (UINT8*)CmdLine; > - OptionalDataSize = StrSize (CmdLine); > - > - Print(L"Description for this new Entry: "); > - Status = GetHIInputStr (BootDescription, BOOT_DEVICE_DESCRIPTION_MAX); > - if (EFI_ERROR(Status)) { > - Status = EFI_ABORTED; > - goto FREE_DEVICE_PATH; > - } > - > - // Create new entry > - BdsLoadOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool (sizeof(BDS_LOAD_OPTION_ENTRY)); > - Status = BootOptionCreate (Attributes, BootDescription, DevicePath, OptionalData, OptionalDataSize, &BdsLoadOptionEntry->BdsLoadOption); > - if (!EFI_ERROR(Status)) { > - InsertTailList (BootOptionsList, &BdsLoadOptionEntry->Link); > - } > - > -FREE_DEVICE_PATH: > - FreePool (DevicePath); > - > -EXIT: > - if (Status == EFI_ABORTED) { > - Print(L"\n"); > - } > - FreePool(SupportedBootDevice); > - return Status; > -} > - > -EFI_STATUS > -BootMenuRemoveBootOption ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - BDS_LOAD_OPTION_ENTRY* BootOptionEntry; > - > - DisplayBootOptions (BootOptionsList); > - Status = SelectBootOption (BootOptionsList, DELETE_BOOT_ENTRY, &BootOptionEntry); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - // If the Boot Option was attached to a list remove it > - if (!IsListEmpty (&BootOptionEntry->Link)) { > - // Remove the entry from the list > - RemoveEntryList (&BootOptionEntry->Link); > - } > - > - // Delete the BDS Load option structures > - BootOptionDelete (BootOptionEntry->BdsLoadOption); > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BootMenuUpdateBootOption ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - BDS_LOAD_OPTION_ENTRY *BootOptionEntry; > - BDS_LOAD_OPTION *BootOption; > - BDS_LOAD_OPTION_SUPPORT* DeviceSupport; > - CHAR16 BootDescription[BOOT_DEVICE_DESCRIPTION_MAX]; > - CHAR8 CmdLine[BOOT_DEVICE_OPTION_MAX]; > - CHAR16 UnicodeCmdLine[BOOT_DEVICE_OPTION_MAX]; > - CHAR16 *LinuxDevicePath; > - EFI_DEVICE_PATH *DevicePath; > - UINT8* OptionalData; > - UINTN OptionalDataSize; > - BOOLEAN IsPrintable; > - BOOLEAN IsUnicode; > - BOOLEAN EfiBinary; > - > - DisplayBootOptions (BootOptionsList); > - Status = SelectBootOption (BootOptionsList, UPDATE_BOOT_ENTRY, &BootOptionEntry); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - BootOption = BootOptionEntry->BdsLoadOption; > - > - // Get the device support for this Boot Option > - Status = BootDeviceGetDeviceSupport (BootOption->FilePathList, &DeviceSupport); > - if (EFI_ERROR(Status)) { > - Print(L"Not possible to retrieve the supported device for the update\n"); > - return EFI_UNSUPPORTED; > - } > - > - EfiBinary = TRUE; > - if (FeaturePcdGet (PcdBdsLinuxSupport) && mLinuxLoaderDevicePath) { > - Status = DeviceSupport->UpdateDevicePathNode (BootOption->FilePathList, L"EFI Application or the kernel", &DevicePath); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - // Is it an EFI application? > - Status = IsEfiBinary (DevicePath, &EfiBinary); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - if (EfiBinary == FALSE) { > - Print (L"It is assumed the binary is a Linux kernel and the embedded Linux Loader is going to be used.\n"); > - Print (L"Supported command line formats by the embedded Linux Loader:\n"); > - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\"\n"); > - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\" -f <EFI Device Path of the Linux initrd>\n"); > - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\" -a <Machine Type for ATAG Linux kernel>\n"); > - > - // Copy the Linux path into the command line > - LinuxDevicePath = ConvertDevicePathToText (DevicePath, FALSE, FALSE); > - CopyMem (UnicodeCmdLine, LinuxDevicePath, MAX (sizeof (UnicodeCmdLine), StrSize (LinuxDevicePath))); > - FreePool (LinuxDevicePath); > - > - // Free the generated Device Path > - FreePool (DevicePath); > - // and use the embedded Linux Loader as the EFI application > - DevicePath = mLinuxLoaderDevicePath; > - > - // The command line is a unicode printable string > - IsPrintable = TRUE; > - IsUnicode = TRUE; > - } > - } else { > - Status = DeviceSupport->UpdateDevicePathNode (BootOption->FilePathList, L"EFI Application", &DevicePath); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - } > - > - Print (L"Arguments to pass to the EFI Application: "); > - > - // When the command line has not been initialized by the embedded Linux loader earlier > - if (EfiBinary) { > - if (BootOption->OptionalDataSize > 0) { > - IsPrintable = IsPrintableString (BootOption->OptionalData, &IsUnicode); > - if (IsPrintable) { > - // > - // The size in bytes of the string, final zero included, should > - // be equal to or at least lower than "BootOption->OptionalDataSize" > - // and the "IsPrintableString()" has already tested that the length > - // in number of characters is smaller than BOOT_DEVICE_OPTION_MAX, > - // final '\0' included. We can thus copy the string for editing > - // using "CopyMem()". Furthermore, note that in the case of an Unicode > - // string "StrnCpy()" and "StrCpy()" can not be used to copy the > - // string because the data pointed to by "BootOption->OptionalData" > - // is not necessarily 2-byte aligned. > - // > - if (IsUnicode) { > - CopyMem ( > - UnicodeCmdLine, BootOption->OptionalData, > - MIN (sizeof (UnicodeCmdLine), > - BootOption->OptionalDataSize) > - ); > - } else { > - CopyMem ( > - CmdLine, BootOption->OptionalData, > - MIN (sizeof (CmdLine), > - BootOption->OptionalDataSize) > - ); > - } > - } > - } else { > - UnicodeCmdLine[0] = L'\0'; > - IsPrintable = TRUE; > - IsUnicode = TRUE; > - } > - } > - > - // We do not request arguments for OptionalData that cannot be printed > - if (IsPrintable) { > - if (IsUnicode) { > - Status = EditHIInputStr (UnicodeCmdLine, BOOT_DEVICE_OPTION_MAX); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto FREE_DEVICE_PATH; > - } > - > - OptionalData = (UINT8*)UnicodeCmdLine; > - OptionalDataSize = StrSize (UnicodeCmdLine); > - } else { > - Status = EditHIInputAscii (CmdLine, BOOT_DEVICE_OPTION_MAX); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto FREE_DEVICE_PATH; > - } > - > - OptionalData = (UINT8*)CmdLine; > - OptionalDataSize = AsciiStrSize (CmdLine); > - } > - } else { > - // We keep the former OptionalData > - OptionalData = BootOption->OptionalData; > - OptionalDataSize = BootOption->OptionalDataSize; > - } > - > - Print(L"Description for this new Entry: "); > - StrnCpy (BootDescription, BootOption->Description, BOOT_DEVICE_DESCRIPTION_MAX); > - Status = EditHIInputStr (BootDescription, BOOT_DEVICE_DESCRIPTION_MAX); > - if (EFI_ERROR(Status)) { > - Status = EFI_ABORTED; > - goto FREE_DEVICE_PATH; > - } > - > - // Update the entry > - Status = BootOptionUpdate (BootOption, BootOption->Attributes, BootDescription, DevicePath, OptionalData, OptionalDataSize); > - > -FREE_DEVICE_PATH: > - FreePool (DevicePath); > - > -EXIT: > - if (Status == EFI_ABORTED) { > - Print(L"\n"); > - } > - return Status; > -} > - > -/** > - Reorder boot options > - > - Ask for the boot option to move and then move it when up or down arrows > - are pressed. This function is called when the user selects the "Reorder Boot > - Device Entries" entry in the boot manager menu. > - The order of the boot options in BootOptionList and in the UEFI BootOrder > - global variable are kept coherent until the user confirm his reordering (ie: > - he does not exit by pressing escape). > - > - @param[in] BootOptionsList List of the boot devices constructed in > - BootMenuMain() > - > - @retval EFI_SUCCESS No error encountered. > - @retval !EFI_SUCCESS An error has occured either in the selection of the > - boot option to move or while interacting with the user. > - > -**/ > -STATIC > -EFI_STATUS > -BootMenuReorderBootOptions ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - BDS_LOAD_OPTION_ENTRY *BootOptionEntry; > - LIST_ENTRY *SelectedEntry; > - LIST_ENTRY *PrevEntry; > - BOOLEAN Move; > - BOOLEAN Save; > - BOOLEAN Cancel; > - UINTN WaitIndex; > - EFI_INPUT_KEY Key; > - LIST_ENTRY *SecondEntry; > - UINTN BootOrderSize; > - UINT16 *BootOrder; > - LIST_ENTRY *Entry; > - UINTN Index; > - > - DisplayBootOptions (BootOptionsList); > - > - // Ask to select the boot option to move > - while (TRUE) { > - Status = SelectBootOption (BootOptionsList, MOVE_BOOT_ENTRY, &BootOptionEntry); > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - > - SelectedEntry = &BootOptionEntry->Link; > - SecondEntry = NULL; > - // Note down the previous entry in the list to be able to cancel changes > - PrevEntry = GetPreviousNode (BootOptionsList, SelectedEntry); > - > - // Start of interaction > - while (TRUE) { > - Print ( > - L"* Use up/down arrows to move the entry '%s'", > - BootOptionEntry->BdsLoadOption->Description > - ); > - > - // Wait for a move, save or cancel request > - Move = FALSE; > - Save = FALSE; > - Cancel = FALSE; > - do { > - Status = gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &WaitIndex); > - if (!EFI_ERROR (Status)) { > - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); > - } > - if (EFI_ERROR (Status)) { > - Print (L"\n"); > - goto ErrorExit; > - } > - > - switch (Key.ScanCode) { > - case SCAN_NULL: > - Save = (Key.UnicodeChar == CHAR_LINEFEED) || > - (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) || > - (Key.UnicodeChar == 0x7f); > - break; > - > - case SCAN_UP: > - SecondEntry = GetPreviousNode (BootOptionsList, SelectedEntry); > - Move = SecondEntry != BootOptionsList; > - break; > - > - case SCAN_DOWN: > - SecondEntry = GetNextNode (BootOptionsList, SelectedEntry); > - Move = SecondEntry != BootOptionsList; > - break; > - > - case SCAN_ESC: > - Cancel = TRUE; > - break; > - } > - } while ((!Move) && (!Save) && (!Cancel)); > - > - if (Move) { > - if ((SelectedEntry != NULL) && (SecondEntry != NULL)) { > - SwapListEntries (SelectedEntry, SecondEntry); > - } > - } else { > - if (Save) { > - Status = GetGlobalEnvironmentVariable ( > - L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder > - ); > - BootOrderSize /= sizeof (UINT16); > - > - if (!EFI_ERROR (Status)) { > - // The order of the boot options in the 'BootOptionsList' is the > - // new order that has been just defined by the user. Save this new > - // order in "BootOrder" UEFI global variable. > - Entry = GetFirstNode (BootOptionsList); > - for (Index = 0; Index < BootOrderSize; Index++) { > - BootOrder[Index] = (LOAD_OPTION_FROM_LINK (Entry))->LoadOptionIndex; > - Entry = GetNextNode (BootOptionsList, Entry); > - } > - Status = gRT->SetVariable ( > - (CHAR16*)L"BootOrder", > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | > - EFI_VARIABLE_BOOTSERVICE_ACCESS | > - EFI_VARIABLE_RUNTIME_ACCESS, > - BootOrderSize * sizeof (UINT16), > - BootOrder > - ); > - FreePool (BootOrder); > - } > - > - if (EFI_ERROR (Status)) { > - Print (L"\nAn error occurred, move not completed!\n"); > - Cancel = TRUE; > - } > - } > - > - if (Cancel) { > - // > - // Restore initial position of the selected boot option > - // > - RemoveEntryList (SelectedEntry); > - InsertHeadList (PrevEntry, SelectedEntry); > - } > - } > - > - Print (L"\n"); > - DisplayBootOptions (BootOptionsList); > - // Saved or cancelled, back to the choice of boot option to move > - if (!Move) { > - break; > - } > - } > - } > - > -ErrorExit: > - return Status ; > -} > - > -EFI_STATUS > -UpdateFdtPath ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - BDS_SUPPORTED_DEVICE *SupportedBootDevice; > - EFI_DEVICE_PATH_PROTOCOL *FdtDevicePathNodes; > - EFI_DEVICE_PATH_PROTOCOL *FdtDevicePath; > - CHAR16 *FdtTextDevicePath; > - EFI_PHYSICAL_ADDRESS FdtBlobBase; > - UINTN FdtBlobSize; > - UINTN NumPages; > - EFI_PHYSICAL_ADDRESS FdtConfigurationTableBase; > - > - SupportedBootDevice = NULL; > - > - Status = SelectBootDevice (&SupportedBootDevice); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - // Create the specific device path node > - Status = SupportedBootDevice->Support->CreateDevicePathNode (L"FDT blob", &FdtDevicePathNodes); > - if (EFI_ERROR (Status)) { > - Status = EFI_ABORTED; > - goto EXIT; > - } > - > - if (FdtDevicePathNodes != NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - > - FdtDevicePath = AppendDevicePath (SupportedBootDevice->DevicePathProtocol, FdtDevicePathNodes); > - FreePool (FdtDevicePathNodes); > - if (FdtDevicePath == NULL) { > - goto EXIT; > - } > - > - FdtTextDevicePath = ConvertDevicePathToText (FdtDevicePath, TRUE, TRUE); > - if (FdtTextDevicePath == NULL) { > - goto EXIT; > - } > - > - Status = gRT->SetVariable ( > - (CHAR16*)L"Fdt", > - &gFdtVariableGuid, > - EFI_VARIABLE_RUNTIME_ACCESS | > - EFI_VARIABLE_NON_VOLATILE | > - EFI_VARIABLE_BOOTSERVICE_ACCESS, > - StrSize (FdtTextDevicePath), > - FdtTextDevicePath > - ); > - ASSERT_EFI_ERROR (Status); > - FreePool (FdtTextDevicePath); > - } else { > - Status = gRT->SetVariable ( > - (CHAR16*)L"Fdt", > - &gFdtVariableGuid, > - EFI_VARIABLE_RUNTIME_ACCESS | > - EFI_VARIABLE_NON_VOLATILE | > - EFI_VARIABLE_BOOTSERVICE_ACCESS, > - 0, > - NULL > - ); > - ASSERT_EFI_ERROR (Status); > - return Status; > - } > - > - // > - // Try to load FDT from the new EFI Device Path > - // > - > - // > - // Load the FDT given its device path. > - // This operation may fail if the device path is not supported. > - // > - FdtBlobBase = 0; > - NumPages = 0; > - Status = BdsLoadImage (FdtDevicePath, AllocateAnyPages, &FdtBlobBase, &FdtBlobSize); > - FreePool (FdtDevicePath); > - > - if (EFI_ERROR (Status)) { > - goto EXIT_LOAD_FDT; > - } > - > - // Check the FDT header is valid. We only make this check in DEBUG mode in > - // case the FDT header change on production device and this ASSERT() becomes > - // not valid. > - ASSERT (fdt_check_header ((VOID*)(UINTN)FdtBlobBase) == 0); > - > - // > - // Ensure the Size of the Device Tree is smaller than the size of the read file > - // > - ASSERT ((UINTN)fdt_totalsize ((VOID*)(UINTN)FdtBlobBase) <= FdtBlobSize); > - > - // > - // Store the FDT as Runtime Service Data to prevent the Kernel from > - // overwritting its data. > - // > - NumPages = EFI_SIZE_TO_PAGES (FdtBlobSize); > - Status = gBS->AllocatePages ( > - AllocateAnyPages, EfiRuntimeServicesData, > - NumPages, &FdtConfigurationTableBase > - ); > - if (EFI_ERROR (Status)) { > - goto EXIT_LOAD_FDT; > - } > - gBS->CopyMem ( > - (VOID*)(UINTN)FdtConfigurationTableBase, > - (VOID*)(UINTN)FdtBlobBase, > - FdtBlobSize > - ); > - > - // > - // Install the FDT into the Configuration Table > - // > - Status = gBS->InstallConfigurationTable ( > - &gFdtTableGuid, > - (VOID*)(UINTN)FdtConfigurationTableBase > - ); > - if (EFI_ERROR (Status)) { > - gBS->FreePages (FdtConfigurationTableBase, NumPages); > - } > - > -EXIT_LOAD_FDT: > - if (EFI_ERROR (Status)) { > - Print (L"\nWarning: Did not manage to install the new device tree. Try to restart the platform.\n"); > - } > - > - if (FdtBlobBase != 0) { > - gBS->FreePages (FdtBlobBase, NumPages); > - } > - > -EXIT: > - if (Status == EFI_ABORTED) { > - Print (L"\n"); > - } > - > - if (SupportedBootDevice != NULL) { > - FreePool (SupportedBootDevice); > - } > - > - return Status; > -} > - > -/** > - Set boot timeout > - > - Ask for the boot timeout in seconds and if the input succeeds assign the > - input value to the UEFI global variable "Timeout". This function is called > - when the user selects the "Set Boot Timeout" of the boot manager menu. > - > - @param[in] BootOptionsList List of the boot devices, not used here > - > - @retval EFI_SUCCESS Boot timeout in second retrieved from the standard > - input and assigned to the UEFI "Timeout" global > - variable > - @retval !EFI_SUCCESS Either the input or the setting of the UEFI global > - variable "Timeout" has failed. > -**/ > -EFI_STATUS > -STATIC > -BootMenuSetBootTimeout ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - UINTN Input; > - UINT16 Timeout; > - > - Print (L"Timeout duration (in seconds): "); > - Status = GetHIInputInteger (&Input); > - if (EFI_ERROR (Status)) { > - Print (L"\n"); > - goto ErrorExit; > - } > - > - Timeout = Input; > - Status = gRT->SetVariable ( > - (CHAR16*)L"Timeout", > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | > - EFI_VARIABLE_BOOTSERVICE_ACCESS | > - EFI_VARIABLE_RUNTIME_ACCESS, > - sizeof (UINT16), > - &Timeout > - ); > - ASSERT_EFI_ERROR (Status); > - > -ErrorExit: > - return Status; > -} > - > -struct BOOT_MANAGER_ENTRY { > - CONST CHAR16* Description; > - EFI_STATUS (*Callback) (IN LIST_ENTRY *BootOptionsList); > -} BootManagerEntries[] = { > - { L"Add Boot Device Entry", BootMenuAddBootOption }, > - { L"Update Boot Device Entry", BootMenuUpdateBootOption }, > - { L"Remove Boot Device Entry", BootMenuRemoveBootOption }, > - { L"Reorder Boot Device Entries", BootMenuReorderBootOptions }, > - { L"Update FDT path", UpdateFdtPath }, > - { L"Set Boot Timeout", BootMenuSetBootTimeout }, > -}; > - > -EFI_STATUS > -BootMenuManager ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - UINTN Index; > - UINTN OptionSelected; > - UINTN BootManagerEntryCount; > - EFI_STATUS Status; > - > - BootManagerEntryCount = sizeof(BootManagerEntries) / sizeof(struct BOOT_MANAGER_ENTRY); > - > - while (TRUE) { > - // Display Boot Manager menu > - for (Index = 0; Index < BootManagerEntryCount; Index++) { > - Print(L"[%d] %s\n",Index+1,BootManagerEntries[Index]); > - } > - Print(L"[%d] Return to main menu\n",Index+1); > - > - // Select which entry to call > - Print(L"Choice: "); > - Status = GetHIInputInteger (&OptionSelected); > - if (EFI_ERROR(Status) || (OptionSelected == (BootManagerEntryCount+1))) { > - if (EFI_ERROR(Status)) { > - Print(L"\n"); > - } > - return EFI_SUCCESS; > - } else if ((OptionSelected > 0) && (OptionSelected <= BootManagerEntryCount)) { > - BootManagerEntries[OptionSelected-1].Callback (BootOptionsList); > - } > - } > - // Should never go here > -} > - > -EFI_STATUS > -BootShell ( > - IN LIST_ENTRY *BootOptionsList > - ) > -{ > - EFI_STATUS Status; > - EFI_DEVICE_PATH* EfiShellDevicePath; > - > - // Find the EFI Shell > - Status = LocateEfiApplicationInFvByName (L"Shell", &EfiShellDevicePath); > - if (Status == EFI_NOT_FOUND) { > - Print (L"Error: EFI Application not found.\n"); > - return Status; > - } else if (EFI_ERROR (Status)) { > - Print (L"Error: Status Code: 0x%X\n", (UINT32)Status); > - return Status; > - } else { > - // Need to connect every drivers to ensure no dependencies are missing for the application > - Status = BdsConnectAllDrivers (); > - if (EFI_ERROR (Status)) { > - DEBUG ((EFI_D_ERROR, "FAIL to connect all drivers\n")); > - return Status; > - } > - > - return BdsStartEfiApplication (gImageHandle, EfiShellDevicePath, 0, NULL); > - } > -} > - > -struct BOOT_MAIN_ENTRY { > - CONST CHAR16* Description; > - EFI_STATUS (*Callback) (IN LIST_ENTRY *BootOptionsList); > -} BootMainEntries[] = { > - { L"Shell", BootShell }, > - { L"Boot Manager", BootMenuManager }, > -}; > - > -EFI_STATUS > -BootMenuMain ( > - VOID > - ) > -{ > - LIST_ENTRY BootOptionsList; > - UINTN OptionCount; > - UINTN BootOptionCount; > - EFI_STATUS Status; > - LIST_ENTRY* Entry; > - BDS_LOAD_OPTION* BootOption; > - UINTN BootOptionSelected; > - UINTN Index; > - UINTN BootMainEntryCount; > - BOOLEAN IsUnicode; > - > - BootOption = NULL; > - BootMainEntryCount = sizeof(BootMainEntries) / sizeof(struct BOOT_MAIN_ENTRY); > - > - if (FeaturePcdGet (PcdBdsLinuxSupport)) { > - // Check Linux Loader is present > - Status = LocateEfiApplicationInFvByGuid (&mLinuxLoaderAppGuid, &mLinuxLoaderDevicePath); > - ASSERT_EFI_ERROR (Status); > - } > - > - while (TRUE) { > - // Get Boot#### list > - BootOptionList (&BootOptionsList); > - > - OptionCount = 1; > - > - // Display the Boot options > - for (Entry = GetFirstNode (&BootOptionsList); > - !IsNull (&BootOptionsList,Entry); > - Entry = GetNextNode (&BootOptionsList,Entry) > - ) > - { > - BootOption = LOAD_OPTION_FROM_LINK(Entry); > - > - Print(L"[%d] %s\n", OptionCount, BootOption->Description); > - > - DEBUG_CODE_BEGIN(); > - CHAR16* DevicePathTxt; > - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; > - > - Status = gBS->LocateProtocol (&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); > - if (EFI_ERROR(Status)) { > - // You must provide an implementation of DevicePathToTextProtocol in your firmware (eg: DevicePathDxe) > - DEBUG((EFI_D_ERROR,"Error: Bds requires DevicePathToTextProtocol\n")); > - return Status; > - } > - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (BootOption->FilePathList, TRUE, TRUE); > - > - Print(L"\t- %s\n",DevicePathTxt); > - > - if (BootOption->OptionalData != NULL) { > - if (IsPrintableString (BootOption->OptionalData, &IsUnicode)) { > - if (IsUnicode) { > - Print (L"\t- Arguments: %s\n", BootOption->OptionalData); > - } else { > - AsciiPrint ("\t- Arguments: %a\n", BootOption->OptionalData); > - } > - } > - } > - FreePool(DevicePathTxt); > - DEBUG_CODE_END(); > - > - OptionCount++; > - } > - BootOptionCount = OptionCount-1; > - > - // Display the hardcoded Boot entries > - for (Index = 0; Index < BootMainEntryCount; Index++) { > - Print(L"[%d] %s\n",OptionCount,BootMainEntries[Index]); > - OptionCount++; > - } > - > - // Request the boot entry from the user > - BootOptionSelected = 0; > - while (BootOptionSelected == 0) { > - Print(L"Start: "); > - Status = GetHIInputInteger (&BootOptionSelected); > - if (EFI_ERROR(Status) || (BootOptionSelected == 0) || (BootOptionSelected > OptionCount)) { > - Print(L"Invalid input (max %d)\n",(OptionCount-1)); > - BootOptionSelected = 0; > - } > - } > - > - // Start the selected entry > - if (BootOptionSelected > BootOptionCount) { > - // Start the hardcoded entry > - Status = BootMainEntries[BootOptionSelected - BootOptionCount - 1].Callback (&BootOptionsList); > - } else { > - // Find the selected entry from the Boot#### list > - Index = 1; > - for (Entry = GetFirstNode (&BootOptionsList); > - !IsNull (&BootOptionsList,Entry); > - Entry = GetNextNode (&BootOptionsList,Entry) > - ) > - { > - if (Index == BootOptionSelected) { > - BootOption = LOAD_OPTION_FROM_LINK(Entry); > - break; > - } > - Index++; > - } > - > - Status = BootOptionStart (BootOption); > - } > - } > - // Should never go here > -} > diff --git a/ArmPlatformPkg/Bds/BootOption.c b/ArmPlatformPkg/Bds/BootOption.c > deleted file mode 100644 > index 32a5679762f9..000000000000 > --- a/ArmPlatformPkg/Bds/BootOption.c > +++ /dev/null > @@ -1,316 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011-2015, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#include "BdsInternal.h" > - > -EFI_STATUS > -BootOptionStart ( > - IN BDS_LOAD_OPTION *BootOption > - ) > -{ > - EFI_STATUS Status; > - UINT16 LoadOptionIndexSize; > - > - // Connect all the drivers if the EFI Application is not a EFI OS Loader > - if ((BootOption->Attributes & LOAD_OPTION_CATEGORY) == LOAD_OPTION_CATEGORY_APP) { > - BdsConnectAllDrivers (); > - } > - > - // Set BootCurrent variable > - LoadOptionIndexSize = sizeof (UINT16); > - gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, > - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - LoadOptionIndexSize, &(BootOption->LoadOptionIndex)); > - > - Status = BdsStartEfiApplication (gImageHandle, BootOption->FilePathList, BootOption->OptionalDataSize, BootOption->OptionalData); > - > - // Clear BootCurrent variable > - LoadOptionIndexSize = sizeof (UINT16); > - gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, > - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - 0, NULL); > - > - return Status; > -} > - > -EFI_STATUS > -BootOptionList ( > - IN OUT LIST_ENTRY *BootOptionList > - ) > -{ > - EFI_STATUS Status; > - UINTN Index; > - UINT16* BootOrder; > - UINTN BootOrderSize; > - BDS_LOAD_OPTION* BdsLoadOption; > - BDS_LOAD_OPTION_ENTRY* BdsLoadOptionEntry; > - > - InitializeListHead (BootOptionList); > - > - // Get the Boot Option Order from the environment variable > - Status = GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder); > - if (EFI_ERROR(Status)) { > - return Status; > - } > - > - for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) { > - Status = BootOptionFromLoadOptionIndex (BootOrder[Index], &BdsLoadOption); > - if (!EFI_ERROR(Status)) { > - BdsLoadOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool(sizeof(BDS_LOAD_OPTION_ENTRY)); > - BdsLoadOptionEntry->BdsLoadOption = BdsLoadOption; > - InsertTailList (BootOptionList,&BdsLoadOptionEntry->Link); > - } > - } > - > - FreePool (BootOrder); > - > - return EFI_SUCCESS; > -} > - > -STATIC > -EFI_STATUS > -BootOptionSetFields ( > - IN BDS_LOAD_OPTION* BootOption, > - IN UINT32 Attributes, > - IN CHAR16* BootDescription, > - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, > - IN UINT8* OptionalData, > - IN UINTN OptionalDataSize > - ) > -{ > - EFI_LOAD_OPTION *EfiLoadOption; > - UINTN EfiLoadOptionSize; > - UINTN BootDescriptionSize; > - UINT16 FilePathListLength; > - UINT8* EfiLoadOptionPtr; > - > - // If we are overwriting an existent Boot Option then we have to free previously allocated memory > - if (BootOption->LoadOption) { > - FreePool (BootOption->LoadOption); > - } > - > - BootDescriptionSize = StrSize (BootDescription); > - > - // Compute the size of the FilePath list > - FilePathListLength = GetUnalignedDevicePathSize (DevicePath); > - > - // Allocate the memory for the EFI Load Option > - EfiLoadOptionSize = sizeof(UINT32) + sizeof(UINT16) + BootDescriptionSize + FilePathListLength + OptionalDataSize; > - EfiLoadOption = (EFI_LOAD_OPTION *)AllocatePool(EfiLoadOptionSize); > - EfiLoadOptionPtr = (UINT8 *)EfiLoadOption; > - > - // > - // Populate the EFI Load Option and BDS Boot Option structures > - // > - > - // Attributes fields > - BootOption->Attributes = Attributes; > - *(UINT32*)EfiLoadOptionPtr = Attributes; > - EfiLoadOptionPtr += sizeof(UINT32); > - > - // FilePath List fields > - BootOption->FilePathListLength = FilePathListLength; > - *(UINT16*)EfiLoadOptionPtr = FilePathListLength; > - EfiLoadOptionPtr += sizeof(UINT16); > - > - // Boot description fields > - BootOption->Description = (CHAR16*)EfiLoadOptionPtr; > - CopyMem (EfiLoadOptionPtr, BootDescription, BootDescriptionSize); > - EfiLoadOptionPtr += BootDescriptionSize; > - > - // File path fields > - BootOption->FilePathList = (EFI_DEVICE_PATH_PROTOCOL*)EfiLoadOptionPtr; > - CopyMem (EfiLoadOptionPtr, DevicePath, FilePathListLength); > - EfiLoadOptionPtr += FilePathListLength; > - > - // Optional Data fields, Do unaligned writes > - BootOption->OptionalData = EfiLoadOptionPtr; > - > - if (OptionalData != NULL) { > - CopyMem (BootOption->OptionalData, OptionalData, OptionalDataSize); > - } > - > - BootOption->OptionalDataSize = OptionalDataSize; > - > - // If this function is called at the creation of the Boot Device entry (not at the update) the > - // BootOption->LoadOptionSize must be zero then we get a new BootIndex for this entry > - if (BootOption->LoadOptionSize == 0) { > - BootOption->LoadOptionIndex = BootOptionAllocateBootIndex (); > - } > - > - // Fill the EFI Load option fields > - BootOption->LoadOption = EfiLoadOption; > - BootOption->LoadOptionSize = EfiLoadOptionSize; > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BootOptionCreate ( > - IN UINT32 Attributes, > - IN CHAR16* BootDescription, > - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, > - IN UINT8* OptionalData, > - IN UINTN OptionalDataSize, > - OUT BDS_LOAD_OPTION** BdsLoadOption > - ) > -{ > - EFI_STATUS Status; > - BDS_LOAD_OPTION_ENTRY* BootOptionEntry; > - BDS_LOAD_OPTION* BootOption; > - CHAR16 BootVariableName[9]; > - UINT16* BootOrder; > - UINTN BootOrderSize; > - > - // > - // Allocate and fill the memory for the BDS Load Option structure > - // > - BootOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool (sizeof (BDS_LOAD_OPTION_ENTRY)); > - InitializeListHead (&BootOptionEntry->Link); > - BootOptionEntry->BdsLoadOption = (BDS_LOAD_OPTION*)AllocateZeroPool (sizeof(BDS_LOAD_OPTION)); > - > - BootOption = BootOptionEntry->BdsLoadOption; > - BootOptionSetFields (BootOption, Attributes, BootDescription, DevicePath, OptionalData, OptionalDataSize); > - > - // > - // Set the related environment variables > - // > - > - // Create Boot#### environment variable > - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BootOption->LoadOptionIndex); > - Status = gRT->SetVariable ( > - BootVariableName, > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - BootOption->LoadOptionSize, > - BootOption->LoadOption > - ); > - > - // Add the new Boot Index to the list > - Status = GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder); > - if (!EFI_ERROR(Status)) { > - BootOrder = ReallocatePool (BootOrderSize, BootOrderSize + sizeof(UINT16), BootOrder); > - // Add the new index at the end > - BootOrder[BootOrderSize / sizeof(UINT16)] = BootOption->LoadOptionIndex; > - BootOrderSize += sizeof(UINT16); > - } else { > - // BootOrder does not exist. Create it > - BootOrderSize = sizeof(UINT16); > - BootOrder = &(BootOption->LoadOptionIndex); > - } > - > - // Update (or Create) the BootOrder environment variable > - Status = gRT->SetVariable ( > - L"BootOrder", > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - BootOrderSize, > - BootOrder > - ); > - > - // We only free it if the UEFI Variable 'BootOrder' was already existing > - if (BootOrderSize > sizeof(UINT16)) { > - FreePool (BootOrder); > - } > - > - *BdsLoadOption = BootOption; > - return Status; > -} > - > -EFI_STATUS > -BootOptionUpdate ( > - IN BDS_LOAD_OPTION* BdsLoadOption, > - IN UINT32 Attributes, > - IN CHAR16* BootDescription, > - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, > - IN UINT8* OptionalData, > - IN UINTN OptionalDataSize > - ) > -{ > - EFI_STATUS Status; > - CHAR16 BootVariableName[9]; > - > - // Update the BDS Load Option structure > - BootOptionSetFields (BdsLoadOption, Attributes, BootDescription, DevicePath, OptionalData, OptionalDataSize); > - > - // Update the related environment variables > - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BdsLoadOption->LoadOptionIndex); > - > - Status = gRT->SetVariable ( > - BootVariableName, > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - BdsLoadOption->LoadOptionSize, > - BdsLoadOption->LoadOption > - ); > - > - return Status; > -} > - > -EFI_STATUS > -BootOptionDelete ( > - IN BDS_LOAD_OPTION *BootOption > - ) > -{ > - UINTN Index; > - UINTN BootOrderSize; > - UINT16* BootOrder; > - UINTN BootOrderCount; > - CHAR16 BootVariableName[9]; > - EFI_STATUS Status; > - > - // Remove the entry from the BootOrder environment variable > - Status = GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder); > - if (!EFI_ERROR(Status)) { > - BootOrderCount = BootOrderSize / sizeof(UINT16); > - > - // Find the index of the removed entry > - for (Index = 0; Index < BootOrderCount; Index++) { > - if (BootOrder[Index] == BootOption->LoadOptionIndex) { > - // If it the last entry we do not need to rearrange the BootOrder list > - if (Index + 1 != BootOrderCount) { > - CopyMem ( > - &BootOrder[Index], > - &BootOrder[Index + 1], > - (BootOrderCount - (Index + 1)) * sizeof(UINT16) > - ); > - } > - break; > - } > - } > - > - // Update the BootOrder environment variable > - Status = gRT->SetVariable ( > - L"BootOrder", > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - BootOrderSize - sizeof(UINT16), > - BootOrder > - ); > - } > - > - // Delete Boot#### environment variable > - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BootOption->LoadOptionIndex); > - Status = gRT->SetVariable ( > - BootVariableName, > - &gEfiGlobalVariableGuid, > - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > - 0, > - NULL > - ); > - > - FreePool (BootOrder); > - > - return Status; > -} > diff --git a/ArmPlatformPkg/Bds/BootOptionSupport.c b/ArmPlatformPkg/Bds/BootOptionSupport.c > deleted file mode 100644 > index 27faf003c69e..000000000000 > --- a/ArmPlatformPkg/Bds/BootOptionSupport.c > +++ /dev/null > @@ -1,1195 +0,0 @@ > -/** @file > -* > -* Copyright (c) 2011-2014, ARM Limited. All rights reserved. > -* > -* This program and the accompanying materials > -* are licensed and made available under the terms and conditions of the BSD License > -* which accompanies this distribution. The full text of the license may be found at > -* http://opensource.org/licenses/bsd-license.php > -* > -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > -* > -**/ > - > -#include "BdsInternal.h" > - > -#include <Library/NetLib.h> > - > -#include <Protocol/BlockIo.h> > -#include <Protocol/DevicePathToText.h> > -#include <Protocol/FirmwareVolumeBlock.h> > -#include <Protocol/PxeBaseCode.h> > -#include <Protocol/SimpleFileSystem.h> > -#include <Protocol/SimpleNetwork.h> > -#include <Protocol/Dhcp4.h> > -#include <Protocol/Mtftp4.h> > - > -#include <Guid/FileSystemInfo.h> > - > -#define IS_DEVICE_PATH_NODE(node,type,subtype) (((node)->Type == (type)) && ((node)->SubType == (subtype))) > - > -EFI_STATUS > -BdsLoadOptionFileSystemList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ); > - > -EFI_STATUS > -BdsLoadOptionFileSystemCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ); > - > -EFI_STATUS > -BdsLoadOptionFileSystemUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ); > - > -BOOLEAN > -BdsLoadOptionFileSystemIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ); > - > -EFI_STATUS > -BdsLoadOptionMemMapList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ); > - > -EFI_STATUS > -BdsLoadOptionMemMapCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ); > - > -EFI_STATUS > -BdsLoadOptionMemMapUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ); > - > -BOOLEAN > -BdsLoadOptionMemMapIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ); > - > -EFI_STATUS > -BdsLoadOptionPxeList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ); > - > -EFI_STATUS > -BdsLoadOptionPxeCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ); > - > -EFI_STATUS > -BdsLoadOptionPxeUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ); > - > -BOOLEAN > -BdsLoadOptionPxeIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ); > - > -EFI_STATUS > -BdsLoadOptionTftpList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ); > - > -EFI_STATUS > -BdsLoadOptionTftpCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ); > - > -EFI_STATUS > -BdsLoadOptionTftpUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ); > - > -BOOLEAN > -BdsLoadOptionTftpIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ); > - > -BDS_LOAD_OPTION_SUPPORT BdsLoadOptionSupportList[] = { > - { > - BDS_DEVICE_FILESYSTEM, > - BdsLoadOptionFileSystemList, > - BdsLoadOptionFileSystemIsSupported, > - BdsLoadOptionFileSystemCreateDevicePath, > - BdsLoadOptionFileSystemUpdateDevicePath, > - TRUE > - }, > - { > - BDS_DEVICE_MEMMAP, > - BdsLoadOptionMemMapList, > - BdsLoadOptionMemMapIsSupported, > - BdsLoadOptionMemMapCreateDevicePath, > - BdsLoadOptionMemMapUpdateDevicePath, > - TRUE > - }, > - { > - BDS_DEVICE_PXE, > - BdsLoadOptionPxeList, > - BdsLoadOptionPxeIsSupported, > - BdsLoadOptionPxeCreateDevicePath, > - BdsLoadOptionPxeUpdateDevicePath, > - FALSE > - }, > - { > - BDS_DEVICE_TFTP, > - BdsLoadOptionTftpList, > - BdsLoadOptionTftpIsSupported, > - BdsLoadOptionTftpCreateDevicePath, > - BdsLoadOptionTftpUpdateDevicePath, > - TRUE > - } > -}; > - > -EFI_STATUS > -BootDeviceListSupportedInit ( > - IN OUT LIST_ENTRY *SupportedDeviceList > - ) > -{ > - UINTN Index; > - > - // Initialize list of supported devices > - InitializeListHead (SupportedDeviceList); > - > - for (Index = 0; Index < BDS_DEVICE_MAX; Index++) { > - BdsLoadOptionSupportList[Index].ListDevices (SupportedDeviceList); > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BootDeviceListSupportedFree ( > - IN LIST_ENTRY *SupportedDeviceList, > - IN BDS_SUPPORTED_DEVICE *Except > - ) > -{ > - LIST_ENTRY *Entry; > - BDS_SUPPORTED_DEVICE* SupportedDevice; > - > - Entry = GetFirstNode (SupportedDeviceList); > - while (Entry != SupportedDeviceList) { > - SupportedDevice = SUPPORTED_BOOT_DEVICE_FROM_LINK(Entry); > - Entry = RemoveEntryList (Entry); > - if (SupportedDevice != Except) { > - FreePool (SupportedDevice); > - } > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BootDeviceGetDeviceSupport ( > - IN EFI_DEVICE_PATH *DevicePath, > - OUT BDS_LOAD_OPTION_SUPPORT **DeviceSupport > - ) > -{ > - UINTN Index; > - > - // Find which supported device is the most appropriate > - for (Index = 0; Index < BDS_DEVICE_MAX; Index++) { > - if (BdsLoadOptionSupportList[Index].IsSupported (DevicePath)) { > - *DeviceSupport = &BdsLoadOptionSupportList[Index]; > - return EFI_SUCCESS; > - } > - } > - > - return EFI_UNSUPPORTED; > -} > - > -EFI_STATUS > -BdsLoadOptionFileSystemList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ) > -{ > - EFI_STATUS Status; > - UINTN HandleCount; > - EFI_HANDLE *HandleBuffer; > - UINTN Index; > - BDS_SUPPORTED_DEVICE *SupportedDevice; > - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* FileProtocol; > - EFI_FILE_HANDLE Fs; > - UINTN Size; > - EFI_FILE_SYSTEM_INFO* FsInfo; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; > - > - // List all the Simple File System Protocols > - Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSimpleFileSystemProtocolGuid, NULL, &HandleCount, &HandleBuffer); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - for (Index = 0; Index < HandleCount; Index++) { > - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePathProtocol); > - if (!EFI_ERROR(Status)) { > - // Allocate BDS Supported Device structure > - SupportedDevice = (BDS_SUPPORTED_DEVICE*)AllocatePool (sizeof(BDS_SUPPORTED_DEVICE)); > - > - FileProtocol = NULL; > - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiSimpleFileSystemProtocolGuid, (VOID **)&FileProtocol); > - ASSERT_EFI_ERROR(Status); > - > - FileProtocol->OpenVolume (FileProtocol, &Fs); > - > - // Generate a Description from the file system > - Size = 0; > - FsInfo = NULL; > - Status = Fs->GetInfo (Fs, &gEfiFileSystemInfoGuid, &Size, FsInfo); > - if (Status == EFI_BUFFER_TOO_SMALL) { > - FsInfo = AllocatePool (Size); > - Status = Fs->GetInfo (Fs, &gEfiFileSystemInfoGuid, &Size, FsInfo); > - } > - UnicodeSPrint (SupportedDevice->Description,BOOT_DEVICE_DESCRIPTION_MAX,L"%s (%d MB)",FsInfo->VolumeLabel,(UINT32)(FsInfo->VolumeSize / (1024 * 1024))); > - FreePool(FsInfo); > - Fs->Close (Fs); > - > - SupportedDevice->DevicePathProtocol = DevicePathProtocol; > - SupportedDevice->Support = &BdsLoadOptionSupportList[BDS_DEVICE_FILESYSTEM]; > - > - InsertTailList (BdsLoadOptionList,&SupportedDevice->Link); > - } > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BdsLoadOptionFileSystemCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ) > -{ > - EFI_STATUS Status; > - FILEPATH_DEVICE_PATH* FilePathDevicePath; > - CHAR16 BootFilePath[BOOT_DEVICE_FILEPATH_MAX]; > - UINTN BootFilePathSize; > - > - Print(L"File path of the %s: ", FileName); > - Status = GetHIInputStr (BootFilePath, BOOT_DEVICE_FILEPATH_MAX); > - if (EFI_ERROR(Status)) { > - return EFI_ABORTED; > - } > - > - BootFilePathSize = StrSize (BootFilePath); > - if (BootFilePathSize == 2) { > - *DevicePathNodes = NULL; > - return EFI_NOT_FOUND; > - } > - > - // Create the FilePath Device Path node > - FilePathDevicePath = (FILEPATH_DEVICE_PATH*)AllocatePool(SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize + END_DEVICE_PATH_LENGTH); > - FilePathDevicePath->Header.Type = MEDIA_DEVICE_PATH; > - FilePathDevicePath->Header.SubType = MEDIA_FILEPATH_DP; > - SetDevicePathNodeLength (FilePathDevicePath, SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize); > - CopyMem (FilePathDevicePath->PathName, BootFilePath, BootFilePathSize); > - SetDevicePathEndNode ((VOID*)((UINTN)FilePathDevicePath + SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize)); > - *DevicePathNodes = (EFI_DEVICE_PATH_PROTOCOL*)FilePathDevicePath; > - > - return Status; > -} > - > -EFI_STATUS > -BdsLoadOptionFileSystemUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ) > -{ > - EFI_STATUS Status; > - CHAR16 BootFilePath[BOOT_DEVICE_FILEPATH_MAX]; > - UINTN BootFilePathSize; > - FILEPATH_DEVICE_PATH* EndingDevicePath; > - FILEPATH_DEVICE_PATH* FilePathDevicePath; > - EFI_DEVICE_PATH* DevicePath; > - > - DevicePath = DuplicateDevicePath (OldDevicePath); > - > - EndingDevicePath = (FILEPATH_DEVICE_PATH*)GetLastDevicePathNode (DevicePath); > - > - Print(L"File path of the %s: ", FileName); > - StrnCpy (BootFilePath, EndingDevicePath->PathName, BOOT_DEVICE_FILEPATH_MAX); > - Status = EditHIInputStr (BootFilePath, BOOT_DEVICE_FILEPATH_MAX); > - if (EFI_ERROR(Status)) { > - return Status; > - } > - > - BootFilePathSize = StrSize(BootFilePath); > - if (BootFilePathSize == 2) { > - *NewDevicePath = NULL; > - return EFI_NOT_FOUND; > - } > - > - // Create the FilePath Device Path node > - FilePathDevicePath = (FILEPATH_DEVICE_PATH*)AllocatePool(SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize); > - FilePathDevicePath->Header.Type = MEDIA_DEVICE_PATH; > - FilePathDevicePath->Header.SubType = MEDIA_FILEPATH_DP; > - SetDevicePathNodeLength (FilePathDevicePath, SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize); > - CopyMem (FilePathDevicePath->PathName, BootFilePath, BootFilePathSize); > - > - // Generate the new Device Path by replacing the last node by the updated node > - SetDevicePathEndNode (EndingDevicePath); > - *NewDevicePath = AppendDevicePathNode (DevicePath, (CONST EFI_DEVICE_PATH_PROTOCOL *)FilePathDevicePath); > - FreePool(DevicePath); > - > - return EFI_SUCCESS; > -} > - > -/** > - Check if a boot option path is a file system boot option path or not. > - > - The device specified by the beginning of the path has to support the Simple File > - System protocol. Furthermore, the remaining part of the path has to be composed of > - a single node of type MEDIA_DEVICE_PATH and sub-type MEDIA_FILEPATH_DP. > - > - @param[in] DevicePath Complete device path of a boot option. > - > - @retval FALSE The boot option path has not been identified as that of a > - file system boot option. > - @retval TRUE The boot option path is a file system boot option. > -**/ > -BOOLEAN > -BdsLoadOptionFileSystemIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ) > -{ > - EFI_STATUS Status; > - EFI_HANDLE Handle; > - EFI_DEVICE_PATH *RemainingDevicePath; > - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileProtocol; > - > - Status = BdsConnectDevicePath (DevicePath, &Handle, &RemainingDevicePath); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } > - > - Status = gBS->HandleProtocol ( > - Handle, > - &gEfiSimpleFileSystemProtocolGuid, > - (VOID **)(&FileProtocol) > - ); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } > - > - if (!IS_DEVICE_PATH_NODE (RemainingDevicePath, MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP)) > - return FALSE; > - > - return TRUE; > -} > - > -STATIC > -BOOLEAN > -IsParentDevicePath ( > - IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath, > - IN EFI_DEVICE_PATH_PROTOCOL *ChildDevicePath > - ) > -{ > - UINTN ParentSize; > - UINTN ChildSize; > - > - ParentSize = GetDevicePathSize (ParentDevicePath); > - ChildSize = GetDevicePathSize (ChildDevicePath); > - > - if (ParentSize > ChildSize) { > - return FALSE; > - } > - > - if (CompareMem (ParentDevicePath, ChildDevicePath, ParentSize - END_DEVICE_PATH_LENGTH) != 0) { > - return FALSE; > - } > - > - return TRUE; > -} > - > -EFI_STATUS > -BdsLoadOptionMemMapList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ) > -{ > - EFI_STATUS Status; > - UINTN HandleCount; > - EFI_HANDLE *HandleBuffer; > - UINTN DevicePathHandleCount; > - EFI_HANDLE *DevicePathHandleBuffer; > - BOOLEAN IsParent; > - UINTN Index; > - UINTN Index2; > - BDS_SUPPORTED_DEVICE *SupportedDevice; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; > - EFI_DEVICE_PATH* DevicePath; > - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileProtocol; > - EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol; > - > - // List all the BlockIo Protocols > - Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &HandleCount, &HandleBuffer); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - for (Index = 0; Index < HandleCount; Index++) { > - // We only select handles WITH a Device Path AND not part of Media (to > - // avoid duplication with HardDisk, CDROM, etc). Skip handles used by > - // Simple Filesystem or used for Variable Storage. > - > - > - Status = gBS->HandleProtocol (HandleBuffer[Index], > - &gEfiSimpleFileSystemProtocolGuid, > - (VOID *)&FileProtocol); > - if (!EFI_ERROR(Status)) { > - // SimpleFilesystem supported on this handle, skip > - continue; > - } > - > - Status = gBS->HandleProtocol (HandleBuffer[Index], > - &gEfiFirmwareVolumeBlockProtocolGuid, > - (VOID *)&FvbProtocol); > - if (!EFI_ERROR(Status)) { > - // Firmware Volme Block / Variable storage supported on this handle, skip > - continue; > - } > - > - Status = gBS->HandleProtocol (HandleBuffer[Index], > - &gEfiFirmwareVolumeBlock2ProtocolGuid, > - (VOID *)&FvbProtocol); > - if (!EFI_ERROR(Status)) { > - // Firmware Volme Block / Variable storage supported on this handle, skip > - continue; > - } > - > - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePathProtocol); > - if (!EFI_ERROR(Status)) { > - // BlockIo is not part of Media Device Path > - DevicePath = DevicePathProtocol; > - while (!IsDevicePathEndType (DevicePath) && (DevicePathType (DevicePath) != MEDIA_DEVICE_PATH)) { > - DevicePath = NextDevicePathNode (DevicePath); > - } > - if (DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) { > - continue; > - } > - > - // Open all the handle supporting the DevicePath protocol and verify this handle has not got any child > - Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiDevicePathProtocolGuid, NULL, &DevicePathHandleCount, &DevicePathHandleBuffer); > - ASSERT_EFI_ERROR (Status); > - IsParent = FALSE; > - for (Index2 = 0; (Index2 < DevicePathHandleCount) && !IsParent; Index2++) { > - if (HandleBuffer[Index] != DevicePathHandleBuffer[Index2]) { > - gBS->HandleProtocol (DevicePathHandleBuffer[Index2], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePath); > - if (IsParentDevicePath (DevicePathProtocol, DevicePath)) { > - IsParent = TRUE; > - } > - } > - } > - if (IsParent) { > - continue; > - } > - > - // Allocate BDS Supported Device structure > - SupportedDevice = (BDS_SUPPORTED_DEVICE*)AllocatePool(sizeof(BDS_SUPPORTED_DEVICE)); > - > - Status = GenerateDeviceDescriptionName (HandleBuffer[Index], SupportedDevice->Description); > - ASSERT_EFI_ERROR (Status); > - > - SupportedDevice->DevicePathProtocol = DevicePathProtocol; > - SupportedDevice->Support = &BdsLoadOptionSupportList[BDS_DEVICE_MEMMAP]; > - > - InsertTailList (BdsLoadOptionList,&SupportedDevice->Link); > - } > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BdsLoadOptionMemMapCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ) > -{ > - EFI_STATUS Status; > - MEMMAP_DEVICE_PATH *MemMapDevicePath; > - CHAR16 StrStartingAddress[BOOT_DEVICE_ADDRESS_MAX]; > - CHAR16 StrEndingAddress[BOOT_DEVICE_ADDRESS_MAX]; > - > - Print(L"Starting Address of the %s: ", FileName); > - Status = GetHIInputStr (StrStartingAddress, BOOT_DEVICE_ADDRESS_MAX); > - if (EFI_ERROR(Status)) { > - return EFI_ABORTED; > - } > - > - Print(L"Ending Address of the %s: ", FileName); > - Status = GetHIInputStr (StrEndingAddress, BOOT_DEVICE_ADDRESS_MAX); > - if (EFI_ERROR(Status)) { > - return EFI_ABORTED; > - } > - > - // Create the MemMap Device Path Node > - MemMapDevicePath = (MEMMAP_DEVICE_PATH*)AllocatePool (sizeof(MEMMAP_DEVICE_PATH) + END_DEVICE_PATH_LENGTH); > - MemMapDevicePath->Header.Type = HARDWARE_DEVICE_PATH; > - MemMapDevicePath->Header.SubType = HW_MEMMAP_DP; > - SetDevicePathNodeLength (MemMapDevicePath, sizeof(MEMMAP_DEVICE_PATH)); > - MemMapDevicePath->MemoryType = EfiBootServicesData; > - MemMapDevicePath->StartingAddress = StrHexToUint64 (StrStartingAddress); > - MemMapDevicePath->EndingAddress = StrHexToUint64 (StrEndingAddress); > - > - // Set a Device Path End Node after the Memory Map Device Path Node > - SetDevicePathEndNode (MemMapDevicePath + 1); > - *DevicePathNodes = (EFI_DEVICE_PATH_PROTOCOL*)MemMapDevicePath; > - > - return Status; > -} > - > -EFI_STATUS > -BdsLoadOptionMemMapUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ) > -{ > - EFI_STATUS Status; > - CHAR16 StrStartingAddress[BOOT_DEVICE_ADDRESS_MAX]; > - CHAR16 StrEndingAddress[BOOT_DEVICE_ADDRESS_MAX]; > - MEMMAP_DEVICE_PATH* EndingDevicePath; > - EFI_DEVICE_PATH* DevicePath; > - > - DevicePath = DuplicateDevicePath (OldDevicePath); > - EndingDevicePath = (MEMMAP_DEVICE_PATH*)GetLastDevicePathNode (DevicePath); > - > - Print(L"Starting Address of the %s: ", FileName); > - UnicodeSPrint (StrStartingAddress, BOOT_DEVICE_ADDRESS_MAX, L"0x%X", (UINTN)EndingDevicePath->StartingAddress); > - Status = EditHIInputStr (StrStartingAddress, BOOT_DEVICE_ADDRESS_MAX); > - if (EFI_ERROR(Status)) { > - return EFI_ABORTED; > - } > - > - Print(L"Ending Address of the %s: ", FileName); > - UnicodeSPrint (StrEndingAddress, BOOT_DEVICE_ADDRESS_MAX, L"0x%X", (UINTN)EndingDevicePath->EndingAddress); > - Status = EditHIInputStr (StrEndingAddress, BOOT_DEVICE_ADDRESS_MAX); > - if (EFI_ERROR(Status)) { > - return EFI_ABORTED; > - } > - > - EndingDevicePath->StartingAddress = StrHexToUint64 (StrStartingAddress); > - EndingDevicePath->EndingAddress = StrHexToUint64 (StrEndingAddress); > - > - if (EFI_ERROR(Status)) { > - FreePool(DevicePath); > - } else { > - *NewDevicePath = DevicePath; > - } > - > - return Status; > -} > - > -/** > - Check if a boot option path is a memory map boot option path or not. > - > - The device specified by the beginning of the path has to support the BlockIo > - protocol. Furthermore, the remaining part of the path has to be composed of > - a single node of type HARDWARE_DEVICE_PATH and sub-type HW_MEMMAP_DP. > - > - @param[in] DevicePath Complete device path of a boot option. > - > - @retval FALSE The boot option path has not been identified as that of a > - memory map boot option. > - @retval TRUE The boot option path is a a memory map boot option. > -**/ > -BOOLEAN > -BdsLoadOptionMemMapIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ) > -{ > - EFI_STATUS Status; > - EFI_HANDLE Handle; > - EFI_DEVICE_PATH *RemainingDevicePath; > - EFI_BLOCK_IO_PROTOCOL *BlockIoProtocol; > - > - Status = BdsConnectDevicePath (DevicePath, &Handle, &RemainingDevicePath); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } > - > - Status = gBS->HandleProtocol ( > - Handle, > - &gEfiBlockIoProtocolGuid, > - (VOID **)(&BlockIoProtocol) > - ); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } > - > - if (!IS_DEVICE_PATH_NODE (RemainingDevicePath, HARDWARE_DEVICE_PATH, HW_MEMMAP_DP)) > - return FALSE; > - > - return TRUE; > -} > - > -EFI_STATUS > -BdsLoadOptionPxeList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ) > -{ > - EFI_STATUS Status; > - UINTN HandleCount; > - EFI_HANDLE *HandleBuffer; > - UINTN Index; > - BDS_SUPPORTED_DEVICE *SupportedDevice; > - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; > - EFI_SIMPLE_NETWORK_PROTOCOL* SimpleNet; > - CHAR16 DeviceDescription[BOOT_DEVICE_DESCRIPTION_MAX]; > - EFI_MAC_ADDRESS *Mac; > - > - // List all the PXE Protocols > - Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiPxeBaseCodeProtocolGuid, NULL, &HandleCount, &HandleBuffer); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - for (Index = 0; Index < HandleCount; Index++) { > - // We only select the handle WITH a Device Path AND the PXE Protocol > - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePathProtocol); > - if (!EFI_ERROR(Status)) { > - // Allocate BDS Supported Device structure > - SupportedDevice = (BDS_SUPPORTED_DEVICE*)AllocatePool(sizeof(BDS_SUPPORTED_DEVICE)); > - > - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiSimpleNetworkProtocolGuid, (VOID **)&SimpleNet); > - if (!EFI_ERROR(Status)) { > - Mac = &SimpleNet->Mode->CurrentAddress; > - UnicodeSPrint (DeviceDescription,BOOT_DEVICE_DESCRIPTION_MAX,L"MAC Address: %02x:%02x:%02x:%02x:%02x:%02x", Mac->Addr[0], Mac->Addr[1], Mac->Addr[2], Mac->Addr[3], Mac->Addr[4], Mac->Addr[5]); > - } else { > - Status = GenerateDeviceDescriptionName (HandleBuffer[Index], DeviceDescription); > - ASSERT_EFI_ERROR (Status); > - } > - UnicodeSPrint (SupportedDevice->Description,BOOT_DEVICE_DESCRIPTION_MAX,L"PXE on %s",DeviceDescription); > - > - SupportedDevice->DevicePathProtocol = DevicePathProtocol; > - SupportedDevice->Support = &BdsLoadOptionSupportList[BDS_DEVICE_PXE]; > - > - InsertTailList (BdsLoadOptionList,&SupportedDevice->Link); > - } > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BdsLoadOptionPxeCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ) > -{ > - *DevicePathNodes = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH); > - SetDevicePathEndNode (*DevicePathNodes); > - > - return EFI_SUCCESS; > -} > - > -/** > - Update the parameters of a Pxe boot option > - > - @param[in] OldDevicePath Current complete device path of the Pxe boot option. > - This has to be a valid complete Pxe boot option path. > - @param[in] FileName Description of the file the path is asked for > - @param[out] NewDevicePath Pointer to the new complete device path. > - > - @retval EFI_SUCCESS Update completed > - @retval EFI_OUT_OF_RESOURCES Fail to perform the update due to lack of resource > -**/ > -EFI_STATUS > -BdsLoadOptionPxeUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ) > -{ > - // > - // Make a copy of the complete device path that is made of : > - // the device path of the device supporting the Pxe base code protocol > - // followed by an end node. > - // > - *NewDevicePath = DuplicateDevicePath (OldDevicePath); > - if (*NewDevicePath == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } else { > - return EFI_SUCCESS; > - } > -} > - > -BOOLEAN > -BdsLoadOptionPxeIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ) > -{ > - EFI_STATUS Status; > - EFI_HANDLE Handle; > - EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath; > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBcProtocol; > - > - Status = BdsConnectDevicePath (DevicePath, &Handle, &RemainingDevicePath); > - if (EFI_ERROR(Status)) { > - return FALSE; > - } > - > - if (!IsDevicePathEnd(RemainingDevicePath)) { > - return FALSE; > - } > - > - Status = gBS->HandleProtocol (Handle, &gEfiPxeBaseCodeProtocolGuid, (VOID **)&PxeBcProtocol); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } else { > - return TRUE; > - } > -} > - > -/** > - Add to the list of boot devices the devices allowing a TFTP boot > - > - @param[in] BdsLoadOptionList List of devices to boot from > - > - @retval EFI_SUCCESS Update completed > - @retval EFI_OUT_OF_RESOURCES Fail to perform the update due to lack of resource > -**/ > -EFI_STATUS > -BdsLoadOptionTftpList ( > - IN OUT LIST_ENTRY* BdsLoadOptionList > - ) > -{ > - EFI_STATUS Status; > - UINTN HandleCount; > - EFI_HANDLE *HandleBuffer; > - EFI_HANDLE Handle; > - UINTN Index; > - EFI_DEVICE_PATH_PROTOCOL *DevicePathProtocol; > - VOID *Interface; > - EFI_SIMPLE_NETWORK_PROTOCOL *SimpleNetworkProtocol; > - BDS_SUPPORTED_DEVICE *SupportedDevice; > - EFI_MAC_ADDRESS *Mac; > - > - // > - // List all the handles on which the Simple Network Protocol is installed. > - // > - Status = gBS->LocateHandleBuffer ( > - ByProtocol, > - &gEfiSimpleNetworkProtocolGuid, > - NULL, > - &HandleCount, > - &HandleBuffer > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - for (Index = 0; Index < HandleCount; Index++) { > - Handle = HandleBuffer[Index]; > - // > - // We select the handles that support : > - // . the Device Path Protocol > - // . the MTFTP4 Protocol > - // > - Status = gBS->HandleProtocol ( > - Handle, > - &gEfiDevicePathProtocolGuid, > - (VOID **)&DevicePathProtocol > - ); > - if (EFI_ERROR (Status)) { > - continue; > - } > - > - Status = gBS->HandleProtocol ( > - Handle, > - &gEfiMtftp4ServiceBindingProtocolGuid, > - &Interface > - ); > - if (EFI_ERROR (Status)) { > - continue; > - } > - > - Status = gBS->HandleProtocol ( > - Handle, > - &gEfiSimpleNetworkProtocolGuid, > - (VOID **)&SimpleNetworkProtocol > - ); > - if (EFI_ERROR (Status)) { > - continue; > - } > - > - // Allocate BDS Supported Device structure > - SupportedDevice = (BDS_SUPPORTED_DEVICE*)AllocatePool (sizeof (BDS_SUPPORTED_DEVICE)); > - if (SupportedDevice == NULL) { > - continue; > - } > - > - Mac = &SimpleNetworkProtocol->Mode->CurrentAddress; > - UnicodeSPrint ( > - SupportedDevice->Description, > - BOOT_DEVICE_DESCRIPTION_MAX, > - L"TFTP on MAC Address: %02x:%02x:%02x:%02x:%02x:%02x", > - Mac->Addr[0], Mac->Addr[1], Mac->Addr[2], Mac->Addr[3], Mac->Addr[4], Mac->Addr[5] > - ); > - > - SupportedDevice->DevicePathProtocol = DevicePathProtocol; > - SupportedDevice->Support = &BdsLoadOptionSupportList[BDS_DEVICE_TFTP]; > - > - InsertTailList (BdsLoadOptionList, &SupportedDevice->Link); > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS > -BdsLoadOptionTftpCreateDevicePath ( > - IN CHAR16* FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes > - ) > -{ > - EFI_STATUS Status; > - BOOLEAN IsDHCP; > - EFI_IP_ADDRESS LocalIp; > - EFI_IP_ADDRESS SubnetMask; > - EFI_IP_ADDRESS GatewayIp; > - EFI_IP_ADDRESS RemoteIp; > - IPv4_DEVICE_PATH *IPv4DevicePathNode; > - FILEPATH_DEVICE_PATH *FilePathDevicePath; > - CHAR16 BootFilePath[BOOT_DEVICE_FILEPATH_MAX]; > - UINTN BootFilePathSize; > - > - Print (L"Get the IP address from DHCP: "); > - Status = GetHIInputBoolean (&IsDHCP); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - > - if (!IsDHCP) { > - Print (L"Local static IP address: "); > - Status = GetHIInputIP (&LocalIp); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - Print (L"Get the network mask: "); > - Status = GetHIInputIP (&SubnetMask); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - Print (L"Get the gateway IP address: "); > - Status = GetHIInputIP (&GatewayIp); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - } > - > - Print (L"Get the TFTP server IP address: "); > - Status = GetHIInputIP (&RemoteIp); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - > - Print (L"File path of the %s : ", FileName); > - Status = GetHIInputStr (BootFilePath, BOOT_DEVICE_FILEPATH_MAX); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - > - BootFilePathSize = StrSize(BootFilePath); > - if (BootFilePathSize == 2) { > - return EFI_NOT_FOUND; > - } > - > - // Allocate the memory for the IPv4 + File Path Device Path Nodes > - IPv4DevicePathNode = (IPv4_DEVICE_PATH*)AllocatePool(sizeof(IPv4_DEVICE_PATH) + SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize + END_DEVICE_PATH_LENGTH); > - > - // Create the IPv4 Device Path > - IPv4DevicePathNode->Header.Type = MESSAGING_DEVICE_PATH; > - IPv4DevicePathNode->Header.SubType = MSG_IPv4_DP; > - SetDevicePathNodeLength (&IPv4DevicePathNode->Header, sizeof(IPv4_DEVICE_PATH)); > - > - if (!IsDHCP) { > - CopyMem (&IPv4DevicePathNode->LocalIpAddress, &LocalIp.v4, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&IPv4DevicePathNode->SubnetMask, &SubnetMask.v4, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&IPv4DevicePathNode->GatewayIpAddress, &GatewayIp.v4, sizeof (EFI_IPv4_ADDRESS)); > - } > - > - CopyMem (&IPv4DevicePathNode->RemoteIpAddress, &RemoteIp.v4, sizeof (EFI_IPv4_ADDRESS)); > - IPv4DevicePathNode->LocalPort = 0; > - IPv4DevicePathNode->RemotePort = 0; > - IPv4DevicePathNode->Protocol = EFI_IP_PROTO_TCP; > - IPv4DevicePathNode->StaticIpAddress = (IsDHCP != TRUE); > - > - // Create the FilePath Device Path node > - FilePathDevicePath = (FILEPATH_DEVICE_PATH*)(IPv4DevicePathNode + 1); > - FilePathDevicePath->Header.Type = MEDIA_DEVICE_PATH; > - FilePathDevicePath->Header.SubType = MEDIA_FILEPATH_DP; > - SetDevicePathNodeLength (FilePathDevicePath, SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize); > - CopyMem (FilePathDevicePath->PathName, BootFilePath, BootFilePathSize); > - > - // Set the End Device Path Node > - SetDevicePathEndNode ((VOID*)((UINTN)FilePathDevicePath + SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize)); > - *DevicePathNodes = (EFI_DEVICE_PATH_PROTOCOL*)IPv4DevicePathNode; > - > - return Status; > -} > - > -/** > - Update the parameters of a TFTP boot option > - > - The function asks sequentially to update the IPv4 parameters as well as the boot file path, > - providing the previously set value if any. > - > - @param[in] OldDevicePath Current complete device path of the Tftp boot option. > - This has to be a valid complete Tftp boot option path. > - By complete, we mean that it is not only the Tftp > - specific end part built by the > - "BdsLoadOptionTftpCreateDevicePath()" function. > - This path is handled as read only. > - @param[in] FileName Description of the file the path is asked for > - @param[out] NewDevicePath Pointer to the new complete device path. > - > - @retval EFI_SUCCESS Update completed > - @retval EFI_ABORTED Update aborted by the user > - @retval EFI_OUT_OF_RESOURCES Fail to perform the update due to lack of resource > -**/ > -EFI_STATUS > -BdsLoadOptionTftpUpdateDevicePath ( > - IN EFI_DEVICE_PATH *OldDevicePath, > - IN CHAR16 *FileName, > - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath > - ) > -{ > - EFI_STATUS Status; > - EFI_DEVICE_PATH *DevicePath; > - EFI_DEVICE_PATH *DevicePathNode; > - UINT8 *Ipv4NodePtr; > - IPv4_DEVICE_PATH Ipv4Node; > - BOOLEAN IsDHCP; > - EFI_IP_ADDRESS OldIp; > - EFI_IP_ADDRESS OldSubnetMask; > - EFI_IP_ADDRESS OldGatewayIp; > - EFI_IP_ADDRESS LocalIp; > - EFI_IP_ADDRESS SubnetMask; > - EFI_IP_ADDRESS GatewayIp; > - EFI_IP_ADDRESS RemoteIp; > - UINT8 *FileNodePtr; > - CHAR16 BootFilePath[BOOT_DEVICE_FILEPATH_MAX]; > - UINTN PathSize; > - UINTN BootFilePathSize; > - FILEPATH_DEVICE_PATH *NewFilePathNode; > - > - Ipv4NodePtr = NULL; > - > - // > - // Make a copy of the complete device path that is made of : > - // the device path of the device that support the Simple Network protocol > - // followed by an IPv4 node (type IPv4_DEVICE_PATH), > - // followed by a file path node (type FILEPATH_DEVICE_PATH) and ended up > - // by an end node. The IPv6 case is not handled yet. > - // > - > - DevicePath = DuplicateDevicePath (OldDevicePath); > - if (DevicePath == NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - goto ErrorExit; > - } > - > - // > - // Because of the check done by "BdsLoadOptionTftpIsSupported()" prior to the > - // call to this function, we know that the device path ends with an IPv4 node > - // followed by a file path node and finally an end node. To get the address of > - // the last IPv4 node, we loop over the whole device path, noting down the > - // address of each encountered IPv4 node. > - // > - > - for (DevicePathNode = DevicePath; > - !IsDevicePathEnd (DevicePathNode); > - DevicePathNode = NextDevicePathNode (DevicePathNode)) > - { > - if (IS_DEVICE_PATH_NODE (DevicePathNode, MESSAGING_DEVICE_PATH, MSG_IPv4_DP)) { > - Ipv4NodePtr = (UINT8*)DevicePathNode; > - } > - } > - > - // Copy for alignment of the IPv4 node data > - CopyMem (&Ipv4Node, Ipv4NodePtr, sizeof (IPv4_DEVICE_PATH)); > - > - Print (L"Get the IP address from DHCP: "); > - Status = GetHIInputBoolean (&IsDHCP); > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - > - if (!IsDHCP) { > - Print (L"Local static IP address: "); > - if (Ipv4Node.StaticIpAddress) { > - CopyMem (&OldIp.v4, &Ipv4Node.LocalIpAddress, sizeof (EFI_IPv4_ADDRESS)); > - Status = EditHIInputIP (&OldIp, &LocalIp); > - } else { > - Status = GetHIInputIP (&LocalIp); > - } > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - > - Print (L"Get the network mask: "); > - if (Ipv4Node.StaticIpAddress) { > - CopyMem (&OldSubnetMask.v4, &Ipv4Node.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); > - Status = EditHIInputIP (&OldSubnetMask, &SubnetMask); > - } else { > - Status = GetHIInputIP (&SubnetMask); > - } > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - > - Print (L"Get the gateway IP address: "); > - if (Ipv4Node.StaticIpAddress) { > - CopyMem (&OldGatewayIp.v4, &Ipv4Node.GatewayIpAddress, sizeof (EFI_IPv4_ADDRESS)); > - Status = EditHIInputIP (&OldGatewayIp, &GatewayIp); > - } else { > - Status = GetHIInputIP (&GatewayIp); > - } > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - } > - > - Print (L"TFTP server IP address: "); > - // Copy remote IPv4 address into IPv4 or IPv6 union > - CopyMem (&OldIp.v4, &Ipv4Node.RemoteIpAddress, sizeof (EFI_IPv4_ADDRESS)); > - > - Status = EditHIInputIP (&OldIp, &RemoteIp); > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - > - // Get the path of the boot file and its size in number of bytes > - FileNodePtr = Ipv4NodePtr + sizeof (IPv4_DEVICE_PATH); > - BootFilePathSize = DevicePathNodeLength (FileNodePtr) - SIZE_OF_FILEPATH_DEVICE_PATH; > - > - // > - // Ask for update of the boot file path > - // > - do { > - // Copy for 2-byte alignment of the Unicode string > - CopyMem ( > - BootFilePath, FileNodePtr + SIZE_OF_FILEPATH_DEVICE_PATH, > - MIN (BootFilePathSize, BOOT_DEVICE_FILEPATH_MAX) > - ); > - BootFilePath[BOOT_DEVICE_FILEPATH_MAX - 1] = L'\0'; > - > - Print (L"File path of the %s: ", FileName); > - Status = EditHIInputStr (BootFilePath, BOOT_DEVICE_FILEPATH_MAX); > - if (EFI_ERROR (Status)) { > - goto ErrorExit; > - } > - PathSize = StrSize (BootFilePath); > - if (PathSize > 2) { > - break; > - } > - // Empty string, give the user another try > - Print (L"Empty string - Invalid path\n"); > - } while (PathSize <= 2) ; > - > - // > - // Update the IPv4 node. IPv6 case not handled yet. > - // > - if (IsDHCP) { > - Ipv4Node.StaticIpAddress = FALSE; > - ZeroMem (&Ipv4Node.LocalIpAddress, sizeof (EFI_IPv4_ADDRESS)); > - ZeroMem (&Ipv4Node.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); > - ZeroMem (&Ipv4Node.GatewayIpAddress, sizeof (EFI_IPv4_ADDRESS)); > - } else { > - Ipv4Node.StaticIpAddress = TRUE; > - CopyMem (&Ipv4Node.LocalIpAddress, &LocalIp.v4, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&Ipv4Node.SubnetMask, &SubnetMask.v4, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&Ipv4Node.GatewayIpAddress, &GatewayIp.v4, sizeof (EFI_IPv4_ADDRESS)); > - } > - > - CopyMem (&Ipv4Node.RemoteIpAddress, &RemoteIp.v4, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (Ipv4NodePtr, &Ipv4Node, sizeof (IPv4_DEVICE_PATH)); > - > - // > - // Create the new file path node > - // > - NewFilePathNode = (FILEPATH_DEVICE_PATH*)AllocatePool ( > - SIZE_OF_FILEPATH_DEVICE_PATH + > - PathSize > - ); > - NewFilePathNode->Header.Type = MEDIA_DEVICE_PATH; > - NewFilePathNode->Header.SubType = MEDIA_FILEPATH_DP; > - SetDevicePathNodeLength ( > - NewFilePathNode, > - SIZE_OF_FILEPATH_DEVICE_PATH + PathSize > - ); > - CopyMem (NewFilePathNode->PathName, BootFilePath, PathSize); > - > - // > - // Generate the new Device Path by replacing the file path node at address > - // "FileNodePtr" by the new one "NewFilePathNode" and return its address. > - // > - SetDevicePathEndNode (FileNodePtr); > - *NewDevicePath = AppendDevicePathNode ( > - DevicePath, > - (CONST EFI_DEVICE_PATH_PROTOCOL*)NewFilePathNode > - ); > - > -ErrorExit: > - if (DevicePath != NULL) { > - FreePool (DevicePath) ; > - } > - > - return Status; > -} > - > -BOOLEAN > -BdsLoadOptionTftpIsSupported ( > - IN EFI_DEVICE_PATH *DevicePath > - ) > -{ > - EFI_STATUS Status; > - EFI_HANDLE Handle; > - EFI_DEVICE_PATH *RemainingDevicePath; > - EFI_DEVICE_PATH *NextDevicePath; > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBcProtocol; > - > - Status = BdsConnectDevicePath (DevicePath, &Handle, &RemainingDevicePath); > - if (EFI_ERROR(Status)) { > - return FALSE; > - } > - > - // Validate the Remaining Device Path > - if (IsDevicePathEnd(RemainingDevicePath)) { > - return FALSE; > - } > - if (!IS_DEVICE_PATH_NODE(RemainingDevicePath,MESSAGING_DEVICE_PATH,MSG_IPv4_DP) && > - !IS_DEVICE_PATH_NODE(RemainingDevicePath,MESSAGING_DEVICE_PATH,MSG_IPv6_DP)) { > - return FALSE; > - } > - NextDevicePath = NextDevicePathNode (RemainingDevicePath); > - if (IsDevicePathEnd(NextDevicePath)) { > - return FALSE; > - } > - if (!IS_DEVICE_PATH_NODE(NextDevicePath,MEDIA_DEVICE_PATH,MEDIA_FILEPATH_DP)) { > - return FALSE; > - } > - > - Status = gBS->HandleProtocol (Handle, &gEfiPxeBaseCodeProtocolGuid, (VOID **)&PxeBcProtocol); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } else { > - return TRUE; > - } > -} > -- > 2.7.4 > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
On 26 October 2016 at 13:33, Ryan Harkin <ryan.harkin@linaro.org> wrote: > On 25 October 2016 at 18:16, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote: >> This is no longer used, and does not belong in a reference code base, >> so remove it. >> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > > I tested this along with the series to move to the generic BDS and the > additional Juno patch. Tested on Juno R0/1/2, TC2 and FVP AEMv8 and > Foundation models. > > Tested-by: Ryan Harkin <ryan.harkin@linaro.org> > > And it's simple enough that I can understand what it does: > > Reviewed-by: Ryan Harkin <ryan.harkin@linaro.org> > Pushed, thanks!! _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
diff --git a/ArmPlatformPkg/Bds/Bds.c b/ArmPlatformPkg/Bds/Bds.c deleted file mode 100644 index 4cea3cd531bb..000000000000 --- a/ArmPlatformPkg/Bds/Bds.c +++ /dev/null @@ -1,561 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2015, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#include "BdsInternal.h" - -#include <Library/PcdLib.h> -#include <Library/PerformanceLib.h> - -#include <Protocol/Bds.h> - -#include <Guid/EventGroup.h> - -#define EFI_SET_TIMER_TO_SECOND 10000000 - -STATIC -EFI_STATUS -GetConsoleDevicePathFromVariable ( - IN CHAR16* ConsoleVarName, - IN CHAR16* DefaultConsolePaths, - OUT EFI_DEVICE_PATH** DevicePaths - ) -{ - EFI_STATUS Status; - UINTN Size; - EFI_DEVICE_PATH_PROTOCOL* DevicePathInstances; - EFI_DEVICE_PATH_PROTOCOL* DevicePathInstance; - CHAR16* DevicePathStr; - CHAR16* NextDevicePathStr; - EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *EfiDevicePathFromTextProtocol; - - Status = GetGlobalEnvironmentVariable (ConsoleVarName, NULL, NULL, (VOID**)&DevicePathInstances); - if (EFI_ERROR(Status)) { - // In case no default console device path has been defined we assume a driver handles the console (eg: SimpleTextInOutSerial) - if ((DefaultConsolePaths == NULL) || (DefaultConsolePaths[0] == L'\0')) { - *DevicePaths = NULL; - return EFI_SUCCESS; - } - - Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, (VOID **)&EfiDevicePathFromTextProtocol); - ASSERT_EFI_ERROR(Status); - - DevicePathInstances = NULL; - - // Extract the Device Path instances from the multi-device path string - while ((DefaultConsolePaths != NULL) && (DefaultConsolePaths[0] != L'\0')) { - NextDevicePathStr = StrStr (DefaultConsolePaths, L";"); - if (NextDevicePathStr == NULL) { - DevicePathStr = DefaultConsolePaths; - DefaultConsolePaths = NULL; - } else { - DevicePathStr = (CHAR16*)AllocateCopyPool ((NextDevicePathStr - DefaultConsolePaths + 1) * sizeof(CHAR16), DefaultConsolePaths); - *(DevicePathStr + (NextDevicePathStr - DefaultConsolePaths)) = L'\0'; - DefaultConsolePaths = NextDevicePathStr; - if (DefaultConsolePaths[0] == L';') { - DefaultConsolePaths++; - } - } - - DevicePathInstance = EfiDevicePathFromTextProtocol->ConvertTextToDevicePath (DevicePathStr); - ASSERT(DevicePathInstance != NULL); - DevicePathInstances = AppendDevicePathInstance (DevicePathInstances, DevicePathInstance); - - if (NextDevicePathStr != NULL) { - FreePool (DevicePathStr); - } - FreePool (DevicePathInstance); - } - - // Set the environment variable with this device path multi-instances - Size = GetDevicePathSize (DevicePathInstances); - if (Size > 0) { - gRT->SetVariable ( - ConsoleVarName, - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - Size, - DevicePathInstances - ); - } else { - Status = EFI_INVALID_PARAMETER; - } - } - - if (!EFI_ERROR(Status)) { - *DevicePaths = DevicePathInstances; - } - return Status; -} - -STATIC -EFI_STATUS -InitializeConsolePipe ( - IN EFI_DEVICE_PATH *ConsoleDevicePaths, - IN EFI_GUID *Protocol, - OUT EFI_HANDLE *Handle, - OUT VOID* *Interface - ) -{ - EFI_STATUS Status; - UINTN Size; - UINTN NoHandles; - EFI_HANDLE *Buffer; - EFI_DEVICE_PATH_PROTOCOL* DevicePath; - - // Connect all the Device Path Consoles - while (ConsoleDevicePaths != NULL) { - DevicePath = GetNextDevicePathInstance (&ConsoleDevicePaths, &Size); - - Status = BdsConnectDevicePath (DevicePath, Handle, NULL); - DEBUG_CODE_BEGIN(); - if (EFI_ERROR(Status)) { - // We convert back to the text representation of the device Path - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; - CHAR16* DevicePathTxt; - EFI_STATUS Status; - - Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); - if (!EFI_ERROR(Status)) { - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (DevicePath, TRUE, TRUE); - - DEBUG((EFI_D_ERROR,"Fail to start the console with the Device Path '%s'. (Error '%r')\n", DevicePathTxt, Status)); - - FreePool (DevicePathTxt); - } - } - DEBUG_CODE_END(); - - // If the console splitter driver is not supported by the platform then use the first Device Path - // instance for the console interface. - if (!EFI_ERROR(Status) && (*Interface == NULL)) { - Status = gBS->HandleProtocol (*Handle, Protocol, Interface); - } - } - - // No Device Path has been defined for this console interface. We take the first protocol implementation - if (*Interface == NULL) { - Status = gBS->LocateHandleBuffer (ByProtocol, Protocol, NULL, &NoHandles, &Buffer); - if (EFI_ERROR (Status)) { - BdsConnectAllDrivers(); - Status = gBS->LocateHandleBuffer (ByProtocol, Protocol, NULL, &NoHandles, &Buffer); - } - - if (!EFI_ERROR(Status)) { - *Handle = Buffer[0]; - Status = gBS->HandleProtocol (*Handle, Protocol, Interface); - ASSERT_EFI_ERROR(Status); - FreePool (Buffer); - } - } else { - Status = EFI_SUCCESS; - } - - return Status; -} - -EFI_STATUS -InitializeConsole ( - VOID - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH* ConOutDevicePaths; - EFI_DEVICE_PATH* ConInDevicePaths; - EFI_DEVICE_PATH* ConErrDevicePaths; - - // By getting the Console Device Paths from the environment variables before initializing the console pipe, we - // create the 3 environment variables (ConIn, ConOut, ConErr) that allows to initialize all the console interface - // of newly installed console drivers - Status = GetConsoleDevicePathFromVariable (L"ConOut", (CHAR16*)PcdGetPtr(PcdDefaultConOutPaths), &ConOutDevicePaths); - ASSERT_EFI_ERROR (Status); - Status = GetConsoleDevicePathFromVariable (L"ConIn", (CHAR16*)PcdGetPtr(PcdDefaultConInPaths), &ConInDevicePaths); - ASSERT_EFI_ERROR (Status); - Status = GetConsoleDevicePathFromVariable (L"ErrOut", (CHAR16*)PcdGetPtr(PcdDefaultConOutPaths), &ConErrDevicePaths); - ASSERT_EFI_ERROR (Status); - - // Initialize the Consoles - Status = InitializeConsolePipe (ConOutDevicePaths, &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **)&gST->ConOut); - ASSERT_EFI_ERROR (Status); - Status = InitializeConsolePipe (ConInDevicePaths, &gEfiSimpleTextInProtocolGuid, &gST->ConsoleInHandle, (VOID **)&gST->ConIn); - ASSERT_EFI_ERROR (Status); - Status = InitializeConsolePipe (ConErrDevicePaths, &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **)&gST->StdErr); - if (EFI_ERROR(Status)) { - // In case of error, we reuse the console output for the error output - gST->StandardErrorHandle = gST->ConsoleOutHandle; - gST->StdErr = gST->ConOut; - } - - // Free Memory allocated for reading the UEFI Variables - if (ConOutDevicePaths) { - FreePool (ConOutDevicePaths); - } - if (ConInDevicePaths) { - FreePool (ConInDevicePaths); - } - if (ConErrDevicePaths) { - FreePool (ConErrDevicePaths); - } - - return EFI_SUCCESS; -} - -EFI_STATUS -DefineDefaultBootEntries ( - VOID - ) -{ - BDS_LOAD_OPTION* BdsLoadOption; - UINTN Size; - EFI_STATUS Status; - EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL* EfiDevicePathFromTextProtocol; - EFI_DEVICE_PATH* BootDevicePath; - UINTN CmdLineSize; - UINTN CmdLineAsciiSize; - CHAR16* DefaultBootArgument; - CHAR8* AsciiDefaultBootArgument; - - // - // If Boot Order does not exist then create a default entry - // - Size = 0; - Status = gRT->GetVariable (L"BootOrder", &gEfiGlobalVariableGuid, NULL, &Size, NULL); - if (Status == EFI_NOT_FOUND) { - if ((PcdGetPtr(PcdDefaultBootDevicePath) == NULL) || (StrLen ((CHAR16*)PcdGetPtr(PcdDefaultBootDevicePath)) == 0)) { - return EFI_UNSUPPORTED; - } - - Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, (VOID **)&EfiDevicePathFromTextProtocol); - if (EFI_ERROR(Status)) { - // You must provide an implementation of DevicePathFromTextProtocol in your firmware (eg: DevicePathDxe) - DEBUG((EFI_D_ERROR,"Error: Bds requires DevicePathFromTextProtocol\n")); - return Status; - } - BootDevicePath = EfiDevicePathFromTextProtocol->ConvertTextToDevicePath ((CHAR16*)PcdGetPtr(PcdDefaultBootDevicePath)); - - DEBUG_CODE_BEGIN(); - // We convert back to the text representation of the device Path to see if the initial text is correct - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; - CHAR16* DevicePathTxt; - - Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); - ASSERT_EFI_ERROR(Status); - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (BootDevicePath, TRUE, TRUE); - - if (StrCmp ((CHAR16*)PcdGetPtr (PcdDefaultBootDevicePath), DevicePathTxt) != 0) { - DEBUG ((EFI_D_ERROR, "Device Path given: '%s' Device Path expected: '%s'\n", - (CHAR16*)PcdGetPtr (PcdDefaultBootDevicePath), DevicePathTxt)); - ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); - } - - FreePool (DevicePathTxt); - DEBUG_CODE_END(); - - // Create the entry is the Default values are correct - if (BootDevicePath != NULL) { - // We do not support NULL pointer - ASSERT (PcdGetPtr (PcdDefaultBootArgument) != NULL); - - // - // Logic to handle ASCII or Unicode default parameters - // - if (*(CHAR8*)PcdGetPtr (PcdDefaultBootArgument) == '\0') { - CmdLineSize = 0; - CmdLineAsciiSize = 0; - DefaultBootArgument = NULL; - AsciiDefaultBootArgument = NULL; - } else if (IsUnicodeString ((CHAR16*)PcdGetPtr (PcdDefaultBootArgument))) { - // The command line is a Unicode string - DefaultBootArgument = (CHAR16*)PcdGetPtr (PcdDefaultBootArgument); - CmdLineSize = StrSize (DefaultBootArgument); - - // Initialize ASCII variables - CmdLineAsciiSize = CmdLineSize / 2; - AsciiDefaultBootArgument = AllocatePool (CmdLineAsciiSize); - if (AsciiDefaultBootArgument == NULL) { - return EFI_OUT_OF_RESOURCES; - } - UnicodeStrToAsciiStr ((CHAR16*)PcdGetPtr (PcdDefaultBootArgument), AsciiDefaultBootArgument); - } else { - // The command line is a ASCII string - AsciiDefaultBootArgument = (CHAR8*)PcdGetPtr (PcdDefaultBootArgument); - CmdLineAsciiSize = AsciiStrSize (AsciiDefaultBootArgument); - - // Initialize ASCII variables - CmdLineSize = CmdLineAsciiSize * 2; - DefaultBootArgument = AllocatePool (CmdLineSize); - if (DefaultBootArgument == NULL) { - return EFI_OUT_OF_RESOURCES; - } - AsciiStrToUnicodeStr (AsciiDefaultBootArgument, DefaultBootArgument); - } - - BootOptionCreate (LOAD_OPTION_ACTIVE | LOAD_OPTION_CATEGORY_BOOT, - (CHAR16*)PcdGetPtr (PcdDefaultBootDescription), - BootDevicePath, - (UINT8 *)DefaultBootArgument, // OptionalData - CmdLineSize, // OptionalDataSize - &BdsLoadOption - ); - FreePool (BdsLoadOption); - - if (DefaultBootArgument == (CHAR16*)PcdGetPtr (PcdDefaultBootArgument)) { - FreePool (AsciiDefaultBootArgument); - } else if (DefaultBootArgument != NULL) { - FreePool (DefaultBootArgument); - } - } else { - Status = EFI_UNSUPPORTED; - } - } - - return Status; -} - -EFI_STATUS -StartDefaultBootOnTimeout ( - VOID - ) -{ - UINTN Size; - UINT16 Timeout; - UINT16 *TimeoutPtr; - EFI_EVENT WaitList[2]; - UINTN WaitIndex; - UINT16 *BootOrder; - UINTN BootOrderSize; - UINTN Index; - CHAR16 BootVariableName[9]; - EFI_STATUS Status; - EFI_INPUT_KEY Key; - - Size = sizeof(UINT16); - Timeout = (UINT16)PcdGet16 (PcdPlatformBootTimeOut); - Status = GetGlobalEnvironmentVariable (L"Timeout", &Timeout, &Size, (VOID**)&TimeoutPtr); - if (!EFI_ERROR (Status)) { - Timeout = *TimeoutPtr; - FreePool (TimeoutPtr); - } - - if (Timeout != 0xFFFF) { - if (Timeout > 0) { - // Create the waiting events (keystroke and 1sec timer) - gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &WaitList[0]); - gBS->SetTimer (WaitList[0], TimerPeriodic, EFI_SET_TIMER_TO_SECOND); - WaitList[1] = gST->ConIn->WaitForKey; - - // Start the timer - WaitIndex = 0; - Print(L"The default boot selection will start in "); - while ((Timeout > 0) && (WaitIndex == 0)) { - Print(L"%3d seconds",Timeout); - gBS->WaitForEvent (2, WaitList, &WaitIndex); - if (WaitIndex == 0) { - Print(L"\b\b\b\b\b\b\b\b\b\b\b"); - Timeout--; - } - } - // Discard key in the buffer - do { - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); - } while(!EFI_ERROR(Status)); - gBS->CloseEvent (WaitList[0]); - Print(L"\n\r"); - } - - // In case of Timeout we start the default boot selection - if (Timeout == 0) { - // Get the Boot Option Order from the environment variable (a default value should have been created) - GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder); - - for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) { - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BootOrder[Index]); - Status = BdsStartBootOption (BootVariableName); - if(!EFI_ERROR(Status)){ - // Boot option returned successfully, hence don't need to start next boot option - break; - } - // In case of success, we should not return from this call. - } - FreePool (BootOrder); - } - } - return EFI_SUCCESS; -} - -/** - An empty function to pass error checking of CreateEventEx (). - - @param Event Event whose notification function is being invoked. - @param Context Pointer to the notification function's context, - which is implementation-dependent. - -**/ -VOID -EFIAPI -EmptyCallbackFunction ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - return; -} - -/** - This function uses policy data from the platform to determine what operating - system or system utility should be loaded and invoked. This function call - also optionally make the use of user input to determine the operating system - or system utility to be loaded and invoked. When the DXE Core has dispatched - all the drivers on the dispatch queue, this function is called. This - function will attempt to connect the boot devices required to load and invoke - the selected operating system or system utility. During this process, - additional firmware volumes may be discovered that may contain addition DXE - drivers that can be dispatched by the DXE Core. If a boot device cannot be - fully connected, this function calls the DXE Service Dispatch() to allow the - DXE drivers from any newly discovered firmware volumes to be dispatched. - Then the boot device connection can be attempted again. If the same boot - device connection operation fails twice in a row, then that boot device has - failed, and should be skipped. This function should never return. - - @param This The EFI_BDS_ARCH_PROTOCOL instance. - - @return None. - -**/ -VOID -EFIAPI -BdsEntry ( - IN EFI_BDS_ARCH_PROTOCOL *This - ) -{ - UINTN Size; - EFI_STATUS Status; - UINT16 *BootNext; - UINTN BootNextSize; - CHAR16 BootVariableName[9]; - EFI_EVENT EndOfDxeEvent; - - // - // Signal EndOfDxe PI Event - // - Status = gBS->CreateEventEx ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - EmptyCallbackFunction, - NULL, - &gEfiEndOfDxeEventGroupGuid, - &EndOfDxeEvent - ); - if (!EFI_ERROR (Status)) { - gBS->SignalEvent (EndOfDxeEvent); - } - - PERF_END (NULL, "DXE", NULL, 0); - - // - // Declare the Firmware Vendor - // - if (FixedPcdGetPtr(PcdFirmwareVendor) != NULL) { - Size = 0x100; - gST->FirmwareVendor = AllocateRuntimePool (Size); - ASSERT (gST->FirmwareVendor != NULL); - UnicodeSPrint (gST->FirmwareVendor, Size, L"%a EFI %a %a", PcdGetPtr(PcdFirmwareVendor), __DATE__, __TIME__); - } - - // - // Fixup Table CRC after we updated Firmware Vendor - // - gST->Hdr.CRC32 = 0; - Status = gBS->CalculateCrc32 ((VOID*)gST, gST->Hdr.HeaderSize, &gST->Hdr.CRC32); - ASSERT_EFI_ERROR (Status); - - // Now we need to setup the EFI System Table with information about the console devices. - InitializeConsole (); - - // If BootNext environment variable is defined then we just load it ! - BootNextSize = sizeof(UINT16); - Status = GetGlobalEnvironmentVariable (L"BootNext", NULL, &BootNextSize, (VOID**)&BootNext); - if (!EFI_ERROR(Status)) { - ASSERT(BootNextSize == sizeof(UINT16)); - - // Generate the requested Boot Entry variable name - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", *BootNext); - - // Set BootCurrent variable - gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - BootNextSize, BootNext); - - FreePool (BootNext); - - // Start the requested Boot Entry - Status = BdsStartBootOption (BootVariableName); - if (Status != EFI_NOT_FOUND) { - // BootNext has not been succeeded launched - if (EFI_ERROR(Status)) { - Print(L"Fail to start BootNext.\n"); - } - - // Delete the BootNext environment variable - gRT->SetVariable (L"BootNext", &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - 0, NULL); - } - - // Clear BootCurrent variable - gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - 0, NULL); - } - - // If Boot Order does not exist then create a default entry - DefineDefaultBootEntries (); - - // - // Update the CRC32 in the EFI System Table header - // - gST->Hdr.CRC32 = 0; - Status = gBS->CalculateCrc32 ((VOID*)gST, gST->Hdr.HeaderSize, &gST->Hdr.CRC32); - ASSERT_EFI_ERROR (Status); - - // Timer before initiating the default boot selection - StartDefaultBootOnTimeout (); - - // Start the Boot Menu - Status = BootMenuMain (); - ASSERT_EFI_ERROR (Status); - -} - -EFI_BDS_ARCH_PROTOCOL gBdsProtocol = { - BdsEntry, -}; - -EFI_STATUS -EFIAPI -BdsInitialize ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - - Status = gBS->InstallMultipleProtocolInterfaces ( - &ImageHandle, - &gEfiBdsArchProtocolGuid, &gBdsProtocol, - NULL - ); - ASSERT_EFI_ERROR (Status); - - return Status; -} diff --git a/ArmPlatformPkg/Bds/Bds.inf b/ArmPlatformPkg/Bds/Bds.inf deleted file mode 100644 index 96bec16f0a2e..000000000000 --- a/ArmPlatformPkg/Bds/Bds.inf +++ /dev/null @@ -1,90 +0,0 @@ -#/** @file -# -# Component description file for Bds module -# -# Copyright (c) 2011-2015, ARM Ltd. All rights reserved.<BR> -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -#**/ - - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = ArmPlatformBds - FILE_GUID = 5a50aa81-c3ae-4608-a0e3-41a2e69baf94 - MODULE_TYPE = DXE_DRIVER - VERSION_STRING = 1.0 - - ENTRY_POINT = BdsInitialize - -[Sources] - Bds.c - BdsHelper.c - BootLinux.c - BootMenu.c - BootOption.c - BootOptionSupport.c - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - ArmPkg/ArmPkg.dec - ArmPlatformPkg/ArmPlatformPkg.dec - EmbeddedPkg/EmbeddedPkg.dec - IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec - -[Guids] - gFdtTableGuid - -[LibraryClasses] - BdsLib - UefiBootServicesTableLib - DxeServicesTableLib - UefiDriverEntryPoint - DebugLib - PerformanceLib - PrintLib - BaseLib - FdtLib - NetLib - -[Guids] - gEfiEndOfDxeEventGroupGuid - gEfiFileSystemInfoGuid - gFdtVariableGuid - -[Protocols] - gEfiBdsArchProtocolGuid - gEfiBlockIoProtocolGuid - gEfiSimpleTextInProtocolGuid - gEfiPxeBaseCodeProtocolGuid - gEfiSimpleNetworkProtocolGuid - gEfiDevicePathToTextProtocolGuid - gEfiFirmwareVolumeBlockProtocolGuid - gEfiFirmwareVolumeBlock2ProtocolGuid - gEfiDhcp4ServiceBindingProtocolGuid - gEfiMtftp4ServiceBindingProtocolGuid - -[FeaturePcd] - gArmPlatformTokenSpaceGuid.PcdBdsLinuxSupport - -[Pcd] - gArmPlatformTokenSpaceGuid.PcdFirmwareVendor - gArmPlatformTokenSpaceGuid.PcdDefaultBootDescription - gArmPlatformTokenSpaceGuid.PcdDefaultBootDevicePath - gArmPlatformTokenSpaceGuid.PcdDefaultBootArgument - gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut - gArmPlatformTokenSpaceGuid.PcdDefaultConInPaths - gArmPlatformTokenSpaceGuid.PcdDefaultConOutPaths - - gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile - -[Depex] - TRUE diff --git a/ArmPlatformPkg/Bds/BdsHelper.c b/ArmPlatformPkg/Bds/BdsHelper.c deleted file mode 100644 index 732292cdb94a..000000000000 --- a/ArmPlatformPkg/Bds/BdsHelper.c +++ /dev/null @@ -1,465 +0,0 @@ -/** @file -* -* Copyright (c) 2011 - 2014, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#include <Library/NetLib.h> -#include "BdsInternal.h" - -EFI_STATUS -EditHIInputStr ( - IN OUT CHAR16 *CmdLine, - IN UINTN MaxCmdLine - ) -{ - UINTN CmdLineIndex; - UINTN WaitIndex; - CHAR8 Char; - EFI_INPUT_KEY Key; - EFI_STATUS Status; - - // The command line must be at least one character long - ASSERT (MaxCmdLine > 0); - - // Ensure the last character of the buffer is the NULL character - CmdLine[MaxCmdLine - 1] = '\0'; - - Print (CmdLine); - - // To prevent a buffer overflow, we only allow to enter (MaxCmdLine-1) characters - for (CmdLineIndex = StrLen (CmdLine); CmdLineIndex < MaxCmdLine; ) { - Status = gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &WaitIndex); - ASSERT_EFI_ERROR (Status); - - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); - ASSERT_EFI_ERROR (Status); - - // Unicode character is valid when Scancode is NUll - if (Key.ScanCode == SCAN_NULL) { - // Scan code is NUll, hence read Unicode character - Char = (CHAR8)Key.UnicodeChar; - } else { - Char = CHAR_NULL; - } - - if ((Char == CHAR_LINEFEED) || (Char == CHAR_CARRIAGE_RETURN) || (Char == 0x7f)) { - CmdLine[CmdLineIndex] = '\0'; - Print (L"\r\n"); - - return EFI_SUCCESS; - } else if ((Key.UnicodeChar == L'\b') || (Key.ScanCode == SCAN_LEFT) || (Key.ScanCode == SCAN_DELETE)){ - if (CmdLineIndex != 0) { - CmdLineIndex--; - Print (L"\b \b"); - } - } else if ((Key.ScanCode == SCAN_ESC) || (Char == 0x1B) || (Char == 0x0)) { - return EFI_INVALID_PARAMETER; - } else if (CmdLineIndex < (MaxCmdLine-1)) { - CmdLine[CmdLineIndex++] = Key.UnicodeChar; - Print (L"%c", Key.UnicodeChar); - } - } - - return EFI_SUCCESS; -} - -EFI_STATUS -GetHIInputStr ( - IN OUT CHAR16 *CmdLine, - IN UINTN MaxCmdLine - ) -{ - EFI_STATUS Status; - - // For a new input just passed an empty string - CmdLine[0] = L'\0'; - - Status = EditHIInputStr (CmdLine, MaxCmdLine); - - return Status; -} - -EFI_STATUS -EditHIInputAscii ( - IN OUT CHAR8 *CmdLine, - IN UINTN MaxCmdLine - ) -{ - CHAR16* Str; - EFI_STATUS Status; - - Str = (CHAR16*)AllocatePool (MaxCmdLine * sizeof(CHAR16)); - AsciiStrToUnicodeStr (CmdLine, Str); - - Status = EditHIInputStr (Str, MaxCmdLine); - if (!EFI_ERROR(Status)) { - UnicodeStrToAsciiStr (Str, CmdLine); - } - FreePool (Str); - - return Status; -} - -EFI_STATUS -GetHIInputAscii ( - IN OUT CHAR8 *CmdLine, - IN UINTN MaxCmdLine - ) -{ - // For a new input just passed an empty string - CmdLine[0] = '\0'; - - return EditHIInputAscii (CmdLine,MaxCmdLine); -} - -EFI_STATUS -GetHIInputInteger ( - OUT UINTN *Integer - ) -{ - CHAR16 CmdLine[255]; - EFI_STATUS Status; - - CmdLine[0] = '\0'; - Status = EditHIInputStr (CmdLine, 255); - if (!EFI_ERROR(Status)) { - *Integer = StrDecimalToUintn (CmdLine); - } - - return Status; -} - -/** - Get an IPv4 address - - The function asks the user for an IPv4 address. If the input - string defines a valid IPv4 address, the four bytes of the - corresponding IPv4 address are extracted from the string and returned by - the function. As long as the user does not define a valid IP - address, he is asked for one. He can always escape by - pressing ESC. - - @param[out] EFI_IP_ADDRESS OutIpAddr Returned IPv4 address. Valid if - and only if the returned value - is equal to EFI_SUCCESS - - @retval EFI_SUCCESS Input completed - @retval EFI_ABORTED Editing aborted by the user - @retval EFI_OUT_OF_RESOURCES Fail to perform the operation due to - lack of resource -**/ -EFI_STATUS -GetHIInputIP ( - OUT EFI_IP_ADDRESS *OutIpAddr - ) -{ - EFI_STATUS Status; - CHAR16 CmdLine[48]; - - while (TRUE) { - CmdLine[0] = '\0'; - Status = EditHIInputStr (CmdLine, 48); - if (EFI_ERROR (Status)) { - return EFI_ABORTED; - } - - Status = NetLibStrToIp4 (CmdLine, &OutIpAddr->v4); - if (Status == EFI_INVALID_PARAMETER) { - Print (L"Invalid address\n"); - } else { - return Status; - } - } -} - -/** - Edit an IPv4 address - - The function displays as a string following the "%d.%d.%d.%d" format the - IPv4 address that is passed in and asks the user to modify it. If the - resulting string defines a valid IPv4 address, the four bytes of the - corresponding IPv4 address are extracted from the string and returned by - the function. As long as the user does not define a valid IP - address, he is asked for one. He can always escape by - pressing ESC. - - @param[in ] EFI_IP_ADDRESS InIpAddr Input IPv4 address - @param[out] EFI_IP_ADDRESS OutIpAddr Returned IPv4 address. Valid if - and only if the returned value - is equal to EFI_SUCCESS - - @retval EFI_SUCCESS Update completed - @retval EFI_ABORTED Editing aborted by the user - @retval EFI_INVALID_PARAMETER The string returned by the user is - mal-formated - @retval EFI_OUT_OF_RESOURCES Fail to perform the operation due to - lack of resource -**/ -EFI_STATUS -EditHIInputIP ( - IN EFI_IP_ADDRESS *InIpAddr, - OUT EFI_IP_ADDRESS *OutIpAddr - ) -{ - EFI_STATUS Status; - CHAR16 CmdLine[48]; - - while (TRUE) { - UnicodeSPrint ( - CmdLine, 48, L"%d.%d.%d.%d", - InIpAddr->v4.Addr[0], InIpAddr->v4.Addr[1], - InIpAddr->v4.Addr[2], InIpAddr->v4.Addr[3] - ); - - Status = EditHIInputStr (CmdLine, 48); - if (EFI_ERROR (Status)) { - return EFI_ABORTED; - } - Status = NetLibStrToIp4 (CmdLine, &OutIpAddr->v4); - if (Status == EFI_INVALID_PARAMETER) { - Print (L"Invalid address\n"); - } else { - return Status; - } - } -} - -EFI_STATUS -GetHIInputBoolean ( - OUT BOOLEAN *Value - ) -{ - CHAR16 CmdBoolean[2]; - EFI_STATUS Status; - - while(1) { - Print (L"[y/n] "); - Status = GetHIInputStr (CmdBoolean, 2); - if (EFI_ERROR(Status)) { - return Status; - } else if ((CmdBoolean[0] == L'y') || (CmdBoolean[0] == L'Y')) { - if (Value) *Value = TRUE; - return EFI_SUCCESS; - } else if ((CmdBoolean[0] == L'n') || (CmdBoolean[0] == L'N')) { - if (Value) *Value = FALSE; - return EFI_SUCCESS; - } - } -} - -// Return the last non end-type Device Path Node from a Device Path -EFI_DEVICE_PATH* -GetLastDevicePathNode ( - IN EFI_DEVICE_PATH* DevicePath - ) -{ - EFI_DEVICE_PATH* PrevDevicePathNode; - - PrevDevicePathNode = DevicePath; - while (!IsDevicePathEndType (DevicePath)) { - PrevDevicePathNode = DevicePath; - DevicePath = NextDevicePathNode (DevicePath); - } - - return PrevDevicePathNode; -} - -EFI_STATUS -GenerateDeviceDescriptionName ( - IN EFI_HANDLE Handle, - IN OUT CHAR16* Description - ) -{ - EFI_STATUS Status; - EFI_COMPONENT_NAME_PROTOCOL* ComponentName2Protocol; - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; - CHAR16* DriverName; - CHAR16* DevicePathTxt; - EFI_DEVICE_PATH* DevicePathNode; - - ComponentName2Protocol = NULL; - Status = gBS->HandleProtocol (Handle, &gEfiComponentName2ProtocolGuid, (VOID **)&ComponentName2Protocol); - if (!EFI_ERROR(Status)) { - //TODO: Fixme. we must find the best langague - Status = ComponentName2Protocol->GetDriverName (ComponentName2Protocol,"en",&DriverName); - if (!EFI_ERROR(Status)) { - StrnCpy (Description, DriverName, BOOT_DEVICE_DESCRIPTION_MAX); - } - } - - if (EFI_ERROR(Status)) { - // Use the lastest non null entry of the Device path as a description - Status = gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID **)&DevicePathProtocol); - if (EFI_ERROR(Status)) { - return Status; - } - - // Convert the last non end-type Device Path Node in text for the description - DevicePathNode = GetLastDevicePathNode (DevicePathProtocol); - Status = gBS->LocateProtocol (&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); - ASSERT_EFI_ERROR(Status); - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (DevicePathNode, TRUE, TRUE); - StrnCpy (Description, DevicePathTxt, BOOT_DEVICE_DESCRIPTION_MAX); - FreePool (DevicePathTxt); - } - - return EFI_SUCCESS; -} - -EFI_STATUS -BdsStartBootOption ( - IN CHAR16* BootOption - ) -{ - EFI_STATUS Status; - BDS_LOAD_OPTION *BdsLoadOption; - - Status = BootOptionFromLoadOptionVariable (BootOption, &BdsLoadOption); - if (!EFI_ERROR(Status)) { - Status = BootOptionStart (BdsLoadOption); - FreePool (BdsLoadOption); - - if (!EFI_ERROR(Status)) { - Status = EFI_SUCCESS; - } else { - Status = EFI_NOT_STARTED; - } - } else { - Status = EFI_NOT_FOUND; - } - return Status; -} - -UINTN -GetUnalignedDevicePathSize ( - IN EFI_DEVICE_PATH* DevicePath - ) -{ - UINTN Size; - EFI_DEVICE_PATH* AlignedDevicePath; - - if ((UINTN)DevicePath & 0x1) { - AlignedDevicePath = DuplicateDevicePath (DevicePath); - Size = GetDevicePathSize (AlignedDevicePath); - FreePool (AlignedDevicePath); - } else { - Size = GetDevicePathSize (DevicePath); - } - return Size; -} - -EFI_DEVICE_PATH* -GetAlignedDevicePath ( - IN EFI_DEVICE_PATH* DevicePath - ) -{ - if ((UINTN)DevicePath & 0x1) { - return DuplicateDevicePath (DevicePath); - } else { - return DevicePath; - } -} - -BOOLEAN -IsUnicodeString ( - IN VOID* String - ) -{ - // We do not support NULL pointer - ASSERT (String != NULL); - - if (*(CHAR16*)String < 0x100) { - //Note: We could get issue if the string is an empty Ascii string... - return TRUE; - } else { - return FALSE; - } -} - -/* - * Try to detect if the given string is an ASCII or Unicode string - * - * There are actually few limitation to this function but it is mainly to give - * a user friendly output. - * - * Some limitations: - * - it only supports unicode string that use ASCII character (< 0x100) - * - single character ASCII strings are interpreted as Unicode string - * - string cannot be longer than BOOT_DEVICE_OPTION_MAX characters and - * thus (BOOT_DEVICE_OPTION_MAX*2) bytes for an Unicode string and - * BOOT_DEVICE_OPTION_MAX bytes for an ASCII string. - * - * @param String Buffer that might contain a Unicode or Ascii string - * @param IsUnicode If not NULL this boolean value returns if the string is an - * ASCII or Unicode string. - */ -BOOLEAN -IsPrintableString ( - IN VOID* String, - OUT BOOLEAN *IsUnicode - ) -{ - BOOLEAN UnicodeDetected; - BOOLEAN IsPrintable; - UINTN Index; - CHAR16 Character; - - // We do not support NULL pointer - ASSERT (String != NULL); - - // Test empty string - if (*(CHAR16*)String == L'\0') { - if (IsUnicode) { - *IsUnicode = TRUE; - } - return TRUE; - } else if (*(CHAR16*)String == '\0') { - if (IsUnicode) { - *IsUnicode = FALSE; - } - return TRUE; - } - - // Limitation: if the string is an ASCII single character string. This comparison - // will assume it is a Unicode string. - if (*(CHAR16*)String < 0x100) { - UnicodeDetected = TRUE; - } else { - UnicodeDetected = FALSE; - } - - IsPrintable = FALSE; - for (Index = 0; Index < BOOT_DEVICE_OPTION_MAX; Index++) { - if (UnicodeDetected) { - Character = ((CHAR16*)String)[Index]; - } else { - Character = ((CHAR8*)String)[Index]; - } - - if (Character == '\0') { - // End of the string - IsPrintable = TRUE; - break; - } else if ((Character < 0x20) || (Character > 0x7f)) { - // We only support the range of printable ASCII character - IsPrintable = FALSE; - break; - } - } - - if (IsPrintable && IsUnicode) { - *IsUnicode = UnicodeDetected; - } - - return IsPrintable; -} diff --git a/ArmPlatformPkg/Bds/BdsInternal.h b/ArmPlatformPkg/Bds/BdsInternal.h deleted file mode 100644 index ddf5308e8b23..000000000000 --- a/ArmPlatformPkg/Bds/BdsInternal.h +++ /dev/null @@ -1,277 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2015, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#ifndef _BDSINTERNAL_H_ -#define _BDSINTERNAL_H_ - -#include <PiDxe.h> -#include <Library/BaseMemoryLib.h> -#include <Library/BdsLib.h> -#include <Library/DebugLib.h> -#include <Library/DevicePathLib.h> -#include <Library/UefiLib.h> -#include <Library/PrintLib.h> -#include <Library/PcdLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiRuntimeServicesTableLib.h> - -#include <Protocol/DevicePathFromText.h> -#include <Protocol/DevicePathToText.h> - -#include <Guid/GlobalVariable.h> -#include <Guid/Fdt.h> - -#define BOOT_DEVICE_DESCRIPTION_MAX 100 -#define BOOT_DEVICE_FILEPATH_MAX 100 -#define BOOT_DEVICE_OPTION_MAX 300 -#define BOOT_DEVICE_ADDRESS_MAX (sizeof(L"0x0000000000000000")) - -#define UPDATE_BOOT_ENTRY L"Update entry: " -#define DELETE_BOOT_ENTRY L"Delete entry: " -#define MOVE_BOOT_ENTRY L"Move entry: " - -typedef struct { - LIST_ENTRY Link; - BDS_LOAD_OPTION* BdsLoadOption; -} BDS_LOAD_OPTION_ENTRY; - -typedef enum { - BDS_DEVICE_FILESYSTEM = 0, - BDS_DEVICE_MEMMAP, - BDS_DEVICE_PXE, - BDS_DEVICE_TFTP, - BDS_DEVICE_MAX -} BDS_SUPPORTED_DEVICE_TYPE; - -typedef struct { - LIST_ENTRY Link; - CHAR16 Description[BOOT_DEVICE_DESCRIPTION_MAX]; - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; - struct _BDS_LOAD_OPTION_SUPPORT* Support; -} BDS_SUPPORTED_DEVICE; - -#define SUPPORTED_BOOT_DEVICE_FROM_LINK(a) BASE_CR(a, BDS_SUPPORTED_DEVICE, Link) - -typedef struct _BDS_LOAD_OPTION_SUPPORT { - BDS_SUPPORTED_DEVICE_TYPE Type; - EFI_STATUS (*ListDevices)(IN OUT LIST_ENTRY* BdsLoadOptionList); - BOOLEAN (*IsSupported)(IN EFI_DEVICE_PATH *DevicePath); - EFI_STATUS (*CreateDevicePathNode)(IN CHAR16* FileName, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes); - EFI_STATUS (*UpdateDevicePathNode)(IN EFI_DEVICE_PATH *OldDevicePath, IN CHAR16* FileName, OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath); - - /// Define if the boot menu should request if the file is a EFI binary or a Linux kernel - /// Example: PXE boot always deliver a UEFI application. - BOOLEAN RequestBootType; -} BDS_LOAD_OPTION_SUPPORT; - -#define LOAD_OPTION_ENTRY_FROM_LINK(a) BASE_CR(a, BDS_LOAD_OPTION_ENTRY, Link) -#define LOAD_OPTION_FROM_LINK(a) ((BDS_LOAD_OPTION_ENTRY*)BASE_CR(a, BDS_LOAD_OPTION_ENTRY, Link))->BdsLoadOption - -// GUID of the EFI Linux Loader -extern CONST EFI_GUID mLinuxLoaderAppGuid; - -// Device path of the EFI Linux Loader in the Firmware Volume -extern EFI_DEVICE_PATH* mLinuxLoaderDevicePath; - -EFI_STATUS -BootDeviceListSupportedInit ( - IN OUT LIST_ENTRY *SupportedDeviceList - ); - -EFI_STATUS -BootDeviceListSupportedFree ( - IN LIST_ENTRY *SupportedDeviceList, - IN BDS_SUPPORTED_DEVICE *Except - ); - -EFI_STATUS -BootDeviceGetDeviceSupport ( - IN EFI_DEVICE_PATH *DevicePath, - OUT BDS_LOAD_OPTION_SUPPORT **DeviceSupport - ); - -EFI_STATUS -GetHIInputStr ( - IN OUT CHAR16 *CmdLine, - IN UINTN MaxCmdLine - ); - -EFI_STATUS -EditHIInputStr ( - IN OUT CHAR16 *CmdLine, - IN UINTN MaxCmdLine - ); - -EFI_STATUS -GetHIInputAscii ( - IN OUT CHAR8 *CmdLine, - IN UINTN MaxCmdLine - ); - -EFI_STATUS -EditHIInputAscii ( - IN OUT CHAR8 *CmdLine, - IN UINTN MaxCmdLine - ); - -EFI_STATUS -GetHIInputInteger ( - IN OUT UINTN *Integer - ); - -EFI_STATUS -GetHIInputIP ( - OUT EFI_IP_ADDRESS *Ip - ); - -EFI_STATUS -EditHIInputIP ( - IN EFI_IP_ADDRESS *InIpAddr, - OUT EFI_IP_ADDRESS *OutIpAddr - ); - -EFI_STATUS -GetHIInputBoolean ( - OUT BOOLEAN *Value - ); - -EFI_DEVICE_PATH* -GetLastDevicePathNode ( - IN EFI_DEVICE_PATH* DevicePath - ); - -EFI_STATUS -BdsStartBootOption ( - IN CHAR16* BootOption - ); - -UINTN -GetUnalignedDevicePathSize ( - IN EFI_DEVICE_PATH* DevicePath - ); - -EFI_DEVICE_PATH* -GetAlignedDevicePath ( - IN EFI_DEVICE_PATH* DevicePath - ); - -EFI_STATUS -GenerateDeviceDescriptionName ( - IN EFI_HANDLE Handle, - IN OUT CHAR16* Description - ); - -EFI_STATUS -BootOptionList ( - IN OUT LIST_ENTRY *BootOptionList - ); - -EFI_STATUS -BootOptionParseLoadOption ( - IN EFI_LOAD_OPTION EfiLoadOption, - IN UINTN EfiLoadOptionSize, - OUT BDS_LOAD_OPTION **BdsLoadOption - ); - -EFI_STATUS -BootOptionStart ( - IN BDS_LOAD_OPTION *BootOption - ); - -EFI_STATUS -BootOptionCreate ( - IN UINT32 Attributes, - IN CHAR16* BootDescription, - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, - IN UINT8* OptionalData, - IN UINTN OptionalDataSize, - OUT BDS_LOAD_OPTION** BdsLoadOption - ); - -EFI_STATUS -BootOptionUpdate ( - IN BDS_LOAD_OPTION* BdsLoadOption, - IN UINT32 Attributes, - IN CHAR16* BootDescription, - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, - IN UINT8* OptionalData, - IN UINTN OptionalDataSize - ); - -EFI_STATUS -BootOptionDelete ( - IN BDS_LOAD_OPTION *BootOption - ); - -EFI_STATUS -BootMenuMain ( - VOID - ); - -BOOLEAN -IsUnicodeString ( - IN VOID* String - ); - -/* - * Try to detect if the given string is an ASCII or Unicode string - * - * There are actually few limitation to this function but it is mainly to give - * a user friendly output. - * - * Some limitations: - * - it only supports unicode string that use ASCII character (< 0x100) - * - single character ASCII strings are interpreted as Unicode string - * - string cannot be longer than 2 x BOOT_DEVICE_OPTION_MAX (600 bytes) - * - * @param String Buffer that might contain a Unicode or Ascii string - * @param IsUnicode If not NULL this boolean value returns if the string is an - * ASCII or Unicode string. - */ -BOOLEAN -IsPrintableString ( - IN VOID* String, - OUT BOOLEAN *IsUnicode - ); - -/** - An empty function to pass error checking of CreateEventEx (). - - @param Event Event whose notification function is being invoked. - @param Context Pointer to the notification function's context, - which is implementation-dependent. - -**/ -VOID -EFIAPI -EmptyCallbackFunction ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -/** - * This function check if the DevicePath defines an EFI binary - * - * This function is used when the BDS support Linux loader to - * detect if the binary is an EFI application or potentially a - * Linux kernel. - */ -EFI_STATUS -IsEfiBinary ( - IN EFI_DEVICE_PATH* DevicePath, - OUT BOOLEAN *EfiBinary - ); - -#endif /* _BDSINTERNAL_H_ */ diff --git a/ArmPlatformPkg/Bds/BootLinux.c b/ArmPlatformPkg/Bds/BootLinux.c deleted file mode 100644 index 0445e894e153..000000000000 --- a/ArmPlatformPkg/Bds/BootLinux.c +++ /dev/null @@ -1,124 +0,0 @@ -/** @file -* -* Copyright (c) 2011 - 2015, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#include "BdsInternal.h" - -// 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 of the EFI Linux Loader in the Firmware Volume -EFI_DEVICE_PATH* mLinuxLoaderDevicePath = NULL; - -STATIC -BOOLEAN -HasFilePathEfiExtension ( - IN CHAR16* FilePath - ) -{ - return (StrCmp (FilePath + (StrSize (FilePath) / sizeof (CHAR16)) - 5, L".EFI") == 0) || - (StrCmp (FilePath + (StrSize (FilePath) / sizeof (CHAR16)) - 5, L".efi") == 0); -} - -/** - * This function check if the DevicePath defines an EFI binary - * - * This function is used when the BDS support Linux loader to - * detect if the binary is an EFI application or potentially a - * Linux kernel. - */ -EFI_STATUS -IsEfiBinary ( - IN EFI_DEVICE_PATH* DevicePath, - OUT BOOLEAN *EfiBinary - ) -{ - EFI_STATUS Status; - CHAR16* FileName; - EFI_DEVICE_PATH* PrevDevicePathNode; - EFI_DEVICE_PATH* DevicePathNode; - EFI_PHYSICAL_ADDRESS Image; - UINTN FileSize; - EFI_IMAGE_DOS_HEADER* DosHeader; - UINTN PeCoffHeaderOffset; - EFI_IMAGE_NT_HEADERS32* NtHeader; - - ASSERT (EfiBinary != NULL); - - // - // Check if the last node of the device path is a FilePath node - // - PrevDevicePathNode = NULL; - DevicePathNode = DevicePath; - while ((DevicePathNode != NULL) && !IsDevicePathEnd (DevicePathNode)) { - PrevDevicePathNode = DevicePathNode; - DevicePathNode = NextDevicePathNode (DevicePathNode); - } - - if ((PrevDevicePathNode != NULL) && - (PrevDevicePathNode->Type == MEDIA_DEVICE_PATH) && - (PrevDevicePathNode->SubType == MEDIA_FILEPATH_DP)) - { - FileName = ((FILEPATH_DEVICE_PATH*)PrevDevicePathNode)->PathName; - } else { - FileName = NULL; - } - - if (FileName == NULL) { - Print (L"Is an EFI Application? "); - Status = GetHIInputBoolean (EfiBinary); - if (EFI_ERROR (Status)) { - return EFI_ABORTED; - } - } else if (HasFilePathEfiExtension (FileName)) { - *EfiBinary = TRUE; - } else { - // Check if the file exist - Status = BdsLoadImage (DevicePath, AllocateAnyPages, &Image, &FileSize); - if (!EFI_ERROR (Status)) { - - DosHeader = (EFI_IMAGE_DOS_HEADER *)(UINTN) Image; - if (DosHeader->e_magic == EFI_IMAGE_DOS_SIGNATURE) { - // - // DOS image header is present, - // so read the PE header after the DOS image header. - // - PeCoffHeaderOffset = DosHeader->e_lfanew; - } else { - PeCoffHeaderOffset = 0; - } - - // - // Check PE/COFF image. - // - NtHeader = (EFI_IMAGE_NT_HEADERS32 *)(UINTN) (Image + PeCoffHeaderOffset); - if (NtHeader->Signature != EFI_IMAGE_NT_SIGNATURE) { - *EfiBinary = FALSE; - } else { - *EfiBinary = TRUE; - } - - // Free memory - gBS->FreePages (Image, EFI_SIZE_TO_PAGES (FileSize)); - } else { - // If we did not manage to open it then ask for the type - Print (L"Is an EFI Application? "); - Status = GetHIInputBoolean (EfiBinary); - if (EFI_ERROR (Status)) { - return EFI_ABORTED; - } - } - } - - return EFI_SUCCESS; -} diff --git a/ArmPlatformPkg/Bds/BootMenu.c b/ArmPlatformPkg/Bds/BootMenu.c deleted file mode 100644 index 5cbac1d2dc1a..000000000000 --- a/ArmPlatformPkg/Bds/BootMenu.c +++ /dev/null @@ -1,1101 +0,0 @@ -/** @file -* -* Copyright (c) 2011 - 2015, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#include "BdsInternal.h" - -#include <libfdt.h> - -/** - Worker function that displays the list of boot options that is passed in. - - The function loops over the entries of the list of boot options that is passed - in. For each entry, the boot option description is displayed on a single line - along with the position of the option in the list. In debug mode, the UEFI - device path and the arguments of the boot option are displayed as well in - subsequent lines. - - @param[in] BootOptionsList List of the boot options - -**/ -STATIC -VOID -DisplayBootOptions ( - IN LIST_ENTRY* BootOptionsList - ) -{ - EFI_STATUS Status; - UINTN BootOptionCount; - LIST_ENTRY *Entry; - BDS_LOAD_OPTION *BdsLoadOption; - BOOLEAN IsUnicode; - - BootOptionCount = 0 ; - for (Entry = GetFirstNode (BootOptionsList); - !IsNull (BootOptionsList, Entry); - Entry = GetNextNode (BootOptionsList, Entry) - ) { - - BdsLoadOption = LOAD_OPTION_FROM_LINK (Entry); - Print (L"[%d] %s\n", ++BootOptionCount, BdsLoadOption->Description); - - DEBUG_CODE_BEGIN (); - CHAR16* DevicePathTxt; - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; - - Status = gBS->LocateProtocol ( - &gEfiDevicePathToTextProtocolGuid, - NULL, - (VOID **)&DevicePathToTextProtocol - ); - ASSERT_EFI_ERROR (Status); - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText ( - BdsLoadOption->FilePathList, - TRUE, - TRUE - ); - Print (L"\t- %s\n", DevicePathTxt); - - if (IsPrintableString (BdsLoadOption->OptionalData, &IsUnicode)) { - if (IsUnicode) { - Print (L"\t- Arguments: %s\n", BdsLoadOption->OptionalData); - } else { - AsciiPrint ("\t- Arguments: %a\n", BdsLoadOption->OptionalData); - } - } - - FreePool (DevicePathTxt); - DEBUG_CODE_END (); - } -} - -/** - Worker function that asks for a boot option to be selected and returns a - pointer to the structure describing the selected boot option. - - @param[in] BootOptionsList List of the boot options - - @retval EFI_SUCCESS Selection succeeded - @retval !EFI_SUCCESS Input error or input cancelled - -**/ -STATIC -EFI_STATUS -SelectBootOption ( - IN LIST_ENTRY* BootOptionsList, - IN CONST CHAR16* InputStatement, - OUT BDS_LOAD_OPTION_ENTRY** BdsLoadOptionEntry - ) -{ - EFI_STATUS Status; - UINTN BootOptionCount; - UINT16 *BootOrder; - LIST_ENTRY* Entry; - UINTN BootOptionSelected; - UINTN Index; - - // Get the number of boot options - Status = GetGlobalEnvironmentVariable ( - L"BootOrder", NULL, &BootOptionCount, (VOID**)&BootOrder - ); - if (EFI_ERROR (Status)) { - goto ErrorExit; - } - FreePool (BootOrder); - BootOptionCount /= sizeof (UINT16); - - // Check if a valid boot option(s) is found - if (BootOptionCount == 0) { - if (StrCmp (InputStatement, DELETE_BOOT_ENTRY) == 0) { - Print (L"Nothing to remove!\n"); - } else if (StrCmp (InputStatement, UPDATE_BOOT_ENTRY) == 0) { - Print (L"Nothing to update!\n"); - } else if (StrCmp (InputStatement, MOVE_BOOT_ENTRY) == 0) { - Print (L"Nothing to move!\n"); - } else { - Print (L"No supported Boot Entry.\n"); - } - return EFI_NOT_FOUND; - } - - // Get the index of the boot device to delete - BootOptionSelected = 0; - while (BootOptionSelected == 0) { - Print (InputStatement); - Status = GetHIInputInteger (&BootOptionSelected); - if (EFI_ERROR (Status)) { - Print (L"\n"); - goto ErrorExit; - } else if ((BootOptionSelected == 0) || (BootOptionSelected > BootOptionCount)) { - Print (L"Invalid input (max %d)\n", BootOptionCount); - BootOptionSelected = 0; - } - } - - // Get the structure of the Boot device to delete - Index = 1; - for (Entry = GetFirstNode (BootOptionsList); - !IsNull (BootOptionsList, Entry); - Entry = GetNextNode (BootOptionsList,Entry) - ) - { - if (Index == BootOptionSelected) { - *BdsLoadOptionEntry = LOAD_OPTION_ENTRY_FROM_LINK (Entry); - break; - } - Index++; - } - -ErrorExit: - return Status; -} - -STATIC -EFI_STATUS -SelectBootDevice ( - OUT BDS_SUPPORTED_DEVICE** SupportedBootDevice - ) -{ - EFI_STATUS Status; - LIST_ENTRY SupportedDeviceList; - UINTN SupportedDeviceCount; - LIST_ENTRY* Entry; - UINTN SupportedDeviceSelected; - UINTN Index; - - // - // List the Boot Devices supported - // - - // Start all the drivers first - BdsConnectAllDrivers (); - - // List the supported devices - Status = BootDeviceListSupportedInit (&SupportedDeviceList); - ASSERT_EFI_ERROR(Status); - - SupportedDeviceCount = 0; - for (Entry = GetFirstNode (&SupportedDeviceList); - !IsNull (&SupportedDeviceList,Entry); - Entry = GetNextNode (&SupportedDeviceList,Entry) - ) - { - *SupportedBootDevice = SUPPORTED_BOOT_DEVICE_FROM_LINK(Entry); - Print(L"[%d] %s\n",SupportedDeviceCount+1,(*SupportedBootDevice)->Description); - - DEBUG_CODE_BEGIN(); - CHAR16* DevicePathTxt; - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; - - Status = gBS->LocateProtocol (&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); - ASSERT_EFI_ERROR(Status); - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText ((*SupportedBootDevice)->DevicePathProtocol,TRUE,TRUE); - - Print(L"\t- %s\n",DevicePathTxt); - - FreePool(DevicePathTxt); - DEBUG_CODE_END(); - - SupportedDeviceCount++; - } - - if (SupportedDeviceCount == 0) { - Print(L"There is no supported device.\n"); - Status = EFI_ABORTED; - goto EXIT; - } - - // - // Select the Boot Device - // - SupportedDeviceSelected = 0; - while (SupportedDeviceSelected == 0) { - Print(L"Select the Boot Device: "); - Status = GetHIInputInteger (&SupportedDeviceSelected); - if (EFI_ERROR(Status)) { - Status = EFI_ABORTED; - goto EXIT; - } else if ((SupportedDeviceSelected == 0) || (SupportedDeviceSelected > SupportedDeviceCount)) { - Print(L"Invalid input (max %d)\n",SupportedDeviceCount); - SupportedDeviceSelected = 0; - } - } - - // - // Get the Device Path for the selected boot device - // - Index = 1; - for (Entry = GetFirstNode (&SupportedDeviceList); - !IsNull (&SupportedDeviceList,Entry); - Entry = GetNextNode (&SupportedDeviceList,Entry) - ) - { - if (Index == SupportedDeviceSelected) { - *SupportedBootDevice = SUPPORTED_BOOT_DEVICE_FROM_LINK(Entry); - break; - } - Index++; - } - -EXIT: - BootDeviceListSupportedFree (&SupportedDeviceList, *SupportedBootDevice); - return Status; -} - -EFI_STATUS -BootMenuAddBootOption ( - IN LIST_ENTRY *BootOptionsList - ) -{ - EFI_STATUS Status; - BDS_SUPPORTED_DEVICE* SupportedBootDevice; - CHAR16 BootDescription[BOOT_DEVICE_DESCRIPTION_MAX]; - CHAR16 CmdLine[BOOT_DEVICE_OPTION_MAX]; - UINT32 Attributes; - BDS_LOAD_OPTION_ENTRY *BdsLoadOptionEntry; - EFI_DEVICE_PATH *DevicePath; - EFI_DEVICE_PATH_PROTOCOL *DevicePathNodes; - UINT8* OptionalData; - UINTN OptionalDataSize; - BOOLEAN EfiBinary; - CHAR16 *LinuxDevicePath; - - Attributes = 0; - SupportedBootDevice = NULL; - - // List the Boot Devices supported - Status = SelectBootDevice (&SupportedBootDevice); - if (EFI_ERROR(Status)) { - Status = EFI_ABORTED; - goto EXIT; - } - - // Create the specific device path node - if (FeaturePcdGet (PcdBdsLinuxSupport) && mLinuxLoaderDevicePath) { - Status = SupportedBootDevice->Support->CreateDevicePathNode (L"EFI Application or the kernel", &DevicePathNodes); - } else { - Status = SupportedBootDevice->Support->CreateDevicePathNode (L"EFI Application", &DevicePathNodes); - } - if (EFI_ERROR (Status)) { - Status = EFI_ABORTED; - goto EXIT; - } - // Append the Device Path to the selected device path - DevicePath = AppendDevicePath (SupportedBootDevice->DevicePathProtocol, (CONST EFI_DEVICE_PATH_PROTOCOL *)DevicePathNodes); - if (DevicePath == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto EXIT; - } - - // Is it an EFI application? - if (FeaturePcdGet (PcdBdsLinuxSupport) && mLinuxLoaderDevicePath) { - Status = IsEfiBinary (DevicePath, &EfiBinary); - if (EFI_ERROR (Status)) { - Status = EFI_ABORTED; - goto EXIT; - } - - if (EfiBinary == FALSE) { - Print (L"It is assumed the binary is a Linux kernel and the embedded Linux Loader is going to be used.\n"); - Print (L"Supported command line formats by the embedded Linux Loader:\n"); - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\"\n"); - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\" -f <EFI Device Path of the Linux initrd>\n"); - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\" -a <Machine Type for ATAG Linux kernel>\n"); - - // Copy the Linux path into the command line - LinuxDevicePath = ConvertDevicePathToText (DevicePath, FALSE, FALSE); - CopyMem (CmdLine, LinuxDevicePath, MAX (sizeof (CmdLine), StrSize (LinuxDevicePath))); - FreePool (LinuxDevicePath); - - // Free the generated Device Path - FreePool (DevicePath); - // and use the embedded Linux Loader as the EFI application - DevicePath = mLinuxLoaderDevicePath; - } else { - CmdLine[0] = L'\0'; - } - } else { - CmdLine[0] = L'\0'; - } - - Print (L"Arguments to pass to the EFI Application: "); - Status = EditHIInputStr (CmdLine, BOOT_DEVICE_OPTION_MAX); - if (EFI_ERROR (Status)) { - Status = EFI_ABORTED; - goto EXIT; - } - - OptionalData = (UINT8*)CmdLine; - OptionalDataSize = StrSize (CmdLine); - - Print(L"Description for this new Entry: "); - Status = GetHIInputStr (BootDescription, BOOT_DEVICE_DESCRIPTION_MAX); - if (EFI_ERROR(Status)) { - Status = EFI_ABORTED; - goto FREE_DEVICE_PATH; - } - - // Create new entry - BdsLoadOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool (sizeof(BDS_LOAD_OPTION_ENTRY)); - Status = BootOptionCreate (Attributes, BootDescription, DevicePath, OptionalData, OptionalDataSize, &BdsLoadOptionEntry->BdsLoadOption); - if (!EFI_ERROR(Status)) { - InsertTailList (BootOptionsList, &BdsLoadOptionEntry->Link); - } - -FREE_DEVICE_PATH: - FreePool (DevicePath); - -EXIT: - if (Status == EFI_ABORTED) { - Print(L"\n"); - } - FreePool(SupportedBootDevice); - return Status; -} - -EFI_STATUS -BootMenuRemoveBootOption ( - IN LIST_ENTRY *BootOptionsList - ) -{ - EFI_STATUS Status; - BDS_LOAD_OPTION_ENTRY* BootOptionEntry; - - DisplayBootOptions (BootOptionsList); - Status = SelectBootOption (BootOptionsList, DELETE_BOOT_ENTRY, &BootOptionEntry); - if (EFI_ERROR (Status)) { - return Status; - } - - // If the Boot Option was attached to a list remove it - if (!IsListEmpty (&BootOptionEntry->Link)) { - // Remove the entry from the list - RemoveEntryList (&BootOptionEntry->Link); - } - - // Delete the BDS Load option structures - BootOptionDelete (BootOptionEntry->BdsLoadOption); - - return EFI_SUCCESS; -} - -EFI_STATUS -BootMenuUpdateBootOption ( - IN LIST_ENTRY *BootOptionsList - ) -{ - EFI_STATUS Status; - BDS_LOAD_OPTION_ENTRY *BootOptionEntry; - BDS_LOAD_OPTION *BootOption; - BDS_LOAD_OPTION_SUPPORT* DeviceSupport; - CHAR16 BootDescription[BOOT_DEVICE_DESCRIPTION_MAX]; - CHAR8 CmdLine[BOOT_DEVICE_OPTION_MAX]; - CHAR16 UnicodeCmdLine[BOOT_DEVICE_OPTION_MAX]; - CHAR16 *LinuxDevicePath; - EFI_DEVICE_PATH *DevicePath; - UINT8* OptionalData; - UINTN OptionalDataSize; - BOOLEAN IsPrintable; - BOOLEAN IsUnicode; - BOOLEAN EfiBinary; - - DisplayBootOptions (BootOptionsList); - Status = SelectBootOption (BootOptionsList, UPDATE_BOOT_ENTRY, &BootOptionEntry); - if (EFI_ERROR (Status)) { - return Status; - } - BootOption = BootOptionEntry->BdsLoadOption; - - // Get the device support for this Boot Option - Status = BootDeviceGetDeviceSupport (BootOption->FilePathList, &DeviceSupport); - if (EFI_ERROR(Status)) { - Print(L"Not possible to retrieve the supported device for the update\n"); - return EFI_UNSUPPORTED; - } - - EfiBinary = TRUE; - if (FeaturePcdGet (PcdBdsLinuxSupport) && mLinuxLoaderDevicePath) { - Status = DeviceSupport->UpdateDevicePathNode (BootOption->FilePathList, L"EFI Application or the kernel", &DevicePath); - if (EFI_ERROR (Status)) { - Status = EFI_ABORTED; - goto EXIT; - } - - // Is it an EFI application? - Status = IsEfiBinary (DevicePath, &EfiBinary); - if (EFI_ERROR (Status)) { - Status = EFI_ABORTED; - goto EXIT; - } - - if (EfiBinary == FALSE) { - Print (L"It is assumed the binary is a Linux kernel and the embedded Linux Loader is going to be used.\n"); - Print (L"Supported command line formats by the embedded Linux Loader:\n"); - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\"\n"); - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\" -f <EFI Device Path of the Linux initrd>\n"); - Print (L"- <EFI device path of the Linux kernel> -c \"<Linux kernel command line>\" -a <Machine Type for ATAG Linux kernel>\n"); - - // Copy the Linux path into the command line - LinuxDevicePath = ConvertDevicePathToText (DevicePath, FALSE, FALSE); - CopyMem (UnicodeCmdLine, LinuxDevicePath, MAX (sizeof (UnicodeCmdLine), StrSize (LinuxDevicePath))); - FreePool (LinuxDevicePath); - - // Free the generated Device Path - FreePool (DevicePath); - // and use the embedded Linux Loader as the EFI application - DevicePath = mLinuxLoaderDevicePath; - - // The command line is a unicode printable string - IsPrintable = TRUE; - IsUnicode = TRUE; - } - } else { - Status = DeviceSupport->UpdateDevicePathNode (BootOption->FilePathList, L"EFI Application", &DevicePath); - if (EFI_ERROR (Status)) { - Status = EFI_ABORTED; - goto EXIT; - } - } - - Print (L"Arguments to pass to the EFI Application: "); - - // When the command line has not been initialized by the embedded Linux loader earlier - if (EfiBinary) { - if (BootOption->OptionalDataSize > 0) { - IsPrintable = IsPrintableString (BootOption->OptionalData, &IsUnicode); - if (IsPrintable) { - // - // The size in bytes of the string, final zero included, should - // be equal to or at least lower than "BootOption->OptionalDataSize" - // and the "IsPrintableString()" has already tested that the length - // in number of characters is smaller than BOOT_DEVICE_OPTION_MAX, - // final '\0' included. We can thus copy the string for editing - // using "CopyMem()". Furthermore, note that in the case of an Unicode - // string "StrnCpy()" and "StrCpy()" can not be used to copy the - // string because the data pointed to by "BootOption->OptionalData" - // is not necessarily 2-byte aligned. - // - if (IsUnicode) { - CopyMem ( - UnicodeCmdLine, BootOption->OptionalData, - MIN (sizeof (UnicodeCmdLine), - BootOption->OptionalDataSize) - ); - } else { - CopyMem ( - CmdLine, BootOption->OptionalData, - MIN (sizeof (CmdLine), - BootOption->OptionalDataSize) - ); - } - } - } else { - UnicodeCmdLine[0] = L'\0'; - IsPrintable = TRUE; - IsUnicode = TRUE; - } - } - - // We do not request arguments for OptionalData that cannot be printed - if (IsPrintable) { - if (IsUnicode) { - Status = EditHIInputStr (UnicodeCmdLine, BOOT_DEVICE_OPTION_MAX); - if (EFI_ERROR (Status)) { - Status = EFI_ABORTED; - goto FREE_DEVICE_PATH; - } - - OptionalData = (UINT8*)UnicodeCmdLine; - OptionalDataSize = StrSize (UnicodeCmdLine); - } else { - Status = EditHIInputAscii (CmdLine, BOOT_DEVICE_OPTION_MAX); - if (EFI_ERROR (Status)) { - Status = EFI_ABORTED; - goto FREE_DEVICE_PATH; - } - - OptionalData = (UINT8*)CmdLine; - OptionalDataSize = AsciiStrSize (CmdLine); - } - } else { - // We keep the former OptionalData - OptionalData = BootOption->OptionalData; - OptionalDataSize = BootOption->OptionalDataSize; - } - - Print(L"Description for this new Entry: "); - StrnCpy (BootDescription, BootOption->Description, BOOT_DEVICE_DESCRIPTION_MAX); - Status = EditHIInputStr (BootDescription, BOOT_DEVICE_DESCRIPTION_MAX); - if (EFI_ERROR(Status)) { - Status = EFI_ABORTED; - goto FREE_DEVICE_PATH; - } - - // Update the entry - Status = BootOptionUpdate (BootOption, BootOption->Attributes, BootDescription, DevicePath, OptionalData, OptionalDataSize); - -FREE_DEVICE_PATH: - FreePool (DevicePath); - -EXIT: - if (Status == EFI_ABORTED) { - Print(L"\n"); - } - return Status; -} - -/** - Reorder boot options - - Ask for the boot option to move and then move it when up or down arrows - are pressed. This function is called when the user selects the "Reorder Boot - Device Entries" entry in the boot manager menu. - The order of the boot options in BootOptionList and in the UEFI BootOrder - global variable are kept coherent until the user confirm his reordering (ie: - he does not exit by pressing escape). - - @param[in] BootOptionsList List of the boot devices constructed in - BootMenuMain() - - @retval EFI_SUCCESS No error encountered. - @retval !EFI_SUCCESS An error has occured either in the selection of the - boot option to move or while interacting with the user. - -**/ -STATIC -EFI_STATUS -BootMenuReorderBootOptions ( - IN LIST_ENTRY *BootOptionsList - ) -{ - EFI_STATUS Status; - BDS_LOAD_OPTION_ENTRY *BootOptionEntry; - LIST_ENTRY *SelectedEntry; - LIST_ENTRY *PrevEntry; - BOOLEAN Move; - BOOLEAN Save; - BOOLEAN Cancel; - UINTN WaitIndex; - EFI_INPUT_KEY Key; - LIST_ENTRY *SecondEntry; - UINTN BootOrderSize; - UINT16 *BootOrder; - LIST_ENTRY *Entry; - UINTN Index; - - DisplayBootOptions (BootOptionsList); - - // Ask to select the boot option to move - while (TRUE) { - Status = SelectBootOption (BootOptionsList, MOVE_BOOT_ENTRY, &BootOptionEntry); - if (EFI_ERROR (Status)) { - goto ErrorExit; - } - - SelectedEntry = &BootOptionEntry->Link; - SecondEntry = NULL; - // Note down the previous entry in the list to be able to cancel changes - PrevEntry = GetPreviousNode (BootOptionsList, SelectedEntry); - - // Start of interaction - while (TRUE) { - Print ( - L"* Use up/down arrows to move the entry '%s'", - BootOptionEntry->BdsLoadOption->Description - ); - - // Wait for a move, save or cancel request - Move = FALSE; - Save = FALSE; - Cancel = FALSE; - do { - Status = gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &WaitIndex); - if (!EFI_ERROR (Status)) { - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); - } - if (EFI_ERROR (Status)) { - Print (L"\n"); - goto ErrorExit; - } - - switch (Key.ScanCode) { - case SCAN_NULL: - Save = (Key.UnicodeChar == CHAR_LINEFEED) || - (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) || - (Key.UnicodeChar == 0x7f); - break; - - case SCAN_UP: - SecondEntry = GetPreviousNode (BootOptionsList, SelectedEntry); - Move = SecondEntry != BootOptionsList; - break; - - case SCAN_DOWN: - SecondEntry = GetNextNode (BootOptionsList, SelectedEntry); - Move = SecondEntry != BootOptionsList; - break; - - case SCAN_ESC: - Cancel = TRUE; - break; - } - } while ((!Move) && (!Save) && (!Cancel)); - - if (Move) { - if ((SelectedEntry != NULL) && (SecondEntry != NULL)) { - SwapListEntries (SelectedEntry, SecondEntry); - } - } else { - if (Save) { - Status = GetGlobalEnvironmentVariable ( - L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder - ); - BootOrderSize /= sizeof (UINT16); - - if (!EFI_ERROR (Status)) { - // The order of the boot options in the 'BootOptionsList' is the - // new order that has been just defined by the user. Save this new - // order in "BootOrder" UEFI global variable. - Entry = GetFirstNode (BootOptionsList); - for (Index = 0; Index < BootOrderSize; Index++) { - BootOrder[Index] = (LOAD_OPTION_FROM_LINK (Entry))->LoadOptionIndex; - Entry = GetNextNode (BootOptionsList, Entry); - } - Status = gRT->SetVariable ( - (CHAR16*)L"BootOrder", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, - BootOrderSize * sizeof (UINT16), - BootOrder - ); - FreePool (BootOrder); - } - - if (EFI_ERROR (Status)) { - Print (L"\nAn error occurred, move not completed!\n"); - Cancel = TRUE; - } - } - - if (Cancel) { - // - // Restore initial position of the selected boot option - // - RemoveEntryList (SelectedEntry); - InsertHeadList (PrevEntry, SelectedEntry); - } - } - - Print (L"\n"); - DisplayBootOptions (BootOptionsList); - // Saved or cancelled, back to the choice of boot option to move - if (!Move) { - break; - } - } - } - -ErrorExit: - return Status ; -} - -EFI_STATUS -UpdateFdtPath ( - IN LIST_ENTRY *BootOptionsList - ) -{ - EFI_STATUS Status; - BDS_SUPPORTED_DEVICE *SupportedBootDevice; - EFI_DEVICE_PATH_PROTOCOL *FdtDevicePathNodes; - EFI_DEVICE_PATH_PROTOCOL *FdtDevicePath; - CHAR16 *FdtTextDevicePath; - EFI_PHYSICAL_ADDRESS FdtBlobBase; - UINTN FdtBlobSize; - UINTN NumPages; - EFI_PHYSICAL_ADDRESS FdtConfigurationTableBase; - - SupportedBootDevice = NULL; - - Status = SelectBootDevice (&SupportedBootDevice); - if (EFI_ERROR (Status)) { - Status = EFI_ABORTED; - goto EXIT; - } - - // Create the specific device path node - Status = SupportedBootDevice->Support->CreateDevicePathNode (L"FDT blob", &FdtDevicePathNodes); - if (EFI_ERROR (Status)) { - Status = EFI_ABORTED; - goto EXIT; - } - - if (FdtDevicePathNodes != NULL) { - Status = EFI_OUT_OF_RESOURCES; - - FdtDevicePath = AppendDevicePath (SupportedBootDevice->DevicePathProtocol, FdtDevicePathNodes); - FreePool (FdtDevicePathNodes); - if (FdtDevicePath == NULL) { - goto EXIT; - } - - FdtTextDevicePath = ConvertDevicePathToText (FdtDevicePath, TRUE, TRUE); - if (FdtTextDevicePath == NULL) { - goto EXIT; - } - - Status = gRT->SetVariable ( - (CHAR16*)L"Fdt", - &gFdtVariableGuid, - EFI_VARIABLE_RUNTIME_ACCESS | - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS, - StrSize (FdtTextDevicePath), - FdtTextDevicePath - ); - ASSERT_EFI_ERROR (Status); - FreePool (FdtTextDevicePath); - } else { - Status = gRT->SetVariable ( - (CHAR16*)L"Fdt", - &gFdtVariableGuid, - EFI_VARIABLE_RUNTIME_ACCESS | - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS, - 0, - NULL - ); - ASSERT_EFI_ERROR (Status); - return Status; - } - - // - // Try to load FDT from the new EFI Device Path - // - - // - // Load the FDT given its device path. - // This operation may fail if the device path is not supported. - // - FdtBlobBase = 0; - NumPages = 0; - Status = BdsLoadImage (FdtDevicePath, AllocateAnyPages, &FdtBlobBase, &FdtBlobSize); - FreePool (FdtDevicePath); - - if (EFI_ERROR (Status)) { - goto EXIT_LOAD_FDT; - } - - // Check the FDT header is valid. We only make this check in DEBUG mode in - // case the FDT header change on production device and this ASSERT() becomes - // not valid. - ASSERT (fdt_check_header ((VOID*)(UINTN)FdtBlobBase) == 0); - - // - // Ensure the Size of the Device Tree is smaller than the size of the read file - // - ASSERT ((UINTN)fdt_totalsize ((VOID*)(UINTN)FdtBlobBase) <= FdtBlobSize); - - // - // Store the FDT as Runtime Service Data to prevent the Kernel from - // overwritting its data. - // - NumPages = EFI_SIZE_TO_PAGES (FdtBlobSize); - Status = gBS->AllocatePages ( - AllocateAnyPages, EfiRuntimeServicesData, - NumPages, &FdtConfigurationTableBase - ); - if (EFI_ERROR (Status)) { - goto EXIT_LOAD_FDT; - } - gBS->CopyMem ( - (VOID*)(UINTN)FdtConfigurationTableBase, - (VOID*)(UINTN)FdtBlobBase, - FdtBlobSize - ); - - // - // Install the FDT into the Configuration Table - // - Status = gBS->InstallConfigurationTable ( - &gFdtTableGuid, - (VOID*)(UINTN)FdtConfigurationTableBase - ); - if (EFI_ERROR (Status)) { - gBS->FreePages (FdtConfigurationTableBase, NumPages); - } - -EXIT_LOAD_FDT: - if (EFI_ERROR (Status)) { - Print (L"\nWarning: Did not manage to install the new device tree. Try to restart the platform.\n"); - } - - if (FdtBlobBase != 0) { - gBS->FreePages (FdtBlobBase, NumPages); - } - -EXIT: - if (Status == EFI_ABORTED) { - Print (L"\n"); - } - - if (SupportedBootDevice != NULL) { - FreePool (SupportedBootDevice); - } - - return Status; -} - -/** - Set boot timeout - - Ask for the boot timeout in seconds and if the input succeeds assign the - input value to the UEFI global variable "Timeout". This function is called - when the user selects the "Set Boot Timeout" of the boot manager menu. - - @param[in] BootOptionsList List of the boot devices, not used here - - @retval EFI_SUCCESS Boot timeout in second retrieved from the standard - input and assigned to the UEFI "Timeout" global - variable - @retval !EFI_SUCCESS Either the input or the setting of the UEFI global - variable "Timeout" has failed. -**/ -EFI_STATUS -STATIC -BootMenuSetBootTimeout ( - IN LIST_ENTRY *BootOptionsList - ) -{ - EFI_STATUS Status; - UINTN Input; - UINT16 Timeout; - - Print (L"Timeout duration (in seconds): "); - Status = GetHIInputInteger (&Input); - if (EFI_ERROR (Status)) { - Print (L"\n"); - goto ErrorExit; - } - - Timeout = Input; - Status = gRT->SetVariable ( - (CHAR16*)L"Timeout", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, - sizeof (UINT16), - &Timeout - ); - ASSERT_EFI_ERROR (Status); - -ErrorExit: - return Status; -} - -struct BOOT_MANAGER_ENTRY { - CONST CHAR16* Description; - EFI_STATUS (*Callback) (IN LIST_ENTRY *BootOptionsList); -} BootManagerEntries[] = { - { L"Add Boot Device Entry", BootMenuAddBootOption }, - { L"Update Boot Device Entry", BootMenuUpdateBootOption }, - { L"Remove Boot Device Entry", BootMenuRemoveBootOption }, - { L"Reorder Boot Device Entries", BootMenuReorderBootOptions }, - { L"Update FDT path", UpdateFdtPath }, - { L"Set Boot Timeout", BootMenuSetBootTimeout }, -}; - -EFI_STATUS -BootMenuManager ( - IN LIST_ENTRY *BootOptionsList - ) -{ - UINTN Index; - UINTN OptionSelected; - UINTN BootManagerEntryCount; - EFI_STATUS Status; - - BootManagerEntryCount = sizeof(BootManagerEntries) / sizeof(struct BOOT_MANAGER_ENTRY); - - while (TRUE) { - // Display Boot Manager menu - for (Index = 0; Index < BootManagerEntryCount; Index++) { - Print(L"[%d] %s\n",Index+1,BootManagerEntries[Index]); - } - Print(L"[%d] Return to main menu\n",Index+1); - - // Select which entry to call - Print(L"Choice: "); - Status = GetHIInputInteger (&OptionSelected); - if (EFI_ERROR(Status) || (OptionSelected == (BootManagerEntryCount+1))) { - if (EFI_ERROR(Status)) { - Print(L"\n"); - } - return EFI_SUCCESS; - } else if ((OptionSelected > 0) && (OptionSelected <= BootManagerEntryCount)) { - BootManagerEntries[OptionSelected-1].Callback (BootOptionsList); - } - } - // Should never go here -} - -EFI_STATUS -BootShell ( - IN LIST_ENTRY *BootOptionsList - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH* EfiShellDevicePath; - - // Find the EFI Shell - Status = LocateEfiApplicationInFvByName (L"Shell", &EfiShellDevicePath); - if (Status == EFI_NOT_FOUND) { - Print (L"Error: EFI Application not found.\n"); - return Status; - } else if (EFI_ERROR (Status)) { - Print (L"Error: Status Code: 0x%X\n", (UINT32)Status); - return Status; - } else { - // Need to connect every drivers to ensure no dependencies are missing for the application - Status = BdsConnectAllDrivers (); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "FAIL to connect all drivers\n")); - return Status; - } - - return BdsStartEfiApplication (gImageHandle, EfiShellDevicePath, 0, NULL); - } -} - -struct BOOT_MAIN_ENTRY { - CONST CHAR16* Description; - EFI_STATUS (*Callback) (IN LIST_ENTRY *BootOptionsList); -} BootMainEntries[] = { - { L"Shell", BootShell }, - { L"Boot Manager", BootMenuManager }, -}; - -EFI_STATUS -BootMenuMain ( - VOID - ) -{ - LIST_ENTRY BootOptionsList; - UINTN OptionCount; - UINTN BootOptionCount; - EFI_STATUS Status; - LIST_ENTRY* Entry; - BDS_LOAD_OPTION* BootOption; - UINTN BootOptionSelected; - UINTN Index; - UINTN BootMainEntryCount; - BOOLEAN IsUnicode; - - BootOption = NULL; - BootMainEntryCount = sizeof(BootMainEntries) / sizeof(struct BOOT_MAIN_ENTRY); - - if (FeaturePcdGet (PcdBdsLinuxSupport)) { - // Check Linux Loader is present - Status = LocateEfiApplicationInFvByGuid (&mLinuxLoaderAppGuid, &mLinuxLoaderDevicePath); - ASSERT_EFI_ERROR (Status); - } - - while (TRUE) { - // Get Boot#### list - BootOptionList (&BootOptionsList); - - OptionCount = 1; - - // Display the Boot options - for (Entry = GetFirstNode (&BootOptionsList); - !IsNull (&BootOptionsList,Entry); - Entry = GetNextNode (&BootOptionsList,Entry) - ) - { - BootOption = LOAD_OPTION_FROM_LINK(Entry); - - Print(L"[%d] %s\n", OptionCount, BootOption->Description); - - DEBUG_CODE_BEGIN(); - CHAR16* DevicePathTxt; - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol; - - Status = gBS->LocateProtocol (&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol); - if (EFI_ERROR(Status)) { - // You must provide an implementation of DevicePathToTextProtocol in your firmware (eg: DevicePathDxe) - DEBUG((EFI_D_ERROR,"Error: Bds requires DevicePathToTextProtocol\n")); - return Status; - } - DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (BootOption->FilePathList, TRUE, TRUE); - - Print(L"\t- %s\n",DevicePathTxt); - - if (BootOption->OptionalData != NULL) { - if (IsPrintableString (BootOption->OptionalData, &IsUnicode)) { - if (IsUnicode) { - Print (L"\t- Arguments: %s\n", BootOption->OptionalData); - } else { - AsciiPrint ("\t- Arguments: %a\n", BootOption->OptionalData); - } - } - } - FreePool(DevicePathTxt); - DEBUG_CODE_END(); - - OptionCount++; - } - BootOptionCount = OptionCount-1; - - // Display the hardcoded Boot entries - for (Index = 0; Index < BootMainEntryCount; Index++) { - Print(L"[%d] %s\n",OptionCount,BootMainEntries[Index]); - OptionCount++; - } - - // Request the boot entry from the user - BootOptionSelected = 0; - while (BootOptionSelected == 0) { - Print(L"Start: "); - Status = GetHIInputInteger (&BootOptionSelected); - if (EFI_ERROR(Status) || (BootOptionSelected == 0) || (BootOptionSelected > OptionCount)) { - Print(L"Invalid input (max %d)\n",(OptionCount-1)); - BootOptionSelected = 0; - } - } - - // Start the selected entry - if (BootOptionSelected > BootOptionCount) { - // Start the hardcoded entry - Status = BootMainEntries[BootOptionSelected - BootOptionCount - 1].Callback (&BootOptionsList); - } else { - // Find the selected entry from the Boot#### list - Index = 1; - for (Entry = GetFirstNode (&BootOptionsList); - !IsNull (&BootOptionsList,Entry); - Entry = GetNextNode (&BootOptionsList,Entry) - ) - { - if (Index == BootOptionSelected) { - BootOption = LOAD_OPTION_FROM_LINK(Entry); - break; - } - Index++; - } - - Status = BootOptionStart (BootOption); - } - } - // Should never go here -} diff --git a/ArmPlatformPkg/Bds/BootOption.c b/ArmPlatformPkg/Bds/BootOption.c deleted file mode 100644 index 32a5679762f9..000000000000 --- a/ArmPlatformPkg/Bds/BootOption.c +++ /dev/null @@ -1,316 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2015, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#include "BdsInternal.h" - -EFI_STATUS -BootOptionStart ( - IN BDS_LOAD_OPTION *BootOption - ) -{ - EFI_STATUS Status; - UINT16 LoadOptionIndexSize; - - // Connect all the drivers if the EFI Application is not a EFI OS Loader - if ((BootOption->Attributes & LOAD_OPTION_CATEGORY) == LOAD_OPTION_CATEGORY_APP) { - BdsConnectAllDrivers (); - } - - // Set BootCurrent variable - LoadOptionIndexSize = sizeof (UINT16); - gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - LoadOptionIndexSize, &(BootOption->LoadOptionIndex)); - - Status = BdsStartEfiApplication (gImageHandle, BootOption->FilePathList, BootOption->OptionalDataSize, BootOption->OptionalData); - - // Clear BootCurrent variable - LoadOptionIndexSize = sizeof (UINT16); - gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - 0, NULL); - - return Status; -} - -EFI_STATUS -BootOptionList ( - IN OUT LIST_ENTRY *BootOptionList - ) -{ - EFI_STATUS Status; - UINTN Index; - UINT16* BootOrder; - UINTN BootOrderSize; - BDS_LOAD_OPTION* BdsLoadOption; - BDS_LOAD_OPTION_ENTRY* BdsLoadOptionEntry; - - InitializeListHead (BootOptionList); - - // Get the Boot Option Order from the environment variable - Status = GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder); - if (EFI_ERROR(Status)) { - return Status; - } - - for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) { - Status = BootOptionFromLoadOptionIndex (BootOrder[Index], &BdsLoadOption); - if (!EFI_ERROR(Status)) { - BdsLoadOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool(sizeof(BDS_LOAD_OPTION_ENTRY)); - BdsLoadOptionEntry->BdsLoadOption = BdsLoadOption; - InsertTailList (BootOptionList,&BdsLoadOptionEntry->Link); - } - } - - FreePool (BootOrder); - - return EFI_SUCCESS; -} - -STATIC -EFI_STATUS -BootOptionSetFields ( - IN BDS_LOAD_OPTION* BootOption, - IN UINT32 Attributes, - IN CHAR16* BootDescription, - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, - IN UINT8* OptionalData, - IN UINTN OptionalDataSize - ) -{ - EFI_LOAD_OPTION *EfiLoadOption; - UINTN EfiLoadOptionSize; - UINTN BootDescriptionSize; - UINT16 FilePathListLength; - UINT8* EfiLoadOptionPtr; - - // If we are overwriting an existent Boot Option then we have to free previously allocated memory - if (BootOption->LoadOption) { - FreePool (BootOption->LoadOption); - } - - BootDescriptionSize = StrSize (BootDescription); - - // Compute the size of the FilePath list - FilePathListLength = GetUnalignedDevicePathSize (DevicePath); - - // Allocate the memory for the EFI Load Option - EfiLoadOptionSize = sizeof(UINT32) + sizeof(UINT16) + BootDescriptionSize + FilePathListLength + OptionalDataSize; - EfiLoadOption = (EFI_LOAD_OPTION *)AllocatePool(EfiLoadOptionSize); - EfiLoadOptionPtr = (UINT8 *)EfiLoadOption; - - // - // Populate the EFI Load Option and BDS Boot Option structures - // - - // Attributes fields - BootOption->Attributes = Attributes; - *(UINT32*)EfiLoadOptionPtr = Attributes; - EfiLoadOptionPtr += sizeof(UINT32); - - // FilePath List fields - BootOption->FilePathListLength = FilePathListLength; - *(UINT16*)EfiLoadOptionPtr = FilePathListLength; - EfiLoadOptionPtr += sizeof(UINT16); - - // Boot description fields - BootOption->Description = (CHAR16*)EfiLoadOptionPtr; - CopyMem (EfiLoadOptionPtr, BootDescription, BootDescriptionSize); - EfiLoadOptionPtr += BootDescriptionSize; - - // File path fields - BootOption->FilePathList = (EFI_DEVICE_PATH_PROTOCOL*)EfiLoadOptionPtr; - CopyMem (EfiLoadOptionPtr, DevicePath, FilePathListLength); - EfiLoadOptionPtr += FilePathListLength; - - // Optional Data fields, Do unaligned writes - BootOption->OptionalData = EfiLoadOptionPtr; - - if (OptionalData != NULL) { - CopyMem (BootOption->OptionalData, OptionalData, OptionalDataSize); - } - - BootOption->OptionalDataSize = OptionalDataSize; - - // If this function is called at the creation of the Boot Device entry (not at the update) the - // BootOption->LoadOptionSize must be zero then we get a new BootIndex for this entry - if (BootOption->LoadOptionSize == 0) { - BootOption->LoadOptionIndex = BootOptionAllocateBootIndex (); - } - - // Fill the EFI Load option fields - BootOption->LoadOption = EfiLoadOption; - BootOption->LoadOptionSize = EfiLoadOptionSize; - - return EFI_SUCCESS; -} - -EFI_STATUS -BootOptionCreate ( - IN UINT32 Attributes, - IN CHAR16* BootDescription, - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, - IN UINT8* OptionalData, - IN UINTN OptionalDataSize, - OUT BDS_LOAD_OPTION** BdsLoadOption - ) -{ - EFI_STATUS Status; - BDS_LOAD_OPTION_ENTRY* BootOptionEntry; - BDS_LOAD_OPTION* BootOption; - CHAR16 BootVariableName[9]; - UINT16* BootOrder; - UINTN BootOrderSize; - - // - // Allocate and fill the memory for the BDS Load Option structure - // - BootOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool (sizeof (BDS_LOAD_OPTION_ENTRY)); - InitializeListHead (&BootOptionEntry->Link); - BootOptionEntry->BdsLoadOption = (BDS_LOAD_OPTION*)AllocateZeroPool (sizeof(BDS_LOAD_OPTION)); - - BootOption = BootOptionEntry->BdsLoadOption; - BootOptionSetFields (BootOption, Attributes, BootDescription, DevicePath, OptionalData, OptionalDataSize); - - // - // Set the related environment variables - // - - // Create Boot#### environment variable - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BootOption->LoadOptionIndex); - Status = gRT->SetVariable ( - BootVariableName, - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - BootOption->LoadOptionSize, - BootOption->LoadOption - ); - - // Add the new Boot Index to the list - Status = GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder); - if (!EFI_ERROR(Status)) { - BootOrder = ReallocatePool (BootOrderSize, BootOrderSize + sizeof(UINT16), BootOrder); - // Add the new index at the end - BootOrder[BootOrderSize / sizeof(UINT16)] = BootOption->LoadOptionIndex; - BootOrderSize += sizeof(UINT16); - } else { - // BootOrder does not exist. Create it - BootOrderSize = sizeof(UINT16); - BootOrder = &(BootOption->LoadOptionIndex); - } - - // Update (or Create) the BootOrder environment variable - Status = gRT->SetVariable ( - L"BootOrder", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - BootOrderSize, - BootOrder - ); - - // We only free it if the UEFI Variable 'BootOrder' was already existing - if (BootOrderSize > sizeof(UINT16)) { - FreePool (BootOrder); - } - - *BdsLoadOption = BootOption; - return Status; -} - -EFI_STATUS -BootOptionUpdate ( - IN BDS_LOAD_OPTION* BdsLoadOption, - IN UINT32 Attributes, - IN CHAR16* BootDescription, - IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, - IN UINT8* OptionalData, - IN UINTN OptionalDataSize - ) -{ - EFI_STATUS Status; - CHAR16 BootVariableName[9]; - - // Update the BDS Load Option structure - BootOptionSetFields (BdsLoadOption, Attributes, BootDescription, DevicePath, OptionalData, OptionalDataSize); - - // Update the related environment variables - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BdsLoadOption->LoadOptionIndex); - - Status = gRT->SetVariable ( - BootVariableName, - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - BdsLoadOption->LoadOptionSize, - BdsLoadOption->LoadOption - ); - - return Status; -} - -EFI_STATUS -BootOptionDelete ( - IN BDS_LOAD_OPTION *BootOption - ) -{ - UINTN Index; - UINTN BootOrderSize; - UINT16* BootOrder; - UINTN BootOrderCount; - CHAR16 BootVariableName[9]; - EFI_STATUS Status; - - // Remove the entry from the BootOrder environment variable - Status = GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder); - if (!EFI_ERROR(Status)) { - BootOrderCount = BootOrderSize / sizeof(UINT16); - - // Find the index of the removed entry - for (Index = 0; Index < BootOrderCount; Index++) { - if (BootOrder[Index] == BootOption->LoadOptionIndex) { - // If it the last entry we do not need to rearrange the BootOrder list - if (Index + 1 != BootOrderCount) { - CopyMem ( - &BootOrder[Index], - &BootOrder[Index + 1], - (BootOrderCount - (Index + 1)) * sizeof(UINT16) - ); - } - break; - } - } - - // Update the BootOrder environment variable - Status = gRT->SetVariable ( - L"BootOrder", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - BootOrderSize - sizeof(UINT16), - BootOrder - ); - } - - // Delete Boot#### environment variable - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BootOption->LoadOptionIndex); - Status = gRT->SetVariable ( - BootVariableName, - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - 0, - NULL - ); - - FreePool (BootOrder); - - return Status; -} diff --git a/ArmPlatformPkg/Bds/BootOptionSupport.c b/ArmPlatformPkg/Bds/BootOptionSupport.c deleted file mode 100644 index 27faf003c69e..000000000000 --- a/ArmPlatformPkg/Bds/BootOptionSupport.c +++ /dev/null @@ -1,1195 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2014, ARM Limited. All rights reserved. -* -* This program and the accompanying materials -* are licensed and made available under the terms and conditions of the BSD License -* which accompanies this distribution. The full text of the license may be found at -* http://opensource.org/licenses/bsd-license.php -* -* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -* -**/ - -#include "BdsInternal.h" - -#include <Library/NetLib.h> - -#include <Protocol/BlockIo.h> -#include <Protocol/DevicePathToText.h> -#include <Protocol/FirmwareVolumeBlock.h> -#include <Protocol/PxeBaseCode.h> -#include <Protocol/SimpleFileSystem.h> -#include <Protocol/SimpleNetwork.h> -#include <Protocol/Dhcp4.h> -#include <Protocol/Mtftp4.h> - -#include <Guid/FileSystemInfo.h> - -#define IS_DEVICE_PATH_NODE(node,type,subtype) (((node)->Type == (type)) && ((node)->SubType == (subtype))) - -EFI_STATUS -BdsLoadOptionFileSystemList ( - IN OUT LIST_ENTRY* BdsLoadOptionList - ); - -EFI_STATUS -BdsLoadOptionFileSystemCreateDevicePath ( - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes - ); - -EFI_STATUS -BdsLoadOptionFileSystemUpdateDevicePath ( - IN EFI_DEVICE_PATH *OldDevicePath, - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath - ); - -BOOLEAN -BdsLoadOptionFileSystemIsSupported ( - IN EFI_DEVICE_PATH *DevicePath - ); - -EFI_STATUS -BdsLoadOptionMemMapList ( - IN OUT LIST_ENTRY* BdsLoadOptionList - ); - -EFI_STATUS -BdsLoadOptionMemMapCreateDevicePath ( - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes - ); - -EFI_STATUS -BdsLoadOptionMemMapUpdateDevicePath ( - IN EFI_DEVICE_PATH *OldDevicePath, - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath - ); - -BOOLEAN -BdsLoadOptionMemMapIsSupported ( - IN EFI_DEVICE_PATH *DevicePath - ); - -EFI_STATUS -BdsLoadOptionPxeList ( - IN OUT LIST_ENTRY* BdsLoadOptionList - ); - -EFI_STATUS -BdsLoadOptionPxeCreateDevicePath ( - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes - ); - -EFI_STATUS -BdsLoadOptionPxeUpdateDevicePath ( - IN EFI_DEVICE_PATH *OldDevicePath, - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath - ); - -BOOLEAN -BdsLoadOptionPxeIsSupported ( - IN EFI_DEVICE_PATH *DevicePath - ); - -EFI_STATUS -BdsLoadOptionTftpList ( - IN OUT LIST_ENTRY* BdsLoadOptionList - ); - -EFI_STATUS -BdsLoadOptionTftpCreateDevicePath ( - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes - ); - -EFI_STATUS -BdsLoadOptionTftpUpdateDevicePath ( - IN EFI_DEVICE_PATH *OldDevicePath, - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath - ); - -BOOLEAN -BdsLoadOptionTftpIsSupported ( - IN EFI_DEVICE_PATH *DevicePath - ); - -BDS_LOAD_OPTION_SUPPORT BdsLoadOptionSupportList[] = { - { - BDS_DEVICE_FILESYSTEM, - BdsLoadOptionFileSystemList, - BdsLoadOptionFileSystemIsSupported, - BdsLoadOptionFileSystemCreateDevicePath, - BdsLoadOptionFileSystemUpdateDevicePath, - TRUE - }, - { - BDS_DEVICE_MEMMAP, - BdsLoadOptionMemMapList, - BdsLoadOptionMemMapIsSupported, - BdsLoadOptionMemMapCreateDevicePath, - BdsLoadOptionMemMapUpdateDevicePath, - TRUE - }, - { - BDS_DEVICE_PXE, - BdsLoadOptionPxeList, - BdsLoadOptionPxeIsSupported, - BdsLoadOptionPxeCreateDevicePath, - BdsLoadOptionPxeUpdateDevicePath, - FALSE - }, - { - BDS_DEVICE_TFTP, - BdsLoadOptionTftpList, - BdsLoadOptionTftpIsSupported, - BdsLoadOptionTftpCreateDevicePath, - BdsLoadOptionTftpUpdateDevicePath, - TRUE - } -}; - -EFI_STATUS -BootDeviceListSupportedInit ( - IN OUT LIST_ENTRY *SupportedDeviceList - ) -{ - UINTN Index; - - // Initialize list of supported devices - InitializeListHead (SupportedDeviceList); - - for (Index = 0; Index < BDS_DEVICE_MAX; Index++) { - BdsLoadOptionSupportList[Index].ListDevices (SupportedDeviceList); - } - - return EFI_SUCCESS; -} - -EFI_STATUS -BootDeviceListSupportedFree ( - IN LIST_ENTRY *SupportedDeviceList, - IN BDS_SUPPORTED_DEVICE *Except - ) -{ - LIST_ENTRY *Entry; - BDS_SUPPORTED_DEVICE* SupportedDevice; - - Entry = GetFirstNode (SupportedDeviceList); - while (Entry != SupportedDeviceList) { - SupportedDevice = SUPPORTED_BOOT_DEVICE_FROM_LINK(Entry); - Entry = RemoveEntryList (Entry); - if (SupportedDevice != Except) { - FreePool (SupportedDevice); - } - } - - return EFI_SUCCESS; -} - -EFI_STATUS -BootDeviceGetDeviceSupport ( - IN EFI_DEVICE_PATH *DevicePath, - OUT BDS_LOAD_OPTION_SUPPORT **DeviceSupport - ) -{ - UINTN Index; - - // Find which supported device is the most appropriate - for (Index = 0; Index < BDS_DEVICE_MAX; Index++) { - if (BdsLoadOptionSupportList[Index].IsSupported (DevicePath)) { - *DeviceSupport = &BdsLoadOptionSupportList[Index]; - return EFI_SUCCESS; - } - } - - return EFI_UNSUPPORTED; -} - -EFI_STATUS -BdsLoadOptionFileSystemList ( - IN OUT LIST_ENTRY* BdsLoadOptionList - ) -{ - EFI_STATUS Status; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - UINTN Index; - BDS_SUPPORTED_DEVICE *SupportedDevice; - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* FileProtocol; - EFI_FILE_HANDLE Fs; - UINTN Size; - EFI_FILE_SYSTEM_INFO* FsInfo; - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; - - // List all the Simple File System Protocols - Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSimpleFileSystemProtocolGuid, NULL, &HandleCount, &HandleBuffer); - if (EFI_ERROR (Status)) { - return Status; - } - - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePathProtocol); - if (!EFI_ERROR(Status)) { - // Allocate BDS Supported Device structure - SupportedDevice = (BDS_SUPPORTED_DEVICE*)AllocatePool (sizeof(BDS_SUPPORTED_DEVICE)); - - FileProtocol = NULL; - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiSimpleFileSystemProtocolGuid, (VOID **)&FileProtocol); - ASSERT_EFI_ERROR(Status); - - FileProtocol->OpenVolume (FileProtocol, &Fs); - - // Generate a Description from the file system - Size = 0; - FsInfo = NULL; - Status = Fs->GetInfo (Fs, &gEfiFileSystemInfoGuid, &Size, FsInfo); - if (Status == EFI_BUFFER_TOO_SMALL) { - FsInfo = AllocatePool (Size); - Status = Fs->GetInfo (Fs, &gEfiFileSystemInfoGuid, &Size, FsInfo); - } - UnicodeSPrint (SupportedDevice->Description,BOOT_DEVICE_DESCRIPTION_MAX,L"%s (%d MB)",FsInfo->VolumeLabel,(UINT32)(FsInfo->VolumeSize / (1024 * 1024))); - FreePool(FsInfo); - Fs->Close (Fs); - - SupportedDevice->DevicePathProtocol = DevicePathProtocol; - SupportedDevice->Support = &BdsLoadOptionSupportList[BDS_DEVICE_FILESYSTEM]; - - InsertTailList (BdsLoadOptionList,&SupportedDevice->Link); - } - } - - return EFI_SUCCESS; -} - -EFI_STATUS -BdsLoadOptionFileSystemCreateDevicePath ( - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes - ) -{ - EFI_STATUS Status; - FILEPATH_DEVICE_PATH* FilePathDevicePath; - CHAR16 BootFilePath[BOOT_DEVICE_FILEPATH_MAX]; - UINTN BootFilePathSize; - - Print(L"File path of the %s: ", FileName); - Status = GetHIInputStr (BootFilePath, BOOT_DEVICE_FILEPATH_MAX); - if (EFI_ERROR(Status)) { - return EFI_ABORTED; - } - - BootFilePathSize = StrSize (BootFilePath); - if (BootFilePathSize == 2) { - *DevicePathNodes = NULL; - return EFI_NOT_FOUND; - } - - // Create the FilePath Device Path node - FilePathDevicePath = (FILEPATH_DEVICE_PATH*)AllocatePool(SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize + END_DEVICE_PATH_LENGTH); - FilePathDevicePath->Header.Type = MEDIA_DEVICE_PATH; - FilePathDevicePath->Header.SubType = MEDIA_FILEPATH_DP; - SetDevicePathNodeLength (FilePathDevicePath, SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize); - CopyMem (FilePathDevicePath->PathName, BootFilePath, BootFilePathSize); - SetDevicePathEndNode ((VOID*)((UINTN)FilePathDevicePath + SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize)); - *DevicePathNodes = (EFI_DEVICE_PATH_PROTOCOL*)FilePathDevicePath; - - return Status; -} - -EFI_STATUS -BdsLoadOptionFileSystemUpdateDevicePath ( - IN EFI_DEVICE_PATH *OldDevicePath, - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath - ) -{ - EFI_STATUS Status; - CHAR16 BootFilePath[BOOT_DEVICE_FILEPATH_MAX]; - UINTN BootFilePathSize; - FILEPATH_DEVICE_PATH* EndingDevicePath; - FILEPATH_DEVICE_PATH* FilePathDevicePath; - EFI_DEVICE_PATH* DevicePath; - - DevicePath = DuplicateDevicePath (OldDevicePath); - - EndingDevicePath = (FILEPATH_DEVICE_PATH*)GetLastDevicePathNode (DevicePath); - - Print(L"File path of the %s: ", FileName); - StrnCpy (BootFilePath, EndingDevicePath->PathName, BOOT_DEVICE_FILEPATH_MAX); - Status = EditHIInputStr (BootFilePath, BOOT_DEVICE_FILEPATH_MAX); - if (EFI_ERROR(Status)) { - return Status; - } - - BootFilePathSize = StrSize(BootFilePath); - if (BootFilePathSize == 2) { - *NewDevicePath = NULL; - return EFI_NOT_FOUND; - } - - // Create the FilePath Device Path node - FilePathDevicePath = (FILEPATH_DEVICE_PATH*)AllocatePool(SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize); - FilePathDevicePath->Header.Type = MEDIA_DEVICE_PATH; - FilePathDevicePath->Header.SubType = MEDIA_FILEPATH_DP; - SetDevicePathNodeLength (FilePathDevicePath, SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize); - CopyMem (FilePathDevicePath->PathName, BootFilePath, BootFilePathSize); - - // Generate the new Device Path by replacing the last node by the updated node - SetDevicePathEndNode (EndingDevicePath); - *NewDevicePath = AppendDevicePathNode (DevicePath, (CONST EFI_DEVICE_PATH_PROTOCOL *)FilePathDevicePath); - FreePool(DevicePath); - - return EFI_SUCCESS; -} - -/** - Check if a boot option path is a file system boot option path or not. - - The device specified by the beginning of the path has to support the Simple File - System protocol. Furthermore, the remaining part of the path has to be composed of - a single node of type MEDIA_DEVICE_PATH and sub-type MEDIA_FILEPATH_DP. - - @param[in] DevicePath Complete device path of a boot option. - - @retval FALSE The boot option path has not been identified as that of a - file system boot option. - @retval TRUE The boot option path is a file system boot option. -**/ -BOOLEAN -BdsLoadOptionFileSystemIsSupported ( - IN EFI_DEVICE_PATH *DevicePath - ) -{ - EFI_STATUS Status; - EFI_HANDLE Handle; - EFI_DEVICE_PATH *RemainingDevicePath; - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileProtocol; - - Status = BdsConnectDevicePath (DevicePath, &Handle, &RemainingDevicePath); - if (EFI_ERROR (Status)) { - return FALSE; - } - - Status = gBS->HandleProtocol ( - Handle, - &gEfiSimpleFileSystemProtocolGuid, - (VOID **)(&FileProtocol) - ); - if (EFI_ERROR (Status)) { - return FALSE; - } - - if (!IS_DEVICE_PATH_NODE (RemainingDevicePath, MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP)) - return FALSE; - - return TRUE; -} - -STATIC -BOOLEAN -IsParentDevicePath ( - IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath, - IN EFI_DEVICE_PATH_PROTOCOL *ChildDevicePath - ) -{ - UINTN ParentSize; - UINTN ChildSize; - - ParentSize = GetDevicePathSize (ParentDevicePath); - ChildSize = GetDevicePathSize (ChildDevicePath); - - if (ParentSize > ChildSize) { - return FALSE; - } - - if (CompareMem (ParentDevicePath, ChildDevicePath, ParentSize - END_DEVICE_PATH_LENGTH) != 0) { - return FALSE; - } - - return TRUE; -} - -EFI_STATUS -BdsLoadOptionMemMapList ( - IN OUT LIST_ENTRY* BdsLoadOptionList - ) -{ - EFI_STATUS Status; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - UINTN DevicePathHandleCount; - EFI_HANDLE *DevicePathHandleBuffer; - BOOLEAN IsParent; - UINTN Index; - UINTN Index2; - BDS_SUPPORTED_DEVICE *SupportedDevice; - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; - EFI_DEVICE_PATH* DevicePath; - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileProtocol; - EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol; - - // List all the BlockIo Protocols - Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &HandleCount, &HandleBuffer); - if (EFI_ERROR (Status)) { - return Status; - } - - for (Index = 0; Index < HandleCount; Index++) { - // We only select handles WITH a Device Path AND not part of Media (to - // avoid duplication with HardDisk, CDROM, etc). Skip handles used by - // Simple Filesystem or used for Variable Storage. - - - Status = gBS->HandleProtocol (HandleBuffer[Index], - &gEfiSimpleFileSystemProtocolGuid, - (VOID *)&FileProtocol); - if (!EFI_ERROR(Status)) { - // SimpleFilesystem supported on this handle, skip - continue; - } - - Status = gBS->HandleProtocol (HandleBuffer[Index], - &gEfiFirmwareVolumeBlockProtocolGuid, - (VOID *)&FvbProtocol); - if (!EFI_ERROR(Status)) { - // Firmware Volme Block / Variable storage supported on this handle, skip - continue; - } - - Status = gBS->HandleProtocol (HandleBuffer[Index], - &gEfiFirmwareVolumeBlock2ProtocolGuid, - (VOID *)&FvbProtocol); - if (!EFI_ERROR(Status)) { - // Firmware Volme Block / Variable storage supported on this handle, skip - continue; - } - - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePathProtocol); - if (!EFI_ERROR(Status)) { - // BlockIo is not part of Media Device Path - DevicePath = DevicePathProtocol; - while (!IsDevicePathEndType (DevicePath) && (DevicePathType (DevicePath) != MEDIA_DEVICE_PATH)) { - DevicePath = NextDevicePathNode (DevicePath); - } - if (DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) { - continue; - } - - // Open all the handle supporting the DevicePath protocol and verify this handle has not got any child - Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiDevicePathProtocolGuid, NULL, &DevicePathHandleCount, &DevicePathHandleBuffer); - ASSERT_EFI_ERROR (Status); - IsParent = FALSE; - for (Index2 = 0; (Index2 < DevicePathHandleCount) && !IsParent; Index2++) { - if (HandleBuffer[Index] != DevicePathHandleBuffer[Index2]) { - gBS->HandleProtocol (DevicePathHandleBuffer[Index2], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePath); - if (IsParentDevicePath (DevicePathProtocol, DevicePath)) { - IsParent = TRUE; - } - } - } - if (IsParent) { - continue; - } - - // Allocate BDS Supported Device structure - SupportedDevice = (BDS_SUPPORTED_DEVICE*)AllocatePool(sizeof(BDS_SUPPORTED_DEVICE)); - - Status = GenerateDeviceDescriptionName (HandleBuffer[Index], SupportedDevice->Description); - ASSERT_EFI_ERROR (Status); - - SupportedDevice->DevicePathProtocol = DevicePathProtocol; - SupportedDevice->Support = &BdsLoadOptionSupportList[BDS_DEVICE_MEMMAP]; - - InsertTailList (BdsLoadOptionList,&SupportedDevice->Link); - } - } - - return EFI_SUCCESS; -} - -EFI_STATUS -BdsLoadOptionMemMapCreateDevicePath ( - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes - ) -{ - EFI_STATUS Status; - MEMMAP_DEVICE_PATH *MemMapDevicePath; - CHAR16 StrStartingAddress[BOOT_DEVICE_ADDRESS_MAX]; - CHAR16 StrEndingAddress[BOOT_DEVICE_ADDRESS_MAX]; - - Print(L"Starting Address of the %s: ", FileName); - Status = GetHIInputStr (StrStartingAddress, BOOT_DEVICE_ADDRESS_MAX); - if (EFI_ERROR(Status)) { - return EFI_ABORTED; - } - - Print(L"Ending Address of the %s: ", FileName); - Status = GetHIInputStr (StrEndingAddress, BOOT_DEVICE_ADDRESS_MAX); - if (EFI_ERROR(Status)) { - return EFI_ABORTED; - } - - // Create the MemMap Device Path Node - MemMapDevicePath = (MEMMAP_DEVICE_PATH*)AllocatePool (sizeof(MEMMAP_DEVICE_PATH) + END_DEVICE_PATH_LENGTH); - MemMapDevicePath->Header.Type = HARDWARE_DEVICE_PATH; - MemMapDevicePath->Header.SubType = HW_MEMMAP_DP; - SetDevicePathNodeLength (MemMapDevicePath, sizeof(MEMMAP_DEVICE_PATH)); - MemMapDevicePath->MemoryType = EfiBootServicesData; - MemMapDevicePath->StartingAddress = StrHexToUint64 (StrStartingAddress); - MemMapDevicePath->EndingAddress = StrHexToUint64 (StrEndingAddress); - - // Set a Device Path End Node after the Memory Map Device Path Node - SetDevicePathEndNode (MemMapDevicePath + 1); - *DevicePathNodes = (EFI_DEVICE_PATH_PROTOCOL*)MemMapDevicePath; - - return Status; -} - -EFI_STATUS -BdsLoadOptionMemMapUpdateDevicePath ( - IN EFI_DEVICE_PATH *OldDevicePath, - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath - ) -{ - EFI_STATUS Status; - CHAR16 StrStartingAddress[BOOT_DEVICE_ADDRESS_MAX]; - CHAR16 StrEndingAddress[BOOT_DEVICE_ADDRESS_MAX]; - MEMMAP_DEVICE_PATH* EndingDevicePath; - EFI_DEVICE_PATH* DevicePath; - - DevicePath = DuplicateDevicePath (OldDevicePath); - EndingDevicePath = (MEMMAP_DEVICE_PATH*)GetLastDevicePathNode (DevicePath); - - Print(L"Starting Address of the %s: ", FileName); - UnicodeSPrint (StrStartingAddress, BOOT_DEVICE_ADDRESS_MAX, L"0x%X", (UINTN)EndingDevicePath->StartingAddress); - Status = EditHIInputStr (StrStartingAddress, BOOT_DEVICE_ADDRESS_MAX); - if (EFI_ERROR(Status)) { - return EFI_ABORTED; - } - - Print(L"Ending Address of the %s: ", FileName); - UnicodeSPrint (StrEndingAddress, BOOT_DEVICE_ADDRESS_MAX, L"0x%X", (UINTN)EndingDevicePath->EndingAddress); - Status = EditHIInputStr (StrEndingAddress, BOOT_DEVICE_ADDRESS_MAX); - if (EFI_ERROR(Status)) { - return EFI_ABORTED; - } - - EndingDevicePath->StartingAddress = StrHexToUint64 (StrStartingAddress); - EndingDevicePath->EndingAddress = StrHexToUint64 (StrEndingAddress); - - if (EFI_ERROR(Status)) { - FreePool(DevicePath); - } else { - *NewDevicePath = DevicePath; - } - - return Status; -} - -/** - Check if a boot option path is a memory map boot option path or not. - - The device specified by the beginning of the path has to support the BlockIo - protocol. Furthermore, the remaining part of the path has to be composed of - a single node of type HARDWARE_DEVICE_PATH and sub-type HW_MEMMAP_DP. - - @param[in] DevicePath Complete device path of a boot option. - - @retval FALSE The boot option path has not been identified as that of a - memory map boot option. - @retval TRUE The boot option path is a a memory map boot option. -**/ -BOOLEAN -BdsLoadOptionMemMapIsSupported ( - IN EFI_DEVICE_PATH *DevicePath - ) -{ - EFI_STATUS Status; - EFI_HANDLE Handle; - EFI_DEVICE_PATH *RemainingDevicePath; - EFI_BLOCK_IO_PROTOCOL *BlockIoProtocol; - - Status = BdsConnectDevicePath (DevicePath, &Handle, &RemainingDevicePath); - if (EFI_ERROR (Status)) { - return FALSE; - } - - Status = gBS->HandleProtocol ( - Handle, - &gEfiBlockIoProtocolGuid, - (VOID **)(&BlockIoProtocol) - ); - if (EFI_ERROR (Status)) { - return FALSE; - } - - if (!IS_DEVICE_PATH_NODE (RemainingDevicePath, HARDWARE_DEVICE_PATH, HW_MEMMAP_DP)) - return FALSE; - - return TRUE; -} - -EFI_STATUS -BdsLoadOptionPxeList ( - IN OUT LIST_ENTRY* BdsLoadOptionList - ) -{ - EFI_STATUS Status; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - UINTN Index; - BDS_SUPPORTED_DEVICE *SupportedDevice; - EFI_DEVICE_PATH_PROTOCOL* DevicePathProtocol; - EFI_SIMPLE_NETWORK_PROTOCOL* SimpleNet; - CHAR16 DeviceDescription[BOOT_DEVICE_DESCRIPTION_MAX]; - EFI_MAC_ADDRESS *Mac; - - // List all the PXE Protocols - Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiPxeBaseCodeProtocolGuid, NULL, &HandleCount, &HandleBuffer); - if (EFI_ERROR (Status)) { - return Status; - } - - for (Index = 0; Index < HandleCount; Index++) { - // We only select the handle WITH a Device Path AND the PXE Protocol - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePathProtocol); - if (!EFI_ERROR(Status)) { - // Allocate BDS Supported Device structure - SupportedDevice = (BDS_SUPPORTED_DEVICE*)AllocatePool(sizeof(BDS_SUPPORTED_DEVICE)); - - Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiSimpleNetworkProtocolGuid, (VOID **)&SimpleNet); - if (!EFI_ERROR(Status)) { - Mac = &SimpleNet->Mode->CurrentAddress; - UnicodeSPrint (DeviceDescription,BOOT_DEVICE_DESCRIPTION_MAX,L"MAC Address: %02x:%02x:%02x:%02x:%02x:%02x", Mac->Addr[0], Mac->Addr[1], Mac->Addr[2], Mac->Addr[3], Mac->Addr[4], Mac->Addr[5]); - } else { - Status = GenerateDeviceDescriptionName (HandleBuffer[Index], DeviceDescription); - ASSERT_EFI_ERROR (Status); - } - UnicodeSPrint (SupportedDevice->Description,BOOT_DEVICE_DESCRIPTION_MAX,L"PXE on %s",DeviceDescription); - - SupportedDevice->DevicePathProtocol = DevicePathProtocol; - SupportedDevice->Support = &BdsLoadOptionSupportList[BDS_DEVICE_PXE]; - - InsertTailList (BdsLoadOptionList,&SupportedDevice->Link); - } - } - - return EFI_SUCCESS; -} - -EFI_STATUS -BdsLoadOptionPxeCreateDevicePath ( - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes - ) -{ - *DevicePathNodes = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH); - SetDevicePathEndNode (*DevicePathNodes); - - return EFI_SUCCESS; -} - -/** - Update the parameters of a Pxe boot option - - @param[in] OldDevicePath Current complete device path of the Pxe boot option. - This has to be a valid complete Pxe boot option path. - @param[in] FileName Description of the file the path is asked for - @param[out] NewDevicePath Pointer to the new complete device path. - - @retval EFI_SUCCESS Update completed - @retval EFI_OUT_OF_RESOURCES Fail to perform the update due to lack of resource -**/ -EFI_STATUS -BdsLoadOptionPxeUpdateDevicePath ( - IN EFI_DEVICE_PATH *OldDevicePath, - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath - ) -{ - // - // Make a copy of the complete device path that is made of : - // the device path of the device supporting the Pxe base code protocol - // followed by an end node. - // - *NewDevicePath = DuplicateDevicePath (OldDevicePath); - if (*NewDevicePath == NULL) { - return EFI_OUT_OF_RESOURCES; - } else { - return EFI_SUCCESS; - } -} - -BOOLEAN -BdsLoadOptionPxeIsSupported ( - IN EFI_DEVICE_PATH *DevicePath - ) -{ - EFI_STATUS Status; - EFI_HANDLE Handle; - EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath; - EFI_PXE_BASE_CODE_PROTOCOL *PxeBcProtocol; - - Status = BdsConnectDevicePath (DevicePath, &Handle, &RemainingDevicePath); - if (EFI_ERROR(Status)) { - return FALSE; - } - - if (!IsDevicePathEnd(RemainingDevicePath)) { - return FALSE; - } - - Status = gBS->HandleProtocol (Handle, &gEfiPxeBaseCodeProtocolGuid, (VOID **)&PxeBcProtocol); - if (EFI_ERROR (Status)) { - return FALSE; - } else { - return TRUE; - } -} - -/** - Add to the list of boot devices the devices allowing a TFTP boot - - @param[in] BdsLoadOptionList List of devices to boot from - - @retval EFI_SUCCESS Update completed - @retval EFI_OUT_OF_RESOURCES Fail to perform the update due to lack of resource -**/ -EFI_STATUS -BdsLoadOptionTftpList ( - IN OUT LIST_ENTRY* BdsLoadOptionList - ) -{ - EFI_STATUS Status; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - EFI_HANDLE Handle; - UINTN Index; - EFI_DEVICE_PATH_PROTOCOL *DevicePathProtocol; - VOID *Interface; - EFI_SIMPLE_NETWORK_PROTOCOL *SimpleNetworkProtocol; - BDS_SUPPORTED_DEVICE *SupportedDevice; - EFI_MAC_ADDRESS *Mac; - - // - // List all the handles on which the Simple Network Protocol is installed. - // - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiSimpleNetworkProtocolGuid, - NULL, - &HandleCount, - &HandleBuffer - ); - if (EFI_ERROR (Status)) { - return Status; - } - - for (Index = 0; Index < HandleCount; Index++) { - Handle = HandleBuffer[Index]; - // - // We select the handles that support : - // . the Device Path Protocol - // . the MTFTP4 Protocol - // - Status = gBS->HandleProtocol ( - Handle, - &gEfiDevicePathProtocolGuid, - (VOID **)&DevicePathProtocol - ); - if (EFI_ERROR (Status)) { - continue; - } - - Status = gBS->HandleProtocol ( - Handle, - &gEfiMtftp4ServiceBindingProtocolGuid, - &Interface - ); - if (EFI_ERROR (Status)) { - continue; - } - - Status = gBS->HandleProtocol ( - Handle, - &gEfiSimpleNetworkProtocolGuid, - (VOID **)&SimpleNetworkProtocol - ); - if (EFI_ERROR (Status)) { - continue; - } - - // Allocate BDS Supported Device structure - SupportedDevice = (BDS_SUPPORTED_DEVICE*)AllocatePool (sizeof (BDS_SUPPORTED_DEVICE)); - if (SupportedDevice == NULL) { - continue; - } - - Mac = &SimpleNetworkProtocol->Mode->CurrentAddress; - UnicodeSPrint ( - SupportedDevice->Description, - BOOT_DEVICE_DESCRIPTION_MAX, - L"TFTP on MAC Address: %02x:%02x:%02x:%02x:%02x:%02x", - Mac->Addr[0], Mac->Addr[1], Mac->Addr[2], Mac->Addr[3], Mac->Addr[4], Mac->Addr[5] - ); - - SupportedDevice->DevicePathProtocol = DevicePathProtocol; - SupportedDevice->Support = &BdsLoadOptionSupportList[BDS_DEVICE_TFTP]; - - InsertTailList (BdsLoadOptionList, &SupportedDevice->Link); - } - - return EFI_SUCCESS; -} - -EFI_STATUS -BdsLoadOptionTftpCreateDevicePath ( - IN CHAR16* FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes - ) -{ - EFI_STATUS Status; - BOOLEAN IsDHCP; - EFI_IP_ADDRESS LocalIp; - EFI_IP_ADDRESS SubnetMask; - EFI_IP_ADDRESS GatewayIp; - EFI_IP_ADDRESS RemoteIp; - IPv4_DEVICE_PATH *IPv4DevicePathNode; - FILEPATH_DEVICE_PATH *FilePathDevicePath; - CHAR16 BootFilePath[BOOT_DEVICE_FILEPATH_MAX]; - UINTN BootFilePathSize; - - Print (L"Get the IP address from DHCP: "); - Status = GetHIInputBoolean (&IsDHCP); - if (EFI_ERROR (Status)) { - return EFI_ABORTED; - } - - if (!IsDHCP) { - Print (L"Local static IP address: "); - Status = GetHIInputIP (&LocalIp); - if (EFI_ERROR (Status)) { - return EFI_ABORTED; - } - Print (L"Get the network mask: "); - Status = GetHIInputIP (&SubnetMask); - if (EFI_ERROR (Status)) { - return EFI_ABORTED; - } - Print (L"Get the gateway IP address: "); - Status = GetHIInputIP (&GatewayIp); - if (EFI_ERROR (Status)) { - return EFI_ABORTED; - } - } - - Print (L"Get the TFTP server IP address: "); - Status = GetHIInputIP (&RemoteIp); - if (EFI_ERROR (Status)) { - return EFI_ABORTED; - } - - Print (L"File path of the %s : ", FileName); - Status = GetHIInputStr (BootFilePath, BOOT_DEVICE_FILEPATH_MAX); - if (EFI_ERROR (Status)) { - return EFI_ABORTED; - } - - BootFilePathSize = StrSize(BootFilePath); - if (BootFilePathSize == 2) { - return EFI_NOT_FOUND; - } - - // Allocate the memory for the IPv4 + File Path Device Path Nodes - IPv4DevicePathNode = (IPv4_DEVICE_PATH*)AllocatePool(sizeof(IPv4_DEVICE_PATH) + SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize + END_DEVICE_PATH_LENGTH); - - // Create the IPv4 Device Path - IPv4DevicePathNode->Header.Type = MESSAGING_DEVICE_PATH; - IPv4DevicePathNode->Header.SubType = MSG_IPv4_DP; - SetDevicePathNodeLength (&IPv4DevicePathNode->Header, sizeof(IPv4_DEVICE_PATH)); - - if (!IsDHCP) { - CopyMem (&IPv4DevicePathNode->LocalIpAddress, &LocalIp.v4, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&IPv4DevicePathNode->SubnetMask, &SubnetMask.v4, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&IPv4DevicePathNode->GatewayIpAddress, &GatewayIp.v4, sizeof (EFI_IPv4_ADDRESS)); - } - - CopyMem (&IPv4DevicePathNode->RemoteIpAddress, &RemoteIp.v4, sizeof (EFI_IPv4_ADDRESS)); - IPv4DevicePathNode->LocalPort = 0; - IPv4DevicePathNode->RemotePort = 0; - IPv4DevicePathNode->Protocol = EFI_IP_PROTO_TCP; - IPv4DevicePathNode->StaticIpAddress = (IsDHCP != TRUE); - - // Create the FilePath Device Path node - FilePathDevicePath = (FILEPATH_DEVICE_PATH*)(IPv4DevicePathNode + 1); - FilePathDevicePath->Header.Type = MEDIA_DEVICE_PATH; - FilePathDevicePath->Header.SubType = MEDIA_FILEPATH_DP; - SetDevicePathNodeLength (FilePathDevicePath, SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize); - CopyMem (FilePathDevicePath->PathName, BootFilePath, BootFilePathSize); - - // Set the End Device Path Node - SetDevicePathEndNode ((VOID*)((UINTN)FilePathDevicePath + SIZE_OF_FILEPATH_DEVICE_PATH + BootFilePathSize)); - *DevicePathNodes = (EFI_DEVICE_PATH_PROTOCOL*)IPv4DevicePathNode; - - return Status; -} - -/** - Update the parameters of a TFTP boot option - - The function asks sequentially to update the IPv4 parameters as well as the boot file path, - providing the previously set value if any. - - @param[in] OldDevicePath Current complete device path of the Tftp boot option. - This has to be a valid complete Tftp boot option path. - By complete, we mean that it is not only the Tftp - specific end part built by the - "BdsLoadOptionTftpCreateDevicePath()" function. - This path is handled as read only. - @param[in] FileName Description of the file the path is asked for - @param[out] NewDevicePath Pointer to the new complete device path. - - @retval EFI_SUCCESS Update completed - @retval EFI_ABORTED Update aborted by the user - @retval EFI_OUT_OF_RESOURCES Fail to perform the update due to lack of resource -**/ -EFI_STATUS -BdsLoadOptionTftpUpdateDevicePath ( - IN EFI_DEVICE_PATH *OldDevicePath, - IN CHAR16 *FileName, - OUT EFI_DEVICE_PATH_PROTOCOL **NewDevicePath - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH *DevicePath; - EFI_DEVICE_PATH *DevicePathNode; - UINT8 *Ipv4NodePtr; - IPv4_DEVICE_PATH Ipv4Node; - BOOLEAN IsDHCP; - EFI_IP_ADDRESS OldIp; - EFI_IP_ADDRESS OldSubnetMask; - EFI_IP_ADDRESS OldGatewayIp; - EFI_IP_ADDRESS LocalIp; - EFI_IP_ADDRESS SubnetMask; - EFI_IP_ADDRESS GatewayIp; - EFI_IP_ADDRESS RemoteIp; - UINT8 *FileNodePtr; - CHAR16 BootFilePath[BOOT_DEVICE_FILEPATH_MAX]; - UINTN PathSize; - UINTN BootFilePathSize; - FILEPATH_DEVICE_PATH *NewFilePathNode; - - Ipv4NodePtr = NULL; - - // - // Make a copy of the complete device path that is made of : - // the device path of the device that support the Simple Network protocol - // followed by an IPv4 node (type IPv4_DEVICE_PATH), - // followed by a file path node (type FILEPATH_DEVICE_PATH) and ended up - // by an end node. The IPv6 case is not handled yet. - // - - DevicePath = DuplicateDevicePath (OldDevicePath); - if (DevicePath == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ErrorExit; - } - - // - // Because of the check done by "BdsLoadOptionTftpIsSupported()" prior to the - // call to this function, we know that the device path ends with an IPv4 node - // followed by a file path node and finally an end node. To get the address of - // the last IPv4 node, we loop over the whole device path, noting down the - // address of each encountered IPv4 node. - // - - for (DevicePathNode = DevicePath; - !IsDevicePathEnd (DevicePathNode); - DevicePathNode = NextDevicePathNode (DevicePathNode)) - { - if (IS_DEVICE_PATH_NODE (DevicePathNode, MESSAGING_DEVICE_PATH, MSG_IPv4_DP)) { - Ipv4NodePtr = (UINT8*)DevicePathNode; - } - } - - // Copy for alignment of the IPv4 node data - CopyMem (&Ipv4Node, Ipv4NodePtr, sizeof (IPv4_DEVICE_PATH)); - - Print (L"Get the IP address from DHCP: "); - Status = GetHIInputBoolean (&IsDHCP); - if (EFI_ERROR (Status)) { - goto ErrorExit; - } - - if (!IsDHCP) { - Print (L"Local static IP address: "); - if (Ipv4Node.StaticIpAddress) { - CopyMem (&OldIp.v4, &Ipv4Node.LocalIpAddress, sizeof (EFI_IPv4_ADDRESS)); - Status = EditHIInputIP (&OldIp, &LocalIp); - } else { - Status = GetHIInputIP (&LocalIp); - } - if (EFI_ERROR (Status)) { - goto ErrorExit; - } - - Print (L"Get the network mask: "); - if (Ipv4Node.StaticIpAddress) { - CopyMem (&OldSubnetMask.v4, &Ipv4Node.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - Status = EditHIInputIP (&OldSubnetMask, &SubnetMask); - } else { - Status = GetHIInputIP (&SubnetMask); - } - if (EFI_ERROR (Status)) { - goto ErrorExit; - } - - Print (L"Get the gateway IP address: "); - if (Ipv4Node.StaticIpAddress) { - CopyMem (&OldGatewayIp.v4, &Ipv4Node.GatewayIpAddress, sizeof (EFI_IPv4_ADDRESS)); - Status = EditHIInputIP (&OldGatewayIp, &GatewayIp); - } else { - Status = GetHIInputIP (&GatewayIp); - } - if (EFI_ERROR (Status)) { - goto ErrorExit; - } - } - - Print (L"TFTP server IP address: "); - // Copy remote IPv4 address into IPv4 or IPv6 union - CopyMem (&OldIp.v4, &Ipv4Node.RemoteIpAddress, sizeof (EFI_IPv4_ADDRESS)); - - Status = EditHIInputIP (&OldIp, &RemoteIp); - if (EFI_ERROR (Status)) { - goto ErrorExit; - } - - // Get the path of the boot file and its size in number of bytes - FileNodePtr = Ipv4NodePtr + sizeof (IPv4_DEVICE_PATH); - BootFilePathSize = DevicePathNodeLength (FileNodePtr) - SIZE_OF_FILEPATH_DEVICE_PATH; - - // - // Ask for update of the boot file path - // - do { - // Copy for 2-byte alignment of the Unicode string - CopyMem ( - BootFilePath, FileNodePtr + SIZE_OF_FILEPATH_DEVICE_PATH, - MIN (BootFilePathSize, BOOT_DEVICE_FILEPATH_MAX) - ); - BootFilePath[BOOT_DEVICE_FILEPATH_MAX - 1] = L'\0'; - - Print (L"File path of the %s: ", FileName); - Status = EditHIInputStr (BootFilePath, BOOT_DEVICE_FILEPATH_MAX); - if (EFI_ERROR (Status)) { - goto ErrorExit; - } - PathSize = StrSize (BootFilePath); - if (PathSize > 2) { - break; - } - // Empty string, give the user another try - Print (L"Empty string - Invalid path\n"); - } while (PathSize <= 2) ; - - // - // Update the IPv4 node. IPv6 case not handled yet. - // - if (IsDHCP) { - Ipv4Node.StaticIpAddress = FALSE; - ZeroMem (&Ipv4Node.LocalIpAddress, sizeof (EFI_IPv4_ADDRESS)); - ZeroMem (&Ipv4Node.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - ZeroMem (&Ipv4Node.GatewayIpAddress, sizeof (EFI_IPv4_ADDRESS)); - } else { - Ipv4Node.StaticIpAddress = TRUE; - CopyMem (&Ipv4Node.LocalIpAddress, &LocalIp.v4, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Ipv4Node.SubnetMask, &SubnetMask.v4, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Ipv4Node.GatewayIpAddress, &GatewayIp.v4, sizeof (EFI_IPv4_ADDRESS)); - } - - CopyMem (&Ipv4Node.RemoteIpAddress, &RemoteIp.v4, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (Ipv4NodePtr, &Ipv4Node, sizeof (IPv4_DEVICE_PATH)); - - // - // Create the new file path node - // - NewFilePathNode = (FILEPATH_DEVICE_PATH*)AllocatePool ( - SIZE_OF_FILEPATH_DEVICE_PATH + - PathSize - ); - NewFilePathNode->Header.Type = MEDIA_DEVICE_PATH; - NewFilePathNode->Header.SubType = MEDIA_FILEPATH_DP; - SetDevicePathNodeLength ( - NewFilePathNode, - SIZE_OF_FILEPATH_DEVICE_PATH + PathSize - ); - CopyMem (NewFilePathNode->PathName, BootFilePath, PathSize); - - // - // Generate the new Device Path by replacing the file path node at address - // "FileNodePtr" by the new one "NewFilePathNode" and return its address. - // - SetDevicePathEndNode (FileNodePtr); - *NewDevicePath = AppendDevicePathNode ( - DevicePath, - (CONST EFI_DEVICE_PATH_PROTOCOL*)NewFilePathNode - ); - -ErrorExit: - if (DevicePath != NULL) { - FreePool (DevicePath) ; - } - - return Status; -} - -BOOLEAN -BdsLoadOptionTftpIsSupported ( - IN EFI_DEVICE_PATH *DevicePath - ) -{ - EFI_STATUS Status; - EFI_HANDLE Handle; - EFI_DEVICE_PATH *RemainingDevicePath; - EFI_DEVICE_PATH *NextDevicePath; - EFI_PXE_BASE_CODE_PROTOCOL *PxeBcProtocol; - - Status = BdsConnectDevicePath (DevicePath, &Handle, &RemainingDevicePath); - if (EFI_ERROR(Status)) { - return FALSE; - } - - // Validate the Remaining Device Path - if (IsDevicePathEnd(RemainingDevicePath)) { - return FALSE; - } - if (!IS_DEVICE_PATH_NODE(RemainingDevicePath,MESSAGING_DEVICE_PATH,MSG_IPv4_DP) && - !IS_DEVICE_PATH_NODE(RemainingDevicePath,MESSAGING_DEVICE_PATH,MSG_IPv6_DP)) { - return FALSE; - } - NextDevicePath = NextDevicePathNode (RemainingDevicePath); - if (IsDevicePathEnd(NextDevicePath)) { - return FALSE; - } - if (!IS_DEVICE_PATH_NODE(NextDevicePath,MEDIA_DEVICE_PATH,MEDIA_FILEPATH_DP)) { - return FALSE; - } - - Status = gBS->HandleProtocol (Handle, &gEfiPxeBaseCodeProtocolGuid, (VOID **)&PxeBcProtocol); - if (EFI_ERROR (Status)) { - return FALSE; - } else { - return TRUE; - } -}
This is no longer used, and does not belong in a reference code base, so remove it. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- Note that the OpenPlatformPkg version of Beagle will still need to be brought in line with the EDK2 version (after switching to the generic BDS) ArmPlatformPkg/Bds/Bds.c | 561 --------- ArmPlatformPkg/Bds/Bds.inf | 90 -- ArmPlatformPkg/Bds/BdsHelper.c | 465 -------- ArmPlatformPkg/Bds/BdsInternal.h | 277 ----- ArmPlatformPkg/Bds/BootLinux.c | 124 -- ArmPlatformPkg/Bds/BootMenu.c | 1101 ------------------ ArmPlatformPkg/Bds/BootOption.c | 316 ------ ArmPlatformPkg/Bds/BootOptionSupport.c | 1195 -------------------- 8 files changed, 4129 deletions(-) -- 2.7.4 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel