The EFIAPI function declaration is missing for several functions in the EmbeddedPkg/Ebl directory. A few function pointer struct members expect EFIAPI though and GCC46/X64 will fail to compile the directory without them. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Thomas Palmer <thomas.palmer@hpe.com> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18697 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			217 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
*
 | 
						|
*  Copyright (c) 2011, ARM Limited. All rights reserved.
 | 
						|
*  (C) Copyright 2015 Hewlett Packard Enterprise Development LP<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.
 | 
						|
*
 | 
						|
**/
 | 
						|
 | 
						|
#include "Ebl.h"
 | 
						|
 | 
						|
#include <Guid/GlobalVariable.h>
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
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 '%s' 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
 | 
						|
EFIAPI
 | 
						|
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) {
 | 
						|
    //
 | 
						|
    // There is no value. It means this variable will be deleted
 | 
						|
    //
 | 
						|
 | 
						|
    // Convert VariableName into Unicode
 | 
						|
    VariableName = AllocatePool((AsciiStrLen (AsciiVariableSetting) + 1) * sizeof (CHAR16));
 | 
						|
    AsciiStrToUnicodeStr (AsciiVariableSetting,VariableName);
 | 
						|
 | 
						|
    Status = gRT->SetVariable (
 | 
						|
                          VariableName,
 | 
						|
                          &gEfiGlobalVariableGuid,
 | 
						|
                          ( !Volatile ? EFI_VARIABLE_NON_VOLATILE : 0) |
 | 
						|
                          EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
 | 
						|
                          0,
 | 
						|
                          NULL
 | 
						|
                          );
 | 
						|
    if (!EFI_ERROR(Status)) {
 | 
						|
      AsciiPrint("Variable '%s' deleted\n",VariableName);
 | 
						|
    } else {
 | 
						|
      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
 | 
						|
                      );
 | 
						|
  if (!EFI_ERROR(Status)) {
 | 
						|
    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));
 | 
						|
}
 |