summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStar Zeng <star.zeng@intel.com>2016-06-28 13:37:06 +0800
committerHao Wu <hao.a.wu@intel.com>2016-07-07 15:07:46 +0800
commit6dcdfd2bdb963222f422b5c804330e9c13ccb39c (patch)
tree9f75bb490eec22e4a90c394bae9f7aa6a78079b3
parentcaa8a4fba576d8007561ebf60d825c831cf4c445 (diff)
downloadedk2-platforms-6dcdfd2bdb963222f422b5c804330e9c13ccb39c.tar.xz
MdeModulePkg VariableInfo: Use fixed buffer for smm comm buffer
Cc: Jiewen Yao <jiewen.yao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> (cherry picked from commit faf3de9bd036cd2a387c1e44d403d24386fadb49)
-rw-r--r--MdeModulePkg/Application/VariableInfo/VariableInfo.c68
-rw-r--r--MdeModulePkg/Application/VariableInfo/VariableInfo.inf9
-rw-r--r--MdeModulePkg/Application/VariableInfo/VariableInfo.unibin2904 -> 2920 bytes
3 files changed, 47 insertions, 30 deletions
diff --git a/MdeModulePkg/Application/VariableInfo/VariableInfo.c b/MdeModulePkg/Application/VariableInfo/VariableInfo.c
index 727e1ce105..df91c1451c 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 f76637a2f5..484ad32a4e 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 @@
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
diff --git a/MdeModulePkg/Application/VariableInfo/VariableInfo.uni b/MdeModulePkg/Application/VariableInfo/VariableInfo.uni
index b8e6fd406f..138a6fed4d 100644
--- a/MdeModulePkg/Application/VariableInfo/VariableInfo.uni
+++ b/MdeModulePkg/Application/VariableInfo/VariableInfo.uni
Binary files differ