]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/VariableInfo/VariableInfo.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Application / VariableInfo / VariableInfo.c
index 727e1ce105f32d531bb1d72187b3266e60374ba5..f213471e9abcdc9287d75a78ce868c638ef24704 100644 (file)
@@ -3,14 +3,8 @@
   this utility will print out the statistics information. You can use console\r
   redirection to capture the data.\r
 \r
   this utility will print out the statistics information. You can use console\r
   redirection to capture the data.\r
 \r
-  Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 \r
 **/\r
 \r
@@ -25,6 +19,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include <Guid/VariableFormat.h>\r
 #include <Guid/SmmVariableCommon.h>\r
 \r
 #include <Guid/VariableFormat.h>\r
 #include <Guid/SmmVariableCommon.h>\r
+#include <Guid/PiSmmCommunicationRegionTable.h>\r
 #include <Protocol/SmmCommunication.h>\r
 #include <Protocol/SmmVariable.h>\r
 \r
 #include <Protocol/SmmCommunication.h>\r
 #include <Protocol/SmmVariable.h>\r
 \r
@@ -86,6 +81,11 @@ PrintInfoFromSmm (
   UINTN                                          CommSize;\r
   SMM_VARIABLE_COMMUNICATE_HEADER                *FunctionHeader;\r
   EFI_SMM_VARIABLE_PROTOCOL                      *Smmvariable;\r
   UINTN                                          CommSize;\r
   SMM_VARIABLE_COMMUNICATE_HEADER                *FunctionHeader;\r
   EFI_SMM_VARIABLE_PROTOCOL                      *Smmvariable;\r
+  EDKII_PI_SMM_COMMUNICATION_REGION_TABLE        *PiSmmCommunicationRegionTable;\r
+  UINT32                                         Index;\r
+  EFI_MEMORY_DESCRIPTOR                          *Entry;\r
+  UINTN                                          Size;\r
+  UINTN                                          MaxSize;\r
 \r
   Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **) &Smmvariable);\r
   if (EFI_ERROR (Status)) {\r
 \r
   Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **) &Smmvariable);\r
   if (EFI_ERROR (Status)) {\r
@@ -97,30 +97,48 @@ PrintInfoFromSmm (
     return Status;\r
   }\r
 \r
     return Status;\r
   }\r
 \r
-  CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE;\r
-  RealCommSize = CommSize;\r
-  CommBuffer = AllocateZeroPool (CommSize);\r
+  CommBuffer = NULL;\r
+  RealCommSize = 0;\r
+  Status = EfiGetSystemConfigurationTable (\r
+             &gEdkiiPiSmmCommunicationRegionTableGuid,\r
+             (VOID **) &PiSmmCommunicationRegionTable\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  ASSERT (PiSmmCommunicationRegionTable != NULL);\r
+  Entry = (EFI_MEMORY_DESCRIPTOR *) (PiSmmCommunicationRegionTable + 1);\r
+  Size = 0;\r
+  MaxSize = 0;\r
+  for (Index = 0; Index < PiSmmCommunicationRegionTable->NumberOfEntries; Index++) {\r
+    if (Entry->Type == EfiConventionalMemory) {\r
+      Size = EFI_PAGES_TO_SIZE ((UINTN) Entry->NumberOfPages);\r
+      if (Size > (SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (VARIABLE_INFO_ENTRY))) {\r
+        if (Size > MaxSize) {\r
+          MaxSize = Size;\r
+          RealCommSize = MaxSize;\r
+          CommBuffer = (EFI_SMM_COMMUNICATE_HEADER *) (UINTN) Entry->PhysicalStart;\r
+        }\r
+      }\r
+    }\r
+    Entry = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) Entry + PiSmmCommunicationRegionTable->DescriptorSize);\r
+  }\r
   ASSERT (CommBuffer != NULL);\r
   ASSERT (CommBuffer != NULL);\r
