]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Core/Dxe/Image/Image.c
Merge R8->R9 tracker 5935 and 7080 to update runtime arch protocol to DxeCis 0.91...
[mirror_edk2.git] / EdkModulePkg / Core / Dxe / Image / Image.c
index a71c6f643a6321965428a4814263522e18f77e2f..4e6bd0843e8edaba79d170c6365748ce55864f34 100644 (file)
@@ -24,11 +24,6 @@ Abstract:
 // Module Globals\r
 //\r
 \r
-//\r
-// LIST of runtime images that need to be relocated.\r
-//\r
-LIST_ENTRY                 mRuntimeImageList = INITIALIZE_LIST_HEAD_VARIABLE (mRuntimeImageList);\r
-\r
 LOADED_IMAGE_PRIVATE_DATA  *mCurrentImage = NULL;\r
 \r
 LOAD_PE32_IMAGE_PRIVATE_DATA  mLoadPe32PrivateData = {\r
@@ -78,9 +73,7 @@ LOADED_IMAGE_PRIVATE_DATA mCorePrivateImage  = {
   NULL,                       // JumpContext\r
   0,                          // Machine\r
   NULL,                       // Ebc\r
-  FALSE,                      // RuntimeFixupValid\r
-  NULL,                       // RuntimeFixup\r
-  { NULL, NULL },             // Link\r
+  NULL,                       // RuntimeData\r
 };\r
 \r
 \r
@@ -173,52 +166,6 @@ Returns:
            );\r
 }\r
 \r
