From: Ruiyu Ni <ruiyu.ni@intel.com>
To: edk2-devel@lists.01.org
Cc: Chen A Chen <chen.a.chen@intel.com>,
Jaben Carsey <jaben.carsey@intel.com>,
Tapan Shah <tapandshah@hpe.com>
Subject: [PATCH v2] ShellPkg/dmpstore: Support "-sfo"
Date: Mon, 14 Nov 2016 10:19:18 +0800 [thread overview]
Message-ID: <20161114021918.128680-1-ruiyu.ni@intel.com> (raw)
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>
Cc: Jaben Carsey <jaben.carsey@intel.com>
Cc: Tapan Shah <tapandshah@hpe.com>
---
.../Library/UefiShellDebug1CommandsLib/DmpStore.c | 207 +++++++++++++++------
.../UefiShellDebug1CommandsLib.uni | 8 +-
2 files changed, 154 insertions(+), 61 deletions(-)
diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c
index 3427c99..7133881 100644
--- a/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c
+++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c
@@ -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
@@ -82,6 +82,42 @@ GetAttrType (
}
/**
+ 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.
@param[in] FileHandle The file to be read.
@@ -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);
}
diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni
index 52c2af0..bd1726b 100644
--- a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni
+++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni
@@ -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"
--
2.9.0.windows.1
next reply other threads:[~2016-11-14 2:19 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-14 2:19 Ruiyu Ni [this message]
2016-11-15 16:50 ` [PATCH v2] ShellPkg/dmpstore: Support "-sfo" Shah, Tapan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161114021918.128680-1-ruiyu.ni@intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox