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>
This commit is contained in:
Star Zeng
2016-06-28 13:37:06 +08:00
parent fd3fac0fb2
commit faf3de9bd0
3 changed files with 50 additions and 33 deletions

View File

@@ -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");
}