From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id BA61C81C9A for ; Sun, 13 Nov 2016 18:28:39 -0800 (PST) Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga103.fm.intel.com with ESMTP; 13 Nov 2016 18:28:43 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,488,1473145200"; d="scan'208";a="901025232" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga003.jf.intel.com with ESMTP; 13 Nov 2016 18:28:43 -0800 Received: from fmsmsx125.amr.corp.intel.com (10.18.125.40) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.248.2; Sun, 13 Nov 2016 18:28:43 -0800 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by FMSMSX125.amr.corp.intel.com (10.18.125.40) with Microsoft SMTP Server (TLS) id 14.3.248.2; Sun, 13 Nov 2016 18:28:43 -0800 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.142]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.96]) with mapi id 14.03.0248.002; Mon, 14 Nov 2016 10:28:39 +0800 From: "Ni, Ruiyu" To: "Shah, Tapan" , "edk2-devel@lists.01.org" , "Phillips, Chris J (Plano, TX)" CC: "Carsey, Jaben" , "Chen, Chen A" Thread-Topic: [PATCH] ShellPkg/dmpstore: Support "-sfo" Thread-Index: AQHSPFxJg4HbKVFdl0W1eQqQOTNCbaDXw+Kg Date: Mon, 14 Nov 2016 02:28:38 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D58E76D29@SHSMSX104.ccr.corp.intel.com> References: <20161111101410.116396-1-ruiyu.ni@intel.com> In-Reply-To: Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH] ShellPkg/dmpstore: Support "-sfo" X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Nov 2016 02:28:39 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Yes I just saw that difference in Spec. I agree to remove the sfo support for -s and -l. But I do not think we need to define new SFO table. I think the V1 patch's implementation can satisfy caller's information need= s. For -s, displaying the variable content in SFO is to tell caller that the e= xactly same content is saved to file. For -l, only displaying the variable content in SFO is to tell caller that = the variable listed in SFO is updated to the content shown in SFO. Thanks/Ray > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of > Shah, Tapan > Sent: Saturday, November 12, 2016 4:43 AM > To: Ni, Ruiyu ; edk2-devel@lists.01.org; Phillips, Ch= ris J > (Plano, TX) > Cc: Carsey, Jaben ; Chen, Chen A > > Subject: Re: [edk2] [PATCH] ShellPkg/dmpstore: Support "-sfo" >=20 > Ray, > Chris and I looked at the patch closely again and saw that your change= also > includes -sfo support for -l and -s flags which is not supported accordin= g to > the latest spec. See below syntax from spec: >=20 > dmpstore [-b] [-d] [-all | (-guid guid)] [variable] [-sfo] dmpstore [-all= | (-guid > guid)] [variable] [-s file] dmpstore [-all | (-guid guid)] [variable] [-l= file] >=20 > If we want to include -l and -s support with -sfo flag, then we need to d= efine > new SFO tables and it requires UEFI Shell spec. update. Currently non-sfo > mode for -l and -s flags do not display variable data and current -sfo ta= ble has > variable data column defined. >=20 > We also saw that -l/-s -sfo mode suppresses error and that's confusing fr= om > user prospective as suppressing error does not provide enough information > to user about what happened for an individual variable. This should be > handled with new SFO tables for -l/-s flags and do it later after Shell s= pec. > update. >=20 > Thanks, > Tapan >=20 > -----Original Message----- > From: Shah, Tapan > Sent: Friday, November 11, 2016 11:21 AM > To: 'Ruiyu Ni' ; edk2-devel@lists.01.org > Cc: Chen A Chen ; Jaben Carsey > > Subject: RE: [PATCH] ShellPkg/dmpstore: Support "-sfo" >=20 > Two comments: > 1. Missing help output update for -sfo support in dmpstore command. > 2. BinaryToHexString() is missing input parameter NULL and out of bound s= ize > check before access. >=20 > -----Original Message----- > From: Ruiyu Ni [mailto:ruiyu.ni@intel.com] > Sent: Friday, November 11, 2016 4:14 AM > To: edk2-devel@lists.01.org > Cc: Chen A Chen ; Jaben Carsey > ; Shah, Tapan > Subject: [PATCH] ShellPkg/dmpstore: Support "-sfo" >=20 > The patch adds the "-sfo" support to "dmpstore" command. >=20 > 1. For "-l" (load variable from file), when the variable content can be u= pdated, > the new variable data is displayed in SFO format, otherwise, the new vari= able > data is not displayed. So that the SFO consumer can know which variables = are > updated by parsing the SFO. >=20 > 2. For "-d" (delete variable), when the variable can be deleted successfu= lly, > only the variable name and GUID are displayed in SFO but the > attribute/data/data size are displayed as empty to indicate the deletion > happened; otherwise, the variable is not displayed. >=20 > 3. For displaying variable, 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","","","" >=20 > "dmpstore NameThatDoesntExist -guid GuidThatDoesntExist -sfo" > produces output as: > ShellCommand,"dmpstore" > dmpstore: No matching variables found. Guid GuidThatDoesntExist, Name > NameThatDoesntExist >=20 > The difference between the above 2 cases is that former one only specifie= s > 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. >=20 > Signed-off-by: Ruiyu Ni > Signed-off-by: Chen A Chen > Cc: Jaben Carsey > Cc: Tapan Shah > --- > .../Library/UefiShellDebug1CommandsLib/DmpStore.c | 269 > +++++++++++++++------ > .../UefiShellDebug1CommandsLib.uni | 5 + > 2 files changed, 202 insertions(+), 72 deletions(-) >=20 > diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c > b/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c > index 3427c99..aa8ad09 100644 > --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c > +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c > @@ -2,7 +2,7 @@ > Main file for DmpStore shell Debug1 function. >=20 > (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.
> - Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.
> + Copyright (c) 2005 - 2016, Intel Corporation. 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 @@ -82,12 +82,46 @@ GetAttrType ( } >=20 > /** > + 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; > + > + for (Index =3D 0, StringIndex =3D 0; Index < BufferSize; Index +=3D 1)= { > + StringIndex +=3D > + 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. >=20 > - @param[in] FileHandle The file to be read. > - @param[in] Name The name of the variables to be loaded. > - @param[in] Guid The guid of the variables to be loaded. > - @param[out] Found TRUE when at least one variable was loaded = and > set. > + @param[in] FileHandle The file to be read. > + @param[in] Name The name of the variables to be loade= d. > + @param[in] Guid The guid of the variables to be loade= d. > + @param[out] Found TRUE when at least one variable was l= oaded > and set. > + @param[in] StandardFormatOutput TRUE indicates Standard-Format > Output. >=20 > @retval SHELL_DEVICE_ERROR Cannot access the file. > @retval SHELL_VOLUME_CORRUPTED The file is in bad format. > @@ -99,7 +133,8 @@ LoadVariablesFromFile ( > IN SHELL_FILE_HANDLE FileHandle, > IN CONST CHAR16 *Name, > IN CONST EFI_GUID *Guid, > - OUT BOOLEAN *Found > + OUT BOOLEAN *Found, > + IN BOOLEAN StandardFormatOutput > ) > { > EFI_STATUS Status; > @@ -116,6 +151,7 @@ LoadVariablesFromFile ( > CHAR16 *Attributes; > UINT8 *Buffer; > UINT32 Crc32; > + CHAR16 *HexString; >=20 > Status =3D ShellGetFileSize (FileHandle, &FileSize); > if (EFI_ERROR (Status)) { > @@ -221,11 +257,6 @@ LoadVariablesFromFile ( > ((Guid =3D=3D NULL) || CompareGuid (&Variable->Guid, Guid)) > ) { > Attributes =3D GetAttrType (Variable->Attributes); > - ShellPrintHiiEx ( > - -1, -1, NULL, STRING_TOKEN(STR_DMPSTORE_HEADER_LINE), > gShellDebug1HiiHandle, > - Attributes, &Variable->Guid, Variable->Name, Variable->DataSize > - ); > - SHELL_FREE_NON_NULL(Attributes); >=20 > *Found =3D TRUE; > Status =3D gRT->SetVariable ( > @@ -236,8 +267,38 @@ LoadVariablesFromFile ( > Variable->Data > ); > if (EFI_ERROR (Status)) { > - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN > (STR_DMPSTORE_LOAD_GEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", > Variable->Name, Status); > + if (StandardFormatOutput) { > + // > + // Supress SFO to indicate the loading is failed. > + // > + } else { > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD_GEN_FAIL), > gShellDebug1HiiHandle, > + L"dmpstore", Variable->Name, Status > + ); > + } > + } else { > + if (StandardFormatOutput) { > + HexString =3D AllocatePool ((Variable->DataSize * 2 + 1) * siz= eof > (CHAR16)); > + if (HexString !=3D NULL) { > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_VAR_SFO), > gShellDebug1HiiHandle, > + Variable->Name, &Variable->Guid, Variable->Attributes, Var= iable- > >DataSize, > + BinaryToHexString ( > + Variable->Data, Variable->DataSize, HexString, > + (Variable->DataSize * 2 + 1) * sizeof (CHAR16) > + ) > + ); > + FreePool (HexString); > + } > + } else { > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_HEADER_LINE), > gShellDebug1HiiHandle, > + Attributes, &Variable->Guid, Variable->Name, Variable->DataS= ize > + ); > + } > } > + SHELL_FREE_NON_NULL(Attributes); > } > } >=20 > @@ -350,14 +411,15 @@ AppendSingleVariableToFile ( >=20 > This is necessary since once a delete happens GetNextVariableName() wi= ll > work. >=20 > - @param[in] Name The variable name of the EFI variable (or NU= LL). > - @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 ig= nored. > + @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 specifie= d and > one was printed or > + deleted, then set this to TRUE, otherw= ise ignored. > + @param[in] StandardFormatOutput TRUE indicates Standard-Format > Output. >=20 > @retval SHELL_SUCCESS The operation was successful. > @retval SHELL_OUT_OF_RESOURCES A memorty allocation failed. > @@ -373,7 +435,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 +446,8 @@ CascadeProcessVariables ( > UINT32 Atts; > SHELL_STATUS ShellStatus; > UINTN NameSize; > - CHAR16 *RetString; > + CHAR16 *AttrString; > + CHAR16 *HexString; >=20 > if (ShellGetExecutionBreakFlag()) { > return (SHELL_ABORTED); > @@ -427,7 +491,7 @@ CascadeProcessVariables ( > // > // Recurse to the next iteration. We know "our" variable's name. > // > - ShellStatus =3D CascadeProcessVariables(Name, Guid, Type, FileHandle, > FoundVarName, FoundVarGuid, FoundOne); > + ShellStatus =3D CascadeProcessVariables (Name, Guid, Type, FileHandle, > + FoundVarName, FoundVarGuid, FoundOne, StandardFormatOutput); >=20 > if (ShellGetExecutionBreakFlag() || (ShellStatus =3D=3D SHELL_ABORTED)= ) { > SHELL_FREE_NON_NULL(FoundVarName); > @@ -459,50 +523,86 @@ CascadeProcessVariables ( > Status =3D gRT->GetVariable (FoundVarName, &FoundVarGuid, &Atts, > &DataSize, DataBuffer); > } > } > - if ((Type =3D=3D DmpStoreDisplay) || (Type =3D=3D DmpStoreSave)) { > // > // Last error check then print this variable out. > // > + if (Type =3D=3D DmpStoreDisplay) { > + if (!EFI_ERROR(Status) && (DataBuffer !=3D NULL) && (FoundVarName = !=3D > NULL)) { > + AttrString =3D GetAttrType(Atts); > + if (StandardFormatOutput) { > + HexString =3D AllocatePool ((DataSize * 2 + 1) * sizeof (CHAR1= 6)); > + if (HexString !=3D NULL) { > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_VAR_SFO), > gShellDebug1HiiHandle, > + FoundVarName, &FoundVarGuid, Atts, DataSize, > + BinaryToHexString ( > + DataBuffer, DataSize, HexString, (DataSize * 2 + 1) * si= zeof (CHAR16) > + ) > + ); > + FreePool (HexString); > + } else { > + Status =3D EFI_OUT_OF_RESOURCES; > + } > + } else { > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_HEADER_LINE), > gShellDebug1HiiHandle, > + AttrString, &FoundVarGuid, FoundVarName, DataSize > + ); > + DumpHex (2, 0, DataSize, DataBuffer); > + } > + SHELL_FREE_NON_NULL (AttrString); > + } > + } else if (Type =3D=3D DmpStoreSave) { > if (!EFI_ERROR(Status) && (DataBuffer !=3D NULL) && (FoundVarName = !=3D > NULL)) { > - RetString =3D GetAttrType(Atts); > - ShellPrintHiiEx( > - -1, > - -1, > - NULL, > - STRING_TOKEN(STR_DMPSTORE_HEADER_LINE), > - gShellDebug1HiiHandle, > - RetString, > - &FoundVarGuid, > - FoundVarName, > - DataSize); > - if (Type =3D=3D DmpStoreDisplay) { > - DumpHex(2, 0, DataSize, DataBuffer); > + AttrString =3D GetAttrType (Atts); > + if (StandardFormatOutput) { > + HexString =3D AllocatePool ((DataSize * 2 + 1) * sizeof (CHAR1= 6)); > + if (HexString !=3D NULL) { > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_VAR_SFO), > gShellDebug1HiiHandle, > + FoundVarName, &FoundVarGuid, Atts, DataSize, > + BinaryToHexString ( > + DataBuffer, DataSize, HexString, (DataSize * 2 + 1) * si= zeof (CHAR16) > + ) > + ); > + FreePool (HexString); > + } else { > + Status =3D EFI_OUT_OF_RESOURCES; > + } > } else { > - Status =3D AppendSingleVariableToFile ( > - FileHandle, > - FoundVarName, > - &FoundVarGuid, > - Atts, > - (UINT32) DataSize, > - DataBuffer > - ); > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_HEADER_LINE), > gShellDebug1HiiHandle, > + AttrString, &FoundVarGuid, FoundVarName, DataSize > + ); > } > - SHELL_FREE_NON_NULL(RetString); > + Status =3D AppendSingleVariableToFile ( > + FileHandle, > + FoundVarName, > + &FoundVarGuid, > + Atts, > + (UINT32) DataSize, > + DataBuffer > + ); > + SHELL_FREE_NON_NULL (AttrString); > } > } else if (Type =3D=3D 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 =3D gRT->SetVariable (FoundVarName, > &FoundVarGuid, Atts, 0, NULL); > + if (StandardFormatOutput) { > + if (SetStatus =3D=3D 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 +623,11 @@ CascadeProcessVariables ( > /** > Function to display or delete variables. This will set up and call in= to the > recursive function. >=20 > - @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. >=20 > @retval SHELL_SUCCESS The operation was successful. > @retval SHELL_OUT_OF_RESOURCES A memorty allocation failed. > @@ -539,7 +640,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 +652,14 @@ ProcessVariables ( > ShellStatus =3D SHELL_SUCCESS; > ZeroMem (&FoundVarGuid, sizeof(EFI_GUID)); >=20 > + if (StandardFormatOutput) { > + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_GEN_SFO_HEADER), > + gShellDebug1HiiHandle, L"dmpstore"); } > + > if (Type =3D=3D DmpStoreLoad) { > - ShellStatus =3D LoadVariablesFromFile (FileHandle, Name, Guid, &Foun= d); > + ShellStatus =3D LoadVariablesFromFile (FileHandle, Name, Guid, > + &Found, StandardFormatOutput); > } else { > - ShellStatus =3D CascadeProcessVariables(Name, Guid, Type, FileHandle= , > NULL, FoundVarGuid, &Found); > + ShellStatus =3D CascadeProcessVariables (Name, Guid, Type, > + FileHandle, NULL, FoundVarGuid, &Found, StandardFormatOutput); > } >=20 > if (!Found) { > @@ -561,13 +667,25 @@ ProcessVariables ( > ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), > gShellDebug1HiiHandle, L"dmpstore"); > return (ShellStatus); > } else if (Name !=3D NULL && Guid =3D=3D 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 !=3D NULL && Guid !=3D NULL) { > ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN > (STR_DMPSTORE_NO_VAR_FOUND_GN), gShellDebug1HiiHandle, > L"dmpstore", Guid, Name); > } else if (Name =3D=3D NULL && Guid =3D=3D 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 =3D=3D NULL && Guid !=3D 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 +698,7 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] =3D { > {L"-s", TypeValue}, > {L"-all", TypeFlag}, > {L"-guid", TypeValue}, > + {L"-sfo", TypeFlag}, > {NULL, TypeMax} > }; >=20 > @@ -608,12 +727,14 @@ ShellCommandRunDmpStore ( > DMP_STORE_TYPE Type; > SHELL_FILE_HANDLE FileHandle; > EFI_FILE_INFO *FileInfo; > + BOOLEAN StandardFormatOutput; >=20 > - ShellStatus =3D SHELL_SUCCESS; > - Package =3D NULL; > - FileHandle =3D NULL; > - File =3D NULL; > - Type =3D DmpStoreDisplay; > + ShellStatus =3D SHELL_SUCCESS; > + Package =3D NULL; > + FileHandle =3D NULL; > + File =3D NULL; > + Type =3D DmpStoreDisplay; > + StandardFormatOutput =3D FALSE; >=20 > Status =3D ShellCommandLineParse (ParamList, &Package, &ProblemParam, > TRUE); > if (EFI_ERROR(Status)) { > @@ -742,6 +863,10 @@ ShellCommandRunDmpStore ( > } else if (ShellCommandLineGetFlag(Package, L"-d")) { > Type =3D DmpStoreDelete; > } > + > + if (ShellCommandLineGetFlag (Package,L"-sfo")) { > + StandardFormatOutput =3D TRUE; > + } > } >=20 > if (ShellStatus =3D=3D SHELL_SUCCESS) { @@ -750,7 +875,7 @@ > ShellCommandRunDmpStore ( > } else if (Type =3D=3D DmpStoreLoad) { > ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD= ), > gShellDebug1HiiHandle, File); > } > - ShellStatus =3D ProcessVariables (Name, Guid, Type, FileHandle); > + ShellStatus =3D ProcessVariables (Name, Guid, Type, FileHandle, > + StandardFormatOutput); > if ((Type =3D=3D DmpStoreLoad) || (Type =3D=3D DmpStoreSave)) { > ShellCloseFile (&FileHandle); > } > diff --git > a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1Comman > dsLib.uni > b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1Comman > dsLib.uni > index 52c2af0..c97bd62 100644 > --- > a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1Comman > dsLib.uni > +++ > b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1Comman > d > +++ sLib.uni > @@ -407,9 +407,14 @@ > #string STR_DMPSTORE_HEADER_LINE #language en-US > "Variable %H%s%N '%H%g%N:%H%s%N' DataSize =3D 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" >=20 > #string STR_GET_HELP_COMP #language en-US "" > ".TH comp 0 "Compare 2 files"\r\n" > -- > 2.9.0.windows.1 >=20 > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel