-/**\r
- The event callback is used to get the base address of boot performance data structure on\r
- LegacyBoot event and ExitBootServices event.\r
-\r
- @param Event The event handle.\r
- @param Context The event context.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-OnBootEvent (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN VarSize;\r
-\r
- VarSize = sizeof (EFI_PHYSICAL_ADDRESS);\r
- Status = gRT->GetVariable (\r
- L"PerfDataMemAddr",\r
- &gPerformanceProtocolGuid,\r
- NULL,\r
- &VarSize,\r
- &mPerfDataMemAddress\r
- );\r
- if (EFI_ERROR (Status)) {\r
- mPerfDataMemAddress = 0;\r
- }\r
-}\r
-\r
-/**\r
- Record S3 Script execution time and adjust total S3 resume time for script running.\r
-**/\r
-VOID\r
-WriteToOsS3PerformanceData (\r
- VOID\r
- )\r
-{\r
- UINT64 Ticker;\r
- UINT64 StartValue;\r
- UINT64 EndValue;\r
- UINT64 Freq;\r
- UINT64 ScriptExecuteTicks;\r
- PERF_HEADER *PerfHeader;\r
- PERF_DATA *PerfData;\r
-\r
- Ticker = GetPerformanceCounter ();\r
-\r
- PerfHeader = (PERF_HEADER *)(UINTN)mPerfDataMemAddress;\r
- if (PerfHeader == NULL) {\r
- return;\r
- }\r
-\r
- Freq = GetPerformanceCounterProperties (&StartValue, &EndValue);\r
- Freq = DivU64x32 (Freq, 1000);\r
-\r
- if (EndValue >= StartValue) {\r
- ScriptExecuteTicks = mScriptEndTick - mScriptStartTick;\r
- PerfHeader->S3Resume += Ticker - mS3BootScriptEntryTick;\r
- } else {\r
- ScriptExecuteTicks = mScriptStartTick - mScriptEndTick;\r
- PerfHeader->S3Resume += mS3BootScriptEntryTick - Ticker;\r
- }\r
- if (PerfHeader->S3EntryNum < PERF_PEI_ENTRY_MAX_NUM) {\r
- PerfData = &PerfHeader->S3Entry[PerfHeader->S3EntryNum];\r
- PerfData->Duration = (UINT32) DivU64x32 (ScriptExecuteTicks, (UINT32) Freq);;\r
- AsciiStrnCpy (PerfData->Token, "ScriptExec", PERF_TOKEN_LENGTH);\r
- PerfHeader->S3EntryNum++;\r
- }\r
-}\r
-\r