IN UINT32 Attribute\r
)\r
{\r
- return CoreLoadImageCommon (\r
+ EFI_STATUS Status;\r
+ UINT64 Tick;\r
+ EFI_HANDLE Handle;\r
+\r
+ Tick = 0;\r
+ PERF_CODE (\r
+ Tick = GetPerformanceCounter ();\r
+ );\r
+\r
+ Status = CoreLoadImageCommon (\r
TRUE,\r
ParentImageHandle,\r
FilePath,\r
EntryPoint,\r
Attribute\r
);\r
+\r
+ Handle = NULL; \r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // ImageHandle will be valid only Status is success. \r
+ //\r
+ Handle = *ImageHandle;\r
+ }\r
+\r
+ PERF_START (Handle, "LoadImage:", NULL, Tick);\r
+ PERF_END (Handle, "LoadImage:", NULL, 0);\r
+\r
+ return Status;\r
}\r
\r
\r
LOADED_IMAGE_PRIVATE_DATA *LastImage;\r
UINT64 HandleDatabaseKey;\r
UINTN SetJumpFlag;\r
+ UINT64 Tick;\r
+ EFI_HANDLE Handle;\r
+\r
+ Tick = 0;\r
+ Handle = ImageHandle;\r
\r
Image = CoreLoadedImageInfo (ImageHandle);\r
if (Image == NULL || Image->Started) {\r
return EFI_UNSUPPORTED;\r
}\r
\r
- //\r
- // Don't profile Objects or invalid start requests\r
- //\r
- PERF_START (ImageHandle, "StartImage:", NULL, 0);\r
+ PERF_CODE (\r
+ Tick = GetPerformanceCounter ();\r
+ );\r
\r
\r
//\r
//\r
Image->JumpBuffer = AllocatePool (sizeof (BASE_LIBRARY_JUMP_BUFFER) + BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT);\r
if (Image->JumpBuffer == NULL) {\r
- PERF_END (ImageHandle, "StartImage:", NULL, 0);\r
+ //\r
+ // Image may be unloaded after return with failure,\r
+ // then ImageHandle may be invalid, so use NULL handle to record perf log.\r
+ //\r
+ PERF_START (NULL, "StartImage:", NULL, Tick);\r
+ PERF_END (NULL, "StartImage:", NULL, 0);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
Image->JumpContext = ALIGN_POINTER (Image->JumpBuffer, BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT);\r
//\r
if (EFI_ERROR (Image->Status) || Image->Type == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) {\r
CoreUnloadAndCloseImage (Image, TRUE);\r
+ //\r
+ // ImageHandle may be invalid after the image is unloaded, so use NULL handle to record perf log.\r
+ //\r
+ Handle = NULL;\r
}\r
\r
//\r
// Done\r
//\r
- PERF_END (ImageHandle, "StartImage:", NULL, 0);\r
+ PERF_START (Handle, "StartImage:", NULL, Tick);\r
+ PERF_END (Handle, "StartImage:", NULL, 0);\r
return Status;\r
}\r
\r