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
This commit is contained in:
andrewfish 2011-02-01 05:37:22 +00:00
parent 4c8a6e069c
commit fb334ef6c5
7 changed files with 218 additions and 16 deletions

View File

@ -165,6 +165,11 @@ EblInitializeNetworkCmd (
VOID VOID
); );
VOID
EblInitializeVariableCmds (
VOID
);
CHAR8 * CHAR8 *
ParseArguments ( ParseArguments (
IN CHAR8 *CmdLine, IN CHAR8 *CmdLine,

View File

@ -43,6 +43,7 @@
Script.c Script.c
Ebl.h Ebl.h
Network.c Network.c
Variable.c
[Packages] [Packages]
MdePkg/MdePkg.dec MdePkg/MdePkg.dec

View File

@ -187,7 +187,7 @@ ParseArguments (
break; break;
} }
// Perform any text coversion here // Perform any text conversion here
if (*Char == '\t') { if (*Char == '\t') {
// TAB to space // TAB to space
*Char = ' '; *Char = ' ';
@ -205,9 +205,14 @@ ParseArguments (
} }
} else { } else {
// Looking for the terminator of an Argv[] entry // Looking for the terminator of an Argv[] entry
if ((InQuote && (*Char == '"')) || (!InQuote && (*Char == ' '))) { if (!InQuote && (*Char == ' ')) {
*Char = '\0'; *Char = '\0';
LookingForArg = TRUE; 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 (); EblInitializeScriptCmd ();
EblInitializeExternalCmd (); EblInitializeExternalCmd ();
EblInitializeNetworkCmd(); EblInitializeNetworkCmd();
EblInitializeVariableCmds ();
// Disable the 5 minute EFI watchdog time so we don't get automatically reset // Disable the 5 minute EFI watchdog time so we don't get automatically reset
gBS->SetWatchdogTimer (0, 0, 0, NULL); gBS->SetWatchdogTimer (0, 0, 0, NULL);

192
EmbeddedPkg/Ebl/Variable.c Normal file
View File

@ -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 <Guid/GlobalVariable.h>
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));
}

View File

@ -65,11 +65,11 @@
gEmbeddedTokenSpaceGuid.PcdEmbeddedIoEnable|FALSE|BOOLEAN|0x00000005 gEmbeddedTokenSpaceGuid.PcdEmbeddedIoEnable|FALSE|BOOLEAN|0x00000005
gEmbeddedTokenSpaceGuid.PcdEmbeddedScriptCmd|FALSE|BOOLEAN|0x00000006 gEmbeddedTokenSpaceGuid.PcdEmbeddedScriptCmd|FALSE|BOOLEAN|0x00000006
gEmbeddedTokenSpaceGuid.PcdEmbeddedPciDebugCmd|FALSE|BOOLEAN|0x00000041 gEmbeddedTokenSpaceGuid.PcdEmbeddedPciDebugCmd|FALSE|BOOLEAN|0x00000041
gEmbeddedTokenSpaceGuid.PcdEmbeddedProbeRemovable|TRUE|BOOLEAN|0x00000050 gEmbeddedTokenSpaceGuid.PcdEmbeddedProbeRemovable|TRUE|BOOLEAN|0x00000052
gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob|FALSE|BOOLEAN|0x0000001b gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob|FALSE|BOOLEAN|0x0000001b
gEmbeddedTokenSpaceGuid.PcdCacheEnable|FALSE|BOOLEAN|0x00000042 gEmbeddedTokenSpaceGuid.PcdCacheEnable|FALSE|BOOLEAN|0x00000042
gEmbeddedTokenSpaceGuid.PcdGdbSerial|FALSE|BOOLEAN|0x00000051 gEmbeddedTokenSpaceGuid.PcdGdbSerial|FALSE|BOOLEAN|0x00000053
[PcdsFixedAtBuild.common] [PcdsFixedAtBuild.common]
@ -94,6 +94,9 @@
gEmbeddedTokenSpaceGuid.PcdFlashFvMainOffset|0x0|UINT32|0x00000044 gEmbeddedTokenSpaceGuid.PcdFlashFvMainOffset|0x0|UINT32|0x00000044
gEmbeddedTokenSpaceGuid.PcdFlashFvMainSize|0x0|UINT32|0x00000045 gEmbeddedTokenSpaceGuid.PcdFlashFvMainSize|0x0|UINT32|0x00000045
gEmbeddedTokenSpaceGuid.PcdFlashFvSecBase|0x0|UINT32|0x00000050
gEmbeddedTokenSpaceGuid.PcdFlashFvSecSize|0x0|UINT32|0x00000051
# Used to help reduce fragmentation in the EFI memory map # Used to help reduce fragmentation in the EFI memory map
# EFI Pages (4K) are the units used # EFI Pages (4K) are the units used

View File

@ -45,7 +45,7 @@ EblGetCurrentIpAddress (
CopyMem (Ip, &Pxe->Mode->StationIp, sizeof (EFI_IP_ADDRESS)); CopyMem (Ip, &Pxe->Mode->StationIp, sizeof (EFI_IP_ADDRESS));
return Status; return EFI_SUCCESS;
} }
@ -63,7 +63,7 @@ EblGetCurrentMacAddress (
return Status; return Status;
} }
CopyMem (SimpleNet->Mode->CurrentAddress.Addr, Mac, sizeof (EFI_MAC_ADDRESS)); CopyMem (Mac, SimpleNet->Mode->CurrentAddress.Addr, sizeof (EFI_MAC_ADDRESS));
return Status; return Status;
} }

View File

@ -50,16 +50,11 @@ This is the stack constructed by the exception handler (low address to high addr
*/ */
.globl ASM_PFX(ExceptionHandlersStart) GCC_ASM_EXPORT(ExceptionHandlersStart)
INTERWORK_FUNC(ExceptionHandlersStart) GCC_ASM_EXPORT(ExceptionHandlersEnd)
.globl ASM_PFX(ExceptionHandlersEnd) GCC_ASM_EXPORT(CommonExceptionEntry)
INTERWORK_FUNC(ExceptionHandlersEnd) GCC_ASM_EXPORT(AsmCommonExceptionEntry)
.globl ASM_PFX(CommonExceptionEntry) GCC_ASM_EXPORT(GdbExceptionHandler)
INTERWORK_FUNC(CommonExceptionEntry)
.globl ASM_PFX(AsmCommonExceptionEntry)
INTERWORK_FUNC(AsmCommonExceptionEntry)
.globl ASM_PFX(GdbExceptionHandler)
INTERWORK_FUNC(GdbExceptionHandler)
.text .text
.align 3 .align 3