]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Core/Dxe/Image/Image.c
1) Initialize gBS, gST, gImageHandle in UefiBootServicesTableLib.c to NULL
[mirror_edk2.git] / EdkModulePkg / Core / Dxe / Image / Image.c
index 4e6bd0843e8edaba79d170c6365748ce55864f34..901182e5113b250452275973dbbb1e189d29c727 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
-Copyright (c) 2006, Intel Corporation\r
+Copyright (c) 2006 - 2007, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -132,7 +132,7 @@ Returns:
   Image->ImageBasePage      = DxeCoreImageBaseAddress;\r
   Image->NumberOfPages      = (UINTN)(EFI_SIZE_TO_PAGES((UINTN)(DxeCoreImageLength)));\r
   Image->Tpl                = gEfiCurrentTpl;\r
-  Image->Info.SystemTable   = gST;\r
+  Image->Info.SystemTable   = gDxeCoreST;\r
   Image->Info.ImageBase     = (VOID *)(UINTN)DxeCoreImageBaseAddress;\r
   Image->Info.ImageSize     = DxeCoreImageLength;\r
 \r
@@ -219,8 +219,8 @@ Returns:
 \r
   if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Image->ImageContext.Machine)) {\r
     //\r
-    // The PE/COFF loader can support loading image types that can be executed. \r
-    // If we loaded an image type that we can not execute return EFI_UNSUPORTED. \r
+    // The PE/COFF loader can support loading image types that can be executed.\r
+    // If we loaded an image type that we can not execute return EFI_UNSUPORTED.\r
     //\r
     return EFI_UNSUPPORTED;\r
   }\r
@@ -247,17 +247,30 @@ Returns:
     // If the image relocations have not been stripped, then load at any address.\r
     // Otherwise load at the address at which it was linked.\r
     //\r
-    Status = CoreAllocatePages (\r
-               (Image->ImageContext.RelocationsStripped) ? AllocateAddress : AllocateAnyPages,\r
-               Image->ImageContext.ImageCodeMemoryType,\r
-               Image->NumberOfPages,\r
-               &Image->ImageContext.ImageAddress\r
-               );\r
+    // Memory below 1MB should be treated reserved for CSM and there should be\r
+    // no modules whose preferred load addresses are below 1MB.\r
+    //\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    if (Image->ImageContext.ImageAddress >= 0x100000 || Image->ImageContext.RelocationsStripped) {\r
+      Status = CoreAllocatePages (\r
+                 AllocateAddress,\r
+                 (EFI_MEMORY_TYPE) (Image->ImageContext.ImageCodeMemoryType),\r
+                 Image->NumberOfPages,\r
+                 &Image->ImageContext.ImageAddress\r
+                 );\r
+    }\r
+    if (EFI_ERROR (Status) && !Image->ImageContext.RelocationsStripped) {\r
+      Status = CoreAllocatePages (\r
+                 AllocateAnyPages,\r
+                 (EFI_MEMORY_TYPE) (Image->ImageContext.ImageCodeMemoryType),\r
+                 Image->NumberOfPages,\r
+                 &Image->ImageContext.ImageAddress\r
+                 );\r
+    }\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
     DstBufAlocated = TRUE;\r
-\r
   } else {\r
     //\r
     // Caller provided the destination buffer\r
@@ -376,8 +389,8 @@ Returns:
   Image->Type               = Image->ImageContext.ImageType;\r
   Image->Info.ImageBase     = (VOID *)(UINTN)Image->ImageContext.ImageAddress;\r
   Image->Info.ImageSize     = Image->ImageContext.ImageSize;\r
-  Image->Info.ImageCodeType = Image->ImageContext.ImageCodeMemoryType;\r
-  Image->Info.ImageDataType = Image->ImageContext.ImageDataMemoryType;\r
+  Image->Info.ImageCodeType = (EFI_MEMORY_TYPE) (Image->ImageContext.ImageCodeMemoryType);\r
+  Image->Info.ImageDataType = (EFI_MEMORY_TYPE) (Image->ImageContext.ImageDataMemoryType);\r
   if (Attribute & EFI_LOAD_PE_IMAGE_ATTRIBUTE_RUNTIME_REGISTRATION) {\r
     if (Image->ImageContext.ImageType == EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER) {\r
       //\r
@@ -394,7 +407,7 @@ Returns:
       InsertTailList (&gRuntime->ImageHead, &Image->RuntimeData->Link);\r
     }\r
   }\r
-  \r
+\r
   //\r
   // Fill in the entry point of the image if it is available\r
   //\r
@@ -407,7 +420,7 @@ Returns:
   //\r
 \r
   DEBUG_CODE_BEGIN ();\r
\r
+\r
     UINTN Index;\r
     UINTN StartIndex;\r
     CHAR8 EfiFileName[256];\r
@@ -439,7 +452,7 @@ Returns:
       DEBUG ((EFI_D_INFO | EFI_D_LOAD, "%a", EfiFileName)); // &Image->ImageContext.PdbPointer[StartIndex]));\r
     }\r
     DEBUG ((EFI_D_INFO | EFI_D_LOAD, "\n"));\r
