\r
**/\r
\r
-#include <DxeMain.h>\r
+#include "DxeMain.h"\r
//\r
// Module Globals\r
//\r
//\r
if ((Attribute & EFI_LOAD_PE_IMAGE_ATTRIBUTE_RUNTIME_REGISTRATION) != 0) {\r
if (Image->ImageContext.ImageType == EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER) {\r
- Image->ImageContext.FixupData = CoreAllocateRuntimePool ((UINTN)(Image->ImageContext.FixupDataSize));\r
+ Image->ImageContext.FixupData = AllocateRuntimePool ((UINTN)(Image->ImageContext.FixupDataSize));\r
if (Image->ImageContext.FixupData == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\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
+ Image->RuntimeData = AllocateRuntimePool (sizeof(EFI_RUNTIME_IMAGE_ENTRY));\r
if (Image->RuntimeData == NULL) {\r
goto Done;\r
}\r
UINTN StartIndex;\r
CHAR8 EfiFileName[256];\r
\r
- \r
+\r
DEBUG ((DEBUG_INFO | DEBUG_LOAD,\r
- "Loading driver at 0x%10p EntryPoint=0x%10p ",\r
+ "Loading driver at 0x%11p EntryPoint=0x%11p ",\r
(VOID *)(UINTN) Image->ImageContext.ImageAddress,\r
FUNCTION_ENTRY_POINT ((UINTN) Image->ImageContext.EntryPoint)));\r
- \r
+\r
\r
//\r
// Print Module Name by Pdb file path\r
}\r
\r
\r
+/**\r
+ Unloads EFI image from memory.\r
+\r
+ @param Image EFI image\r
+ @param FreePage Free allocated pages\r
+\r
+**/\r
+VOID\r
+CoreUnloadAndCloseImage (\r
+ IN LOADED_IMAGE_PRIVATE_DATA *Image,\r
+ IN BOOLEAN FreePage\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN HandleCount;\r
+ EFI_HANDLE *HandleBuffer;\r
+ UINTN HandleIndex;\r
+ EFI_GUID **ProtocolGuidArray;\r
+ UINTN ArrayCount;\r
+ UINTN ProtocolIndex;\r
+ EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo;\r
+ UINTN OpenInfoCount;\r
+ UINTN OpenInfoIndex;\r
+\r
+ if (Image->Ebc != NULL) {\r
+ //\r
+ // If EBC protocol exists we must perform cleanups for this image.\r
+ //\r
+ Image->Ebc->UnloadImage (Image->Ebc, Image->Handle);\r
+ }\r
+\r
+ //\r
+ // Unload image, free Image->ImageContext->ModHandle\r
+ //\r
+ PeCoffLoaderUnloadImage (&Image->ImageContext);\r
+\r
+ //\r
+ // Free our references to the image handle\r
+ //\r
+ if (Image->Handle != NULL) {\r
+\r
+ Status = CoreLocateHandleBuffer (\r
+ AllHandles,\r
+ NULL,\r
+ NULL,\r
+ &HandleCount,\r
+ &HandleBuffer\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {\r
+ Status = CoreProtocolsPerHandle (\r
+ HandleBuffer[HandleIndex],\r
+ &ProtocolGuidArray,\r
+ &ArrayCount\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
+ Status = CoreOpenProtocolInformation (\r
+ HandleBuffer[HandleIndex],\r
+ ProtocolGuidArray[ProtocolIndex],\r
+ &OpenInfo,\r
+ &OpenInfoCount\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
+ if (OpenInfo[OpenInfoIndex].AgentHandle == Image->Handle) {\r
+ Status = CoreCloseProtocol (\r
+ HandleBuffer[HandleIndex],\r
+ ProtocolGuidArray[ProtocolIndex],\r
+ Image->Handle,\r
+ OpenInfo[OpenInfoIndex].ControllerHandle\r
+ );\r
+ }\r
+ }\r
+ if (OpenInfo != NULL) {\r
+ CoreFreePool(OpenInfo);\r
+ }\r
+ }\r
+ }\r
+ if (ProtocolGuidArray != NULL) {\r
+ CoreFreePool(ProtocolGuidArray);\r
+ }\r
+ }\r
+ }\r
+ if (HandleBuffer != NULL) {\r
+ CoreFreePool (HandleBuffer);\r
+ }\r
+ }\r
+\r
+ CoreRemoveDebugImageInfoEntry (Image->Handle);\r
+\r
+ Status = CoreUninstallProtocolInterface (\r
+ Image->Handle,\r
+ &gEfiLoadedImageDevicePathProtocolGuid,\r
+ Image->LoadedImageDevicePath\r
+ );\r
+\r
+ Status = CoreUninstallProtocolInterface (\r
+ Image->Handle,\r
+ &gEfiLoadedImageProtocolGuid,\r
+ &Image->Info\r
+ );\r
+\r
+ }\r
+\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
+ // Free the Image from memory\r
+ //\r
+ if ((Image->ImageBasePage != 0) && FreePage) {\r
+ CoreFreePages (Image->ImageBasePage, Image->NumberOfPages);\r
+ }\r
+\r
+ //\r
+ // Done with the Image structure\r
+ //\r
+ if (Image->Info.FilePath != NULL) {\r
+ CoreFreePool (Image->Info.FilePath);\r
+ }\r
+\r
+ if (Image->LoadedImageDevicePath != NULL) {\r
+ CoreFreePool (Image->LoadedImageDevicePath);\r
+ }\r
+\r
+ if (Image->FixupData != NULL) {\r
+ CoreFreePool (Image->FixupData);\r
+ }\r
+\r
+ CoreFreePool (Image);\r
+}\r
+\r
+\r
/**\r
Loads an EFI image into memory and returns a handle to the image.\r
\r
//\r
// Allocate a new image structure\r
//\r
- Image = CoreAllocateZeroBootServicesPool (sizeof(LOADED_IMAGE_PRIVATE_DATA));\r
+ Image = AllocateZeroPool (sizeof(LOADED_IMAGE_PRIVATE_DATA));\r
if (Image == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
FilePath = OriginalFilePath;\r
Status = CoreHandleProtocol (DeviceHandle, &gEfiDevicePathProtocolGuid, (VOID **)&HandleFilePath);\r
if (!EFI_ERROR (Status)) {\r
- FilePathSize = CoreDevicePathSize (HandleFilePath) - sizeof(EFI_DEVICE_PATH_PROTOCOL);\r
+ FilePathSize = GetDevicePathSize (HandleFilePath) - sizeof(EFI_DEVICE_PATH_PROTOCOL);\r
FilePath = (EFI_DEVICE_PATH_PROTOCOL *) (((UINT8 *)FilePath) + FilePathSize );\r
}\r
\r
Image->Info.SystemTable = gDxeCoreST;\r
Image->Info.DeviceHandle = DeviceHandle;\r
Image->Info.Revision = EFI_LOADED_IMAGE_PROTOCOL_REVISION;\r
- Image->Info.FilePath = CoreDuplicateDevicePath (FilePath);\r
+ Image->Info.FilePath = DuplicateDevicePath (FilePath);\r
Image->Info.ParentHandle = ParentImageHandle;\r
\r
\r
// otherwise Loaded Image Device Path Protocol is installed with a NULL interface pointer.\r
//\r
if (OriginalFilePath != NULL) {\r
- Image->LoadedImageDevicePath = CoreDuplicateDevicePath (OriginalFilePath);\r
+ Image->LoadedImageDevicePath = DuplicateDevicePath (OriginalFilePath);\r
}\r
\r
//\r
UINTN SetJumpFlag;\r
\r
Image = CoreLoadedImageInfo (ImageHandle);\r
- if (Image == NULL_HANDLE || Image->Started) {\r
+ if (Image == NULL || Image->Started) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
// JumpContext must be aligned on a CPU specific boundary.\r
// Overallocate the buffer and force the required alignment\r
//\r
- Image->JumpBuffer = CoreAllocateBootServicesPool (sizeof (BASE_LIBRARY_JUMP_BUFFER) + BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT);\r
+ Image->JumpBuffer = AllocatePool (sizeof (BASE_LIBRARY_JUMP_BUFFER) + BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT);\r
if (Image->JumpBuffer == NULL) {\r
PERF_END (ImageHandle, START_IMAGE_TOK, NULL, 0);\r
return EFI_OUT_OF_RESOURCES;\r
//\r
DEBUG_CODE_BEGIN ();\r
if (EFI_ERROR (Image->Status)) {\r
- DEBUG ((DEBUG_ERROR, "Error: Image at %10p start failed: %r\n", Image->Info.ImageBase, Image->Status));\r
+ DEBUG ((DEBUG_ERROR, "Error: Image at %11p start failed: %r\n", Image->Info.ImageBase, Image->Status));\r
}\r
DEBUG_CODE_END ();\r
\r
return Status;\r
}\r
\r
-\r
-\r
-/**\r
- Unloads EFI image from memory.\r
-\r
- @param Image EFI image\r
- @param FreePage Free allocated pages\r
-\r
-**/\r
-VOID\r
-CoreUnloadAndCloseImage (\r
- IN LOADED_IMAGE_PRIVATE_DATA *Image,\r
- IN BOOLEAN FreePage\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN HandleCount;\r
- EFI_HANDLE *HandleBuffer;\r
- UINTN HandleIndex;\r
- EFI_GUID **ProtocolGuidArray;\r
- UINTN ArrayCount;\r
- UINTN ProtocolIndex;\r
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo;\r
- UINTN OpenInfoCount;\r
- UINTN OpenInfoIndex;\r
-\r
- if (Image->Ebc != NULL) {\r
- //\r
- // If EBC protocol exists we must perform cleanups for this image.\r
- //\r
- Image->Ebc->UnloadImage (Image->Ebc, Image->Handle);\r
- }\r
-\r
- //\r
- // Unload image, free Image->ImageContext->ModHandle\r
- //\r
- PeCoffLoaderUnloadImage (&Image->ImageContext);\r
-\r
- //\r
- // Free our references to the image handle\r
- //\r
- if (Image->Handle != NULL_HANDLE) {\r
-\r
- Status = CoreLocateHandleBuffer (\r
- AllHandles,\r
- NULL,\r
- NULL,\r
- &HandleCount,\r
- &HandleBuffer\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {\r
- Status = CoreProtocolsPerHandle (\r
- HandleBuffer[HandleIndex],\r
- &ProtocolGuidArray,\r
- &ArrayCount\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
- Status = CoreOpenProtocolInformation (\r
- HandleBuffer[HandleIndex],\r
- ProtocolGuidArray[ProtocolIndex],\r
- &OpenInfo,\r
- &OpenInfoCount\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
- if (OpenInfo[OpenInfoIndex].AgentHandle == Image->Handle) {\r
- Status = CoreCloseProtocol (\r
- HandleBuffer[HandleIndex],\r
- ProtocolGuidArray[ProtocolIndex],\r
- Image->Handle,\r
- OpenInfo[OpenInfoIndex].ControllerHandle\r
- );\r
- }\r
- }\r
- if (OpenInfo != NULL) {\r
- CoreFreePool(OpenInfo);\r
- }\r
- }\r
- }\r
- if (ProtocolGuidArray != NULL) {\r
- CoreFreePool(ProtocolGuidArray);\r
- }\r
- }\r
- }\r
- if (HandleBuffer != NULL) {\r
- CoreFreePool (HandleBuffer);\r
- }\r
- }\r
-\r
- CoreRemoveDebugImageInfoEntry (Image->Handle);\r
-\r
- Status = CoreUninstallProtocolInterface (\r
- Image->Handle,\r
- &gEfiLoadedImageDevicePathProtocolGuid,\r
- Image->LoadedImageDevicePath\r
- );\r
-\r
- Status = CoreUninstallProtocolInterface (\r
- Image->Handle,\r
- &gEfiLoadedImageProtocolGuid,\r
- &Image->Info\r
- );\r
-\r
- }\r
-\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
- // Free the Image from memory\r
- //\r
- if ((Image->ImageBasePage != 0) && FreePage) {\r
- CoreFreePages (Image->ImageBasePage, Image->NumberOfPages);\r
- }\r
-\r
- //\r
- // Done with the Image structure\r
- //\r
- if (Image->Info.FilePath != NULL) {\r
- CoreFreePool (Image->Info.FilePath);\r
- }\r
-\r
- if (Image->LoadedImageDevicePath != NULL) {\r
- CoreFreePool (Image->LoadedImageDevicePath);\r
- }\r
-\r
- if (Image->FixupData != NULL) {\r
- CoreFreePool (Image->FixupData);\r
- }\r
-\r
- CoreFreePool (Image);\r
-}\r
-\r
-\r
-\r
-\r
/**\r
Terminates the currently loaded EFI image and returns control to boot services.\r
\r
OldTpl = CoreRaiseTpl (TPL_NOTIFY);\r
\r
Image = CoreLoadedImageInfo (ImageHandle);\r
- if (Image == NULL_HANDLE) {\r
+ if (Image == NULL) {\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
//\r
if (ExitData != NULL) {\r
Image->ExitDataSize = ExitDataSize;\r
- Image->ExitData = CoreAllocateBootServicesPool (Image->ExitDataSize);\r
+ Image->ExitData = AllocatePool (Image->ExitDataSize);\r
if (Image->ExitData == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
{\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 (TPL_NOTIFY);\r
\r
Image = CoreLoadedImageInfo (ImageHandle);\r
if (Image == NULL ) {\r
}\r
\r
Done:\r
- CoreRestoreTpl (OldTpl);\r
return Status;\r
}\r
\r