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

Reply via email to