// 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
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
);\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
\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
\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
//\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
// 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
-\r
- Image->ImageBasePage = Image->ImageContext.ImageAddress;\r
-\r
+ DstBufAlocated = TRUE;\r
} else {\r
//\r
// Caller provided the destination buffer\r
\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
//\r
Status = gEfiPeiPeCoffLoader->LoadImage (gEfiPeiPeCoffLoader, &Image->ImageContext);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
//\r
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
//\r
Status = gEfiPeiPeCoffLoader->RelocateImage (gEfiPeiPeCoffLoader, &Image->ImageContext);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
//\r
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
+ // 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
\r
DEBUG_CODE_BEGIN ();\r
- \r
+\r
UINTN Index;\r
UINTN StartIndex;\r
CHAR8 EfiFileName[256];\r
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
\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
return Image;\r
}\r
\r
-\r
+STATIC\r
EFI_STATUS\r
CoreLoadImageCommon (\r
IN BOOLEAN BootPolicy,\r
\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
);\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