\r
#include "UefiShellDebug1CommandsLib.h"\r
\r
-STATIC CHAR16 *AttrType[] = {\r
- L"invalid", // 000\r
- L"invalid", // 001\r
- L"BS", // 010\r
- L"NV+BS", // 011\r
- L"RT+BS", // 100\r
- L"NV+RT+BS", // 101\r
- L"RT+BS", // 110\r
- L"NV+RT+BS", // 111\r
-};\r
+\r
+#define INIT_NAME_BUFFER_SIZE 128\r
+#define INIT_DATA_BUFFER_SIZE 1024\r
+#define INIT_ATTS_BUFFER_SIZE 64\r
+\r
+CONST CHAR16 *\r
+EFIAPI\r
+GetAttrType (\r
+ IN CONST UINT32 Atts,\r
+ IN OUT CHAR16 *RetString\r
+ )\r
+{\r
+ StrCpy(RetString, L"");\r
+\r
+ if (Atts & EFI_VARIABLE_NON_VOLATILE) {\r
+ StrCat(RetString, L"+NV");\r
+ }\r
+ if (Atts & EFI_VARIABLE_RUNTIME_ACCESS) {\r
+ StrCat(RetString, L"+RS+BS");\r
+ } else if (Atts & EFI_VARIABLE_BOOTSERVICE_ACCESS) {\r
+ StrCat(RetString, L"+BS");\r
+ }\r
+ if (Atts & EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
+ StrCat(RetString, L"+HR");\r
+ }\r
+ if (Atts & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) {\r
+ StrCat(RetString, L"+AW");\r
+ }\r
+ if (Atts & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) {\r
+ StrCat(RetString, L"+AT");\r
+ }\r
+\r
+ if (RetString[0] == L'+') {\r
+ return (RetString+1);\r
+ }\r
+ if (RetString[0] == CHAR_NULL) {\r
+ StrCpy(RetString, L"invalid");\r
+ return (RetString);\r
+ }\r
+ return (RetString);\r
+}\r
\r
/**\r
Function to display or delete variables.\r
)\r
{\r
EFI_STATUS Status;\r
- UINT64 MaxStorSize;\r
- UINT64 RemStorSize;\r
- UINT64 MaxVarSize;\r
CHAR16 *FoundVarName;\r
- UINTN Size;\r
EFI_GUID FoundVarGuid;\r
UINT8 *DataBuffer;\r
UINTN DataSize;\r
UINT32 Atts;\r
SHELL_STATUS ShellStatus;\r
BOOLEAN Found;\r
-\r
- Status = gRT->QueryVariableInfo(EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS|EFI_VARIABLE_NON_VOLATILE, &MaxStorSize, &RemStorSize, &MaxVarSize);\r
- if (EFI_ERROR(Status)) {\r
- return (SHELL_DEVICE_ERROR);\r
- }\r
+ UINTN NameBufferSize; // Allocated Name buffer size\r
+ UINTN NameSize;\r
+ CHAR16 *OldName;\r
+ UINTN OldNameBufferSize;\r
+ UINTN DataBufferSize; // Allocated data buffer size\r
+ CHAR16 RetString[INIT_ATTS_BUFFER_SIZE];\r
\r
Found = FALSE;\r
ShellStatus = SHELL_SUCCESS;\r
- Size = PcdGet16(PcdShellFileOperationSize);\r
- FoundVarName = AllocateZeroPool(Size);\r
\r
+ NameBufferSize = INIT_NAME_BUFFER_SIZE;\r
+ DataBufferSize = INIT_DATA_BUFFER_SIZE;\r
+ FoundVarName = AllocateZeroPool (NameBufferSize);\r
if (FoundVarName == NULL) {\r
return (SHELL_OUT_OF_RESOURCES);\r
- }\r
- FoundVarName[0] = CHAR_NULL;\r
-\r
-\r
- DataSize = (UINTN)MaxVarSize;\r
- DataBuffer = AllocateZeroPool(DataSize);\r
+ } \r
+ DataBuffer = AllocatePool (DataBufferSize);\r
if (DataBuffer == NULL) {\r
- FreePool(FoundVarName);\r
+ FreePool (FoundVarName);\r
return (SHELL_OUT_OF_RESOURCES);\r
}\r
\r
ShellStatus = SHELL_ABORTED;\r
break;\r
}\r
- Size = (UINTN)PcdGet16(PcdShellFileOperationSize);\r
- DataSize = (UINTN)MaxVarSize;\r
\r
- Status = gRT->GetNextVariableName(&Size, FoundVarName, &FoundVarGuid);\r
+ NameSize = NameBufferSize;\r
+ Status = gRT->GetNextVariableName (&NameSize, FoundVarName, &FoundVarGuid);\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ OldName = FoundVarName;\r
+ OldNameBufferSize = NameBufferSize;\r
+ //\r
+ // Expand at least twice to avoid reallocate many times\r
+ //\r
+ NameBufferSize = NameSize > NameBufferSize * 2 ? NameSize : NameBufferSize * 2;\r
+ FoundVarName = AllocateZeroPool (NameBufferSize);\r
+ if (FoundVarName == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ FreePool (OldName);\r
+ break;\r
+ }\r
+ //\r
+ // Preserve the original content to get correct iteration for GetNextVariableName() call\r
+ //\r
+ CopyMem (FoundVarName, OldName, OldNameBufferSize);\r
+ FreePool (OldName);\r
+ NameSize = NameBufferSize;\r
+ Status = gRT->GetNextVariableName (&NameSize, FoundVarName, &FoundVarGuid);\r
+ }\r
if (Status == EFI_NOT_FOUND) {\r
break;\r
}\r
ASSERT_EFI_ERROR(Status);\r
\r
- Status = gRT->GetVariable(FoundVarName, &FoundVarGuid, &Atts, &DataSize, DataBuffer);\r
- ASSERT_EFI_ERROR(Status);\r
-\r
//\r
// Check if it matches\r
//\r
}\r
}\r
\r
+ DataSize = DataBufferSize;\r
+ Status = gRT->GetVariable (FoundVarName, &FoundVarGuid, &Atts, &DataSize, DataBuffer);\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ //\r
+ // Expand at least twice to avoid reallocate many times\r
+ //\r
+ FreePool (DataBuffer);\r
+ DataBufferSize = DataSize > DataBufferSize * 2 ? DataSize : DataBufferSize * 2;\r
+ DataBuffer = AllocatePool (DataBufferSize);\r
+ if (DataBuffer == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ break;\r
+ }\r
+ DataSize = DataBufferSize;\r
+ Status = gRT->GetVariable (FoundVarName, &FoundVarGuid, &Atts, &DataSize, DataBuffer);\r
+ } \r
+ ASSERT_EFI_ERROR(Status);\r
+\r
//\r
// do the print or delete\r
//\r
NULL,\r
STRING_TOKEN(STR_DMPSTORE_HEADER_LINE),\r
gShellDebug1HiiHandle,\r
- AttrType[Atts & 7],\r
+ GetAttrType(Atts, RetString),\r
&FoundVarGuid,\r
FoundVarName,\r
DataSize);\r
FreePool(DataBuffer);\r
}\r
if (!Found) {\r
+ if (Status == EFI_OUT_OF_RESOURCES) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle);\r
+ return SHELL_OUT_OF_RESOURCES;\r
+ }\r
+\r
if (VariableName != NULL && Guid == NULL) {\r
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_N), gShellDebug1HiiHandle, VariableName);\r
} else if (VariableName != NULL && Guid != NULL) {\r