What to do:
1. Merge VariableInfo in SecurityPkg to VariableInfo in MdeModulePkg.

Why to do:
1. Remove code duplication and reduce maintenance effort.
The functionality of VariableInfo in SecurityPkg has covered VariableInfo
in MdeModulePkg.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.z...@intel.com>
Reviewed-by: Jiewen Yao <jiewen....@intel.com>
Reviewed-by: Liming Gao <liming....@intel.com>
---
 .../Application/VariableInfo/VariableInfo.c        | 209 ++++++++++++++++++---
 .../Application/VariableInfo/VariableInfo.inf      |  25 ++-
 .../Application/VariableInfo/VariableInfo.uni      | Bin 2430 -> 2904 bytes
 3 files changed, 205 insertions(+), 29 deletions(-)

diff --git a/MdeModulePkg/Application/VariableInfo/VariableInfo.c 
b/MdeModulePkg/Application/VariableInfo/VariableInfo.c
index 50b67d0..727e1ce 100644
--- a/MdeModulePkg/Application/VariableInfo/VariableInfo.c
+++ b/MdeModulePkg/Application/VariableInfo/VariableInfo.c
@@ -1,35 +1,190 @@
 /** @file
-  If the Variable services have PcdVariableCollectStatistics set to TRUE then 
-  the EFI system table will contain statistical information about variable 
usage
-  an this utility will print out the information. You can use console 
redirection
-  to capture the data.
-  
-  Copyright (c) 2006 - 2007, 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        
-  http://opensource.org/licenses/bsd-license.php                               
             
-
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,        
             
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.             
+  If the Variable services have PcdVariableCollectStatistics set to TRUE then
+  this utility will print out the statistics information. You can use console
+  redirection to capture the data.
+
+  Copyright (c) 2006 - 2015, 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
+  http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
 **/
 
 #include <Uefi.h>
 #include <Library/UefiLib.h>
 #include <Library/UefiApplicationEntryPoint.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/BaseLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/DebugLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+
 #include <Guid/VariableFormat.h>
+#include <Guid/SmmVariableCommon.h>
+#include <Protocol/SmmCommunication.h>
+#include <Protocol/SmmVariable.h>
+
+EFI_SMM_COMMUNICATION_PROTOCOL  *mSmmCommunication = NULL;
+
+/**
+  This function get the variable statistics data from SMM variable driver.
+
+  @param[in, out] SmmCommunicateHeader In input, a pointer to a collection of 
data that will
+                                       be passed into an SMM environment. In 
output, a pointer
+                                       to a collection of data that comes from 
an SMM environment.
+  @param[in, out] SmmCommunicateSize   The size of the SmmCommunicateHeader.
+
+  @retval EFI_SUCCESS               Get the statistics data information.
+  @retval EFI_NOT_FOUND             Not found.
+  @retval EFI_BUFFER_TO_SMALL       DataSize is too small for the result.
+
+**/
+EFI_STATUS
+EFIAPI
+GetVariableStatisticsData (
+  IN OUT  EFI_SMM_COMMUNICATE_HEADER  *SmmCommunicateHeader,
+  IN OUT  UINTN                       *SmmCommunicateSize
+  )
+{
+  EFI_STATUS                          Status;
+  SMM_VARIABLE_COMMUNICATE_HEADER     *SmmVariableFunctionHeader;
+
+  CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid);
+  SmmCommunicateHeader->MessageLength = *SmmCommunicateSize - OFFSET_OF 
(EFI_SMM_COMMUNICATE_HEADER, Data);
+
+  SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) 
&SmmCommunicateHeader->Data[0];
+  SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_STATISTICS;
 
