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
37 EFI_ACPI_5_0_FPDT_RUNTIME_RECORD_TYPE_FIRMWARE_BASIC_BOOT,
39 EFI_ACPI_5_0_FPDT_RUNTIME_RECORD_REVISION_FIRMWARE_BASIC_BOOT
55 CHAR8 NameString[FPDT_STRING_EVENT_RECORD_NAME_LENGTH];
60UINTN mCachePairCount = 0;
62UINT32 mLoadImageCount = 0;
63UINT32 mPerformanceLength = 0;
64UINT32 mMaxPerformanceLength = 0;
65UINT32 mBootRecordSize = 0;
66UINTN mBootRecordMaxSize = 0;
67UINT32 mCachedLength = 0;
69BOOLEAN mFpdtBufferIsReported =
FALSE;
70BOOLEAN mLackSpaceIsReported =
FALSE;
71CHAR8 *mPlatformLanguage =
NULL;
72UINT8 *mPerformancePointer =
NULL;
73UINT8 *mBootRecordBuffer =
NULL;
74BOOLEAN mLockInsertRecord =
FALSE;
75CHAR8 *mDevicePathString =
NULL;
76UINTN mSmmBootRecordOffset = 0;
104 if (mFpdtBufferIsReported) {
108 if (mBootRecordSize + RecordSize > mBootRecordMaxSize) {
109 if (!mLackSpaceIsReported) {
110 DEBUG ((DEBUG_INFO,
"DxeCorePerformanceLib: No enough space to save boot records\n"));
111 mLackSpaceIsReported =
TRUE;
114 return EFI_OUT_OF_RESOURCES;
125 if (mPerformanceLength + RecordSize > mMaxPerformanceLength) {
128 mPerformanceLength + RecordSize + FIRMWARE_RECORD_BUFFER,
131 if (mPerformancePointer ==
NULL) {
132 return EFI_OUT_OF_RESOURCES;
135 mMaxPerformanceLength = mPerformanceLength + RecordSize + FIRMWARE_RECORD_BUFFER;
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))
225 IN BOOLEAN SkipGetPerfData
229 UINT8 *SmmBootRecordCommBuffer;
237 VOID *CurrentBootRecordData;
238 VOID *SmmBootRecordData;
239 UINTN SmmBootRecordDataSize;
240 UINTN ReservedMemSize;
241 UINTN BootRecordDataPayloadSize;
242 UINTN SmmBootRecordDataRetrieved;
247 SmmBootRecordCommBuffer =
NULL;
249 SmmBootRecordData =
NULL;
251 Status =
gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid,
NULL, (
VOID **)&Communication);
252 if (!EFI_ERROR (Status)) {
258 &gEdkiiPiSmmCommunicationRegionTableGuid,
259 (
VOID **)&SmmCommRegionTable
261 if (!EFI_ERROR (Status)) {
262 ASSERT (SmmCommRegionTable !=
NULL);
264 for (Index = 0; Index < SmmCommRegionTable->NumberOfEntries; Index++) {
269 SmmCommMemRegion = (
EFI_MEMORY_DESCRIPTOR *)((UINT8 *)SmmCommMemRegion + SmmCommRegionTable->DescriptorSize);
272 ASSERT (Index < SmmCommRegionTable->NumberOfEntries);
280 if (ReservedMemSize > SMM_BOOT_RECORD_COMM_SIZE) {
288 CommSize = SMM_BOOT_RECORD_COMM_SIZE;
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));
302 if (!EFI_ERROR (Status) && !EFI_ERROR (SmmCommData->ReturnStatus) && (SmmCommData->BootRecordSize != 0)) {
303 if (SkipGetPerfData) {
304 *SmmPerfDataSize = SmmCommData->BootRecordSize;
311 SmmCommData->Function = SMM_FPDT_FUNCTION_GET_BOOT_RECORD_DATA_BY_OFFSET;
312 SmmCommData->BootRecordOffset = mSmmBootRecordOffset;
313 SmmBootRecordDataSize = SmmCommData->BootRecordSize - mSmmBootRecordOffset;
315 SmmBootRecordDataRetrieved = 0;
316 ASSERT (SmmBootRecordData !=
NULL);
317 if (SmmBootRecordData !=
NULL) {
319 while (SmmBootRecordDataRetrieved < SmmBootRecordDataSize) {
321 BootRecordDataPayloadSize =
MIN (
322 ReservedMemSize - SMM_BOOT_RECORD_COMM_SIZE,
323 SmmBootRecordDataSize - SmmBootRecordDataRetrieved
325 SmmCommData->BootRecordSize = BootRecordDataPayloadSize;
330 Status = Communication->Communicate (Communication, SmmBootRecordCommBuffer, &CommSize);
332 if (EFI_ERROR (Status) || EFI_ERROR (SmmCommData->ReturnStatus)) {
336 if (SmmBootRecordDataRetrieved + SmmCommData->BootRecordSize > SmmBootRecordDataSize) {
337 CopyMem ((UINT8 *)SmmBootRecordData + SmmBootRecordDataRetrieved, CurrentBootRecordData, SmmBootRecordDataSize - SmmBootRecordDataRetrieved);
339 CopyMem ((UINT8 *)SmmBootRecordData + SmmBootRecordDataRetrieved, CurrentBootRecordData, SmmCommData->BootRecordSize);
342 SmmBootRecordDataRetrieved += SmmCommData->BootRecordSize;
343 SmmCommData->BootRecordOffset += SmmCommData->BootRecordSize;
346 mSmmBootRecordOffset = SmmCommData->BootRecordOffset;
348 *SmmPerfData = SmmBootRecordData;
349 *SmmPerfDataSize = SmmBootRecordDataSize;
370 UINTN BootPerformanceDataSize;
371 UINT8 *BootPerformanceData;
373 UINTN SmmBootRecordDataSize;
375 SmmBootRecordDataSize = 0;
392 ZeroMem (&PerformanceVariable,
sizeof (PerformanceVariable));
393 Size =
sizeof (PerformanceVariable);
394 Status =
gRT->GetVariable (
395 EFI_FIRMWARE_PERFORMANCE_VARIABLE_NAME,
396 &gEfiFirmwarePerformanceGuid,
401 if (!EFI_ERROR (Status)) {
402 Status =
gBS->AllocatePages (
408 if (!EFI_ERROR (Status)) {
413 if (mAcpiBootPerformanceTable ==
NULL) {
421 if (mAcpiBootPerformanceTable !=
NULL) {
422 ZeroMem (mAcpiBootPerformanceTable, BootPerformanceDataSize);
426 DEBUG ((DEBUG_INFO,
"DxeCorePerformanceLib: ACPI Boot Performance Table address = 0x%x\n", mAcpiBootPerformanceTable));
428 if (mAcpiBootPerformanceTable ==
NULL) {
429 return EFI_OUT_OF_RESOURCES;
435 BootPerformanceData = (UINT8 *)mAcpiBootPerformanceTable;
439 CopyMem (mAcpiBootPerformanceTable, &mBootPerformanceTableTemplate,
sizeof (mBootPerformanceTableTemplate));
440 BootPerformanceData = BootPerformanceData + mAcpiBootPerformanceTable->
Header.Length;
444 if (mPerformancePointer !=
NULL) {
445 CopyMem (BootPerformanceData, mPerformancePointer, mPerformanceLength);
446 mAcpiBootPerformanceTable->
Header.Length += mPerformanceLength;
447 BootPerformanceData = BootPerformanceData + mPerformanceLength;
449 mPerformancePointer =
NULL;
450 mPerformanceLength = 0;
451 mMaxPerformanceLength = 0;
454 mBootRecordBuffer = (UINT8 *)mAcpiBootPerformanceTable;
455 mBootRecordSize = mAcpiBootPerformanceTable->
Header.Length;
456 mBootRecordMaxSize = BootPerformanceDataSize;
478 OUT CHAR8 *NameString,
491 BOOLEAN ModuleGuidIsGet;
497 if ((NameString ==
NULL) || (BufferSize == 0)) {
498 return EFI_INVALID_PARAMETER;
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);
514 Status = EFI_INVALID_PARAMETER;
516 ModuleGuidIsGet =
FALSE;
521 TempGuid = &gZeroGuid;
527 if (Handle !=
NULL) {
531 Status =
gBS->HandleProtocol (
533 &gEfiLoadedImageProtocolGuid,
534 (
VOID **)&LoadedImage
537 if (EFI_ERROR (Status)) {
541 Status =
gBS->OpenProtocol (
543 &gEfiDriverBindingProtocolGuid,
544 (
VOID **)&DriverBinding,
547 EFI_OPEN_PROTOCOL_GET_PROTOCOL
549 if (!EFI_ERROR (Status)) {
553 Status =
gBS->HandleProtocol (
554 DriverBinding->ImageHandle,
555 &gEfiLoadedImageProtocolGuid,
556 (
VOID **)&LoadedImage
562 if (!EFI_ERROR (Status) && (LoadedImage !=
NULL)) {
574 ModuleGuidIsGet =
TRUE;
576 TempGuid = &FvFilePath->FvFileName;
582 PdbFileName = PeCoffLoaderGetPdbPointer (LoadedImage->
ImageBase);
583 if ((PdbFileName !=
NULL) && (BufferSize > 0)) {
585 for (Index = 0; PdbFileName[Index] != 0; Index++) {
586 if ((PdbFileName[Index] ==
'\\') || (PdbFileName[Index] ==
'/')) {
587 StartIndex = Index + 1;
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;
603 if (Index == BufferSize - 1) {
604 NameString[Index] = 0;
617 Status =
gBS->HandleProtocol (
619 &gEfiComponentName2ProtocolGuid,
620 (
VOID **)&ComponentName2
622 if (!EFI_ERROR (Status)) {
626 if (mPlatformLanguage ==
NULL) {
630 if (mPlatformLanguage !=
NULL) {
631 Status = ComponentName2->GetDriverName (
633 mPlatformLanguage !=
NULL ? mPlatformLanguage :
"en-US",
636 if (!EFI_ERROR (Status)) {
637 for (Index = 0; Index < BufferSize - 1 && StringPtr[Index] != 0; Index++) {
638 NameString[Index] = (CHAR8)StringPtr[Index];
641 NameString[Index] = 0;
650 if (ModuleGuidIsGet) {
658 EFI_SECTION_USER_INTERFACE,
664 if (!EFI_ERROR (Status)) {
668 for (Index = 0; Index < BufferSize - 1 && StringPtr[Index] != 0; Index++) {
669 NameString[Index] = (CHAR8)StringPtr[Index];
672 NameString[Index] = 0;
681 if (ModuleGuid !=
NULL) {
683 if (
IsZeroGuid (TempGuid) && (Handle !=
NULL) && !ModuleGuidIsGet) {
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);
718 IN PERF_MEASUREMENT_ATTRIBUTE Attribute,
721 OUT UINT16 *ProgressID
727 if (String !=
NULL) {
730 if (Attribute == PerfStartEntry) {
731 *ProgressID = MODULE_START_ID;
733 *ProgressID = MODULE_END_ID;
737 if (Attribute == PerfStartEntry) {
738 *ProgressID = MODULE_LOADIMAGE_START_ID;
740 *ProgressID = MODULE_LOADIMAGE_END_ID;
744 if (Attribute == PerfStartEntry) {
745 *ProgressID = MODULE_DB_START_ID;
747 *ProgressID = MODULE_DB_END_ID;
751 if (
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
755 if (Attribute == PerfStartEntry) {
756 *ProgressID = MODULE_DB_SUPPORT_START_ID;
758 *ProgressID = MODULE_DB_SUPPORT_END_ID;
762 if (
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
766 if (Attribute == PerfStartEntry) {
767 *ProgressID = MODULE_DB_STOP_START_ID;
769 *ProgressID = MODULE_DB_STOP_END_ID;
775 if (Attribute == PerfStartEntry) {
776 *ProgressID = PERF_CROSSMODULE_START_ID;
778 *ProgressID = PERF_CROSSMODULE_END_ID;
782 if (Attribute == PerfStartEntry) {
783 *ProgressID = PERF_INMODULE_START_ID;
785 *ProgressID = PERF_INMODULE_END_ID;
788 }
else if (Handle !=
NULL) {
790 if (Attribute == PerfStartEntry) {
791 *ProgressID = PERF_INMODULE_START_ID;
793 *ProgressID = PERF_INMODULE_END_ID;
796 return EFI_INVALID_PARAMETER;
813 IN OUT CHAR8 *Destination,
821 ASSERT (Source !=
NULL);
823 if (
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
824 DestMax = STRING_SIZE;
827 if (DestMax > STRING_SIZE) {
828 DestMax = STRING_SIZE;
833 if (StringLen >= DestMax) {
834 StringLen = DestMax -1;
838 *Length += (UINT8)DestMax;
861 OUT CHAR8 *ComponentNameString,
869 CHAR8 *AsciiStringPtr;
870 UINTN ControllerNameStringSize;
871 UINTN DevicePathStringSize;
873 ControllerNameStringSize = 0;
875 Status =
gBS->HandleProtocol (
877 &gEfiComponentName2ProtocolGuid,
878 (
VOID **)&ComponentName2
881 if (!EFI_ERROR (Status)) {
885 if (mPlatformLanguage ==
NULL) {
889 Status = ComponentName2->GetControllerName (
893 mPlatformLanguage !=
NULL ? mPlatformLanguage :
"en-US",
898 if (!EFI_ERROR (Status)) {
903 ControllerNameStringSize =
StrSize (StringPtr) / 2;
908 if ((ControllerNameStringSize + (*Length) + 1) > FPDT_MAX_PERF_RECORD_SIZE) {
912 ControllerNameStringSize = FPDT_MAX_PERF_RECORD_SIZE - (*Length) - 1;
915 UnicodeStrnToAsciiStrS (StringPtr, ControllerNameStringSize - 1, ComponentNameString, ControllerNameStringSize, &ControllerNameStringSize);
920 AsciiStringPtr = ComponentNameString + ControllerNameStringSize - 1;
921 *AsciiStringPtr = 0x20;
924 ControllerNameStringSize++;
926 *Length += (UINT8)ControllerNameStringSize;
935 if (DevicePathProtocol !=
NULL) {
937 if (StringPtr !=
NULL) {
942 DevicePathStringSize =
StrSize (StringPtr) / 2;
944 if ((DevicePathStringSize + (*Length)) > FPDT_MAX_PERF_RECORD_SIZE) {
948 DevicePathStringSize = FPDT_MAX_PERF_RECORD_SIZE - (*Length);
951 if (ControllerNameStringSize != 0) {
952 AsciiStringPtr = ComponentNameString + ControllerNameStringSize - 1;
954 AsciiStringPtr = ComponentNameString;
957 UnicodeStrnToAsciiStrS (StringPtr, DevicePathStringSize - 1, AsciiStringPtr, DevicePathStringSize, &DevicePathStringSize);
958 *Length += (UINT8)DevicePathStringSize;
963 return EFI_UNSUPPORTED;
994 IN CONST CHAR8 *String OPTIONAL,
996 IN UINT64 Address OPTIONAL,
998 IN PERF_MEASUREMENT_ATTRIBUTE Attribute
1002 CHAR8 ModuleName[FPDT_STRING_EVENT_RECORD_NAME_LENGTH];
1006 CONST CHAR8 *StringPtr;
1014 ZeroMem (ModuleName,
sizeof (ModuleName));
1020 if (Attribute != PerfEntry) {
1031 return EFI_INVALID_PARAMETER;
1033 if ((Attribute == PerfStartEntry) && ((PerfId & 0x000F) != 0)) {
1035 }
else if ((Attribute == PerfEndEntry) && ((PerfId & 0x000F) == 0)) {
1038 }
else if (PerfId == 0) {
1042 Status =
GetFpdtRecordId (Attribute, CallerIdentifier, String, &ProgressId);
1043 if (EFI_ERROR (Status)) {
1047 PerfId = ProgressId;
1055 if (EFI_ERROR (Status)) {
1065 }
else if (Ticker == 1) {
1075 case MODULE_START_ID:
1078 StringPtr = ModuleName;
1082 if ((Attribute == PerfEntry) && (PerfId == MODULE_START_ID)) {
1083 if (mFpdtBufferIsReported) {
1084 mCachedLength = mBootRecordSize;
1086 mCachedLength = mPerformanceLength;
1090 if (!
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1091 FpdtRecordPtr.GuidEvent->Header.Type = FPDT_GUID_EVENT_TYPE;
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) {
1104 CopyMem (&FpdtRecordPtr.GuidEvent->
Guid, &CachedFpdtRecordPtr.GuidEvent->
Guid, sizeof (FpdtRecordPtr.GuidEvent->
Guid));
1111 case MODULE_LOADIMAGE_START_ID:
1112 case MODULE_LOADIMAGE_END_ID:
1114 StringPtr = ModuleName;
1115 if (PerfId == MODULE_LOADIMAGE_START_ID) {
1120 if ((CallerIdentifier ==
NULL) && (Attribute == PerfEntry)) {
1121 if (mFpdtBufferIsReported) {
1122 mCachedLength = mBootRecordSize;
1124 mCachedLength = mPerformanceLength;
1129 if (!
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1130 FpdtRecordPtr.GuidQwordEvent->Header.Type = FPDT_GUID_QWORD_EVENT_TYPE;
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) {
1144 CopyMem (&CachedFpdtRecordPtr.GuidQwordEvent->
Guid, &ModuleGuid, sizeof (CachedFpdtRecordPtr.GuidQwordEvent->
Guid));
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:
1157 StringPtr = ModuleName;
1158 if (!
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1159 FpdtRecordPtr.GuidQwordEvent->Header.Type = FPDT_GUID_QWORD_EVENT_TYPE;
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));
1170 case MODULE_DB_END_ID:
1172 StringPtr = ModuleName;
1173 if (!
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1174 FpdtRecordPtr.GuidQwordStringEvent->Header.Type = FPDT_GUID_QWORD_STRING_EVENT_TYPE;
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));
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;
1198 StringPtr =
"unknown name";
1201 if (!
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1202 FpdtRecordPtr.DualGuidStringEvent->Header.Type = FPDT_DUAL_GUID_STRING_EVENT_TYPE;
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));
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:
1222 if (String !=
NULL) {
1225 StringPtr = ModuleName;
1229 StringPtr =
"unknown name";
1232 if (!
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1233 FpdtRecordPtr.DynamicStringEvent->Header.Type = FPDT_DYNAMIC_STRING_EVENT_TYPE;
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));
1245 if (Attribute != PerfEntry) {
1247 if (String !=
NULL) {
1250 StringPtr = ModuleName;
1254 StringPtr =
"unknown name";
1257 if (!
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
1258 FpdtRecordPtr.DynamicStringEvent->Header.Type = FPDT_DYNAMIC_STRING_EVENT_TYPE;
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));
1267 return EFI_INVALID_PARAMETER;
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;
1281 FpdtRecordPtr.DynamicStringEvent->Header.Type = FPDT_DYNAMIC_STRING_EVENT_TYPE;
1283 FpdtRecordPtr.DynamicStringEvent->Header.Revision = FPDT_RECORD_REVISION_1;
1284 FpdtRecordPtr.DynamicStringEvent->
ProgressID = PerfId;
1285 FpdtRecordPtr.DynamicStringEvent->
Timestamp = TimeStamp;
1290 CopyMem (&FpdtRecordPtr.DynamicStringEvent->
Guid, Guid, sizeof (FpdtRecordPtr.DynamicStringEvent->
Guid));
1292 CopyMem (&FpdtRecordPtr.DynamicStringEvent->
Guid, &ModuleGuid, sizeof (FpdtRecordPtr.DynamicStringEvent->
Guid));
1296 StringPtr =
"unknown name";
1301 if ((PerfId == MODULE_LOADIMAGE_START_ID) || (PerfId == MODULE_END_ID)) {
1305 if (((PerfId == MODULE_LOADIMAGE_END_ID) || (PerfId == MODULE_END_ID)) && (mCachedLength != 0)) {
1306 if (mFpdtBufferIsReported) {
1312 if (PerfId == MODULE_LOADIMAGE_END_ID) {
1315 if (StringLen >= DestMax) {
1316 StringLen = DestMax -1;
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) {
1324 if (StringLen >= DestMax) {
1325 StringLen = DestMax -1;
1328 CopyMem (&FpdtRecordPtr.DynamicStringEvent->
Guid, &CachedFpdtRecordPtr.DynamicStringEvent->
Guid, sizeof (CachedFpdtRecordPtr.DynamicStringEvent->
Guid));
1329 AsciiStrnCpyS (FpdtRecordPtr.DynamicStringEvent->
String, DestMax, CachedFpdtRecordPtr.DynamicStringEvent->
String, StringLen);
1339 if (mFpdtBufferIsReported) {
1340 mBootRecordSize += FpdtRecordPtr.RecordHeader->Length;
1341 mAcpiBootPerformanceTable->
Header.Length += FpdtRecordPtr.RecordHeader->Length;
1343 mPerformanceLength += FpdtRecordPtr.RecordHeader->Length;
1364 UINT8 *FirmwarePerformanceHob;
1369 GuidHob =
GetNextGuidHob (&gEdkiiFpdtExtendedFirmwarePerformanceGuid, HobStart);
1370 while (GuidHob !=
NULL) {
1371 FirmwarePerformanceHob = GET_GUID_HOB_DATA (GuidHob);
1374 if (mPerformanceLength + PeiPerformanceLogHeader->SizeOfAllEntries > mMaxPerformanceLength) {
1377 mPerformanceLength +
1378 (
UINTN)PeiPerformanceLogHeader->SizeOfAllEntries +
1379 FIRMWARE_RECORD_BUFFER,
1382 ASSERT (mPerformancePointer !=
NULL);
1383 mMaxPerformanceLength = mPerformanceLength +
1384 (
UINTN)(PeiPerformanceLogHeader->SizeOfAllEntries) +
1385 FIRMWARE_RECORD_BUFFER;
1388 EventRec = mPerformancePointer + mPerformanceLength;
1393 mPerformanceLength += (
UINTN)(PeiPerformanceLogHeader->SizeOfAllEntries);
1394 mLoadImageCount += PeiPerformanceLogHeader->LoadImageCount;
1399 GuidHob =
GetNextGuidHob (&gEdkiiFpdtExtendedFirmwarePerformanceGuid, GET_NEXT_HOB (GuidHob));
1420 if (!mFpdtBufferIsReported) {
1422 if (!EFI_ERROR (Status)) {
1423 BPDTAddr = (UINT64)(
UINTN)mAcpiBootPerformanceTable;
1426 EFI_SOFTWARE_DXE_BS_DRIVER,
1429 &gEdkiiFpdtExtendedFirmwarePerformanceGuid,
1433 Status =
gBS->InstallConfigurationTable (&gEdkiiFpdtExtendedFirmwarePerformanceGuid, (
VOID *)(
UINTN)BPDTAddr);
1440 mFpdtBufferIsReported =
TRUE;
1458 VOID *SmmBootRecordData;
1459 UINTN SmmBootRecordDataSize;
1461 UINT8 *FirmwarePerformanceTablePtr;
1463 SmmBootRecordDataSize = 0;
1468 SmmBootRecordData =
NULL;
1471 FirmwarePerformanceTablePtr = (UINT8 *)mAcpiBootPerformanceTable + mAcpiBootPerformanceTable->
Header.Length;
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;
1477 AppendSize = SmmBootRecordDataSize;
1480 if (SmmBootRecordData !=
NULL) {
1481 CopyMem (FirmwarePerformanceTablePtr, SmmBootRecordData, AppendSize);
1482 mAcpiBootPerformanceTable->
Header.Length += (UINT32)AppendSize;
1483 mBootRecordSize += (UINT32)AppendSize;
1530 Status =
gBS->InstallMultipleProtocolInterfaces (
1532 &gEdkiiPerformanceMeasurementProtocolGuid,
1533 &mPerformanceMeasurementInterface,
1541 Status =
gBS->CreateEventEx (
1546 &gEfiEndOfDxeEventGroupGuid,
1553 Status =
gBS->CreateEventEx (
1558 &gEfiEventReadyToBootGuid,
1565 if (EFI_ERROR (Status)) {
1569 mPerformanceProperty.Revision = PERFORMANCE_PROPERTY_REVISION;
1570 mPerformanceProperty.Reserved = 0;
1572 &mPerformanceProperty.TimerStartValue,
1573 &mPerformanceProperty.TimerEndValue
1575 Status =
gBS->InstallConfigurationTable (&gPerformanceProtocolGuid, &mPerformanceProperty);
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
1616 if (mLockInsertRecord) {
1617 return EFI_INVALID_PARAMETER;
1620 mLockInsertRecord =
TRUE;
1622 Status =
InsertFpdtRecord (CallerIdentifier, Guid, String, TimeStamp, Address, (UINT16)Identifier, Attribute);
1624 mLockInsertRecord =
FALSE;
1658 IN CONST CHAR8 *Token OPTIONAL,
1659 IN CONST CHAR8 *Module OPTIONAL,
1660 IN UINT64 TimeStamp,
1661 IN UINT32 Identifier
1664 CONST CHAR8 *String;
1666 if (Token !=
NULL) {
1668 }
else if (Module !=
NULL) {
1707 IN CONST CHAR8 *Token OPTIONAL,
1708 IN CONST CHAR8 *Module OPTIONAL,
1709 IN UINT64 TimeStamp,
1710 IN UINT32 Identifier
1713 CONST CHAR8 *String;
1715 if (Token !=
NULL) {
1717 }
else if (Module !=
NULL) {
1777 OUT UINT64 *StartTimeStamp,
1778 OUT UINT64 *EndTimeStamp,
1779 OUT UINT32 *Identifier
1812 IN CONST CHAR8 *Token OPTIONAL,
1813 IN CONST CHAR8 *Module OPTIONAL,
1848 IN CONST CHAR8 *Token OPTIONAL,
1849 IN CONST CHAR8 *Module OPTIONAL,
1904 OUT UINT64 *StartTimeStamp,
1905 OUT UINT64 *EndTimeStamp
1952 IN CONST CHAR8 *String OPTIONAL,
1953 IN UINT64 Address OPTIONAL,
1954 IN UINT32 Identifier
#define EFI_ACPI_5_0_FPDT_BOOT_PERFORMANCE_TABLE_SIGNATURE
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)
VOID *EFIAPI GetHobList(VOID)
UINTN EFIAPI StrSize(IN CONST CHAR16 *String)
RETURN_STATUS EFIAPI AsciiStrnCpyS(OUT CHAR8 *Destination, IN UINTN DestMax, IN CONST CHAR8 *Source, IN UINTN Length)
UINTN EFIAPI AsciiStrLen(IN CONST CHAR8 *String)
INTN EFIAPI AsciiStrCmp(IN CONST CHAR8 *FirstString, IN CONST CHAR8 *SecondString)
UINTN EFIAPI AsciiStrSize(IN CONST CHAR8 *String)
RETURN_STATUS EFIAPI UnicodeStrnToAsciiStrS(IN CONST CHAR16 *Source, IN UINTN Length, OUT CHAR8 *Destination, IN UINTN DestMax, OUT UINTN *DestinationLength)
RETURN_STATUS EFIAPI AsciiStrCpyS(OUT CHAR8 *Destination, IN UINTN DestMax, IN CONST CHAR8 *Source)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
GUID *EFIAPI CopyGuid(OUT GUID *DestinationGuid, IN CONST GUID *SourceGuid)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
BOOLEAN EFIAPI IsZeroGuid(IN CONST GUID *Guid)
#define MEDIA_PIWG_FW_FILE_DP
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 AllocatePeiAccessiblePages(IN EFI_MEMORY_TYPE MemoryType, IN UINTN Pages)
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)
EFI_RUNTIME_SERVICES * gRT
#define RETURN_UNSUPPORTED
#define OFFSET_OF(TYPE, Field)
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG(Expression)
#define REPORT_STATUS_CODE_EX(Type, Value, Instance, CallerId, ExtendedDataGuid, ExtendedData, ExtendedDataSize)
#define PcdGet8(TokenName)
#define PcdGet32(TokenName)
#define PcdGetBool(TokenName)
#define EFI_PROGRESS_CODE
#define EFI_SIZE_TO_PAGES(Size)
EFI_STATUS EFIAPI GetEfiGlobalVariable2(IN CONST CHAR16 *Name, OUT VOID **Value, OUT UINTN *Size OPTIONAL)
EFI_STATUS EFIAPI EfiGetSystemConfigurationTable(IN EFI_GUID *TableGuid, OUT VOID **Table)
EFI_ACPI_5_0_FPDT_PERFORMANCE_TABLE_HEADER Header
Common ACPI table header.
EFI_DEVICE_PATH_PROTOCOL * FilePath
VOID * ImageBase
The base address at which the image was loaded.
EFI_PHYSICAL_ADDRESS PhysicalStart
EFI_PHYSICAL_ADDRESS BootPerformanceTablePointer
Pointer to Boot Performance Table.