#include <Library/SynchronizationLib.h>\r
#include <Library/SmmMemLib.h>\r
\r
-#define EXTENSION_RECORD_SIZE 0x1000\r
+SMM_BOOT_PERFORMANCE_TABLE *mSmmBootPerformanceTable = NULL;\r
\r
EFI_SMM_RSC_HANDLER_PROTOCOL *mRscHandlerProtocol = NULL;\r
UINT64 mSuspendStartTime = 0;\r
BOOLEAN mS3SuspendLockBoxSaved = FALSE;\r
UINT32 mBootRecordSize = 0;\r
-UINT32 mBootRecordMaxSize = 0;\r
UINT8 *mBootRecordBuffer = NULL;\r
\r
SPIN_LOCK mSmmFpdtLock;\r
EFI_STATUS Status;\r
UINT64 CurrentTime;\r
EFI_ACPI_5_0_FPDT_S3_SUSPEND_RECORD S3SuspendRecord;\r
- UINT8 *NewRecordBuffer;\r
\r
//\r
// Check whether status code is what we are interested in.\r
//\r
// Collect one or more Boot records in boot time\r
//\r
- if (Data != NULL && CompareGuid (&Data->Type, &gEfiFirmwarePerformanceGuid)) {\r
+ if (Data != NULL && CompareGuid (&Data->Type, &gEdkiiFpdtExtendedFirmwarePerformanceGuid)) {\r
AcquireSpinLock (&mSmmFpdtLock);\r
- \r
- if (mBootRecordSize + Data->Size > mBootRecordMaxSize) {\r
- //\r
- // Try to allocate big SMRAM data to store Boot record. \r
- //\r
- if (mSmramIsOutOfResource) {\r
- ReleaseSpinLock (&mSmmFpdtLock);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- NewRecordBuffer = ReallocatePool (mBootRecordSize, mBootRecordSize + Data->Size + EXTENSION_RECORD_SIZE, mBootRecordBuffer); \r
- if (NewRecordBuffer == NULL) {\r
- ReleaseSpinLock (&mSmmFpdtLock);\r
- mSmramIsOutOfResource = TRUE;\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- mBootRecordBuffer = NewRecordBuffer;\r
- mBootRecordMaxSize = mBootRecordSize + Data->Size + EXTENSION_RECORD_SIZE;\r
- }\r
//\r
- // Save boot record into the temp memory space.\r
+ // Get the boot performance data.\r
//\r
- CopyMem (mBootRecordBuffer + mBootRecordSize, Data + 1, Data->Size);\r
- mBootRecordSize += Data->Size;\r
- \r
+ CopyMem (&mSmmBootPerformanceTable, Data + 1, Data->Size);\r
+ mBootRecordBuffer = ((UINT8 *) (mSmmBootPerformanceTable)) + sizeof (SMM_BOOT_PERFORMANCE_TABLE);\r
+\r
ReleaseSpinLock (&mSmmFpdtLock);\r
return EFI_SUCCESS;\r
}\r
\r
+ if (Data != NULL && CompareGuid (&Data->Type, &gEfiFirmwarePerformanceGuid)) {\r
+ DEBUG ((DEBUG_ERROR, "FpdtStatusCodeListenerSmm: Performance data reported through gEfiFirmwarePerformanceGuid will not be collected by FirmwarePerformanceDataTableSmm\n"));\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
if ((Value != PcdGet32 (PcdProgressCodeS3SuspendStart)) &&\r
(Value != PcdGet32 (PcdProgressCodeS3SuspendEnd))) {\r
return EFI_UNSUPPORTED;\r
\r
switch (SmmCommData->Function) {\r
case SMM_FPDT_FUNCTION_GET_BOOT_RECORD_SIZE :\r
+ if (mSmmBootPerformanceTable != NULL) {\r
+ mBootRecordSize = mSmmBootPerformanceTable->Header.Length - sizeof (SMM_BOOT_PERFORMANCE_TABLE);\r
+ }\r
SmmCommData->BootRecordSize = mBootRecordSize;\r
break;\r
\r