+  Status = mSmmCommunication->Communicate (mSmmCommunication, 
SmmCommunicateHeader, SmmCommunicateSize);
+  ASSERT_EFI_ERROR (Status);
+
+  Status = SmmVariableFunctionHeader->ReturnStatus;
+  return Status;
+}
+
+/**
+
+  This function get and print the variable statistics data from SMM variable 
driver.
+
+  @retval EFI_SUCCESS               Print the statistics information 
successfully.
+  @retval EFI_NOT_FOUND             Not found the statistics information.
+
+**/
+EFI_STATUS
+PrintInfoFromSmm (
+  VOID
+  )
+{
+  EFI_STATUS                                     Status;
+  VARIABLE_INFO_ENTRY                            *VariableInfo;
+  EFI_SMM_COMMUNICATE_HEADER                     *CommBuffer;
+  UINTN                                          RealCommSize;
+  UINTN                                          CommSize;
+  SMM_VARIABLE_COMMUNICATE_HEADER                *FunctionHeader;
+  EFI_SMM_VARIABLE_PROTOCOL                      *Smmvariable;
+
+  Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **) 
&Smmvariable);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID 
**) &mSmmCommunication);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  CommSize = SMM_COMMUNICATE_HEADER_SIZE + 
SMM_VARIABLE_COMMUNICATE_HEADER_SIZE;
+  RealCommSize = CommSize;
+  CommBuffer = AllocateZeroPool (CommSize);
+  ASSERT (CommBuffer != NULL);
+
+  Print (L"Non-Volatile SMM Variables:\n");
+  do {
+    Status = GetVariableStatisticsData (CommBuffer, &CommSize);
+    if (Status == EFI_BUFFER_TOO_SMALL) {
+      FreePool (CommBuffer);
+      CommBuffer = AllocateZeroPool (CommSize);
+      ASSERT (CommBuffer != NULL);
+      RealCommSize = CommSize;
+      Status = GetVariableStatisticsData (CommBuffer, &CommSize);
+    }
+
+    if (EFI_ERROR (Status) || (CommSize <= SMM_COMMUNICATE_HEADER_SIZE + 
SMM_VARIABLE_COMMUNICATE_HEADER_SIZE)) {
+      break;
+    }
+
+    if (CommSize < RealCommSize) {
+      CommSize = RealCommSize;
+    }
+
+    FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) CommBuffer->Data;
+    VariableInfo   = (VARIABLE_INFO_ENTRY *) FunctionHeader->Data;
+
+    if (!VariableInfo->Volatile) {
+      Print (
+          L"%g R%03d(%03d) W%03d D%03d:%s\n",
+          &VariableInfo->VendorGuid,
+          VariableInfo->ReadCount,
+          VariableInfo->CacheCount,
+          VariableInfo->WriteCount,
+          VariableInfo->DeleteCount,
+          (CHAR16 *)(VariableInfo + 1)
+          );
+    }
+  } while (TRUE);
+
+  Print (L"Volatile SMM Variables:\n");
+  ZeroMem (CommBuffer, CommSize);
+  do {
+    Status = GetVariableStatisticsData (CommBuffer, &CommSize);
+    if (Status == EFI_BUFFER_TOO_SMALL) {
+      FreePool (CommBuffer);
+      CommBuffer = AllocateZeroPool (CommSize);
+      ASSERT (CommBuffer != NULL);
+      RealCommSize = CommSize;
+      Status = GetVariableStatisticsData (CommBuffer, &CommSize);
+    }
+
+    if (EFI_ERROR (Status) || (CommSize <= SMM_COMMUNICATE_HEADER_SIZE + 
SMM_VARIABLE_COMMUNICATE_HEADER_SIZE)) {
+      break;
+    }
+
+    if (CommSize < RealCommSize) {
+      CommSize = RealCommSize;
+    }
+
+    FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) CommBuffer->Data;
+    VariableInfo   = (VARIABLE_INFO_ENTRY *) FunctionHeader->Data;
+
+    if (VariableInfo->Volatile) {
+      Print (
+          L"%g R%03d(%03d) W%03d D%03d:%s\n",
+          &VariableInfo->VendorGuid,
+          VariableInfo->ReadCount,
+          VariableInfo->CacheCount,
+          VariableInfo->WriteCount,
+          VariableInfo->DeleteCount,
+          (CHAR16 *)(VariableInfo + 1)
+          );
+    }
+  } while (TRUE);
+
+  FreePool (CommBuffer);
+  return Status;
+}
 
 /**
   The user Entry Point for Application. The user code starts with this function
-  as the real entry point for the image goes into a library that calls this 
+  as the real entry point for the image goes into a library that calls this
   function.
 
-
-  @param[in] ImageHandle    The firmware allocated handle for the EFI image.  
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.
   @param[in] SystemTable    A pointer to the EFI System Table.
-  
+
   @retval EFI_SUCCESS       The entry point is executed successfully.
   @retval other             Some error occurs when executing this entry point.
 
@@ -46,14 +201,25 @@ UefiMain (
   VARIABLE_INFO_ENTRY   *Entry;
 
   Status = EfiGetSystemConfigurationTable (&gEfiVariableGuid, (VOID **)&Entry);
+  if (EFI_ERROR (Status) || (Entry == NULL)) {
+    Status = EfiGetSystemConfigurationTable (&gEfiAuthenticatedVariableGuid, 
(VOID **)&Entry);
+  }
+
+  if (EFI_ERROR (Status) || (Entry == NULL)) {
+    Status = PrintInfoFromSmm ();
+    if (!EFI_ERROR (Status)) {
+      return Status;
+    }
+  }
+
   if (!EFI_ERROR (Status) && (Entry != NULL)) {
     Print (L"Non-Volatile EFI Variables:\n");
     VariableInfo = Entry;
     do {
       if (!VariableInfo->Volatile) {
         Print (
-          L"%g R%03d(%03d) W%03d D%03d:%s\n", 
-          &VariableInfo->VendorGuid,  
+          L"%g R%03d(%03d) W%03d D%03d:%s\n",
+          &VariableInfo->VendorGuid,
           VariableInfo->ReadCount,
           VariableInfo->CacheCount,
           VariableInfo->WriteCount,
@@ -70,8 +236,8 @@ UefiMain (
     do {
       if (VariableInfo->Volatile) {
         Print (
-          L"%g R%03d(%03d) W%03d D%03d:%s\n", 
-          &VariableInfo->VendorGuid,  
+          L"%g R%03d(%03d) W%03d D%03d:%s\n",
+          &VariableInfo->VendorGuid,
           VariableInfo->ReadCount,
           VariableInfo->CacheCount,
           VariableInfo->WriteCount,
@@ -88,7 +254,6 @@ UefiMain (
     Print (L"  1. Set PcdVariableCollectStatistics as TRUE\n");
     Print (L"  2. Rebuild Variable Dxe driver\n");
     Print (L"  3. Run \"VariableInfo\" cmd again\n");
-
   }
 
   return Status;
diff --git a/MdeModulePkg/Application/VariableInfo/VariableInfo.inf 
b/MdeModulePkg/Application/VariableInfo/VariableInfo.inf
index 4d9dc71..9074b52 100644
--- a/MdeModulePkg/Application/VariableInfo/VariableInfo.inf
+++ b/MdeModulePkg/Application/VariableInfo/VariableInfo.inf
@@ -1,9 +1,12 @@
 ## @file
-#  This is a shell application that will display statistical information about 
variable usage.
+#  A shell application that displays statistical information about variable 
usage.
+#
+#  This application can display statistical information about variable usage 
for SMM variable
+#  driver and non-SMM variable driver.
 #  Note that if Variable Dxe driver doesn't enable the feature by setting 
PcdVariableCollectStatistics
-#  as TRUE, The application will not display variable statistical information.
+#  as TRUE, the application will not display variable statistical information.
 #
-#  Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 2007 - 2015, 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
@@ -20,7 +23,6 @@
   FILE_GUID                      = 202A2922-8C27-4943-9855-26180BF9F113
   MODULE_TYPE                    = UEFI_APPLICATION
   VERSION_STRING                 = 1.0
-
   ENTRY_POINT                    = UefiMain
 
 #
@@ -32,18 +34,27 @@
 [Sources]
   VariableInfo.c
 
-
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
 
-
 [LibraryClasses]
   UefiApplicationEntryPoint
   UefiLib
+  UefiBootServicesTableLib
+  BaseMemoryLib
+  MemoryAllocationLib
+
+[Protocols]
+  gEfiSmmCommunicationProtocolGuid   ## SOMETIMES_CONSUMES
 
+  ## UNDEFINED            # Used to do smm communication
+  ## SOMETIMES_CONSUMES 
+  gEfiSmmVariableProtocolGuid 
+  
 [Guids]
-  gEfiVariableGuid          ## CONSUMES ## SystemTable
+  gEfiAuthenticatedVariableGuid      ## SOMETIMES_CONSUMES   ## SystemTable
+  gEfiVariableGuid                   ## CONSUMES             ## SystemTable
 
 [UserExtensions.TianoCore."ExtraFiles"]
   VariableInfoExtra.uni
diff --git a/MdeModulePkg/Application/VariableInfo/VariableInfo.uni 
b/MdeModulePkg/Application/VariableInfo/VariableInfo.uni
index 
ea839d5c0bb7161d3d2f6495f575e97139e934e8..b8e6fd406f0263b6633ade51be96d4065dc58f68
 100644
GIT binary patch
delta 311
zcmew-bVF={3ZvshQ$zj~hD?THh608hhD3%+hT_SNoQ4zE*|CQ(WPl_lI!d!917-3i
z=4SgVFr+c$GZZl>Fa$IB0-*v!8BnSSs4kHq31~nn11|#?gFX-{Fr<LR%Yb4a^*{rF
zA__n<ABc4!`X}piit-|>)0_D4En~^#j~vaDgP5EcO*c<v@@K*0O0CJW*lV!4lpoEd
WAe)qtZ6e-9FAXQVaI68lsuuwLHc1=+

delta 136
zcmca1_D^VnieLys216!8F@pk>Oq_h1-H^Q;$jf2KnfN<<;sKG#j~E}Zg4Cr>G?bqF
riYsNZ2eT8S$>wfme-?uJne`ZyCdaeuPhQ6112jl)vK-eMWW(|RyA3E-

-- 
1.9.5.msysgit.0


------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors 
network devices and physical & virtual servers, alerts via email & sms 
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to