26#define STRING_SIZE (FPDT_STRING_EVENT_RECORD_NAME_LENGTH * sizeof (CHAR8))
27#define FIRMWARE_RECORD_BUFFER 0x1000
28#define CACHE_HANDLE_GUID_COUNT 0x100
34 CHAR8 NameString[FPDT_STRING_EVENT_RECORD_NAME_LENGTH];
39UINTN mCachePairCount = 0;
42UINT32 mMaxPerformanceLength = 0;
43UINT32 mLoadImageCount = 0;
44BOOLEAN mFpdtDataIsReported =
FALSE;
45BOOLEAN mLackSpaceIsReport =
FALSE;
46CHAR8 *mPlatformLanguage =
NULL;
49UINT32 mCachedLength = 0;
50UINT32 mBootRecordSize = 0;
51BOOLEAN mPerformanceMeasurementEnabled;
75 if (mFpdtDataIsReported) {
79 if (mPerformanceLength + RecordSize > mMaxPerformanceLength) {
80 if (!mLackSpaceIsReport) {
81 DEBUG ((DEBUG_INFO,
"SmmCorePerformanceLib: No enough space to save boot records\n"));
82 mLackSpaceIsReport =
TRUE;
85 return EFI_OUT_OF_RESOURCES;
96 if (mPerformanceLength + RecordSize > mMaxPerformanceLength) {
99 mPerformanceLength + RecordSize + FIRMWARE_RECORD_BUFFER,
100 mSmmBootPerformanceTable
103 if (mSmmBootPerformanceTable ==
NULL) {
104 return EFI_OUT_OF_RESOURCES;
107 mSmmBootPerformanceTable->
Header.Length = mPerformanceLength;
108 mMaxPerformanceLength = mPerformanceLength + RecordSize + FIRMWARE_RECORD_BUFFER;
117 FpdtRecordPtr->RecordHeader->Length = 0;
170 if ((Identifier == MODULE_START_ID) ||
171 (Identifier == MODULE_END_ID) ||
172 (Identifier == MODULE_LOADIMAGE_START_ID) ||
173 (Identifier == MODULE_LOADIMAGE_END_ID) ||
174 (Identifier == MODULE_DB_START_ID) ||
175 (Identifier == MODULE_DB_END_ID) ||
176 (Identifier == MODULE_DB_SUPPORT_START_ID) ||
177 (Identifier == MODULE_DB_SUPPORT_END_ID) ||
178 (Identifier == MODULE_DB_STOP_START_ID) ||
179 (Identifier == MODULE_DB_STOP_END_ID))
203 IN PERF_MEASUREMENT_ATTRIBUTE Attribute,
206 OUT UINT16 *ProgressID
212 if (String !=
NULL) {
215 if (Attribute == PerfStartEntry) {
216 *ProgressID = MODULE_START_ID;
218 *ProgressID = MODULE_END_ID;
222 if (Attribute == PerfStartEntry) {
223 *ProgressID = MODULE_LOADIMAGE_START_ID;
225 *ProgressID = MODULE_LOADIMAGE_END_ID;
229 if (Attribute == PerfStartEntry) {
230 *ProgressID = PERF_INMODULE_START_ID;
232 *ProgressID = PERF_INMODULE_END_ID;
235 }
else if (Handle !=
NULL) {
237 if (Attribute == PerfStartEntry) {
238 *ProgressID = PERF_INMODULE_START_ID;
240 *ProgressID = PERF_INMODULE_END_ID;
243 return EFI_UNSUPPORTED;
267 OUT CHAR8 *NameString,
280 BOOLEAN ModuleGuidIsGet;
285 if ((NameString ==
NULL) || (BufferSize == 0)) {
286 return EFI_INVALID_PARAMETER;
292 if (mCachePairCount > 0) {
293 for (Count = mCachePairCount - 1; Count >= 0; Count--) {
294 if (Handle == mCacheHandleGuidTable[Count].Handle) {
295 CopyGuid (ModuleGuid, &mCacheHandleGuidTable[Count].ModuleGuid);
296 AsciiStrCpyS (NameString, FPDT_STRING_EVENT_RECORD_NAME_LENGTH, mCacheHandleGuidTable[Count].NameString);
302 Status = EFI_INVALID_PARAMETER;
304 ModuleGuidIsGet =
FALSE;
309 TempGuid = &gZeroGuid;
315 if (Handle !=
NULL) {
319 Status =
gBS->HandleProtocol (
321 &gEfiLoadedImageProtocolGuid,
322 (VOID **)&LoadedImage
325 if (EFI_ERROR (Status)) {
329 Status =
gBS->OpenProtocol (
331 &gEfiDriverBindingProtocolGuid,
332 (VOID **)&DriverBinding,
335 EFI_OPEN_PROTOCOL_GET_PROTOCOL
337 if (!EFI_ERROR (Status)) {
341 Status =
gBS->HandleProtocol (
342 DriverBinding->ImageHandle,
343 &gEfiLoadedImageProtocolGuid,
344 (VOID **)&LoadedImage
350 if (!EFI_ERROR (Status) && (LoadedImage !=
NULL)) {
362 ModuleGuidIsGet =
TRUE;
364 TempGuid = &FvFilePath->FvFileName;
370 PdbFileName = PeCoffLoaderGetPdbPointer (LoadedImage->
ImageBase);
371 if ((PdbFileName !=
NULL) && (BufferSize > 0)) {
373 for (Index = 0; PdbFileName[Index] != 0; Index++) {
374 if ((PdbFileName[Index] ==
'\\') || (PdbFileName[Index] ==
'/')) {
375 StartIndex = Index + 1;
383 for (Index = 0; Index < BufferSize - 1; Index++) {
384 NameString[Index] = PdbFileName[Index + StartIndex];
385 if ((NameString[Index] == 0) || (NameString[Index] ==
'.')) {
386 NameString[Index] = 0;
391 if (Index == BufferSize - 1) {
392 NameString[Index] = 0;
402 if (ModuleGuidIsGet) {
410 EFI_SECTION_USER_INTERFACE,
416 if (!EFI_ERROR (Status)) {
420 for (Index = 0; Index < BufferSize - 1 && StringPtr[Index] != 0; Index++) {
421 NameString[Index] = (CHAR8)StringPtr[Index];
424 NameString[Index] = 0;
433 if (ModuleGuid !=
NULL) {
435 if (
IsZeroGuid (TempGuid) && (Handle !=
NULL) && !ModuleGuidIsGet) {
444 if (mCachePairCount < CACHE_HANDLE_GUID_COUNT) {
445 mCacheHandleGuidTable[mCachePairCount].Handle = Handle;
446 CopyGuid (&mCacheHandleGuidTable[mCachePairCount].ModuleGuid, ModuleGuid);
447 AsciiStrCpyS (mCacheHandleGuidTable[mCachePairCount].NameString, FPDT_STRING_EVENT_RECORD_NAME_LENGTH, NameString);
465 IN OUT CHAR8 *Destination,
473 ASSERT (Source !=
NULL);
475 if (
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
476 DestMax = STRING_SIZE;
479 if (DestMax > STRING_SIZE) {
480 DestMax = STRING_SIZE;
485 if (StringLen >= DestMax) {
486 StringLen = DestMax -1;
490 *Length += (UINT8)DestMax;
521 IN CONST VOID *CallerIdentifier OPTIONAL,
523 IN CONST CHAR8 *String OPTIONAL,
525 IN UINT64 Address OPTIONAL,
527 IN PERF_MEASUREMENT_ATTRIBUTE Attribute
533 CHAR8 ModuleName[FPDT_STRING_EVENT_RECORD_NAME_LENGTH];
537 CONST CHAR8 *StringPtr;
543 ZeroMem (ModuleName,
sizeof (ModuleName));
549 if (Attribute != PerfEntry) {
560 return EFI_INVALID_PARAMETER;
562 if ((Attribute == PerfStartEntry) && ((PerfId & 0x000F) != 0)) {
564 }
else if ((Attribute == PerfEndEntry) && ((PerfId & 0x000F) == 0)) {
573 Status =
GetFpdtRecordId (Attribute, CallerIdentifier, String, &ProgressId);
574 if (EFI_ERROR (Status)) {
586 if (EFI_ERROR (Status)) {
596 }
else if (Ticker == 1) {
606 case MODULE_START_ID:
609 StringPtr = ModuleName;
613 if ((PerfId == MODULE_START_ID) && (Attribute == PerfEntry)) {
614 mCachedLength = mSmmBootPerformanceTable->
Header.Length;
617 if (!
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
618 FpdtRecordPtr.GuidEvent->Header.Type = FPDT_GUID_EVENT_TYPE;
620 FpdtRecordPtr.GuidEvent->Header.Revision = FPDT_RECORD_REVISION_1;
622 FpdtRecordPtr.GuidEvent->
Timestamp = TimeStamp;
623 CopyMem (&FpdtRecordPtr.GuidEvent->
Guid, &ModuleGuid, sizeof (FpdtRecordPtr.GuidEvent->
Guid));
624 if ((CallerIdentifier ==
NULL) && (PerfId == MODULE_END_ID) && (mCachedLength != 0)) {
626 CopyMem (&FpdtRecordPtr.GuidEvent->
Guid, &CachedFpdtRecordPtr.GuidEvent->
Guid, sizeof (FpdtRecordPtr.GuidEvent->
Guid));
633 case MODULE_LOADIMAGE_START_ID:
634 case MODULE_LOADIMAGE_END_ID:
636 StringPtr = ModuleName;
637 if (PerfId == MODULE_LOADIMAGE_START_ID) {
642 if ((CallerIdentifier ==
NULL) && (Attribute == PerfEntry)) {
643 mCachedLength = mSmmBootPerformanceTable->
Header.Length;
647 if (!
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
648 FpdtRecordPtr.GuidQwordEvent->Header.Type = FPDT_GUID_QWORD_EVENT_TYPE;
650 FpdtRecordPtr.GuidQwordEvent->Header.Revision = FPDT_RECORD_REVISION_1;
651 FpdtRecordPtr.GuidQwordEvent->
ProgressID = PerfId;
652 FpdtRecordPtr.GuidQwordEvent->
Timestamp = TimeStamp;
653 FpdtRecordPtr.GuidQwordEvent->
Qword = mLoadImageCount;
654 CopyMem (&FpdtRecordPtr.GuidQwordEvent->
Guid, &ModuleGuid, sizeof (FpdtRecordPtr.GuidQwordEvent->
Guid));
655 if ((PerfId == MODULE_LOADIMAGE_END_ID) && (mCachedLength != 0)) {
657 CopyMem (&CachedFpdtRecordPtr.GuidQwordEvent->
Guid, &ModuleGuid, sizeof (CachedFpdtRecordPtr.GuidQwordEvent->
Guid));
664 case PERF_EVENTSIGNAL_START_ID:
665 case PERF_EVENTSIGNAL_END_ID:
666 case PERF_CALLBACK_START_ID:
667 case PERF_CALLBACK_END_ID:
668 if ((String ==
NULL) || (Guid ==
NULL)) {
669 return EFI_INVALID_PARAMETER;
674 StringPtr =
"unknown name";
677 if (!
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
678 FpdtRecordPtr.DualGuidStringEvent->Header.Type = FPDT_DUAL_GUID_STRING_EVENT_TYPE;
680 FpdtRecordPtr.DualGuidStringEvent->Header.Revision = FPDT_RECORD_REVISION_1;
681 FpdtRecordPtr.DualGuidStringEvent->
ProgressID = PerfId;
682 FpdtRecordPtr.DualGuidStringEvent->
Timestamp = TimeStamp;
683 CopyMem (&FpdtRecordPtr.DualGuidStringEvent->
Guid1, CallerIdentifier, sizeof (FpdtRecordPtr.DualGuidStringEvent->
Guid1));
684 CopyMem (&FpdtRecordPtr.DualGuidStringEvent->
Guid2, Guid, sizeof (FpdtRecordPtr.DualGuidStringEvent->
Guid2));
691 case PERF_FUNCTION_START_ID:
692 case PERF_FUNCTION_END_ID:
693 case PERF_INMODULE_START_ID:
694 case PERF_INMODULE_END_ID:
695 case PERF_CROSSMODULE_START_ID:
696 case PERF_CROSSMODULE_END_ID:
698 if (String !=
NULL) {
701 StringPtr = ModuleName;
705 StringPtr =
"unknown name";
708 if (!
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
709 FpdtRecordPtr.DynamicStringEvent->Header.Type = FPDT_DYNAMIC_STRING_EVENT_TYPE;
711 FpdtRecordPtr.DynamicStringEvent->Header.Revision = FPDT_RECORD_REVISION_1;
712 FpdtRecordPtr.DynamicStringEvent->
ProgressID = PerfId;
713 FpdtRecordPtr.DynamicStringEvent->
Timestamp = TimeStamp;
714 CopyMem (&FpdtRecordPtr.DynamicStringEvent->
Guid, &ModuleGuid, sizeof (FpdtRecordPtr.DynamicStringEvent->
Guid));
721 if (Attribute != PerfEntry) {
723 if (String !=
NULL) {
726 StringPtr = ModuleName;
730 StringPtr =
"unknown name";
733 if (!
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
734 FpdtRecordPtr.DynamicStringEvent->Header.Type = FPDT_DYNAMIC_STRING_EVENT_TYPE;
736 FpdtRecordPtr.DynamicStringEvent->Header.Revision = FPDT_RECORD_REVISION_1;
737 FpdtRecordPtr.DynamicStringEvent->
ProgressID = PerfId;
738 FpdtRecordPtr.DynamicStringEvent->
Timestamp = TimeStamp;
739 CopyMem (&FpdtRecordPtr.DynamicStringEvent->
Guid, &ModuleGuid, sizeof (FpdtRecordPtr.DynamicStringEvent->
Guid));
743 return EFI_INVALID_PARAMETER;
752 if (
PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) {
753 if (StringPtr ==
NULL) {
754 return EFI_INVALID_PARAMETER;
757 FpdtRecordPtr.DynamicStringEvent->Header.Type = FPDT_DYNAMIC_STRING_EVENT_TYPE;
759 FpdtRecordPtr.DynamicStringEvent->Header.Revision = FPDT_RECORD_REVISION_1;
760 FpdtRecordPtr.DynamicStringEvent->
ProgressID = PerfId;
761 FpdtRecordPtr.DynamicStringEvent->
Timestamp = TimeStamp;
766 CopyMem (&FpdtRecordPtr.DynamicStringEvent->
Guid, Guid, sizeof (FpdtRecordPtr.DynamicStringEvent->
Guid));
768 CopyMem (&FpdtRecordPtr.DynamicStringEvent->
Guid, &ModuleGuid, sizeof (FpdtRecordPtr.DynamicStringEvent->
Guid));
772 StringPtr =
"unknown name";
777 if ((PerfId == MODULE_LOADIMAGE_START_ID) || (PerfId == MODULE_END_ID)) {
781 if (((PerfId == MODULE_LOADIMAGE_END_ID) || (PerfId == MODULE_END_ID)) && (mCachedLength != 0)) {
783 if (PerfId == MODULE_LOADIMAGE_END_ID) {
786 if (StringLen >= DestMax) {
787 StringLen = DestMax -1;
790 CopyMem (&CachedFpdtRecordPtr.DynamicStringEvent->
Guid, &ModuleGuid, sizeof (CachedFpdtRecordPtr.DynamicStringEvent->
Guid));
791 AsciiStrnCpyS (CachedFpdtRecordPtr.DynamicStringEvent->
String, DestMax, StringPtr, StringLen);
792 }
else if (PerfId == MODULE_END_ID) {
795 if (StringLen >= DestMax) {
796 StringLen = DestMax -1;
799 CopyMem (&FpdtRecordPtr.DynamicStringEvent->
Guid, &CachedFpdtRecordPtr.DynamicStringEvent->
Guid, sizeof (CachedFpdtRecordPtr.DynamicStringEvent->
Guid));
800 AsciiStrnCpyS (FpdtRecordPtr.DynamicStringEvent->
String, DestMax, CachedFpdtRecordPtr.DynamicStringEvent->
String, StringLen);
810 mPerformanceLength += FpdtRecordPtr.RecordHeader->Length;
811 mSmmBootPerformanceTable->
Header.Length += FpdtRecordPtr.RecordHeader->Length;
844 IN CONST VOID *RegisterContext,
845 IN OUT VOID *CommBuffer,
851 UINTN BootRecordOffset;
852 UINTN BootRecordSize;
853 VOID *BootRecordData;
854 UINTN TempCommBufferSize;
855 UINT8 *BootRecordBuffer;
860 if ((CommBuffer ==
NULL) || (CommBufferSize ==
NULL)) {
864 TempCommBufferSize = *CommBufferSize;
871 DEBUG ((DEBUG_ERROR,
"FpdtSmiHandler: MM communication data buffer in MMRAM or overflow!\n"));
879 switch (SmmCommData->Function) {
880 case SMM_FPDT_FUNCTION_GET_BOOT_RECORD_SIZE:
881 if (mSmmBootPerformanceTable !=
NULL) {
885 SmmCommData->BootRecordSize = mBootRecordSize;
888 case SMM_FPDT_FUNCTION_GET_BOOT_RECORD_DATA:
889 Status = EFI_UNSUPPORTED;
892 case SMM_FPDT_FUNCTION_GET_BOOT_RECORD_DATA_BY_OFFSET:
893 BootRecordOffset = SmmCommData->BootRecordOffset;
894 BootRecordData = SmmCommData->BootRecordData;
895 BootRecordSize = SmmCommData->BootRecordSize;
896 if ((BootRecordData ==
NULL) || (BootRecordOffset >= mBootRecordSize)) {
897 Status = EFI_INVALID_PARAMETER;
904 if (BootRecordSize > mBootRecordSize - BootRecordOffset) {
905 BootRecordSize = mBootRecordSize - BootRecordOffset;
908 SmmCommData->BootRecordSize = BootRecordSize;
910 DEBUG ((DEBUG_ERROR,
"FpdtSmiHandler: MM Data buffer in MMRAM or overflow!\n"));
911 Status = EFI_ACCESS_DENIED;
917 (UINT8 *)BootRecordData,
918 BootRecordBuffer + BootRecordOffset,
921 mFpdtDataIsReported =
TRUE;
925 Status = EFI_UNSUPPORTED;
928 SmmCommData->ReturnStatus = Status;
957 mPerformanceMeasurementEnabled =
FALSE;
994 &gEdkiiSmmPerformanceMeasurementProtocolGuid,
996 &mPerformanceMeasurementInterface
1004 Status =
gSmst->SmiHandlerRegister (
FpdtSmiHandler, &gEfiFirmwarePerformanceGuid, &SmiHandle);
1008 if (EFI_ERROR (Status)) {
1012 mPerformanceProperty.Revision = PERFORMANCE_PROPERTY_REVISION;
1013 mPerformanceProperty.Reserved = 0;
1015 &mPerformanceProperty.TimerStartValue,
1016 &mPerformanceProperty.TimerEndValue
1018 Status =
gBS->InstallConfigurationTable (&gPerformanceProtocolGuid, &mPerformanceProperty);
1025 Status =
gSmst->SmmRegisterProtocolNotify (
1026 &gEdkiiSmmExitBootServicesProtocolGuid,
1067 Status =
gBS->CreateEvent (
1079 Status =
gBS->RegisterProtocolNotify (
1080 &gEfiSmmBase2ProtocolGuid,
1111 IN CONST VOID *CallerIdentifier OPTIONAL,
1113 IN CONST CHAR8 *String OPTIONAL,
1114 IN UINT64 TimeStamp OPTIONAL,
1115 IN UINT64 Address OPTIONAL,
1116 IN UINT32 Identifier,
1117 IN PERF_MEASUREMENT_ATTRIBUTE Attribute
1125 Status =
InsertFpdtRecord (CallerIdentifier, Guid, String, TimeStamp, Address, (UINT16)Identifier, Attribute);
1158 IN CONST VOID *Handle OPTIONAL,
1159 IN CONST CHAR8 *Token OPTIONAL,
1160 IN CONST CHAR8 *Module OPTIONAL,
1161 IN UINT64 TimeStamp,
1162 IN UINT32 Identifier
1165 CONST CHAR8 *String;
1167 if (Token !=
NULL) {
1169 }
else if (Module !=
NULL) {
1207 IN CONST VOID *Handle OPTIONAL,
1208 IN CONST CHAR8 *Token OPTIONAL,
1209 IN CONST CHAR8 *Module OPTIONAL,
1210 IN UINT64 TimeStamp,
1211 IN UINT32 Identifier
1214 CONST CHAR8 *String;
1216 if (Token !=
NULL) {
1218 }
else if (Module !=
NULL) {
1277 OUT UINT64 *StartTimeStamp,
1278 OUT UINT64 *EndTimeStamp,
1279 OUT UINT32 *Identifier
1311 IN CONST VOID *Handle OPTIONAL,
1312 IN CONST CHAR8 *Token OPTIONAL,
1313 IN CONST CHAR8 *Module OPTIONAL,
1347 IN CONST VOID *Handle OPTIONAL,
1348 IN CONST CHAR8 *Token OPTIONAL,
1349 IN CONST CHAR8 *Module OPTIONAL,
1404 OUT UINT64 *StartTimeStamp,
1405 OUT UINT64 *EndTimeStamp
1429 return mPerformanceMeasurementEnabled;
1450 IN CONST VOID *CallerIdentifier,
1452 IN CONST CHAR8 *String OPTIONAL,
1453 IN UINT64 Address OPTIONAL,
1454 IN UINT32 Identifier
UINT64 EFIAPI GetPerformanceCounterProperties(OUT UINT64 *StartValue OPTIONAL, OUT UINT64 *EndValue OPTIONAL)
UINT64 EFIAPI GetTimeInNanoSecond(IN UINT64 Ticks)
UINT64 EFIAPI GetPerformanceCounter(VOID)
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 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_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 FreePool(IN VOID *Buffer)
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG(Expression)
#define PcdGet8(TokenName)
#define PcdGetBool(TokenName)
EFI_SMM_SYSTEM_TABLE2 * gSmst
BOOLEAN EFIAPI SmmIsBufferOutsideSmmValid(IN EFI_PHYSICAL_ADDRESS Buffer, IN UINT64 Length)
SPIN_LOCK *EFIAPI AcquireSpinLock(IN OUT SPIN_LOCK *SpinLock)
SPIN_LOCK *EFIAPI InitializeSpinLock(OUT SPIN_LOCK *SpinLock)
SPIN_LOCK *EFIAPI ReleaseSpinLock(IN OUT SPIN_LOCK *SpinLock)
EFI_STATUS EFIAPI EfiGetSystemConfigurationTable(IN EFI_GUID *TableGuid, OUT VOID **Table)
EFI_INSTALL_PROTOCOL_INTERFACE SmmInstallProtocolInterface
EFI_DEVICE_PATH_PROTOCOL * FilePath
VOID * ImageBase
The base address at which the image was loaded.
EFI_ACPI_5_0_FPDT_PERFORMANCE_TABLE_HEADER Header
Common ACPI table header.