]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Record LoadImage perf log for LoadImageEx() and use NULL as Handle to record StartIma...
authorlzeng14 <lzeng14@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 30 May 2012 10:48:50 +0000 (10:48 +0000)
committerlzeng14 <lzeng14@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 30 May 2012 10:48:50 +0000 (10:48 +0000)
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13379 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Core/Dxe/Image/Image.c

index 9a143284e7854772bb4958edb32e8c40b5ea7127..32f3898ec28589831a76bd50b967409a439f309e 100644 (file)
@@ -1441,7 +1441,16 @@ CoreLoadImageEx (
   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
@@ -1453,6 +1462,19 @@ CoreLoadImageEx (
            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
@@ -1487,6 +1509,11 @@ CoreStartImage (
   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
@@ -1506,10 +1533,9 @@ CoreStartImage (
     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
@@ -1529,7 +1555,12 @@ CoreStartImage (
   //\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
@@ -1620,12 +1651,17 @@ CoreStartImage (
   //\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