Reviewed-by: [email protected]
> -----Original Message----- > From: Zeng, Star > Sent: Tuesday, June 28, 2016 2:12 PM > To: [email protected] > Cc: Yao, Jiewen <[email protected]> > Subject: [PATCH] MdeModulePkg VariableInfo: Use fixed buffer for smm > comm buffer > > Cc: Jiewen Yao <[email protected]> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Star Zeng <[email protected]> > --- > .../Application/VariableInfo/VariableInfo.c | 68 > +++++++++++++--------- > .../Application/VariableInfo/VariableInfo.inf | 9 +-- > 2 files changed, 47 insertions(+), 30 deletions(-) > > diff --git a/MdeModulePkg/Application/VariableInfo/VariableInfo.c > b/MdeModulePkg/Application/VariableInfo/VariableInfo.c > index 727e1ce105f3..df91c1451c19 100644 > --- a/MdeModulePkg/Application/VariableInfo/VariableInfo.c > +++ b/MdeModulePkg/Application/VariableInfo/VariableInfo.c > @@ -3,7 +3,7 @@ > 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> > + Copyright (c) 2006 - 2016, 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 > @@ -25,6 +25,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF > ANY KIND, EITHER EXPRESS OR IMPLIED. > > #include <Guid/VariableFormat.h> > #include <Guid/SmmVariableCommon.h> > +#include <Guid/PiSmmCommunicationRegionTable.h> > #include <Protocol/SmmCommunication.h> > #include <Protocol/SmmVariable.h> > > @@ -86,6 +87,11 @@ PrintInfoFromSmm ( > UINTN CommSize; > SMM_VARIABLE_COMMUNICATE_HEADER > *FunctionHeader; > EFI_SMM_VARIABLE_PROTOCOL > *Smmvariable; > + EDKII_PI_SMM_COMMUNICATION_REGION_TABLE > *PiSmmCommunicationRegionTable; > + UINT32 Index; > + EFI_MEMORY_DESCRIPTOR *Entry; > + UINTN Size; > + UINTN MaxSize; > > Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, > (VOID **) &Smmvariable); > if (EFI_ERROR (Status)) { > @@ -97,30 +103,47 @@ PrintInfoFromSmm ( > return Status; > } > > - CommSize = SMM_COMMUNICATE_HEADER_SIZE + > SMM_VARIABLE_COMMUNICATE_HEADER_SIZE; > - RealCommSize = CommSize; > - CommBuffer = AllocateZeroPool (CommSize); > + CommBuffer = NULL; > + Status = EfiGetSystemConfigurationTable ( > + &gEdkiiPiSmmCommunicationRegionTableGuid, > + (VOID **) &PiSmmCommunicationRegionTable > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + ASSERT (PiSmmCommunicationRegionTable != NULL); > + Entry = (EFI_MEMORY_DESCRIPTOR *) > (PiSmmCommunicationRegionTable + 1); > + Size = 0; > + MaxSize = 0; > + for (Index = 0; Index < > PiSmmCommunicationRegionTable->NumberOfEntries; Index++) { > + if (Entry->Type == EfiConventionalMemory) { > + Size = EFI_PAGES_TO_SIZE ((UINTN) Entry->NumberOfPages); > + if (Size > (SMM_COMMUNICATE_HEADER_SIZE + > SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof > (VARIABLE_INFO_ENTRY))) { > + if (Size > MaxSize) { > + MaxSize = Size; > + RealCommSize = MaxSize; > + CommBuffer = (EFI_SMM_COMMUNICATE_HEADER *) (UINTN) > Entry->PhysicalStart; > + } > + } > + } > + Entry = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) Entry + > PiSmmCommunicationRegionTable->DescriptorSize); > + } > ASSERT (CommBuffer != NULL); > + ZeroMem (CommBuffer, RealCommSize); > > Print (L"Non-Volatile SMM Variables:\n"); > do { > + CommSize = RealCommSize; > Status = GetVariableStatisticsData (CommBuffer, &CommSize); > if (Status == EFI_BUFFER_TOO_SMALL) { > - FreePool (CommBuffer); > - CommBuffer = AllocateZeroPool (CommSize); > - ASSERT (CommBuffer != NULL); > - RealCommSize = CommSize; > - Status = GetVariableStatisticsData (CommBuffer, &CommSize); > + Print (L"The generic SMM communication buffer provided by > SmmCommunicationRegionTable is too small\n"); > + return Status; > } > > 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; > > @@ -138,25 +161,19 @@ PrintInfoFromSmm ( > } while (TRUE); > > Print (L"Volatile SMM Variables:\n"); > - ZeroMem (CommBuffer, CommSize); > + ZeroMem (CommBuffer, RealCommSize); > do { > + CommSize = RealCommSize; > Status = GetVariableStatisticsData (CommBuffer, &CommSize); > if (Status == EFI_BUFFER_TOO_SMALL) { > - FreePool (CommBuffer); > - CommBuffer = AllocateZeroPool (CommSize); > - ASSERT (CommBuffer != NULL); > - RealCommSize = CommSize; > - Status = GetVariableStatisticsData (CommBuffer, &CommSize); > + Print (L"The generic SMM communication buffer provided by > SmmCommunicationRegionTable is too small\n"); > + return Status; > } > > 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; > > @@ -173,7 +190,6 @@ PrintInfoFromSmm ( > } > } while (TRUE); > > - FreePool (CommBuffer); > return Status; > } > > @@ -249,10 +265,10 @@ UefiMain ( > } while (VariableInfo != NULL); > > } else { > - Print (L"Warning: Variable Dxe driver doesn't enable the feature of > statistical information!\n"); > + Print (L"Warning: Variable Dxe/Smm driver doesn't enable the feature > of statistical information!\n"); > Print (L"If you want to see this info, please:\n"); > Print (L" 1. Set PcdVariableCollectStatistics as TRUE\n"); > - Print (L" 2. Rebuild Variable Dxe driver\n"); > + Print (L" 2. Rebuild Variable Dxe/Smm driver\n"); > Print (L" 3. Run \"VariableInfo\" cmd again\n"); > } > > diff --git a/MdeModulePkg/Application/VariableInfo/VariableInfo.inf > b/MdeModulePkg/Application/VariableInfo/VariableInfo.inf > index f76637a2f5fb..484ad32a4ea6 100644 > --- a/MdeModulePkg/Application/VariableInfo/VariableInfo.inf > +++ b/MdeModulePkg/Application/VariableInfo/VariableInfo.inf > @@ -3,10 +3,10 @@ > # > # 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 > +# Note that if Variable Dxe/Smm driver doesn't enable the feature by > setting PcdVariableCollectStatistics > # as TRUE, the application will not display variable statistical > information. > # > -# Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR> > +# Copyright (c) 2007 - 2016, 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 > @@ -53,8 +53,9 @@ [Protocols] > gEfiSmmVariableProtocolGuid > > [Guids] > - gEfiAuthenticatedVariableGuid ## SOMETIMES_CONSUMES ## > SystemTable > - gEfiVariableGuid ## CONSUMES ## > SystemTable > + gEfiAuthenticatedVariableGuid ## > SOMETIMES_CONSUMES ## SystemTable > + gEfiVariableGuid ## > SOMETIMES_CONSUMES ## SystemTable > + gEdkiiPiSmmCommunicationRegionTableGuid ## > SOMETIMES_CONSUMES ## SystemTable > > [UserExtensions.TianoCore."ExtraFiles"] > VariableInfoExtra.uni > -- > 2.7.0.windows.1 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

