]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fixed issues:
authorydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 26 Jul 2012 07:15:31 +0000 (07:15 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 26 Jul 2012 07:15:31 +0000 (07:15 +0000)
1.Refine the logic about show different attribute.
2.Refine the logic about allocate memory for variable name and data.

Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13558 6f19259b-4bc3-4df7-8a09-765794883524

ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c

index b98c048ad9c3e8d903082eab0d3c3a4ed8daed92..6d27ecc27727f88b58d6787beb556044da802509 100644 (file)
 \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
@@ -47,38 +78,32 @@ ProcessVariables (
   )\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
@@ -87,18 +112,35 @@ ProcessVariables (
       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
@@ -113,6 +155,24 @@ ProcessVariables (
       }\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
@@ -124,7 +184,7 @@ ProcessVariables (
         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
@@ -156,6 +216,11 @@ ProcessVariables (
     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