-\r
-EFI_STATUS\r
-CoreShutdownImageServices (\r
-  VOID\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Transfer control of runtime images to runtime service\r
-\r
-Arguments:\r
-\r
-  None\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS       - Function successfully returned\r
-\r
---*/\r
-{\r
-  LIST_ENTRY                  *Link;\r
-  LOADED_IMAGE_PRIVATE_DATA   *Image;\r
-\r
-  //\r
-  // The Runtime AP is required for the core to function!\r
-  //\r
-  ASSERT (gRuntime != NULL);\r
-\r
-  for (Link = mRuntimeImageList.ForwardLink; Link != &mRuntimeImageList; Link = Link->ForwardLink) {\r
-    Image = CR (Link, LOADED_IMAGE_PRIVATE_DATA, Link, LOADED_IMAGE_PRIVATE_DATA_SIGNATURE);\r
-    if (Image->RuntimeFixupValid) {\r
-      gRuntime->RegisterImage (\r
-                  gRuntime,\r
-                  (UINT64)(UINTN)(Image->Info.ImageBase),\r
-                  (EFI_SIZE_TO_PAGES ((UINTN)Image->Info.ImageSize)),\r
-                  Image->RuntimeFixup\r
-                  );\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-\r
 EFI_STATUS\r
 CoreLoadPeImage (\r
   IN VOID                        *Pe32Handle,\r
@@ -253,8 +200,9 @@ Returns:
 \r
 --*/\r
 {\r
-  EFI_STATUS                            Status;\r
-  UINTN                                 Size;\r
+  EFI_STATUS      Status;\r
+  BOOLEAN         DstBufAlocated;\r
+  UINTN           Size;\r
 \r
   ZeroMem (&Image->ImageContext, sizeof (Image->ImageContext));\r
 \r
@@ -281,7 +229,7 @@ Returns:
   //\r
   // Allocate memory of the correct memory type aligned on the required image boundry\r
   //\r
-\r
+  DstBufAlocated = FALSE;\r
   if (DstBuffer == 0) {\r
     //\r
     // Allocate Destination Buffer as caller did not pass it in\r
@@ -308,8 +256,7 @@ Returns:
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
-\r
-    Image->ImageBasePage = Image->ImageContext.ImageAddress;\r
+    DstBufAlocated = TRUE;\r
 \r
   } else {\r
     //\r
@@ -334,9 +281,9 @@ Returns:
 \r
     Image->NumberOfPages = EFI_SIZE_TO_PAGES ((UINTN)Image->ImageContext.ImageSize + Image->ImageContext.SectionAlignment);\r
     Image->ImageContext.ImageAddress = DstBuffer;\r
-    Image->ImageBasePage = Image->ImageContext.ImageAddress;\r
   }\r
 \r
+  Image->ImageBasePage = Image->ImageContext.ImageAddress;\r
   Image->ImageContext.ImageAddress =\r
       (Image->ImageContext.ImageAddress + Image->ImageContext.SectionAlignment - 1) &\r
       ~((UINTN)Image->ImageContext.SectionAlignment - 1);\r
@@ -346,7 +293,7 @@ Returns:
   //\r
   Status = gEfiPeiPeCoffLoader->LoadImage (gEfiPeiPeCoffLoader, &Image->ImageContext);\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -361,13 +308,6 @@ Returns:
         Status = EFI_OUT_OF_RESOURCES;\r
         goto Done;\r
       }\r
-\r
-      //\r
-      // Make a list off all the RT images so we can let the RT AP know about them\r
-      //\r
-      Image->RuntimeFixupValid = TRUE;\r
-      Image->RuntimeFixup = Image->ImageContext.FixupData;\r
-      InsertTailList (&mRuntimeImageList, &Image->Link);\r
     }\r
   }\r
 \r
@@ -376,7 +316,7 @@ Returns:
   //\r
   Status = gEfiPeiPeCoffLoader->RelocateImage (gEfiPeiPeCoffLoader, &Image->ImageContext);\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -438,7 +378,23 @@ Returns:
   Image->Info.ImageSize     = Image->ImageContext.ImageSize;\r
   Image->Info.ImageCodeType = Image->ImageContext.ImageCodeMemoryType;\r
   Image->Info.ImageDataType = Image->ImageContext.ImageDataMemoryType;\r
-\r
+  if (Attribute & EFI_LOAD_PE_IMAGE_ATTRIBUTE_RUNTIME_REGISTRATION) {\r
+    if (Image->ImageContext.ImageType == EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER) {\r
+      //\r
+      // Make a list off all the RT images so we can let the RT AP know about them.\r
+      //\r
+      Image->RuntimeData = CoreAllocateRuntimePool (sizeof(EFI_RUNTIME_IMAGE_ENTRY));\r
+      if (Image->RuntimeData == NULL) {\r
+        goto Done;\r
+      }\r
+      Image->RuntimeData->ImageBase      = Image->Info.ImageBase;\r
+      Image->RuntimeData->ImageSize      = (UINT64) (Image->Info.ImageSize);\r
+      Image->RuntimeData->RelocationData = Image->ImageContext.FixupData;\r
+      Image->RuntimeData->Handle         = Image->Handle;\r
+      InsertTailList (&gRuntime->ImageHead, &Image->RuntimeData->Link);\r
+    }\r
+  }\r
+  \r
   //\r
   // Fill in the entry point of the image if it is available\r
   //\r
@@ -489,10 +445,19 @@ Returns:
   return EFI_SUCCESS;\r
 \r
 Done:\r
+\r
   //\r
-  // Free memory\r
+  // Free memory.\r
   //\r
-  CoreFreePages (Image->ImageContext.ImageAddress, Image->NumberOfPages);\r
+  \r
+  if (DstBufAlocated) {\r
+    CoreFreePages (Image->ImageContext.ImageAddress, Image->NumberOfPages);\r
+  }\r
+  \r
+  if (Image->ImageContext.FixupData != NULL) {\r
+    CoreFreePool (Image->ImageContext.FixupData);\r
+  }\r
+\r
   return Status;\r
 }\r
 \r
@@ -1168,13 +1133,16 @@ Returns:
                );\r
   }\r
 \r
-  if (Image->RuntimeFixupValid) {\r
-    //\r
-    // Remove the Image from the Runtime Image list as we are about to Free it!\r
-    //\r
-    RemoveEntryList (&Image->Link);\r
+  if (Image->RuntimeData != NULL) {\r
+    if (Image->RuntimeData->Link.ForwardLink != NULL) {\r
+      //\r
+      // Remove the Image from the Runtime Image list as we are about to Free it!\r
+      //\r
+      RemoveEntryList (&Image->RuntimeData->Link);\r
+    }\r
+    CoreFreePool (Image->RuntimeData);\r
   }\r
-\r
+  \r
   //\r
   // Free the Image from memory\r
   //\r