TianoCore EDK2 master
Loading...
Searching...
No Matches
DxeCorePerformanceLib.c
Go to the documentation of this file.
1
20
21//
22// Data for FPDT performance records.
23//
24#define SMM_BOOT_RECORD_COMM_SIZE (OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data) + sizeof(SMM_BOOT_RECORD_COMMUNICATE))
25#define STRING_SIZE (FPDT_STRING_EVENT_RECORD_NAME_LENGTH * sizeof (CHAR8))
26#define FIRMWARE_RECORD_BUFFER 0x10000
27#define CACHE_HANDLE_GUID_COUNT 0x800
28
29BOOT_PERFORMANCE_TABLE *mAcpiBootPerformanceTable = NULL;
30BOOT_PERFORMANCE_TABLE mBootPerformanceTableTemplate = {
31 {
34 },
35 {
36 {
37 EFI_ACPI_5_0_FPDT_RUNTIME_RECORD_TYPE_FIRMWARE_BASIC_BOOT, // Type
39 EFI_ACPI_5_0_FPDT_RUNTIME_RECORD_REVISION_FIRMWARE_BASIC_BOOT // Revision
40 },
41 0, // Reserved
42 //
43 // These values will be updated at runtime.
44 //
45 0, // ResetEnd
46 0, // OsLoaderLoadImageStart
47 0, // OsLoaderStartImageStart
48 0, // ExitBootServicesEntry
49 0 // ExitBootServicesExit
50 }
51};
52
53typedef struct {
54 EFI_HANDLE Handle;
55 CHAR8 NameString[FPDT_STRING_EVENT_RECORD_NAME_LENGTH];
56 EFI_GUID ModuleGuid;
58
59HANDLE_GUID_MAP mCacheHandleGuidTable[CACHE_HANDLE_GUID_COUNT];
60UINTN mCachePairCount = 0;
61
62UINT32 mLoadImageCount = 0;
63UINT32 mPerformanceLength = 0;
64UINT32 mMaxPerformanceLength = 0;
65UINT32 mBootRecordSize = 0;
66UINTN mBootRecordMaxSize = 0;
67UINT32 mCachedLength = 0;
68
69BOOLEAN mFpdtBufferIsReported = FALSE;
70BOOLEAN mLackSpaceIsReported = FALSE;
71CHAR8 *mPlatformLanguage = NULL;
72UINT8 *mPerformancePointer = NULL;
73UINT8 *mBootRecordBuffer = NULL;
74BOOLEAN mLockInsertRecord = FALSE;
75CHAR8 *mDevicePathString = NULL;
76UINTN mSmmBootRecordOffset = 0;
77
78EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *mDevicePathToText = NULL;
79
80//
81// Interfaces for PerformanceMeasurement Protocol.
82//
83EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL mPerformanceMeasurementInterface = {
85};
86
87PERFORMANCE_PROPERTY mPerformanceProperty;
88
100 IN UINT8 RecordSize,
101 IN OUT FPDT_RECORD_PTR *FpdtRecordPtr
102 )
103{
104 if (mFpdtBufferIsReported) {
105 //
106 // Append Boot records to the boot performance table.
107 //
108 if (mBootRecordSize + RecordSize > mBootRecordMaxSize) {
109 if (!mLackSpaceIsReported) {
110 DEBUG ((DEBUG_INFO, "DxeCorePerformanceLib: No enough space to save boot records\n"));
111 mLackSpaceIsReported = TRUE;
112 }
113
114 return EFI_OUT_OF_RESOURCES;
115 } else {
116 //
117 // Save boot record into BootPerformance table
118 //
119 FpdtRecordPtr->RecordHeader = (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER *)(mBootRecordBuffer + mBootRecordSize);
120 }
121 } else {
122 //
123 // Check if pre-allocated buffer is full
124 //
125 if (mPerformanceLength + RecordSize > mMaxPerformanceLength) {
126 mPerformancePointer = ReallocatePool (
127 mPerformanceLength,
128 mPerformanceLength + RecordSize + FIRMWARE_RECORD_BUFFER,
129 mPerformancePointer
130 );
131 if (mPerformancePointer == NULL) {
132 return EFI_OUT_OF_RESOURCES;
133 }
134
135 mMaxPerformanceLength = mPerformanceLength + RecordSize + FIRMWARE_RECORD_BUFFER;
136 }
137
138 //
139 // Covert buffer to FPDT Ptr Union type.
140 //
141 FpdtRecordPtr->RecordHeader = (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER *)(mPerformancePointer + mPerformanceLength);
142 }
143
144 return EFI_SUCCESS;
145}
146
156BOOLEAN
158 IN CONST CHAR8 *Token
159 )
160{
161 if (Token == NULL) {
162 return FALSE;
163 }
164
165 if ((AsciiStrCmp (Token, SEC_TOK) == 0) ||
166 (AsciiStrCmp (Token, PEI_TOK) == 0) ||
167 (AsciiStrCmp (Token, DXE_TOK) == 0) ||
168 (AsciiStrCmp (Token, BDS_TOK) == 0) ||
169 (AsciiStrCmp (Token, DRIVERBINDING_START_TOK) == 0) ||
170 (AsciiStrCmp (Token, DRIVERBINDING_SUPPORT_TOK) == 0) ||
171 (AsciiStrCmp (Token, DRIVERBINDING_STOP_TOK) == 0) ||
172 (AsciiStrCmp (Token, LOAD_IMAGE_TOK) == 0) ||
173 (AsciiStrCmp (Token, START_IMAGE_TOK) == 0) ||
174 (AsciiStrCmp (Token, PEIM_TOK) == 0))
175 {
176 return TRUE;
177 } else {
178 return FALSE;
179 }
180}
181
191BOOLEAN
193 IN UINT32 Identifier
194 )
195{
196 if ((Identifier == MODULE_START_ID) ||
197 (Identifier == MODULE_END_ID) ||
198 (Identifier == MODULE_LOADIMAGE_START_ID) ||
199 (Identifier == MODULE_LOADIMAGE_END_ID) ||
200 (Identifier == MODULE_DB_START_ID) ||
201 (Identifier == MODULE_DB_END_ID) ||
202 (Identifier == MODULE_DB_SUPPORT_START_ID) ||
203 (Identifier == MODULE_DB_SUPPORT_END_ID) ||
204 (Identifier == MODULE_DB_STOP_START_ID) ||
205 (Identifier == MODULE_DB_STOP_END_ID))
206 {
207 return TRUE;
208 } else {
209 return FALSE;
210 }
211}
212
221VOID
223 OUT VOID **SmmPerfData,
224 OUT UINTN *SmmPerfDataSize,
225 IN BOOLEAN SkipGetPerfData
226 )
227{
228 EFI_STATUS Status;
229 UINT8 *SmmBootRecordCommBuffer;
230 EFI_MM_COMMUNICATE_HEADER *MmCommBufferHeader;
231 SMM_BOOT_RECORD_COMMUNICATE *SmmCommData;
232 UINTN CommSize;
233 EFI_SMM_COMMUNICATION_PROTOCOL *Communication;
234 EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *SmmCommRegionTable;
235 EFI_MEMORY_DESCRIPTOR *SmmCommMemRegion;
236 UINTN Index;
237 VOID *CurrentBootRecordData;
238 VOID *SmmBootRecordData;
239 UINTN SmmBootRecordDataSize;
240 UINTN ReservedMemSize;
241 UINTN BootRecordDataPayloadSize;
242 UINTN SmmBootRecordDataRetrieved;
243
244 //
245 // Collect boot records from SMM drivers.
246 //
247 SmmBootRecordCommBuffer = NULL;
248 SmmCommData = NULL;
249 SmmBootRecordData = NULL;
250 ReservedMemSize = 0;
251 Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **)&Communication);
252 if (!EFI_ERROR (Status)) {
253 //
254 // Initialize communicate buffer
255 // Get the prepared Reserved Memory Range
256 //
258 &gEdkiiPiSmmCommunicationRegionTableGuid,
259 (VOID **)&SmmCommRegionTable
260 );
261 if (!EFI_ERROR (Status)) {
262 ASSERT (SmmCommRegionTable != NULL);
263 SmmCommMemRegion = (EFI_MEMORY_DESCRIPTOR *)(SmmCommRegionTable + 1);
264 for (Index = 0; Index < SmmCommRegionTable->NumberOfEntries; Index++) {
265 if (SmmCommMemRegion->Type == EfiConventionalMemory) {
266 break;
267 }
268
269 SmmCommMemRegion = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)SmmCommMemRegion + SmmCommRegionTable->DescriptorSize);
270 }
271
272 ASSERT (Index < SmmCommRegionTable->NumberOfEntries);
273 ASSERT (SmmCommMemRegion->PhysicalStart > 0);
274 ASSERT (SmmCommMemRegion->NumberOfPages > 0);
275 ReservedMemSize = (UINTN)SmmCommMemRegion->NumberOfPages * EFI_PAGE_SIZE;
276
277 //
278 // Check enough reserved memory space
279 //
280 if (ReservedMemSize > SMM_BOOT_RECORD_COMM_SIZE) {
281 SmmBootRecordCommBuffer = (VOID *)(UINTN)SmmCommMemRegion->PhysicalStart;
282 MmCommBufferHeader = (EFI_MM_COMMUNICATE_HEADER *)SmmBootRecordCommBuffer;
283 SmmCommData = (SMM_BOOT_RECORD_COMMUNICATE *)MmCommBufferHeader->Data;
284 ZeroMem ((UINT8 *)SmmCommData, sizeof (SMM_BOOT_RECORD_COMMUNICATE));
285
286 CopyGuid (&MmCommBufferHeader->HeaderGuid, &gEfiFirmwarePerformanceGuid);
287 MmCommBufferHeader->MessageLength = sizeof (SMM_BOOT_RECORD_COMMUNICATE);
288 CommSize = SMM_BOOT_RECORD_COMM_SIZE;
289
290 //
291 // Get the size of boot records.
292 //
293 SmmCommData->Function = SMM_FPDT_FUNCTION_GET_BOOT_RECORD_SIZE;
294 SmmCommData->BootRecordData = NULL;
295 Status = Communication->Communicate (Communication, SmmBootRecordCommBuffer, &CommSize);
296 if (EFI_ERROR (Status)) {
297 DEBUG ((DEBUG_WARN, "Perf handler MMI not found or communicate failed. Status = %r.\n", Status));
298 } else if (EFI_ERROR (SmmCommData->ReturnStatus)) {
299 DEBUG ((DEBUG_ERROR, "Perf handler MMI returned an error. Status = %r.\n", SmmCommData->ReturnStatus));
300 }
301
302 if (!EFI_ERROR (Status) && !EFI_ERROR (SmmCommData->ReturnStatus) && (SmmCommData->BootRecordSize != 0)) {
303 if (SkipGetPerfData) {
304 *SmmPerfDataSize = SmmCommData->BootRecordSize;
305 return;
306 }
307
308 //
309 // Get boot records starting from mSmmBootRecordOffset
310 //
311 SmmCommData->Function = SMM_FPDT_FUNCTION_GET_BOOT_RECORD_DATA_BY_OFFSET;
312 SmmCommData->BootRecordOffset = mSmmBootRecordOffset;
313 SmmBootRecordDataSize = SmmCommData->BootRecordSize - mSmmBootRecordOffset;
314 SmmBootRecordData = AllocateZeroPool (SmmBootRecordDataSize);
315 SmmBootRecordDataRetrieved = 0;
316 ASSERT (SmmBootRecordData != NULL);
317 if (SmmBootRecordData != NULL) {
318 CurrentBootRecordData = (VOID *)((UINTN)SmmCommMemRegion->PhysicalStart + SMM_BOOT_RECORD_COMM_SIZE);
319 while (SmmBootRecordDataRetrieved < SmmBootRecordDataSize) {
320 // Note: Maximum comm buffer data payload size is ReservedMemSize - SMM_BOOT_RECORD_COMM_SIZE
321 BootRecordDataPayloadSize = MIN (
322 ReservedMemSize - SMM_BOOT_RECORD_COMM_SIZE,
323 SmmBootRecordDataSize - SmmBootRecordDataRetrieved
324 );
325 SmmCommData->BootRecordSize = BootRecordDataPayloadSize;
326
327 MmCommBufferHeader->MessageLength = sizeof (SMM_BOOT_RECORD_COMMUNICATE) + BootRecordDataPayloadSize;
328 CommSize = OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data) + (UINTN)MmCommBufferHeader->MessageLength;
329
330 Status = Communication->Communicate (Communication, SmmBootRecordCommBuffer, &CommSize);
331 ASSERT_EFI_ERROR (Status);
332 if (EFI_ERROR (Status) || EFI_ERROR (SmmCommData->ReturnStatus)) {
333 break;
334 }
335
336 if (SmmBootRecordDataRetrieved + SmmCommData->BootRecordSize > SmmBootRecordDataSize) {
337 CopyMem ((UINT8 *)SmmBootRecordData + SmmBootRecordDataRetrieved, CurrentBootRecordData, SmmBootRecordDataSize - SmmBootRecordDataRetrieved);
338 } else {
339 CopyMem ((UINT8 *)SmmBootRecordData + SmmBootRecordDataRetrieved, CurrentBootRecordData, SmmCommData->BootRecordSize);
340 }
341
342 SmmBootRecordDataRetrieved += SmmCommData->BootRecordSize;
343 SmmCommData->BootRecordOffset += SmmCommData->BootRecordSize;
344 }
345
346 mSmmBootRecordOffset = SmmCommData->BootRecordOffset;
347
348 *SmmPerfData = SmmBootRecordData;
349 *SmmPerfDataSize = SmmBootRecordDataSize;
350 }
351 }
352 }
353 }
354 }
355}
356
365 VOID
366 )
367{
368 EFI_STATUS Status;
369 UINTN Size;
370 UINTN BootPerformanceDataSize;
371 UINT8 *BootPerformanceData;
372 FIRMWARE_PERFORMANCE_VARIABLE PerformanceVariable;
373 UINTN SmmBootRecordDataSize;
374
375 SmmBootRecordDataSize = 0;
376
377 //
378 // Get SMM performance data size at the point of EndOfDxe in order to allocate the boot performance table.
379 // Will Get all the data at ReadyToBoot.
380 //
381 InternalGetSmmPerfData (NULL, &SmmBootRecordDataSize, TRUE);
382
383 //
384 // Prepare memory for Boot Performance table.
385 // Boot Performance table includes BasicBoot record, and one or more appended Boot Records.
386 //
387 BootPerformanceDataSize = sizeof (BOOT_PERFORMANCE_TABLE) + mPerformanceLength + SmmBootRecordDataSize + PcdGet32 (PcdExtFpdtBootRecordPadSize);
388
389 //
390 // Try to allocate the same runtime buffer as last time boot.
391 //
392 ZeroMem (&PerformanceVariable, sizeof (PerformanceVariable));
393 Size = sizeof (PerformanceVariable);
394 Status = gRT->GetVariable (
395 EFI_FIRMWARE_PERFORMANCE_VARIABLE_NAME,
396 &gEfiFirmwarePerformanceGuid,
397 NULL,
398 &Size,
399 &PerformanceVariable
400 );
401 if (!EFI_ERROR (Status)) {
402 Status = gBS->AllocatePages (
405 EFI_SIZE_TO_PAGES (BootPerformanceDataSize),
406 &PerformanceVariable.BootPerformanceTablePointer
407 );
408 if (!EFI_ERROR (Status)) {
409 mAcpiBootPerformanceTable = (BOOT_PERFORMANCE_TABLE *)(UINTN)PerformanceVariable.BootPerformanceTablePointer;
410 }
411 }
412
413 if (mAcpiBootPerformanceTable == NULL) {
414 //
415 // Fail to allocate at specified address, continue to allocate at any address.
416 //
417 mAcpiBootPerformanceTable = (BOOT_PERFORMANCE_TABLE *)AllocatePeiAccessiblePages (
419 EFI_SIZE_TO_PAGES (BootPerformanceDataSize)
420 );
421 if (mAcpiBootPerformanceTable != NULL) {
422 ZeroMem (mAcpiBootPerformanceTable, BootPerformanceDataSize);
423 }
424 }
425
426 DEBUG ((DEBUG_INFO, "DxeCorePerformanceLib: ACPI Boot Performance Table address = 0x%x\n", mAcpiBootPerformanceTable));
427
428 if (mAcpiBootPerformanceTable == NULL) {
429 return EFI_OUT_OF_RESOURCES;
430 }
431
432 //
433 // Prepare Boot Performance Table.
434 //
435 BootPerformanceData = (UINT8 *)mAcpiBootPerformanceTable;
436 //
437 // Fill Basic Boot record to Boot Performance Table.
438 //
439 CopyMem (mAcpiBootPerformanceTable, &mBootPerformanceTableTemplate, sizeof (mBootPerformanceTableTemplate));
440 BootPerformanceData = BootPerformanceData + mAcpiBootPerformanceTable->Header.Length;
441 //
442 // Fill Boot records from boot drivers.
443 //
444 if (mPerformancePointer != NULL) {
445 CopyMem (BootPerformanceData, mPerformancePointer, mPerformanceLength);
446 mAcpiBootPerformanceTable->Header.Length += mPerformanceLength;
447 BootPerformanceData = BootPerformanceData + mPerformanceLength;
448 FreePool (mPerformancePointer);
449 mPerformancePointer = NULL;
450 mPerformanceLength = 0;
451 mMaxPerformanceLength = 0;
452 }
453
454 mBootRecordBuffer = (UINT8 *)mAcpiBootPerformanceTable;
455 mBootRecordSize = mAcpiBootPerformanceTable->Header.Length;
456 mBootRecordMaxSize = BootPerformanceDataSize;
457
458 return EFI_SUCCESS;
459}
460
477 IN EFI_HANDLE Handle,
478 OUT CHAR8 *NameString,
479 IN UINTN BufferSize,
480 OUT EFI_GUID *ModuleGuid OPTIONAL
481 )
482{
483 EFI_STATUS Status;
484 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
485 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;
486 CHAR8 *PdbFileName;
487 EFI_GUID *TempGuid;
488 UINTN StartIndex;
489 UINTN Index;
490 INTN Count;
491 BOOLEAN ModuleGuidIsGet;
492 UINTN StringSize;
493 CHAR16 *StringPtr;
494 EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
496
497 if ((NameString == NULL) || (BufferSize == 0)) {
498 return EFI_INVALID_PARAMETER;
499 }
500
501 //
502 // Try to get the ModuleGuid and name string form the caached array.
503 //
504 if (mCachePairCount > 0) {
505 for (Count = mCachePairCount -1; Count >= 0; Count--) {
506 if (Handle == mCacheHandleGuidTable[Count].Handle) {
507 CopyGuid (ModuleGuid, &mCacheHandleGuidTable[Count].ModuleGuid);
508 AsciiStrCpyS (NameString, FPDT_STRING_EVENT_RECORD_NAME_LENGTH, mCacheHandleGuidTable[Count].NameString);
509 return EFI_SUCCESS;
510 }
511 }
512 }
513
514 Status = EFI_INVALID_PARAMETER;
515 LoadedImage = NULL;
516 ModuleGuidIsGet = FALSE;
517
518 //
519 // Initialize GUID as zero value.
520 //
521 TempGuid = &gZeroGuid;
522 //
523 // Initialize it as "" string.
524 //
525 NameString[0] = 0;
526
527 if (Handle != NULL) {
528 //
529 // Try Handle as ImageHandle.
530 //
531 Status = gBS->HandleProtocol (
532 Handle,
533 &gEfiLoadedImageProtocolGuid,
534 (VOID **)&LoadedImage
535 );
536
537 if (EFI_ERROR (Status)) {
538 //
539 // Try Handle as Controller Handle
540 //
541 Status = gBS->OpenProtocol (
542 Handle,
543 &gEfiDriverBindingProtocolGuid,
544 (VOID **)&DriverBinding,
545 NULL,
546 NULL,
547 EFI_OPEN_PROTOCOL_GET_PROTOCOL
548 );
549 if (!EFI_ERROR (Status)) {
550 //
551 // Get Image protocol from ImageHandle
552 //
553 Status = gBS->HandleProtocol (
554 DriverBinding->ImageHandle,
555 &gEfiLoadedImageProtocolGuid,
556 (VOID **)&LoadedImage
557 );
558 }
559 }
560 }
561
562 if (!EFI_ERROR (Status) && (LoadedImage != NULL)) {
563 //
564 // Get Module Guid from DevicePath.
565 //
566 if ((LoadedImage->FilePath != NULL) &&
567 (LoadedImage->FilePath->Type == MEDIA_DEVICE_PATH) &&
568 (LoadedImage->FilePath->SubType == MEDIA_PIWG_FW_FILE_DP)
569 )
570 {
571 //
572 // Determine GUID associated with module logging performance
573 //
574 ModuleGuidIsGet = TRUE;
575 FvFilePath = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)LoadedImage->FilePath;
576 TempGuid = &FvFilePath->FvFileName;
577 }
578
579 //
580 // Method 1 Get Module Name from PDB string.
581 //
582 PdbFileName = PeCoffLoaderGetPdbPointer (LoadedImage->ImageBase);
583 if ((PdbFileName != NULL) && (BufferSize > 0)) {
584 StartIndex = 0;
585 for (Index = 0; PdbFileName[Index] != 0; Index++) {
586 if ((PdbFileName[Index] == '\\') || (PdbFileName[Index] == '/')) {
587 StartIndex = Index + 1;
588 }
589 }
590
591 //
592 // Copy the PDB file name to our temporary string.
593 // If the length is bigger than BufferSize, trim the redudant characters to avoid overflow in array boundary.
594 //
595 for (Index = 0; Index < BufferSize - 1; Index++) {
596 NameString[Index] = PdbFileName[Index + StartIndex];
597 if ((NameString[Index] == 0) || (NameString[Index] == '.')) {
598 NameString[Index] = 0;
599 break;
600 }
601 }
602
603 if (Index == BufferSize - 1) {
604 NameString[Index] = 0;
605 }
606
607 //
608 // Module Name is got.
609 //
610 goto Done;
611 }
612 }
613
614 //
615 // Method 2: Get the name string from ComponentName2 protocol
616 //
617 Status = gBS->HandleProtocol (
618 Handle,
619 &gEfiComponentName2ProtocolGuid,
620 (VOID **)&ComponentName2
621 );
622 if (!EFI_ERROR (Status)) {
623 //
624 // Get the current platform language setting
625 //
626 if (mPlatformLanguage == NULL) {
627 GetEfiGlobalVariable2 (L"PlatformLang", (VOID **)&mPlatformLanguage, NULL);
628 }
629
630 if (mPlatformLanguage != NULL) {
631 Status = ComponentName2->GetDriverName (
632 ComponentName2,
633 mPlatformLanguage != NULL ? mPlatformLanguage : "en-US",
634 &StringPtr
635 );
636 if (!EFI_ERROR (Status)) {
637 for (Index = 0; Index < BufferSize - 1 && StringPtr[Index] != 0; Index++) {
638 NameString[Index] = (CHAR8)StringPtr[Index];
639 }
640
641 NameString[Index] = 0;
642 //
643 // Module Name is got.
644 //
645 goto Done;
646 }
647 }
648 }
649
650 if (ModuleGuidIsGet) {
651 //
652 // Method 3 Try to get the image's FFS UI section by image GUID
653 //
654 StringPtr = NULL;
655 StringSize = 0;
656 Status = GetSectionFromAnyFv (
657 TempGuid,
658 EFI_SECTION_USER_INTERFACE,
659 0,
660 (VOID **)&StringPtr,
661 &StringSize
662 );
663
664 if (!EFI_ERROR (Status)) {
665 //
666 // Method 3. Get the name string from FFS UI section
667 //
668 for (Index = 0; Index < BufferSize - 1 && StringPtr[Index] != 0; Index++) {
669 NameString[Index] = (CHAR8)StringPtr[Index];
670 }
671
672 NameString[Index] = 0;
673 FreePool (StringPtr);
674 }
675 }
676
677Done:
678 //
679 // Copy Module Guid
680 //
681 if (ModuleGuid != NULL) {
682 CopyGuid (ModuleGuid, TempGuid);
683 if (IsZeroGuid (TempGuid) && (Handle != NULL) && !ModuleGuidIsGet) {
684 // Handle is GUID
685 CopyGuid (ModuleGuid, (EFI_GUID *)Handle);
686 }
687 }
688
689 //
690 // Cache the Handle and Guid pairs.
691 //
692 if (mCachePairCount < CACHE_HANDLE_GUID_COUNT) {
693 mCacheHandleGuidTable[mCachePairCount].Handle = Handle;
694 CopyGuid (&mCacheHandleGuidTable[mCachePairCount].ModuleGuid, ModuleGuid);
695 AsciiStrCpyS (mCacheHandleGuidTable[mCachePairCount].NameString, FPDT_STRING_EVENT_RECORD_NAME_LENGTH, NameString);
696 mCachePairCount++;
697 }
698
699 return Status;
700}
701
718 IN PERF_MEASUREMENT_ATTRIBUTE Attribute,
719 IN CONST VOID *Handle,
720 IN CONST CHAR8 *String,
721 OUT UINT16 *ProgressID
722 )
723{
724 //
725 // Token to PerfId.
726 //
727 if (String != NULL) {
728 if (AsciiStrCmp (String, START_IMAGE_TOK) == 0) {
729 // "StartImage:"
730 if (Attribute == PerfStartEntry) {
731 *ProgressID = MODULE_START_ID;
732 } else {
733 *ProgressID = MODULE_END_ID;
734 }
735 } else if (AsciiStrCmp (String, LOAD_IMAGE_TOK) == 0) {
736 // "LoadImage:"
737 if (Attribute == PerfStartEntry) {
738 *ProgressID = MODULE_LOADIMAGE_START_ID;
739 } else {
740 *ProgressID = MODULE_LOADIMAGE_END_ID;
741 }
742 } else if (AsciiStrCmp (String, DRIVERBINDING_START_TOK) == 0) {
743 // "DB:Start:"
744 if (Attribute == PerfStartEntry) {
745 *ProgressID = MODULE_DB_START_ID;
746 } else {
747 *ProgressID = MODULE_DB_END_ID;
748 }
749 } else if (AsciiStrCmp (String, DRIVERBINDING_SUPPORT_TOK) == 0) {
750 // "DB:Support:"
751 if (PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
752 return RETURN_UNSUPPORTED;
753 }
754
755 if (Attribute == PerfStartEntry) {
756 *ProgressID = MODULE_DB_SUPPORT_START_ID;
757 } else {
758 *ProgressID = MODULE_DB_SUPPORT_END_ID;
759 }
760 } else if (AsciiStrCmp (String, DRIVERBINDING_STOP_TOK) == 0) {
761 // "DB:Stop:"
762 if (PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
763 return RETURN_UNSUPPORTED;
764 }
765
766 if (Attribute == PerfStartEntry) {
767 *ProgressID = MODULE_DB_STOP_START_ID;
768 } else {
769 *ProgressID = MODULE_DB_STOP_END_ID;
770 }
771 } else if ((AsciiStrCmp (String, PEI_TOK) == 0) || // "PEI"
772 (AsciiStrCmp (String, DXE_TOK) == 0) || // "DXE"
773 (AsciiStrCmp (String, BDS_TOK) == 0)) // "BDS"
774 {
775 if (Attribute == PerfStartEntry) {
776 *ProgressID = PERF_CROSSMODULE_START_ID;
777 } else {
778 *ProgressID = PERF_CROSSMODULE_END_ID;
779 }
780 } else {
781 // Pref used in Modules.
782 if (Attribute == PerfStartEntry) {
783 *ProgressID = PERF_INMODULE_START_ID;
784 } else {
785 *ProgressID = PERF_INMODULE_END_ID;
786 }
787 }
788 } else if (Handle != NULL) {
789 // Pref used in Modules.
790 if (Attribute == PerfStartEntry) {
791 *ProgressID = PERF_INMODULE_START_ID;
792 } else {
793 *ProgressID = PERF_INMODULE_END_ID;
794 }
795 } else {
796 return EFI_INVALID_PARAMETER;
797 }
798
799 return EFI_SUCCESS;
800}
801
811VOID
813 IN OUT CHAR8 *Destination,
814 IN CONST CHAR8 *Source,
815 IN OUT UINT8 *Length
816 )
817{
818 UINTN StringLen;
819 UINTN DestMax;
820
821 ASSERT (Source != NULL);
822
823 if (PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
824 DestMax = STRING_SIZE;
825 } else {
826 DestMax = AsciiStrSize (Source);
827 if (DestMax > STRING_SIZE) {
828 DestMax = STRING_SIZE;
829 }
830 }
831
832 StringLen = AsciiStrLen (Source);
833 if (StringLen >= DestMax) {
834 StringLen = DestMax -1;
835 }
836
837 AsciiStrnCpyS (Destination, DestMax, Source, StringLen);
838 *Length += (UINT8)DestMax;
839
840 return;
841}
842
859 IN CONST VOID *Handle,
860 IN EFI_HANDLE ControllerHandle,
861 OUT CHAR8 *ComponentNameString,
862 IN OUT UINT8 *Length
863 )
864{
865 EFI_DEVICE_PATH_PROTOCOL *DevicePathProtocol;
866 EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
867 EFI_STATUS Status;
868 CHAR16 *StringPtr;
869 CHAR8 *AsciiStringPtr;
870 UINTN ControllerNameStringSize;
871 UINTN DevicePathStringSize;
872
873 ControllerNameStringSize = 0;
874
875 Status = gBS->HandleProtocol (
876 (EFI_HANDLE)Handle,
877 &gEfiComponentName2ProtocolGuid,
878 (VOID **)&ComponentName2
879 );
880
881 if (!EFI_ERROR (Status)) {
882 //
883 // Get the current platform language setting
884 //
885 if (mPlatformLanguage == NULL) {
886 GetEfiGlobalVariable2 (L"PlatformLang", (VOID **)&mPlatformLanguage, NULL);
887 }
888
889 Status = ComponentName2->GetControllerName (
890 ComponentName2,
891 ControllerHandle,
892 NULL,
893 mPlatformLanguage != NULL ? mPlatformLanguage : "en-US",
894 &StringPtr
895 );
896 }
897
898 if (!EFI_ERROR (Status)) {
899 //
900 // This will produce the size of the unicode string, which is twice as large as the ASCII one
901 // This must be an even number, so ok to divide by 2
902 //
903 ControllerNameStringSize = StrSize (StringPtr) / 2;
904
905 //
906 // The + 1 is because we want to add a space between the ControllerName and the device path
907 //
908 if ((ControllerNameStringSize + (*Length) + 1) > FPDT_MAX_PERF_RECORD_SIZE) {
909 //
910 // Only copy enough to fill FPDT_MAX_PERF_RECORD_SIZE worth of the record
911 //
912 ControllerNameStringSize = FPDT_MAX_PERF_RECORD_SIZE - (*Length) - 1;
913 }
914
915 UnicodeStrnToAsciiStrS (StringPtr, ControllerNameStringSize - 1, ComponentNameString, ControllerNameStringSize, &ControllerNameStringSize);
916
917 //
918 // Add a space in the end of the ControllerName
919 //
920 AsciiStringPtr = ComponentNameString + ControllerNameStringSize - 1;
921 *AsciiStringPtr = 0x20;
922 AsciiStringPtr++;
923 *AsciiStringPtr = 0;
924 ControllerNameStringSize++;
925
926 *Length += (UINT8)ControllerNameStringSize;
927 }
928
929 //
930 // This function returns the device path protocol from the handle specified by Handle. If Handle is
931 // NULL or Handle does not contain a device path protocol, then NULL is returned.
932 //
933 DevicePathProtocol = DevicePathFromHandle (ControllerHandle);
934
935 if (DevicePathProtocol != NULL) {
936 StringPtr = ConvertDevicePathToText (DevicePathProtocol, TRUE, FALSE);
937 if (StringPtr != NULL) {
938 //
939 // This will produce the size of the unicode string, which is twice as large as the ASCII one
940 // This must be an even number, so ok to divide by 2
941 //
942 DevicePathStringSize = StrSize (StringPtr) / 2;
943
944 if ((DevicePathStringSize + (*Length)) > FPDT_MAX_PERF_RECORD_SIZE) {
945 //
946 // Only copy enough to fill FPDT_MAX_PERF_RECORD_SIZE worth of the record
947 //
948 DevicePathStringSize = FPDT_MAX_PERF_RECORD_SIZE - (*Length);
949 }
950
951 if (ControllerNameStringSize != 0) {
952 AsciiStringPtr = ComponentNameString + ControllerNameStringSize - 1;
953 } else {
954 AsciiStringPtr = ComponentNameString;
955 }
956
957 UnicodeStrnToAsciiStrS (StringPtr, DevicePathStringSize - 1, AsciiStringPtr, DevicePathStringSize, &DevicePathStringSize);
958 *Length += (UINT8)DevicePathStringSize;
959 return EFI_SUCCESS;
960 }
961 }
962
963 return EFI_UNSUPPORTED;
964}
965
992 IN CONST VOID *CallerIdentifier OPTIONAL,
993 IN CONST VOID *Guid OPTIONAL,
994 IN CONST CHAR8 *String OPTIONAL,
995 IN UINT64 Ticker,
996 IN UINT64 Address OPTIONAL,
997 IN UINT16 PerfId,
998 IN PERF_MEASUREMENT_ATTRIBUTE Attribute
999 )
1000{
1001 EFI_GUID ModuleGuid;
1002 CHAR8 ModuleName[FPDT_STRING_EVENT_RECORD_NAME_LENGTH];
1003 FPDT_RECORD_PTR FpdtRecordPtr;
1004 FPDT_RECORD_PTR CachedFpdtRecordPtr;
1005 UINT64 TimeStamp;
1006 CONST CHAR8 *StringPtr;
1007 UINTN DestMax;
1008 UINTN StringLen;
1009 EFI_STATUS Status;
1010 UINT16 ProgressId;
1011
1012 StringPtr = NULL;
1013 ProgressId = 0;
1014 ZeroMem (ModuleName, sizeof (ModuleName));
1015
1016 //
1017 // 1. Get the Perf Id for records from PERF_START/PERF_END, PERF_START_EX/PERF_END_EX.
1018 // notes: For other Perf macros (Attribute == PerfEntry), their Id is known.
1019 //
1020 if (Attribute != PerfEntry) {
1021 //
1022 // If PERF_START_EX()/PERF_END_EX() have specified the ProgressID,it has high priority.
1023 // !!! Note: If the Perf is not the known Token used in the core but have same
1024 // ID with the core Token, this case will not be supported.
1025 // And in currtnt usage mode, for the unkown ID, there is a general rule:
1026 // If it is start pref: the lower 4 bits of the ID should be 0.
1027 // If it is end pref: the lower 4 bits of the ID should not be 0.
1028 // If input ID doesn't follow the rule, we will adjust it.
1029 //
1030 if ((PerfId != 0) && (IsKnownID (PerfId)) && (!IsKnownTokens (String))) {
1031 return EFI_INVALID_PARAMETER;
1032 } else if ((PerfId != 0) && (!IsKnownID (PerfId)) && (!IsKnownTokens (String))) {
1033 if ((Attribute == PerfStartEntry) && ((PerfId & 0x000F) != 0)) {
1034 PerfId &= 0xFFF0;
1035 } else if ((Attribute == PerfEndEntry) && ((PerfId & 0x000F) == 0)) {
1036 PerfId += 1;
1037 }
1038 } else if (PerfId == 0) {
1039 //
1040 // Get ProgressID form the String Token.
1041 //
1042 Status = GetFpdtRecordId (Attribute, CallerIdentifier, String, &ProgressId);
1043 if (EFI_ERROR (Status)) {
1044 return Status;
1045 }
1046
1047 PerfId = ProgressId;
1048 }
1049 }
1050
1051 //
1052 // 2. Get the buffer to store the FPDT record.
1053 //
1054 Status = GetFpdtRecordPtr (FPDT_MAX_PERF_RECORD_SIZE, &FpdtRecordPtr);
1055 if (EFI_ERROR (Status)) {
1056 return Status;
1057 }
1058
1059 //
1060 // 3. Get the TimeStamp.
1061 //
1062 if (Ticker == 0) {
1063 Ticker = GetPerformanceCounter ();
1064 TimeStamp = GetTimeInNanoSecond (Ticker);
1065 } else if (Ticker == 1) {
1066 TimeStamp = 0;
1067 } else {
1068 TimeStamp = GetTimeInNanoSecond (Ticker);
1069 }
1070
1071 //
1072 // 4. Fill in the FPDT record according to different Performance Identifier.
1073 //
1074 switch (PerfId) {
1075 case MODULE_START_ID:
1076 case MODULE_END_ID:
1077 GetModuleInfoFromHandle ((EFI_HANDLE)CallerIdentifier, ModuleName, sizeof (ModuleName), &ModuleGuid);
1078 StringPtr = ModuleName;
1079 //
1080 // Cache the offset of start image start record and use to update the start image end record if needed.
1081 //
1082 if ((Attribute == PerfEntry) && (PerfId == MODULE_START_ID)) {
1083 if (mFpdtBufferIsReported) {
1084 mCachedLength = mBootRecordSize;
1085 } else {
1086 mCachedLength = mPerformanceLength;
1087 }
1088 }
1089
1090 if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1091 FpdtRecordPtr.GuidEvent->Header.Type = FPDT_GUID_EVENT_TYPE;
1092 FpdtRecordPtr.GuidEvent->Header.Length = sizeof (FPDT_GUID_EVENT_RECORD);
1093 FpdtRecordPtr.GuidEvent->Header.Revision = FPDT_RECORD_REVISION_1;
1094 FpdtRecordPtr.GuidEvent->ProgressID = PerfId;
1095 FpdtRecordPtr.GuidEvent->Timestamp = TimeStamp;
1096 CopyMem (&FpdtRecordPtr.GuidEvent->Guid, &ModuleGuid, sizeof (FpdtRecordPtr.GuidEvent->Guid));
1097 if ((CallerIdentifier == NULL) && (PerfId == MODULE_END_ID) && (mCachedLength != 0)) {
1098 if (mFpdtBufferIsReported) {
1099 CachedFpdtRecordPtr.RecordHeader = (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER *)(mBootRecordBuffer + mCachedLength);
1100 } else {
1101 CachedFpdtRecordPtr.RecordHeader = (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER *)(mPerformancePointer + mCachedLength);
1102 }
1103
1104 CopyMem (&FpdtRecordPtr.GuidEvent->Guid, &CachedFpdtRecordPtr.GuidEvent->Guid, sizeof (FpdtRecordPtr.GuidEvent->Guid));
1105 mCachedLength = 0;
1106 }
1107 }
1108
1109 break;
1110
1111 case MODULE_LOADIMAGE_START_ID:
1112 case MODULE_LOADIMAGE_END_ID:
1113 GetModuleInfoFromHandle ((EFI_HANDLE)CallerIdentifier, ModuleName, sizeof (ModuleName), &ModuleGuid);
1114 StringPtr = ModuleName;
1115 if (PerfId == MODULE_LOADIMAGE_START_ID) {
1116 mLoadImageCount++;
1117 //
1118 // Cache the offset of load image start record and use to be updated by the load image end record if needed.
1119 //
1120 if ((CallerIdentifier == NULL) && (Attribute == PerfEntry)) {
1121 if (mFpdtBufferIsReported) {
1122 mCachedLength = mBootRecordSize;
1123 } else {
1124 mCachedLength = mPerformanceLength;
1125 }
1126 }
1127 }
1128
1129 if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1130 FpdtRecordPtr.GuidQwordEvent->Header.Type = FPDT_GUID_QWORD_EVENT_TYPE;
1131 FpdtRecordPtr.GuidQwordEvent->Header.Length = sizeof (FPDT_GUID_QWORD_EVENT_RECORD);
1132 FpdtRecordPtr.GuidQwordEvent->Header.Revision = FPDT_RECORD_REVISION_1;
1133 FpdtRecordPtr.GuidQwordEvent->ProgressID = PerfId;
1134 FpdtRecordPtr.GuidQwordEvent->Timestamp = TimeStamp;
1135 FpdtRecordPtr.GuidQwordEvent->Qword = mLoadImageCount;
1136 CopyMem (&FpdtRecordPtr.GuidQwordEvent->Guid, &ModuleGuid, sizeof (FpdtRecordPtr.GuidQwordEvent->Guid));
1137 if ((PerfId == MODULE_LOADIMAGE_END_ID) && (mCachedLength != 0)) {
1138 if (mFpdtBufferIsReported) {
1139 CachedFpdtRecordPtr.RecordHeader = (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER *)(mBootRecordBuffer + mCachedLength);
1140 } else {
1141 CachedFpdtRecordPtr.RecordHeader = (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER *)(mPerformancePointer + mCachedLength);
1142 }
1143
1144 CopyMem (&CachedFpdtRecordPtr.GuidQwordEvent->Guid, &ModuleGuid, sizeof (CachedFpdtRecordPtr.GuidQwordEvent->Guid));
1145 mCachedLength = 0;
1146 }
1147 }
1148
1149 break;
1150
1151 case MODULE_DB_START_ID:
1152 case MODULE_DB_SUPPORT_START_ID:
1153 case MODULE_DB_SUPPORT_END_ID:
1154 case MODULE_DB_STOP_START_ID:
1155 case MODULE_DB_STOP_END_ID:
1156 GetModuleInfoFromHandle ((EFI_HANDLE)CallerIdentifier, ModuleName, sizeof (ModuleName), &ModuleGuid);
1157 StringPtr = ModuleName;
1158 if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1159 FpdtRecordPtr.GuidQwordEvent->Header.Type = FPDT_GUID_QWORD_EVENT_TYPE;
1160 FpdtRecordPtr.GuidQwordEvent->Header.Length = sizeof (FPDT_GUID_QWORD_EVENT_RECORD);
1161 FpdtRecordPtr.GuidQwordEvent->Header.Revision = FPDT_RECORD_REVISION_1;
1162 FpdtRecordPtr.GuidQwordEvent->ProgressID = PerfId;
1163 FpdtRecordPtr.GuidQwordEvent->Timestamp = TimeStamp;
1164 FpdtRecordPtr.GuidQwordEvent->Qword = Address;
1165 CopyMem (&FpdtRecordPtr.GuidQwordEvent->Guid, &ModuleGuid, sizeof (FpdtRecordPtr.GuidQwordEvent->Guid));
1166 }
1167
1168 break;
1169
1170 case MODULE_DB_END_ID:
1171 GetModuleInfoFromHandle ((EFI_HANDLE)CallerIdentifier, ModuleName, sizeof (ModuleName), &ModuleGuid);
1172 StringPtr = ModuleName;
1173 if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1174 FpdtRecordPtr.GuidQwordStringEvent->Header.Type = FPDT_GUID_QWORD_STRING_EVENT_TYPE;
1175 FpdtRecordPtr.GuidQwordStringEvent->Header.Length = sizeof (FPDT_GUID_QWORD_STRING_EVENT_RECORD);
1176 FpdtRecordPtr.GuidQwordStringEvent->Header.Revision = FPDT_RECORD_REVISION_1;
1177 FpdtRecordPtr.GuidQwordStringEvent->ProgressID = PerfId;
1178 FpdtRecordPtr.GuidQwordStringEvent->Timestamp = TimeStamp;
1179 FpdtRecordPtr.GuidQwordStringEvent->Qword = Address;
1180 CopyMem (&FpdtRecordPtr.GuidQwordStringEvent->Guid, &ModuleGuid, sizeof (FpdtRecordPtr.GuidQwordStringEvent->Guid));
1181 if (Address != 0) {
1182 GetDeviceInfoFromHandleAndUpdateLength (CallerIdentifier, (EFI_HANDLE)(UINTN)Address, FpdtRecordPtr.GuidQwordStringEvent->String, &FpdtRecordPtr.GuidQwordStringEvent->Header.Length);
1183 }
1184 }
1185
1186 break;
1187
1188 case PERF_EVENTSIGNAL_START_ID:
1189 case PERF_EVENTSIGNAL_END_ID:
1190 case PERF_CALLBACK_START_ID:
1191 case PERF_CALLBACK_END_ID:
1192 if ((String == NULL) || (Guid == NULL)) {
1193 return EFI_INVALID_PARAMETER;
1194 }
1195
1196 StringPtr = String;
1197 if (AsciiStrLen (String) == 0) {
1198 StringPtr = "unknown name";
1199 }
1200
1201 if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1202 FpdtRecordPtr.DualGuidStringEvent->Header.Type = FPDT_DUAL_GUID_STRING_EVENT_TYPE;
1203 FpdtRecordPtr.DualGuidStringEvent->Header.Length = sizeof (FPDT_DUAL_GUID_STRING_EVENT_RECORD);
1204 FpdtRecordPtr.DualGuidStringEvent->Header.Revision = FPDT_RECORD_REVISION_1;
1205 FpdtRecordPtr.DualGuidStringEvent->ProgressID = PerfId;
1206 FpdtRecordPtr.DualGuidStringEvent->Timestamp = TimeStamp;
1207 CopyMem (&FpdtRecordPtr.DualGuidStringEvent->Guid1, CallerIdentifier, sizeof (FpdtRecordPtr.DualGuidStringEvent->Guid1));
1208 CopyMem (&FpdtRecordPtr.DualGuidStringEvent->Guid2, Guid, sizeof (FpdtRecordPtr.DualGuidStringEvent->Guid2));
1209 CopyStringIntoPerfRecordAndUpdateLength (FpdtRecordPtr.DualGuidStringEvent->String, StringPtr, &FpdtRecordPtr.DualGuidStringEvent->Header.Length);
1210 }
1211
1212 break;
1213
1214 case PERF_EVENT_ID:
1215 case PERF_FUNCTION_START_ID:
1216 case PERF_FUNCTION_END_ID:
1217 case PERF_INMODULE_START_ID:
1218 case PERF_INMODULE_END_ID:
1219 case PERF_CROSSMODULE_START_ID:
1220 case PERF_CROSSMODULE_END_ID:
1221 GetModuleInfoFromHandle ((EFI_HANDLE)CallerIdentifier, ModuleName, sizeof (ModuleName), &ModuleGuid);
1222 if (String != NULL) {
1223 StringPtr = String;
1224 } else {
1225 StringPtr = ModuleName;
1226 }
1227
1228 if (AsciiStrLen (StringPtr) == 0) {
1229 StringPtr = "unknown name";
1230 }
1231
1232 if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1233 FpdtRecordPtr.DynamicStringEvent->Header.Type = FPDT_DYNAMIC_STRING_EVENT_TYPE;
1234 FpdtRecordPtr.DynamicStringEvent->Header.Length = sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD);
1235 FpdtRecordPtr.DynamicStringEvent->Header.Revision = FPDT_RECORD_REVISION_1;
1236 FpdtRecordPtr.DynamicStringEvent->ProgressID = PerfId;
1237 FpdtRecordPtr.DynamicStringEvent->Timestamp = TimeStamp;
1238 CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, &ModuleGuid, sizeof (FpdtRecordPtr.DynamicStringEvent->Guid));
1239 CopyStringIntoPerfRecordAndUpdateLength (FpdtRecordPtr.DynamicStringEvent->String, StringPtr, &FpdtRecordPtr.DynamicStringEvent->Header.Length);
1240 }
1241
1242 break;
1243
1244 default:
1245 if (Attribute != PerfEntry) {
1246 GetModuleInfoFromHandle ((EFI_HANDLE)CallerIdentifier, ModuleName, sizeof (ModuleName), &ModuleGuid);
1247 if (String != NULL) {
1248 StringPtr = String;
1249 } else {
1250 StringPtr = ModuleName;
1251 }
1252
1253 if (AsciiStrLen (StringPtr) == 0) {
1254 StringPtr = "unknown name";
1255 }
1256
1257 if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1258 FpdtRecordPtr.DynamicStringEvent->Header.Type = FPDT_DYNAMIC_STRING_EVENT_TYPE;
1259 FpdtRecordPtr.DynamicStringEvent->Header.Length = sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD);
1260 FpdtRecordPtr.DynamicStringEvent->Header.Revision = FPDT_RECORD_REVISION_1;
1261 FpdtRecordPtr.DynamicStringEvent->ProgressID = PerfId;
1262 FpdtRecordPtr.DynamicStringEvent->Timestamp = TimeStamp;
1263 CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, &ModuleGuid, sizeof (FpdtRecordPtr.DynamicStringEvent->Guid));
1264 CopyStringIntoPerfRecordAndUpdateLength (FpdtRecordPtr.DynamicStringEvent->String, StringPtr, &FpdtRecordPtr.DynamicStringEvent->Header.Length);
1265 }
1266 } else {
1267 return EFI_INVALID_PARAMETER;
1268 }
1269
1270 break;
1271 }
1272
1273 //
1274 // 4.2 When PcdEdkiiFpdtStringRecordEnableOnly==TRUE, create string record for all Perf entries.
1275 //
1276 if (PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1277 if ((StringPtr == NULL) || (PerfId == MODULE_DB_SUPPORT_START_ID) || (PerfId == MODULE_DB_SUPPORT_END_ID)) {
1278 return EFI_INVALID_PARAMETER;
1279 }
1280
1281 FpdtRecordPtr.DynamicStringEvent->Header.Type = FPDT_DYNAMIC_STRING_EVENT_TYPE;
1282 FpdtRecordPtr.DynamicStringEvent->Header.Length = sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD);
1283 FpdtRecordPtr.DynamicStringEvent->Header.Revision = FPDT_RECORD_REVISION_1;
1284 FpdtRecordPtr.DynamicStringEvent->ProgressID = PerfId;
1285 FpdtRecordPtr.DynamicStringEvent->Timestamp = TimeStamp;
1286 if (Guid != NULL) {
1287 //
1288 // Cache the event guid in string event record.
1289 //
1290 CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, Guid, sizeof (FpdtRecordPtr.DynamicStringEvent->Guid));
1291 } else {
1292 CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, &ModuleGuid, sizeof (FpdtRecordPtr.DynamicStringEvent->Guid));
1293 }
1294
1295 if (AsciiStrLen (StringPtr) == 0) {
1296 StringPtr = "unknown name";
1297 }
1298
1299 CopyStringIntoPerfRecordAndUpdateLength (FpdtRecordPtr.DynamicStringEvent->String, StringPtr, &FpdtRecordPtr.DynamicStringEvent->Header.Length);
1300
1301 if ((PerfId == MODULE_LOADIMAGE_START_ID) || (PerfId == MODULE_END_ID)) {
1302 FpdtRecordPtr.DynamicStringEvent->Header.Length = (UINT8)(sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD)+ STRING_SIZE);
1303 }
1304
1305 if (((PerfId == MODULE_LOADIMAGE_END_ID) || (PerfId == MODULE_END_ID)) && (mCachedLength != 0)) {
1306 if (mFpdtBufferIsReported) {
1307 CachedFpdtRecordPtr.RecordHeader = (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER *)(mBootRecordBuffer + mCachedLength);
1308 } else {
1309 CachedFpdtRecordPtr.RecordHeader = (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER *)(mPerformancePointer + mCachedLength);
1310 }
1311
1312 if (PerfId == MODULE_LOADIMAGE_END_ID) {
1313 DestMax = CachedFpdtRecordPtr.DynamicStringEvent->Header.Length - sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD);
1314 StringLen = AsciiStrLen (StringPtr);
1315 if (StringLen >= DestMax) {
1316 StringLen = DestMax -1;
1317 }
1318
1319 CopyMem (&CachedFpdtRecordPtr.DynamicStringEvent->Guid, &ModuleGuid, sizeof (CachedFpdtRecordPtr.DynamicStringEvent->Guid));
1320 AsciiStrnCpyS (CachedFpdtRecordPtr.DynamicStringEvent->String, DestMax, StringPtr, StringLen);
1321 } else if (PerfId == MODULE_END_ID) {
1322 DestMax = FpdtRecordPtr.DynamicStringEvent->Header.Length - sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD);
1323 StringLen = AsciiStrLen (CachedFpdtRecordPtr.DynamicStringEvent->String);
1324 if (StringLen >= DestMax) {
1325 StringLen = DestMax -1;
1326 }
1327
1328 CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, &CachedFpdtRecordPtr.DynamicStringEvent->Guid, sizeof (CachedFpdtRecordPtr.DynamicStringEvent->Guid));
1329 AsciiStrnCpyS (FpdtRecordPtr.DynamicStringEvent->String, DestMax, CachedFpdtRecordPtr.DynamicStringEvent->String, StringLen);
1330 }
1331
1332 mCachedLength = 0;
1333 }
1334 }
1335
1336 //
1337 // 5. Update the length of the used buffer after fill in the record.
1338 //
1339 if (mFpdtBufferIsReported) {
1340 mBootRecordSize += FpdtRecordPtr.RecordHeader->Length;
1341 mAcpiBootPerformanceTable->Header.Length += FpdtRecordPtr.RecordHeader->Length;
1342 } else {
1343 mPerformanceLength += FpdtRecordPtr.RecordHeader->Length;
1344 }
1345
1346 return EFI_SUCCESS;
1347}
1348
1359VOID
1361 VOID *HobStart
1362 )
1363{
1364 UINT8 *FirmwarePerformanceHob;
1365 FPDT_PEI_EXT_PERF_HEADER *PeiPerformanceLogHeader;
1366 UINT8 *EventRec;
1367 EFI_HOB_GUID_TYPE *GuidHob;
1368
1369 GuidHob = GetNextGuidHob (&gEdkiiFpdtExtendedFirmwarePerformanceGuid, HobStart);
1370 while (GuidHob != NULL) {
1371 FirmwarePerformanceHob = GET_GUID_HOB_DATA (GuidHob);
1372 PeiPerformanceLogHeader = (FPDT_PEI_EXT_PERF_HEADER *)FirmwarePerformanceHob;
1373
1374 if (mPerformanceLength + PeiPerformanceLogHeader->SizeOfAllEntries > mMaxPerformanceLength) {
1375 mPerformancePointer = ReallocatePool (
1376 mPerformanceLength,
1377 mPerformanceLength +
1378 (UINTN)PeiPerformanceLogHeader->SizeOfAllEntries +
1379 FIRMWARE_RECORD_BUFFER,
1380 mPerformancePointer
1381 );
1382 ASSERT (mPerformancePointer != NULL);
1383 mMaxPerformanceLength = mPerformanceLength +
1384 (UINTN)(PeiPerformanceLogHeader->SizeOfAllEntries) +
1385 FIRMWARE_RECORD_BUFFER;
1386 }
1387
1388 EventRec = mPerformancePointer + mPerformanceLength;
1389 CopyMem (EventRec, FirmwarePerformanceHob + sizeof (FPDT_PEI_EXT_PERF_HEADER), (UINTN)(PeiPerformanceLogHeader->SizeOfAllEntries));
1390 //
1391 // Update the used buffer size.
1392 //
1393 mPerformanceLength += (UINTN)(PeiPerformanceLogHeader->SizeOfAllEntries);
1394 mLoadImageCount += PeiPerformanceLogHeader->LoadImageCount;
1395
1396 //
1397 // Get next performance guid hob
1398 //
1399 GuidHob = GetNextGuidHob (&gEdkiiFpdtExtendedFirmwarePerformanceGuid, GET_NEXT_HOB (GuidHob));
1400 }
1401}
1402
1410VOID
1411EFIAPI
1413 IN EFI_EVENT Event,
1414 IN VOID *Context
1415 )
1416{
1417 EFI_STATUS Status;
1418 UINT64 BPDTAddr;
1419
1420 if (!mFpdtBufferIsReported) {
1421 Status = AllocateBootPerformanceTable ();
1422 if (!EFI_ERROR (Status)) {
1423 BPDTAddr = (UINT64)(UINTN)mAcpiBootPerformanceTable;
1426 EFI_SOFTWARE_DXE_BS_DRIVER,
1427 0,
1428 NULL,
1429 &gEdkiiFpdtExtendedFirmwarePerformanceGuid,
1430 &BPDTAddr,
1431 sizeof (UINT64)
1432 );
1433 Status = gBS->InstallConfigurationTable (&gEdkiiFpdtExtendedFirmwarePerformanceGuid, (VOID *)(UINTN)BPDTAddr);
1434 ASSERT_EFI_ERROR (Status);
1435 }
1436
1437 //
1438 // Set FPDT report state to TRUE.
1439 //
1440 mFpdtBufferIsReported = TRUE;
1441 }
1442}
1443
1451VOID
1452EFIAPI
1454 IN EFI_EVENT Event,
1455 IN VOID *Context
1456 )
1457{
1458 VOID *SmmBootRecordData;
1459 UINTN SmmBootRecordDataSize;
1460 UINTN AppendSize;
1461 UINT8 *FirmwarePerformanceTablePtr;
1462
1463 SmmBootRecordDataSize = 0;
1464
1465 //
1466 // Get SMM performance data.
1467 //
1468 SmmBootRecordData = NULL;
1469 InternalGetSmmPerfData (&SmmBootRecordData, &SmmBootRecordDataSize, FALSE);
1470
1471 FirmwarePerformanceTablePtr = (UINT8 *)mAcpiBootPerformanceTable + mAcpiBootPerformanceTable->Header.Length;
1472
1473 if (mAcpiBootPerformanceTable->Header.Length + SmmBootRecordDataSize > mBootRecordMaxSize) {
1474 DEBUG ((DEBUG_INFO, "DxeCorePerformanceLib: No enough space to save all SMM boot performance data\n"));
1475 AppendSize = mBootRecordMaxSize - mAcpiBootPerformanceTable->Header.Length;
1476 } else {
1477 AppendSize = SmmBootRecordDataSize;
1478 }
1479
1480 if (SmmBootRecordData != NULL) {
1481 CopyMem (FirmwarePerformanceTablePtr, SmmBootRecordData, AppendSize);
1482 mAcpiBootPerformanceTable->Header.Length += (UINT32)AppendSize;
1483 mBootRecordSize += (UINT32)AppendSize;
1484 FreePool (SmmBootRecordData);
1485 }
1486}
1487
1502EFIAPI
1504 IN EFI_HANDLE ImageHandle,
1505 IN EFI_SYSTEM_TABLE *SystemTable
1506 )
1507{
1508 EFI_STATUS Status;
1509 EFI_HANDLE Handle;
1510 EFI_EVENT EndOfDxeEvent;
1511 EFI_EVENT ReadyToBootEvent;
1512 PERFORMANCE_PROPERTY *PerformanceProperty;
1513
1515 //
1516 // Do not initialize performance infrastructure if not required.
1517 //
1518 return EFI_SUCCESS;
1519 }
1520
1521 //
1522 // Dump normal PEI performance records
1523 //
1525
1526 //
1527 // Install the protocol interfaces for DXE performance library instance.
1528 //
1529 Handle = NULL;
1530 Status = gBS->InstallMultipleProtocolInterfaces (
1531 &Handle,
1532 &gEdkiiPerformanceMeasurementProtocolGuid,
1533 &mPerformanceMeasurementInterface,
1534 NULL
1535 );
1536 ASSERT_EFI_ERROR (Status);
1537
1538 //
1539 // Register EndOfDxe event to allocate the boot performance table and report the table address through status code.
1540 //
1541 Status = gBS->CreateEventEx (
1542 EVT_NOTIFY_SIGNAL,
1543 TPL_NOTIFY,
1545 NULL,
1546 &gEfiEndOfDxeEventGroupGuid,
1547 &EndOfDxeEvent
1548 );
1549
1550 //
1551 // Register ReadyToBoot event to update the boot performance table for SMM performance data.
1552 //
1553 Status = gBS->CreateEventEx (
1554 EVT_NOTIFY_SIGNAL,
1555 TPL_CALLBACK,
1557 NULL,
1558 &gEfiEventReadyToBootGuid,
1559 &ReadyToBootEvent
1560 );
1561
1562 ASSERT_EFI_ERROR (Status);
1563
1564 Status = EfiGetSystemConfigurationTable (&gPerformanceProtocolGuid, (VOID **)&PerformanceProperty);
1565 if (EFI_ERROR (Status)) {
1566 //
1567 // Install configuration table for performance property.
1568 //
1569 mPerformanceProperty.Revision = PERFORMANCE_PROPERTY_REVISION;
1570 mPerformanceProperty.Reserved = 0;
1571 mPerformanceProperty.Frequency = GetPerformanceCounterProperties (
1572 &mPerformanceProperty.TimerStartValue,
1573 &mPerformanceProperty.TimerEndValue
1574 );
1575 Status = gBS->InstallConfigurationTable (&gPerformanceProtocolGuid, &mPerformanceProperty);
1576 ASSERT_EFI_ERROR (Status);
1577 }
1578
1579 return EFI_SUCCESS;
1580}
1581
1601EFIAPI
1603 IN CONST VOID *CallerIdentifier,
1604 IN CONST VOID *Guid OPTIONAL,
1605 IN CONST CHAR8 *String OPTIONAL,
1606 IN UINT64 TimeStamp,
1607 IN UINT64 Address OPTIONAL,
1608 IN UINT32 Identifier,
1609 IN PERF_MEASUREMENT_ATTRIBUTE Attribute
1610 )
1611{
1612 EFI_STATUS Status;
1613
1614 Status = EFI_SUCCESS;
1615
1616 if (mLockInsertRecord) {
1617 return EFI_INVALID_PARAMETER;
1618 }
1619
1620 mLockInsertRecord = TRUE;
1621
1622 Status = InsertFpdtRecord (CallerIdentifier, Guid, String, TimeStamp, Address, (UINT16)Identifier, Attribute);
1623
1624 mLockInsertRecord = FALSE;
1625
1626 return Status;
1627}
1628
1654RETURN_STATUS
1655EFIAPI
1657 IN CONST VOID *Handle OPTIONAL,
1658 IN CONST CHAR8 *Token OPTIONAL,
1659 IN CONST CHAR8 *Module OPTIONAL,
1660 IN UINT64 TimeStamp,
1661 IN UINT32 Identifier
1662 )
1663{
1664 CONST CHAR8 *String;
1665
1666 if (Token != NULL) {
1667 String = Token;
1668 } else if (Module != NULL) {
1669 String = Module;
1670 } else {
1671 String = NULL;
1672 }
1673
1674 return (RETURN_STATUS)CreatePerformanceMeasurement (Handle, NULL, String, TimeStamp, 0, Identifier, PerfStartEntry);
1675}
1676
1703RETURN_STATUS
1704EFIAPI
1706 IN CONST VOID *Handle OPTIONAL,
1707 IN CONST CHAR8 *Token OPTIONAL,
1708 IN CONST CHAR8 *Module OPTIONAL,
1709 IN UINT64 TimeStamp,
1710 IN UINT32 Identifier
1711 )
1712{
1713 CONST CHAR8 *String;
1714
1715 if (Token != NULL) {
1716 String = Token;
1717 } else if (Module != NULL) {
1718 String = Module;
1719 } else {
1720 String = NULL;
1721 }
1722
1723 return (RETURN_STATUS)CreatePerformanceMeasurement (Handle, NULL, String, TimeStamp, 0, Identifier, PerfEndEntry);
1724}
1725
1770UINTN
1771EFIAPI
1773 IN UINTN LogEntryKey,
1774 OUT CONST VOID **Handle,
1775 OUT CONST CHAR8 **Token,
1776 OUT CONST CHAR8 **Module,
1777 OUT UINT64 *StartTimeStamp,
1778 OUT UINT64 *EndTimeStamp,
1779 OUT UINT32 *Identifier
1780 )
1781{
1782 return 0;
1783}
1784
1808RETURN_STATUS
1809EFIAPI
1811 IN CONST VOID *Handle OPTIONAL,
1812 IN CONST CHAR8 *Token OPTIONAL,
1813 IN CONST CHAR8 *Module OPTIONAL,
1814 IN UINT64 TimeStamp
1815 )
1816{
1817 return StartPerformanceMeasurementEx (Handle, Token, Module, TimeStamp, 0);
1818}
1819
1844RETURN_STATUS
1845EFIAPI
1847 IN CONST VOID *Handle OPTIONAL,
1848 IN CONST CHAR8 *Token OPTIONAL,
1849 IN CONST CHAR8 *Module OPTIONAL,
1850 IN UINT64 TimeStamp
1851 )
1852{
1853 return EndPerformanceMeasurementEx (Handle, Token, Module, TimeStamp, 0);
1854}
1855
1897UINTN
1898EFIAPI
1900 IN UINTN LogEntryKey,
1901 OUT CONST VOID **Handle,
1902 OUT CONST CHAR8 **Token,
1903 OUT CONST CHAR8 **Module,
1904 OUT UINT64 *StartTimeStamp,
1905 OUT UINT64 *EndTimeStamp
1906 )
1907{
1908 return 0;
1909}
1910
1923BOOLEAN
1924EFIAPI
1926 VOID
1927 )
1928{
1929 return (BOOLEAN)((PcdGet8 (PcdPerformanceLibraryPropertyMask) & PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) != 0);
1930}
1931
1947RETURN_STATUS
1948EFIAPI
1950 IN CONST VOID *CallerIdentifier,
1951 IN CONST VOID *Guid OPTIONAL,
1952 IN CONST CHAR8 *String OPTIONAL,
1953 IN UINT64 Address OPTIONAL,
1954 IN UINT32 Identifier
1955 )
1956{
1957 return (RETURN_STATUS)CreatePerformanceMeasurement (CallerIdentifier, Guid, String, 0, Address, Identifier, PerfEntry);
1958}
1959
1972BOOLEAN
1973EFIAPI
1975 IN CONST UINTN Type
1976 )
1977{
1978 //
1979 // When Performance measurement is enabled and the type is not filtered, the performance can be logged.
1980 //
1981 if (PerformanceMeasurementEnabled () && ((PcdGet8 (PcdPerformanceLibraryPropertyMask) & Type) == 0)) {
1982 return TRUE;
1983 }
1984
1985 return FALSE;
1986}
UINT64 UINTN
INT64 INTN
#define EFI_ACPI_5_0_FPDT_BOOT_PERFORMANCE_TABLE_SIGNATURE
Definition: Acpi50.h:1270
UINT64 EFIAPI GetPerformanceCounterProperties(OUT UINT64 *StartValue OPTIONAL, OUT UINT64 *EndValue OPTIONAL)
UINT64 EFIAPI GetTimeInNanoSecond(IN UINT64 Ticks)
UINT64 EFIAPI GetPerformanceCounter(VOID)
VOID *EFIAPI GetNextGuidHob(IN CONST EFI_GUID *Guid, IN CONST VOID *HobStart)
Definition: HobLib.c:176
VOID *EFIAPI GetHobList(VOID)
Definition: HobLib.c:76
UINTN EFIAPI StrSize(IN CONST CHAR16 *String)
Definition: String.c:72
RETURN_STATUS EFIAPI AsciiStrnCpyS(OUT CHAR8 *Destination, IN UINTN DestMax, IN CONST CHAR8 *Source, IN UINTN Length)
Definition: SafeString.c:1875
UINTN EFIAPI AsciiStrLen(IN CONST CHAR8 *String)
Definition: String.c:641
INTN EFIAPI AsciiStrCmp(IN CONST CHAR8 *FirstString, IN CONST CHAR8 *SecondString)
Definition: String.c:716
UINTN EFIAPI AsciiStrSize(IN CONST CHAR8 *String)
Definition: String.c:681
RETURN_STATUS EFIAPI UnicodeStrnToAsciiStrS(IN CONST CHAR16 *Source, IN UINTN Length, OUT CHAR8 *Destination, IN UINTN DestMax, OUT UINTN *DestinationLength)
Definition: SafeString.c:2757
RETURN_STATUS EFIAPI AsciiStrCpyS(OUT CHAR8 *Destination, IN UINTN DestMax, IN CONST CHAR8 *Source)
Definition: SafeString.c:1797
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
GUID *EFIAPI CopyGuid(OUT GUID *DestinationGuid, IN CONST GUID *SourceGuid)
Definition: MemLibGuid.c:39
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
BOOLEAN EFIAPI IsZeroGuid(IN CONST GUID *Guid)
Definition: MemLibGuid.c:156
#define MEDIA_PIWG_FW_FILE_DP
Definition: DevicePath.h:1130
EFI_DEVICE_PATH_PROTOCOL *EFIAPI DevicePathFromHandle(IN EFI_HANDLE Handle)
CHAR16 *EFIAPI ConvertDevicePathToText(IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN BOOLEAN DisplayOnly, IN BOOLEAN AllowShortcuts)
VOID EFIAPI UpdateBootPerformanceTable(IN EFI_EVENT Event, IN VOID *Context)
EFI_STATUS GetFpdtRecordPtr(IN UINT8 RecordSize, IN OUT FPDT_RECORD_PTR *FpdtRecordPtr)
RETURN_STATUS EFIAPI EndPerformanceMeasurementEx(IN CONST VOID *Handle OPTIONAL, IN CONST CHAR8 *Token OPTIONAL, IN CONST CHAR8 *Module OPTIONAL, IN UINT64 TimeStamp, IN UINT32 Identifier)
EFI_STATUS EFIAPI CreatePerformanceMeasurement(IN CONST VOID *CallerIdentifier, IN CONST VOID *Guid OPTIONAL, IN CONST CHAR8 *String OPTIONAL, IN UINT64 TimeStamp, IN UINT64 Address OPTIONAL, IN UINT32 Identifier, IN PERF_MEASUREMENT_ATTRIBUTE Attribute)
VOID InternalGetPeiPerformance(VOID *HobStart)
UINTN EFIAPI GetPerformanceMeasurement(IN UINTN LogEntryKey, OUT CONST VOID **Handle, OUT CONST CHAR8 **Token, OUT CONST CHAR8 **Module, OUT UINT64 *StartTimeStamp, OUT UINT64 *EndTimeStamp)
VOID CopyStringIntoPerfRecordAndUpdateLength(IN OUT CHAR8 *Destination, IN CONST CHAR8 *Source, IN OUT UINT8 *Length)
EFI_STATUS InsertFpdtRecord(IN CONST VOID *CallerIdentifier OPTIONAL, IN CONST VOID *Guid OPTIONAL, IN CONST CHAR8 *String OPTIONAL, IN UINT64 Ticker, IN UINT64 Address OPTIONAL, IN UINT16 PerfId, IN PERF_MEASUREMENT_ATTRIBUTE Attribute)
RETURN_STATUS EFIAPI StartPerformanceMeasurementEx(IN CONST VOID *Handle OPTIONAL, IN CONST CHAR8 *Token OPTIONAL, IN CONST CHAR8 *Module OPTIONAL, IN UINT64 TimeStamp, IN UINT32 Identifier)
EFI_STATUS GetFpdtRecordId(IN PERF_MEASUREMENT_ATTRIBUTE Attribute, IN CONST VOID *Handle, IN CONST CHAR8 *String, OUT UINT16 *ProgressID)
VOID InternalGetSmmPerfData(OUT VOID **SmmPerfData, OUT UINTN *SmmPerfDataSize, IN BOOLEAN SkipGetPerfData)
EFI_STATUS AllocateBootPerformanceTable(VOID)
RETURN_STATUS EFIAPI LogPerformanceMeasurement(IN CONST VOID *CallerIdentifier, IN CONST VOID *Guid OPTIONAL, IN CONST CHAR8 *String OPTIONAL, IN UINT64 Address OPTIONAL, IN UINT32 Identifier)
EFI_STATUS GetDeviceInfoFromHandleAndUpdateLength(IN CONST VOID *Handle, IN EFI_HANDLE ControllerHandle, OUT CHAR8 *ComponentNameString, IN OUT UINT8 *Length)
BOOLEAN EFIAPI LogPerformanceMeasurementEnabled(IN CONST UINTN Type)
BOOLEAN IsKnownTokens(IN CONST CHAR8 *Token)
BOOLEAN EFIAPI PerformanceMeasurementEnabled(VOID)
UINTN EFIAPI GetPerformanceMeasurementEx(IN UINTN LogEntryKey, OUT CONST VOID **Handle, OUT CONST CHAR8 **Token, OUT CONST CHAR8 **Module, OUT UINT64 *StartTimeStamp, OUT UINT64 *EndTimeStamp, OUT UINT32 *Identifier)
RETURN_STATUS EFIAPI EndPerformanceMeasurement(IN CONST VOID *Handle OPTIONAL, IN CONST CHAR8 *Token OPTIONAL, IN CONST CHAR8 *Module OPTIONAL, IN UINT64 TimeStamp)
BOOLEAN IsKnownID(IN UINT32 Identifier)
EFI_STATUS GetModuleInfoFromHandle(IN EFI_HANDLE Handle, OUT CHAR8 *NameString, IN UINTN BufferSize, OUT EFI_GUID *ModuleGuid OPTIONAL)
VOID EFIAPI ReportFpdtRecordBuffer(IN EFI_EVENT Event, IN VOID *Context)
EFI_STATUS EFIAPI DxeCorePerformanceLibConstructor(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
RETURN_STATUS EFIAPI StartPerformanceMeasurement(IN CONST VOID *Handle OPTIONAL, IN CONST CHAR8 *Token OPTIONAL, IN CONST CHAR8 *Module OPTIONAL, IN UINT64 TimeStamp)
VOID *EFIAPI AllocatePeiAccessiblePages(IN EFI_MEMORY_TYPE MemoryType, IN UINTN Pages)
Definition: Allocate.c:31
EFI_STATUS EFIAPI GetSectionFromAnyFv(IN CONST EFI_GUID *NameGuid, IN EFI_SECTION_TYPE SectionType, IN UINTN SectionInstance, OUT VOID **Buffer, OUT UINTN *Size)
VOID *EFIAPI ReallocatePool(IN UINTN OldSize, IN UINTN NewSize, IN VOID *OldBuffer OPTIONAL)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI FreePool(IN VOID *Buffer)
#define DRIVERBINDING_START_TOK
Driver Binding Start() function call.
#define PEI_TOK
PEI Phase.
#define DXE_TOK
DXE Phase.
#define PEIM_TOK
PEIM Modules Entry Point execution.
#define DRIVERBINDING_STOP_TOK
Driver Binding Stop() function call.
#define LOAD_IMAGE_TOK
Load a dispatched module.
#define START_IMAGE_TOK
Dispatched Modules Entry Point execution.
#define BDS_TOK
BDS Phase.
#define DRIVERBINDING_SUPPORT_TOK
Driver Binding Support() function call.
#define SEC_TOK
SEC Phase.
EFI_RUNTIME_SERVICES * gRT
#define NULL
Definition: Base.h:319
#define CONST
Definition: Base.h:259
#define MIN(a, b)
Definition: Base.h:1007
#define RETURN_UNSUPPORTED
Definition: Base.h:1081
#define VOID
Definition: Base.h:269
#define TRUE
Definition: Base.h:301
#define FALSE
Definition: Base.h:307
#define IN
Definition: Base.h:279
#define OFFSET_OF(TYPE, Field)
Definition: Base.h:758
#define OUT
Definition: Base.h:284
#define ASSERT_EFI_ERROR(StatusParameter)
Definition: DebugLib.h:463
#define DEBUG(Expression)
Definition: DebugLib.h:435
#define REPORT_STATUS_CODE_EX(Type, Value, Instance, CallerId, ExtendedDataGuid, ExtendedData, ExtendedDataSize)
#define PcdGet8(TokenName)
Definition: PcdLib.h:336
#define PcdGet32(TokenName)
Definition: PcdLib.h:362
#define PcdGetBool(TokenName)
Definition: PcdLib.h:401
#define PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED
#define EFI_PROGRESS_CODE
Definition: PiStatusCode.h:44
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
VOID * EFI_EVENT
Definition: UefiBaseType.h:37
#define EFI_SIZE_TO_PAGES(Size)
Definition: UefiBaseType.h:200
VOID * EFI_HANDLE
Definition: UefiBaseType.h:33
#define EFI_SUCCESS
Definition: UefiBaseType.h:112
EFI_BOOT_SERVICES * gBS
EFI_STATUS EFIAPI GetEfiGlobalVariable2(IN CONST CHAR16 *Name, OUT VOID **Value, OUT UINTN *Size OPTIONAL)
Definition: UefiLib.c:1466
EFI_STATUS EFIAPI EfiGetSystemConfigurationTable(IN EFI_GUID *TableGuid, OUT VOID **Table)
Definition: UefiLib.c:78
@ EfiReservedMemoryType
@ EfiConventionalMemory
@ AllocateAddress
Definition: UefiSpec.h:42
EFI_ACPI_5_0_FPDT_PERFORMANCE_TABLE_HEADER Header
Common ACPI table header.
EFI_DEVICE_PATH_PROTOCOL * FilePath
Definition: LoadedImage.h:54
VOID * ImageBase
The base address at which the image was loaded.
Definition: LoadedImage.h:67
EFI_PHYSICAL_ADDRESS PhysicalStart
Definition: UefiSpec.h:165
EFI_PHYSICAL_ADDRESS BootPerformanceTablePointer
Pointer to Boot Performance Table.
Definition: Base.h:213