/** @file\r
*\r
-* Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
+* Copyright (c) 2011 - 2014, ARM Limited. All rights reserved.\r
*\r
* This program and the accompanying materials\r
* are licensed and made available under the terms and conditions of the BSD License\r
BootMenuSelectBootOption (\r
IN LIST_ENTRY* BootOptionsList,\r
IN CONST CHAR16* InputStatement,\r
- IN BOOLEAN OnlyArmBdsBootEntry,\r
OUT BDS_LOAD_OPTION_ENTRY** BdsLoadOptionEntry\r
)\r
{\r
UINTN BootOptionSelected;\r
UINTN BootOptionCount;\r
UINTN Index;\r
+ BOOLEAN IsUnicode;\r
\r
// Display the list of supported boot devices\r
BootOptionCount = 0;\r
{\r
BdsLoadOption = LOAD_OPTION_FROM_LINK(Entry);\r
\r
- if (OnlyArmBdsBootEntry && !IS_ARM_BDS_BOOTENTRY (BdsLoadOption)) {\r
- continue;\r
- }\r
-\r
Print (L"[%d] %s\n", (BootOptionCount + 1), BdsLoadOption->Description);\r
\r
DEBUG_CODE_BEGIN();\r
\r
Print(L"\t- %s\n",DevicePathTxt);\r
OptionalData = BdsLoadOption->OptionalData;\r
- LoaderType = (ARM_BDS_LOADER_TYPE)ReadUnaligned32 ((CONST UINT32*)&OptionalData->Header.LoaderType);\r
- if ((LoaderType == BDS_LOADER_KERNEL_LINUX_ATAG) || (LoaderType == BDS_LOADER_KERNEL_LINUX_FDT)) {\r
- Print (L"\t- Arguments: %a\n",&OptionalData->Arguments.LinuxArguments + 1);\r
+ if (IS_ARM_BDS_BOOTENTRY (BdsLoadOption)) {\r
+ LoaderType = (ARM_BDS_LOADER_TYPE)ReadUnaligned32 ((CONST UINT32*)&OptionalData->Header.LoaderType);\r
+ if ((LoaderType == BDS_LOADER_KERNEL_LINUX_ATAG) || (LoaderType == BDS_LOADER_KERNEL_LINUX_FDT)) {\r
+ Print (L"\t- Arguments: %a\n",&OptionalData->Arguments.LinuxArguments + 1);\r
+ }\r
+ } else if (OptionalData != NULL) {\r
+ if (IsPrintableString (OptionalData, &IsUnicode)) {\r
+ if (IsUnicode) {\r
+ Print (L"\t- Arguments: %s\n", OptionalData);\r
+ } else {\r
+ AsciiPrint ("\t- Arguments: %a\n", OptionalData);\r
+ }\r
+ }\r
}\r
\r
FreePool(DevicePathTxt);\r
EFI_STATUS Status;\r
BDS_LOAD_OPTION_ENTRY* BootOptionEntry;\r
\r
- Status = BootMenuSelectBootOption (BootOptionsList, DELETE_BOOT_ENTRY, FALSE, &BootOptionEntry);\r
+ Status = BootMenuSelectBootOption (BootOptionsList, DELETE_BOOT_ENTRY, &BootOptionEntry);\r
if (EFI_ERROR(Status)) {\r
return Status;\r
}\r
ARM_BDS_LOADER_ARGUMENTS* BootArguments;\r
CHAR16 BootDescription[BOOT_DEVICE_DESCRIPTION_MAX];\r
CHAR8 CmdLine[BOOT_DEVICE_OPTION_MAX];\r
+ CHAR16 UnicodeCmdLine[BOOT_DEVICE_OPTION_MAX];\r
EFI_DEVICE_PATH *DevicePath;\r
EFI_DEVICE_PATH *TempInitrdPath;\r
ARM_BDS_LOADER_TYPE BootType;\r
UINT8* OptionalData;\r
UINTN OptionalDataSize;\r
BOOLEAN RequestBootType;\r
+ BOOLEAN IsPrintable;\r
+ BOOLEAN IsUnicode;\r
\r
- Status = BootMenuSelectBootOption (BootOptionsList, UPDATE_BOOT_ENTRY, TRUE, &BootOptionEntry);\r
+ Status = BootMenuSelectBootOption (BootOptionsList, UPDATE_BOOT_ENTRY, &BootOptionEntry);\r
if (EFI_ERROR(Status)) {\r
return Status;\r
}\r
}\r
\r
LoaderOptionalData = BootOption->OptionalData;\r
- BootType = (ARM_BDS_LOADER_TYPE)ReadUnaligned32 ((UINT32 *)(&LoaderOptionalData->Header.LoaderType));\r
+ if (LoaderOptionalData != NULL) {\r
+ BootType = (ARM_BDS_LOADER_TYPE)ReadUnaligned32 ((UINT32 *)(&LoaderOptionalData->Header.LoaderType));\r
+ } else {\r
+ BootType = BDS_LOADER_EFI_APPLICATION;\r
+ }\r
\r
if ((BootType == BDS_LOADER_KERNEL_LINUX_ATAG) || (BootType == BDS_LOADER_KERNEL_LINUX_FDT)) {\r
LinuxArguments = &LoaderOptionalData->Arguments.LinuxArguments;\r
\r
OptionalData = (UINT8*)BootArguments;\r
} else {\r
- OptionalData = NULL;\r
- OptionalDataSize = 0;\r
+ Print (L"Arguments to pass to the EFI Application: ");\r
+\r
+ if (BootOption->OptionalDataSize > 0) {\r
+ IsPrintable = IsPrintableString (BootOption->OptionalData, &IsUnicode);\r
+ if (IsPrintable) {\r
+ if (IsUnicode) {\r
+ StrnCpy (UnicodeCmdLine, BootOption->OptionalData, BootOption->OptionalDataSize / 2);\r
+ } else {\r
+ AsciiStrnCpy (CmdLine, BootOption->OptionalData, BootOption->OptionalDataSize);\r
+ }\r
+ }\r
+ } else {\r
+ UnicodeCmdLine[0] = L'\0';\r
+ IsPrintable = TRUE;\r
+ IsUnicode = TRUE;\r
+ }\r
+\r
+ // We do not request arguments for OptionalData that cannot be printed\r
+ if (IsPrintable) {\r
+ if (IsUnicode) {\r
+ Status = EditHIInputStr (UnicodeCmdLine, BOOT_DEVICE_OPTION_MAX);\r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_ABORTED;\r
+ goto FREE_DEVICE_PATH;\r
+ }\r
+\r
+ OptionalData = (UINT8*)UnicodeCmdLine;\r
+ OptionalDataSize = StrSize (UnicodeCmdLine);\r
+ } else {\r
+ Status = EditHIInputAscii (CmdLine, BOOT_DEVICE_OPTION_MAX);\r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_ABORTED;\r
+ goto FREE_DEVICE_PATH;\r
+ }\r
+\r
+ OptionalData = (UINT8*)CmdLine;\r
+ OptionalDataSize = AsciiStrSize (CmdLine);\r
+ }\r
+ } else {\r
+ // We keep the former OptionalData\r
+ OptionalData = BootOption->OptionalData;\r
+ OptionalDataSize = BootOption->OptionalDataSize;\r
+ }\r
}\r
\r
Print(L"Description for this new Entry: ");\r