From fb334ef6c543b1babc9d8a613ad5d1ce6fe536e1 Mon Sep 17 00:00:00 2001 From: andrewfish Date: Tue, 1 Feb 2011 05:37:22 +0000 Subject: Fix EBL GetCurrentIpAddress & GetCurrentMacAddress commands. Add variable services commands. Fix arugment parsing in EBL. All fixes from ARM Ltd. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11290 6f19259b-4bc3-4df7-8a09-765794883524 --- EmbeddedPkg/Ebl/Ebl.h | 5 ++ EmbeddedPkg/Ebl/Ebl.inf | 1 + EmbeddedPkg/Ebl/Main.c | 10 ++- EmbeddedPkg/Ebl/Variable.c | 192 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 206 insertions(+), 2 deletions(-) create mode 100644 EmbeddedPkg/Ebl/Variable.c (limited to 'EmbeddedPkg/Ebl') diff --git a/EmbeddedPkg/Ebl/Ebl.h b/EmbeddedPkg/Ebl/Ebl.h index 04f75d0..5c322e5 100644 --- a/EmbeddedPkg/Ebl/Ebl.h +++ b/EmbeddedPkg/Ebl/Ebl.h @@ -165,6 +165,11 @@ EblInitializeNetworkCmd ( VOID ); +VOID +EblInitializeVariableCmds ( + VOID + ); + CHAR8 * ParseArguments ( IN CHAR8 *CmdLine, diff --git a/EmbeddedPkg/Ebl/Ebl.inf b/EmbeddedPkg/Ebl/Ebl.inf index 44bab64..7c30233 100644 --- a/EmbeddedPkg/Ebl/Ebl.inf +++ b/EmbeddedPkg/Ebl/Ebl.inf @@ -43,6 +43,7 @@ Script.c Ebl.h Network.c + Variable.c [Packages] MdePkg/MdePkg.dec diff --git a/EmbeddedPkg/Ebl/Main.c b/EmbeddedPkg/Ebl/Main.c index 98097e4..8f6f4ea 100644 --- a/EmbeddedPkg/Ebl/Main.c +++ b/EmbeddedPkg/Ebl/Main.c @@ -187,7 +187,7 @@ ParseArguments ( break; } - // Perform any text coversion here + // Perform any text conversion here if (*Char == '\t') { // TAB to space *Char = ' '; @@ -205,9 +205,14 @@ ParseArguments ( } } else { // Looking for the terminator of an Argv[] entry - if ((InQuote && (*Char == '"')) || (!InQuote && (*Char == ' '))) { + if (!InQuote && (*Char == ' ')) { *Char = '\0'; LookingForArg = TRUE; + } else if (!InQuote && (*Char == '"') && (*(Char-1) != '\\')) { + InQuote = TRUE; + } else if (InQuote && (*Char == '"') && (*(Char-1) != '\\')) { + *Char = '\0'; + InQuote = FALSE; } } } @@ -597,6 +602,7 @@ EdkBootLoaderEntry ( EblInitializeScriptCmd (); EblInitializeExternalCmd (); EblInitializeNetworkCmd(); + EblInitializeVariableCmds (); // Disable the 5 minute EFI watchdog time so we don't get automatically reset gBS->SetWatchdogTimer (0, 0, 0, NULL); diff --git a/EmbeddedPkg/Ebl/Variable.c b/EmbeddedPkg/Ebl/Variable.c new file mode 100644 index 0000000..330a143 --- /dev/null +++ b/EmbeddedPkg/Ebl/Variable.c @@ -0,0 +1,192 @@ +/** @file +* +* Copyright (c) 2011, 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 "Ebl.h" + +#include + +EFI_STATUS +EblGetCmd ( + IN UINTN Argc, + IN CHAR8 **Argv + ) +{ + EFI_STATUS Status = EFI_INVALID_PARAMETER; + UINTN Size; + VOID* Value; + CHAR8* AsciiVariableName = NULL; + CHAR16* VariableName; + UINT32 Index; + + if (Argc == 1) { + AsciiPrint("Variable name is missing.\n"); + return Status; + } + + for (Index = 1; Index < Argc; Index++) { + if (Argv[Index][0] == '-') { + AsciiPrint("Warning: '%a' not recognized.\n",Argv[Index]); + } else { + AsciiVariableName = Argv[Index]; + } + } + + if (AsciiVariableName == NULL) { + AsciiPrint("Variable name is missing.\n"); + return Status; + } else { + VariableName = AllocatePool((AsciiStrLen (AsciiVariableName) + 1) * sizeof (CHAR16)); + AsciiStrToUnicodeStr (AsciiVariableName,VariableName); + } + + // Try to get the variable size. + Value = NULL; + Size = 0; + Status = gRT->GetVariable (VariableName, &gEfiGlobalVariableGuid, NULL, &Size, Value); + if (Status == EFI_NOT_FOUND) { + AsciiPrint("Variable name '%a' not found.\n",VariableName); + } else if (Status == EFI_BUFFER_TOO_SMALL) { + // Get the environment variable value + Value = AllocatePool (Size); + if (Value == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Status = gRT->GetVariable ((CHAR16 *)VariableName, &gEfiGlobalVariableGuid, NULL, &Size, Value); + if (EFI_ERROR (Status)) { + AsciiPrint("Error: '%r'\n",Status); + } else { + AsciiPrint("%a=%a\n",AsciiVariableName,Value); + } + FreePool(Value); + } else { + AsciiPrint("Error: '%r'\n",Status); + } + + FreePool(VariableName); + return Status; +} + +EFI_STATUS +EblSetCmd ( + IN UINTN Argc, + IN CHAR8 **Argv + ) +{ + EFI_STATUS Status = EFI_INVALID_PARAMETER; + CHAR8* AsciiVariableSetting = NULL; + CHAR8* AsciiVariableName; + CHAR8* AsciiValue; + UINT32 AsciiValueLength; + CHAR16* VariableName; + UINT32 Index; + UINT32 EscapedQuotes = 0; + BOOLEAN Volatile = FALSE; + + if (Argc == 1) { + AsciiPrint("Variable name is missing.\n"); + return Status; + } + + for (Index = 1; Index < Argc; Index++) { + if (AsciiStrCmp(Argv[Index],"-v") == 0) { + Volatile = 0; + } else if (Argv[Index][0] == '-') { + AsciiPrint("Warning: '%a' not recognized.\n",Argv[Index]); + } else { + AsciiVariableSetting = Argv[Index]; + } + } + + if (AsciiVariableSetting == NULL) { + AsciiPrint("Variable name is missing.\n"); + return Status; + } + + // Check if it is a valid variable setting + AsciiValue = AsciiStrStr (AsciiVariableSetting,"="); + if (AsciiValue == NULL) { + AsciiPrint("Variable setting is incorrect. It should be VariableName=Value\n"); + return Status; + } + + AsciiValue[0] = '\0'; + AsciiVariableName = AsciiVariableSetting; + AsciiValue++; + + // Clean AsciiValue from quote + if (AsciiValue[0] == '"') { + AsciiValue++; + } + AsciiValueLength = AsciiStrLen (AsciiValue); + if ((AsciiValue[AsciiValueLength-2] != '\\') && (AsciiValue[AsciiValueLength-1] == '"')) { + AsciiValue[AsciiValueLength-1] = '\0'; + } + + // Clean AsciiValue from escaped quotes + for (Index = 0; Index < AsciiValueLength; Index++) { + if ((Index > 0) && (AsciiValue[Index-1] == '\\') && (AsciiValue[Index] == '"')) { + EscapedQuotes++; + } + AsciiValue[Index-EscapedQuotes] = AsciiValue[Index]; + } + // Fill the end of the value with '\0' + for (Index = 0; Index < EscapedQuotes; Index++) { + AsciiValue[AsciiValueLength-1-Index] = '\0'; + } + + // Convert VariableName into Unicode + VariableName = AllocatePool((AsciiStrLen (AsciiVariableName) + 1) * sizeof (CHAR16)); + AsciiStrToUnicodeStr (AsciiVariableName,VariableName); + + Status = gRT->SetVariable ( + VariableName, + &gEfiGlobalVariableGuid, + ( !Volatile ? EFI_VARIABLE_NON_VOLATILE : 0) | + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + AsciiStrLen (AsciiValue)+1, + AsciiValue + ); + + AsciiPrint("'%a'='%a'\n",AsciiVariableName,AsciiValue); + + return Status; +} + +GLOBAL_REMOVE_IF_UNREFERENCED const EBL_COMMAND_TABLE mCmdVariableTemplate[] = +{ + { + "get", + " ; get UEFI variable\n\r [v]; verbose", + NULL, + EblGetCmd + }, + { + "set", + " ; set UEFI variable\n\r [v]; create volatile variable", + NULL, + EblSetCmd + } +}; + +/** + Initialize the commands in this in this file +**/ +VOID +EblInitializeVariableCmds ( + VOID + ) +{ + EblAddCommands (mCmdVariableTemplate, sizeof (mCmdVariableTemplate)/sizeof (EBL_COMMAND_TABLE)); +} -- cgit v1.1