mirror of https://github.com/acidanthera/audk.git
ShellPkg/dmpstore: Support "-sfo"
The patch adds the "-sfo" support to "dmpstore" command. When -l or -d is specified, -sfo is not supported. When the variable specified by name and GUID cannot be found, an error message is displayed; Otherwise, the SFO is displayed. E.g.: "dmpstore -guid GuidThatDoesntExist -sfo" produces output as: ShellCommand,"dmpstore" VariableInfo,"","GuidThatDoesntExist","","","" "dmpstore NameThatDoesntExist -guid GuidThatDoesntExist -sfo" produces output as: ShellCommand,"dmpstore" dmpstore: No matching variables found. Guid GuidThatDoesntExist, Name NameThatDoesntExist The difference between the above 2 cases is that former one only specifies the GUID, but the latter one specifies both name and GUID. Since not specifying GUID means to use GlobalVariableGuid, "dmpstore NameThatDoesntExist -sfo" produces the similar output as latter one. I personally prefer to always produce SFO output for both cases. But the above behavior is the discussion result between HPE engineers. Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Signed-off-by: Chen A Chen <chen.a.chen@intel.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com> Reviewed-by: Tapan Shah <tapandshah@hpe.com>
This commit is contained in:
parent
86a1eca210
commit
e9597b4519
|
@ -2,7 +2,7 @@
|
|||
Main file for DmpStore shell Debug1 function.
|
||||
|
||||
(C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
|
||||
Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2005 - 2016, Intel Corporation. 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
|
||||
|
@ -81,6 +81,42 @@ GetAttrType (
|
|||
return RetString;
|
||||
}
|
||||
|
||||
/**
|
||||
Convert binary to hex format string.
|
||||
|
||||
@param[in] BufferSize The size in bytes of the binary data.
|
||||
@param[in] Buffer The binary data.
|
||||
@param[in, out] HexString Hex format string.
|
||||
@param[in] HexStringSize The size in bytes of the string.
|
||||
|
||||
@return The hex format string.
|
||||
**/
|
||||
CHAR16*
|
||||
BinaryToHexString (
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN OUT CHAR16 *HexString,
|
||||
IN UINTN HexStringSize
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
UINTN StringIndex;
|
||||
|
||||
ASSERT (Buffer != NULL);
|
||||
ASSERT ((BufferSize * 2 + 1) * sizeof (CHAR16) <= HexStringSize);
|
||||
|
||||
for (Index = 0, StringIndex = 0; Index < BufferSize; Index += 1) {
|
||||
StringIndex +=
|
||||
UnicodeSPrint (
|
||||
&HexString[StringIndex],
|
||||
HexStringSize - StringIndex * sizeof (CHAR16),
|
||||
L"%02x",
|
||||
((UINT8 *) Buffer)[Index]
|
||||
);
|
||||
}
|
||||
return HexString;
|
||||
}
|
||||
|
||||
/**
|
||||
Load the variable data from file and set to variable data base.
|
||||
|
||||
|
@ -350,14 +386,15 @@ AppendSingleVariableToFile (
|
|||
|
||||
This is necessary since once a delete happens GetNextVariableName() will work.
|
||||
|
||||
@param[in] Name The variable name of the EFI variable (or NULL).
|
||||
@param[in] Guid The GUID of the variable set (or NULL).
|
||||
@param[in] Type The operation type.
|
||||
@param[in] FileHandle The file to operate on (or NULL).
|
||||
@param[in] PrevName The previous variable name from GetNextVariableName. L"" to start.
|
||||
@param[in] FoundVarGuid The previous GUID from GetNextVariableName. ignored at start.
|
||||
@param[in] FoundOne If a VariableName or Guid was specified and one was printed or
|
||||
deleted, then set this to TRUE, otherwise ignored.
|
||||
@param[in] Name The variable name of the EFI variable (or NULL).
|
||||
@param[in] Guid The GUID of the variable set (or NULL).
|
||||
@param[in] Type The operation type.
|
||||
@param[in] FileHandle The file to operate on (or NULL).
|
||||
@param[in] PrevName The previous variable name from GetNextVariableName. L"" to start.
|
||||
@param[in] FoundVarGuid The previous GUID from GetNextVariableName. ignored at start.
|
||||
@param[in] FoundOne If a VariableName or Guid was specified and one was printed or
|
||||
deleted, then set this to TRUE, otherwise ignored.
|
||||
@param[in] StandardFormatOutput TRUE indicates Standard-Format Output.
|
||||
|
||||
@retval SHELL_SUCCESS The operation was successful.
|
||||
@retval SHELL_OUT_OF_RESOURCES A memorty allocation failed.
|
||||
|
@ -373,7 +410,8 @@ CascadeProcessVariables (
|
|||
IN EFI_FILE_PROTOCOL *FileHandle OPTIONAL,
|
||||
IN CONST CHAR16 * CONST PrevName,
|
||||
IN EFI_GUID FoundVarGuid,
|
||||
IN BOOLEAN *FoundOne
|
||||
IN BOOLEAN *FoundOne,
|
||||
IN BOOLEAN StandardFormatOutput
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -383,7 +421,8 @@ CascadeProcessVariables (
|
|||
UINT32 Atts;
|
||||
SHELL_STATUS ShellStatus;
|
||||
UINTN NameSize;
|
||||
CHAR16 *RetString;
|
||||
CHAR16 *AttrString;
|
||||
CHAR16 *HexString;
|
||||
|
||||
if (ShellGetExecutionBreakFlag()) {
|
||||
return (SHELL_ABORTED);
|
||||
|
@ -427,7 +466,7 @@ CascadeProcessVariables (
|
|||
//
|
||||
// Recurse to the next iteration. We know "our" variable's name.
|
||||
//
|
||||
ShellStatus = CascadeProcessVariables(Name, Guid, Type, FileHandle, FoundVarName, FoundVarGuid, FoundOne);
|
||||
ShellStatus = CascadeProcessVariables (Name, Guid, Type, FileHandle, FoundVarName, FoundVarGuid, FoundOne, StandardFormatOutput);
|
||||
|
||||
if (ShellGetExecutionBreakFlag() || (ShellStatus == SHELL_ABORTED)) {
|
||||
SHELL_FREE_NON_NULL(FoundVarName);
|
||||
|
@ -459,50 +498,70 @@ CascadeProcessVariables (
|
|||
Status = gRT->GetVariable (FoundVarName, &FoundVarGuid, &Atts, &DataSize, DataBuffer);
|
||||
}
|
||||
}
|
||||
if ((Type == DmpStoreDisplay) || (Type == DmpStoreSave)) {
|
||||
//
|
||||
// Last error check then print this variable out.
|
||||
//
|
||||
if (Type == DmpStoreDisplay) {
|
||||
if (!EFI_ERROR(Status) && (DataBuffer != NULL) && (FoundVarName != NULL)) {
|
||||
RetString = GetAttrType(Atts);
|
||||
ShellPrintHiiEx(
|
||||
-1,
|
||||
-1,
|
||||
NULL,
|
||||
STRING_TOKEN(STR_DMPSTORE_HEADER_LINE),
|
||||
gShellDebug1HiiHandle,
|
||||
RetString,
|
||||
&FoundVarGuid,
|
||||
FoundVarName,
|
||||
DataSize);
|
||||
if (Type == DmpStoreDisplay) {
|
||||
DumpHex(2, 0, DataSize, DataBuffer);
|
||||
AttrString = GetAttrType(Atts);
|
||||
if (StandardFormatOutput) {
|
||||
HexString = AllocatePool ((DataSize * 2 + 1) * sizeof (CHAR16));
|
||||
if (HexString != NULL) {
|
||||
ShellPrintHiiEx (
|
||||
-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_VAR_SFO), gShellDebug1HiiHandle,
|
||||
FoundVarName, &FoundVarGuid, Atts, DataSize,
|
||||
BinaryToHexString (
|
||||
DataBuffer, DataSize, HexString, (DataSize * 2 + 1) * sizeof (CHAR16)
|
||||
)
|
||||
);
|
||||
FreePool (HexString);
|
||||
} else {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
} else {
|
||||
Status = AppendSingleVariableToFile (
|
||||
FileHandle,
|
||||
FoundVarName,
|
||||
&FoundVarGuid,
|
||||
Atts,
|
||||
(UINT32) DataSize,
|
||||
DataBuffer
|
||||
);
|
||||
ShellPrintHiiEx (
|
||||
-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_HEADER_LINE), gShellDebug1HiiHandle,
|
||||
AttrString, &FoundVarGuid, FoundVarName, DataSize
|
||||
);
|
||||
DumpHex (2, 0, DataSize, DataBuffer);
|
||||
}
|
||||
SHELL_FREE_NON_NULL(RetString);
|
||||
SHELL_FREE_NON_NULL (AttrString);
|
||||
}
|
||||
} else if (Type == DmpStoreSave) {
|
||||
if (!EFI_ERROR(Status) && (DataBuffer != NULL) && (FoundVarName != NULL)) {
|
||||
AttrString = GetAttrType (Atts);
|
||||
ShellPrintHiiEx (
|
||||
-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_HEADER_LINE), gShellDebug1HiiHandle,
|
||||
AttrString, &FoundVarGuid, FoundVarName, DataSize
|
||||
);
|
||||
Status = AppendSingleVariableToFile (
|
||||
FileHandle,
|
||||
FoundVarName,
|
||||
&FoundVarGuid,
|
||||
Atts,
|
||||
(UINT32) DataSize,
|
||||
DataBuffer
|
||||
);
|
||||
SHELL_FREE_NON_NULL (AttrString);
|
||||
}
|
||||
} else if (Type == DmpStoreDelete) {
|
||||
//
|
||||
// We only need name to delete it...
|
||||
//
|
||||
ShellPrintHiiEx (
|
||||
-1,
|
||||
-1,
|
||||
NULL,
|
||||
STRING_TOKEN(STR_DMPSTORE_DELETE_LINE),
|
||||
gShellDebug1HiiHandle,
|
||||
&FoundVarGuid,
|
||||
FoundVarName,
|
||||
gRT->SetVariable (FoundVarName, &FoundVarGuid, Atts, 0, NULL)
|
||||
);
|
||||
EFI_STATUS SetStatus = gRT->SetVariable (FoundVarName, &FoundVarGuid, Atts, 0, NULL);
|
||||
if (StandardFormatOutput) {
|
||||
if (SetStatus == EFI_SUCCESS) {
|
||||
ShellPrintHiiEx (
|
||||
-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_NG_SFO), gShellDebug1HiiHandle,
|
||||
FoundVarName, &FoundVarGuid
|
||||
);
|
||||
}
|
||||
} else {
|
||||
ShellPrintHiiEx (
|
||||
-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_DELETE_LINE), gShellDebug1HiiHandle,
|
||||
&FoundVarGuid, FoundVarName, SetStatus
|
||||
);
|
||||
}
|
||||
}
|
||||
SHELL_FREE_NON_NULL(DataBuffer);
|
||||
}
|
||||
|
@ -523,10 +582,11 @@ CascadeProcessVariables (
|
|||
/**
|
||||
Function to display or delete variables. This will set up and call into the recursive function.
|
||||
|
||||
@param[in] Name The variable name of the EFI variable (or NULL).
|
||||
@param[in] Guid The GUID of the variable set (or NULL).
|
||||
@param[in] Type The operation type.
|
||||
@param[in] FileHandle The file to save or load variables.
|
||||
@param[in] Name The variable name of the EFI variable (or NULL).
|
||||
@param[in] Guid The GUID of the variable set (or NULL).
|
||||
@param[in] Type The operation type.
|
||||
@param[in] FileHandle The file to save or load variables.
|
||||
@param[in] StandardFormatOutput TRUE indicates Standard-Format Output.
|
||||
|
||||
@retval SHELL_SUCCESS The operation was successful.
|
||||
@retval SHELL_OUT_OF_RESOURCES A memorty allocation failed.
|
||||
|
@ -539,7 +599,8 @@ ProcessVariables (
|
|||
IN CONST CHAR16 *Name OPTIONAL,
|
||||
IN CONST EFI_GUID *Guid OPTIONAL,
|
||||
IN DMP_STORE_TYPE Type,
|
||||
IN SHELL_FILE_HANDLE FileHandle OPTIONAL
|
||||
IN SHELL_FILE_HANDLE FileHandle OPTIONAL,
|
||||
IN BOOLEAN StandardFormatOutput
|
||||
)
|
||||
{
|
||||
SHELL_STATUS ShellStatus;
|
||||
|
@ -550,10 +611,14 @@ ProcessVariables (
|
|||
ShellStatus = SHELL_SUCCESS;
|
||||
ZeroMem (&FoundVarGuid, sizeof(EFI_GUID));
|
||||
|
||||
if (StandardFormatOutput) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_GEN_SFO_HEADER), gShellDebug1HiiHandle, L"dmpstore");
|
||||
}
|
||||
|
||||
if (Type == DmpStoreLoad) {
|
||||
ShellStatus = LoadVariablesFromFile (FileHandle, Name, Guid, &Found);
|
||||
} else {
|
||||
ShellStatus = CascadeProcessVariables(Name, Guid, Type, FileHandle, NULL, FoundVarGuid, &Found);
|
||||
ShellStatus = CascadeProcessVariables (Name, Guid, Type, FileHandle, NULL, FoundVarGuid, &Found, StandardFormatOutput);
|
||||
}
|
||||
|
||||
if (!Found) {
|
||||
|
@ -561,13 +626,25 @@ ProcessVariables (
|
|||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"dmpstore");
|
||||
return (ShellStatus);
|
||||
} else if (Name != NULL && Guid == NULL) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_N), gShellDebug1HiiHandle, L"dmpstore", Name);
|
||||
if (StandardFormatOutput) {
|
||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_N_SFO), gShellDebug1HiiHandle, Name);
|
||||
} else {
|
||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_N), gShellDebug1HiiHandle, L"dmpstore", Name);
|
||||
}
|
||||
} else if (Name != NULL && Guid != NULL) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_GN), gShellDebug1HiiHandle, L"dmpstore", Guid, Name);
|
||||
} else if (Name == NULL && Guid == NULL) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND), gShellDebug1HiiHandle, L"dmpstore");
|
||||
if (StandardFormatOutput) {
|
||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_SFO), gShellDebug1HiiHandle);
|
||||
} else {
|
||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND), gShellDebug1HiiHandle, L"dmpstore");
|
||||
}
|
||||
} else if (Name == NULL && Guid != NULL) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_G), gShellDebug1HiiHandle, L"dmpstore", Guid);
|
||||
if (StandardFormatOutput) {
|
||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_G_SFO), gShellDebug1HiiHandle, Guid);
|
||||
} else {
|
||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_G), gShellDebug1HiiHandle, L"dmpstore", Guid);
|
||||
}
|
||||
}
|
||||
return (SHELL_NOT_FOUND);
|
||||
}
|
||||
|
@ -580,6 +657,7 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
|
|||
{L"-s", TypeValue},
|
||||
{L"-all", TypeFlag},
|
||||
{L"-guid", TypeValue},
|
||||
{L"-sfo", TypeFlag},
|
||||
{NULL, TypeMax}
|
||||
};
|
||||
|
||||
|
@ -608,12 +686,14 @@ ShellCommandRunDmpStore (
|
|||
DMP_STORE_TYPE Type;
|
||||
SHELL_FILE_HANDLE FileHandle;
|
||||
EFI_FILE_INFO *FileInfo;
|
||||
BOOLEAN StandardFormatOutput;
|
||||
|
||||
ShellStatus = SHELL_SUCCESS;
|
||||
Package = NULL;
|
||||
FileHandle = NULL;
|
||||
File = NULL;
|
||||
Type = DmpStoreDisplay;
|
||||
ShellStatus = SHELL_SUCCESS;
|
||||
Package = NULL;
|
||||
FileHandle = NULL;
|
||||
File = NULL;
|
||||
Type = DmpStoreDisplay;
|
||||
StandardFormatOutput = FALSE;
|
||||
|
||||
Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
|
||||
if (EFI_ERROR(Status)) {
|
||||
|
@ -637,6 +717,9 @@ ShellCommandRunDmpStore (
|
|||
} else if ((ShellCommandLineGetFlag(Package, L"-s") || ShellCommandLineGetFlag(Package, L"-l")) && ShellCommandLineGetFlag(Package, L"-d")) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"dmpstore", L"-l or -s", L"-d");
|
||||
ShellStatus = SHELL_INVALID_PARAMETER;
|
||||
} else if ((ShellCommandLineGetFlag(Package, L"-s") || ShellCommandLineGetFlag(Package, L"-l")) && ShellCommandLineGetFlag(Package, L"-sfo")) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"dmpstore", L"-l or -s", L"-sfo");
|
||||
ShellStatus = SHELL_INVALID_PARAMETER;
|
||||
} else {
|
||||
//
|
||||
// Determine the GUID to search for based on -all and -guid parameters
|
||||
|
@ -742,6 +825,10 @@ ShellCommandRunDmpStore (
|
|||
} else if (ShellCommandLineGetFlag(Package, L"-d")) {
|
||||
Type = DmpStoreDelete;
|
||||
}
|
||||
|
||||
if (ShellCommandLineGetFlag (Package,L"-sfo")) {
|
||||
StandardFormatOutput = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (ShellStatus == SHELL_SUCCESS) {
|
||||
|
@ -750,7 +837,7 @@ ShellCommandRunDmpStore (
|
|||
} else if (Type == DmpStoreLoad) {
|
||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD), gShellDebug1HiiHandle, File);
|
||||
}
|
||||
ShellStatus = ProcessVariables (Name, Guid, Type, FileHandle);
|
||||
ShellStatus = ProcessVariables (Name, Guid, Type, FileHandle, StandardFormatOutput);
|
||||
if ((Type == DmpStoreLoad) || (Type == DmpStoreSave)) {
|
||||
ShellCloseFile (&FileHandle);
|
||||
}
|
||||
|
|
|
@ -407,9 +407,14 @@
|
|||
#string STR_DMPSTORE_HEADER_LINE #language en-US "Variable %H%s%N '%H%g%N:%H%s%N' DataSize = 0x%02x\r\n"
|
||||
#string STR_DMPSTORE_DELETE_LINE #language en-US "Delete variable '%H%g%N:%H%s%N': %r\r\n"
|
||||
#string STR_DMPSTORE_NO_VAR_FOUND #language en-US "%H%s%N: No matching variables found.\r\n"
|
||||
#string STR_DMPSTORE_NO_VAR_FOUND_SFO #language en-US "VariableInfo,\"\",\"\",\"\",\"\",\"\"\r\n"
|
||||
#string STR_DMPSTORE_NO_VAR_FOUND_GN #language en-US "%H%s%N: No matching variables found. Guid %g, Name %s\r\n"
|
||||
#string STR_DMPSTORE_NO_VAR_FOUND_NG_SFO #language en-US "VariableInfo,\"%s\",\"%g\",\"\",\"\",\"\"\r\n"
|
||||
#string STR_DMPSTORE_NO_VAR_FOUND_N #language en-US "%H%s%N: No matching variables found. Name %s\r\n"
|
||||
#string STR_DMPSTORE_NO_VAR_FOUND_N_SFO #language en-US #language en-US "VariableInfo,\"%s\",\"\",\"\",\"\",\"\"\r\n"
|
||||
#string STR_DMPSTORE_NO_VAR_FOUND_G #language en-US "%H%s%N: No matching variables found. Guid %g\r\n"
|
||||
#string STR_DMPSTORE_NO_VAR_FOUND_G_SFO #language en-US "VariableInfo,\"\",\"%g\",\"\",\"\",\"\"\r\n"
|
||||
#string STR_DMPSTORE_VAR_SFO #language en-US "VariableInfo,\"%s\",\"%g\",\"0x%x\",\"0x%x\",\"%s\"\r\n"
|
||||
|
||||
#string STR_GET_HELP_COMP #language en-US ""
|
||||
".TH comp 0 "Compare 2 files"\r\n"
|
||||
|
@ -1015,7 +1020,7 @@
|
|||
"Manages all UEFI variables.\r\n"
|
||||
".SH SYNOPSIS\r\n"
|
||||
" \r\n"
|
||||
"DMPSTORE [-b] [-d] [-all | ([variable] [-guid guid])]\r\n"
|
||||
"DMPSTORE [-b] [-d] [-all | ([variable] [-guid guid])] [-sfo]\r\n"
|
||||
"DMPSTORE [-all | ([variable] [-guid guid])] [-s file]\r\n"
|
||||
"DMPSTORE [-all | ([variable] [-guid guid])] [-l file]\r\n"
|
||||
".SH OPTIONS\r\n"
|
||||
|
@ -1024,6 +1029,7 @@
|
|||
" -guid - Specifies the GUID of the variables to be displayed in\r\n"
|
||||
" standard text format. If not specified and -all is not\r\n"
|
||||
" specified, the EFI_GLOBAL_VARIABLE GUID is assumed.\r\n"
|
||||
" -sfo - Displays information as described in Standard-Format Output.\r\n"
|
||||
" -all - Dumps all variables, including those\r\n"
|
||||
" with a different GUID than EFI_GLOBAL_VARIABLE.\r\n"
|
||||
" -d - Delete variables.\r\n"
|
||||
|
|
Loading…
Reference in New Issue