-  \r
+\r
   DEBUG_CODE_END ();\r
 \r
   return EFI_SUCCESS;\r
@@ -449,11 +462,11 @@ Done:
   //\r
   // Free memory.\r
   //\r
-  \r
+\r
   if (DstBufAlocated) {\r
     CoreFreePages (Image->ImageContext.ImageAddress, Image->NumberOfPages);\r
   }\r
-  \r
+\r
   if (Image->ImageContext.FixupData != NULL) {\r
     CoreFreePool (Image->ImageContext.FixupData);\r
   }\r
@@ -501,7 +514,7 @@ Returns:
   return Image;\r
 }\r
 \r
-\r
+STATIC\r
 EFI_STATUS\r
 CoreLoadImageCommon (\r
   IN  BOOLEAN                          BootPolicy,\r
@@ -637,7 +650,7 @@ Returns:
   // Initialize the fields for an internal driver\r
   //\r
   Image->Signature         = LOADED_IMAGE_PRIVATE_DATA_SIGNATURE;\r
-  Image->Info.SystemTable  = gST;\r
+  Image->Info.SystemTable  = gDxeCoreST;\r
   Image->Info.DeviceHandle = DeviceHandle;\r
   Image->Info.Revision     = EFI_LOADED_IMAGE_INFORMATION_REVISION;\r
   Image->Info.FilePath     = CoreDuplicateDevicePath (FilePath);\r
@@ -927,8 +940,8 @@ Returns:
 \r
   SetJumpFlag = SetJump (Image->JumpContext);\r
   //\r
-  // The initial call to SetJump() must always return 0.  \r
-  // Subsequent calls to LongJump() cause a non-zero value to be returned by SetJump(). \r
+  // The initial call to SetJump() must always return 0.\r
+  // Subsequent calls to LongJump() cause a non-zero value to be returned by SetJump().\r
   //\r
   if (!SetJumpFlag) {\r
     //\r
@@ -1142,7 +1155,7 @@ Returns:
     }\r
     CoreFreePool (Image->RuntimeData);\r
   }\r
-  \r
+\r
   //\r
   // Free the Image from memory\r
   //\r
@@ -1205,10 +1218,18 @@ Returns:
 --*/\r
 {\r
   LOADED_IMAGE_PRIVATE_DATA  *Image;\r
+  EFI_TPL                    OldTpl;\r
 \r
+  //\r
+  // Prevent possible reentrance to this function\r
+  // for the same ImageHandle\r
+  // \r
+  OldTpl = CoreRaiseTpl (EFI_TPL_NOTIFY); \r
\r
   Image = CoreLoadedImageInfo (ImageHandle);\r
   if (Image == NULL_HANDLE) {\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
   if (!Image->Started) {\r
@@ -1216,7 +1237,8 @@ Returns:
     // The image has not been started so just free its resources\r
     //\r
     CoreUnloadAndCloseImage (Image, TRUE);\r
-    return EFI_SUCCESS;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -1224,7 +1246,8 @@ Returns:
   //\r
   if (Image != mCurrentImage) {\r
     DEBUG ((EFI_D_LOAD|EFI_D_ERROR, "Exit: Image is not exitable image\n"));\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -1239,11 +1262,13 @@ Returns:
     Image->ExitDataSize = ExitDataSize;\r
     Image->ExitData = CoreAllocateBootServicesPool (Image->ExitDataSize);\r
     if (Image->ExitData == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+      goto Done;\r
     }\r
     CopyMem (Image->ExitData, ExitData, Image->ExitDataSize);\r
   }\r
 \r
+  CoreRestoreTpl (OldTpl);\r
   //\r
   // return to StartImage\r
   //\r
@@ -1253,7 +1278,10 @@ Returns:
   // If we return from LongJump, then it is an error\r
   //\r
   ASSERT (FALSE);\r
-  return EFI_ACCESS_DENIED;\r
+  Status = EFI_ACCESS_DENIED;\r
+Done:\r
+  CoreRestoreTpl (OldTpl);\r
+  return Status;\r
 }\r
 \r
 \r
@@ -1283,13 +1311,21 @@ Returns:
 {\r
   EFI_STATUS                 Status;\r
   LOADED_IMAGE_PRIVATE_DATA  *Image;\r
+  EFI_TPL                    OldTpl;\r
 \r
+  //\r
+  // Prevent possible reentrance to this function\r
+  // for the same ImageHandle\r
+  // \r
+  OldTpl = CoreRaiseTpl (EFI_TPL_NOTIFY);\r
\r
   Image = CoreLoadedImageInfo (ImageHandle);\r
   if (Image == NULL ) {\r
     //\r
     // The image handle is not valid\r
     //\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
   if (Image->Started) {\r
@@ -1316,6 +1352,8 @@ Returns:
     CoreUnloadAndCloseImage (Image, TRUE);\r
   }\r
 \r
+Done:\r
+  CoreRestoreTpl (OldTpl);\r
   return Status;\r
 }\r
 \r