+  ZeroMem (CommBuffer, RealCommSize);\r
 \r
   Print (L"Non-Volatile SMM Variables:\n");\r
   do {\r
 \r
   Print (L"Non-Volatile SMM Variables:\n");\r
   do {\r
+    CommSize = RealCommSize;\r
     Status = GetVariableStatisticsData (CommBuffer, &CommSize);\r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
     Status = GetVariableStatisticsData (CommBuffer, &CommSize);\r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      FreePool (CommBuffer);\r
-      CommBuffer = AllocateZeroPool (CommSize);\r
-      ASSERT (CommBuffer != NULL);\r
-      RealCommSize = CommSize;\r
-      Status = GetVariableStatisticsData (CommBuffer, &CommSize);\r
+      Print (L"The generic SMM communication buffer provided by SmmCommunicationRegionTable is too small\n");\r
+      return Status;\r
     }\r
 \r
     if (EFI_ERROR (Status) || (CommSize <= SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE)) {\r
       break;\r
     }\r
 \r
     }\r
 \r
     if (EFI_ERROR (Status) || (CommSize <= SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE)) {\r
       break;\r
     }\r
 \r
-    if (CommSize < RealCommSize) {\r
-      CommSize = RealCommSize;\r
-    }\r
-\r
     FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) CommBuffer->Data;\r
     VariableInfo   = (VARIABLE_INFO_ENTRY *) FunctionHeader->Data;\r
 \r
     FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) CommBuffer->Data;\r
     VariableInfo   = (VARIABLE_INFO_ENTRY *) FunctionHeader->Data;\r
 \r
@@ -138,25 +156,19 @@ PrintInfoFromSmm (
   } while (TRUE);\r
 \r
   Print (L"Volatile SMM Variables:\n");\r
   } while (TRUE);\r
 \r
   Print (L"Volatile SMM Variables:\n");\r
-  ZeroMem (CommBuffer, CommSize);\r
+  ZeroMem (CommBuffer, RealCommSize);\r
   do {\r
   do {\r
+    CommSize = RealCommSize;\r
     Status = GetVariableStatisticsData (CommBuffer, &CommSize);\r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
     Status = GetVariableStatisticsData (CommBuffer, &CommSize);\r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      FreePool (CommBuffer);\r
-      CommBuffer = AllocateZeroPool (CommSize);\r
-      ASSERT (CommBuffer != NULL);\r
-      RealCommSize = CommSize;\r
-      Status = GetVariableStatisticsData (CommBuffer, &CommSize);\r
+      Print (L"The generic SMM communication buffer provided by SmmCommunicationRegionTable is too small\n");\r
+      return Status;\r
     }\r
 \r
     if (EFI_ERROR (Status) || (CommSize <= SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE)) {\r
       break;\r
     }\r
 \r
     }\r
 \r
     if (EFI_ERROR (Status) || (CommSize <= SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE)) {\r
       break;\r
     }\r
 \r
-    if (CommSize < RealCommSize) {\r
-      CommSize = RealCommSize;\r
-    }\r
-\r
     FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) CommBuffer->Data;\r
     VariableInfo   = (VARIABLE_INFO_ENTRY *) FunctionHeader->Data;\r
 \r
     FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) CommBuffer->Data;\r
     VariableInfo   = (VARIABLE_INFO_ENTRY *) FunctionHeader->Data;\r
 \r
@@ -173,7 +185,6 @@ PrintInfoFromSmm (
     }\r
   } while (TRUE);\r
 \r
     }\r
   } while (TRUE);\r
 \r
-  FreePool (CommBuffer);\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -249,10 +260,10 @@ UefiMain (
     } while (VariableInfo != NULL);\r
 \r
   } else {\r
     } while (VariableInfo != NULL);\r
 \r
   } else {\r
-    Print (L"Warning: Variable Dxe driver doesn't enable the feature of statistical information!\n");\r
+    Print (L"Warning: Variable Dxe/Smm driver doesn't enable the feature of statistical information!\n");\r
     Print (L"If you want to see this info, please:\n");\r
     Print (L"  1. Set PcdVariableCollectStatistics as TRUE\n");\r
     Print (L"If you want to see this info, please:\n");\r
     Print (L"  1. Set PcdVariableCollectStatistics as TRUE\n");\r
-    Print (L"  2. Rebuild Variable Dxe driver\n");\r
+    Print (L"  2. Rebuild Variable Dxe/Smm driver\n");\r
     Print (L"  3. Run \"VariableInfo\" cmd again\n");\r
   }\r
 \r
     Print (L"  3. Run \"VariableInfo\" cmd again\n");\r
   }\r
 \r