From 627e117a727c3ba93ce8fce697f7b9dbe654c408 Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Wed, 1 Jul 2015 03:02:45 +0000 Subject: [PATCH] MdeModulePkg VariableInfo: Merge from VariableInfo in SecurityPkg 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 Reviewed-by: Jiewen Yao Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17755 6f19259b-4bc3-4df7-8a09-765794883524 --- .../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 50b67d0974..727e1ce105 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.
- 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.
+ 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 #include #include +#include +#include +#include +#include +#include + #include +#include +#include +#include + +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 4d9dc71565..f76637a2f5 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.
+# Copyright (c) 2007 - 2015, 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 @@ -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)0_D4En~^#j~vaDgP5EcO*cOq_h1-H^Q;$jf2KnfN<<;sKG#j~E}Zg4Cr>G?bqF riYsNZ2eT8S$>wfme-?uJne`ZyCdaeuPhQ6112jl)vK-eMWW(|RyA3E- -- 2.39.2