The DstBuffer and NumberOfPages arguments to CoreLoadImageCommon () are never set by its only caller CoreLoadImage() so let's drop them from the prototype.
Signed-off-by: Ard Biesheuvel <a...@kernel.org> --- MdeModulePkg/Core/Dxe/Image/Image.c | 174 +++++++------------- 1 file changed, 56 insertions(+), 118 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c index 2f2dfe5d0496dc4f..6625d0cd0ff82107 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -559,7 +559,6 @@ CoreIsImageTypeSupported ( boot selection. @param Pe32Handle The handle of PE32 image @param Image PE image to be loaded - @param DstBuffer The buffer to store the image @param Attribute The bit mask of attributes to set for the load PE image @@ -570,17 +569,16 @@ CoreIsImageTypeSupported ( @retval EFI_BUFFER_TOO_SMALL Buffer for image is too small **/ +STATIC EFI_STATUS CoreLoadPeImage ( IN BOOLEAN BootPolicy, IN VOID *Pe32Handle, IN LOADED_IMAGE_PRIVATE_DATA *Image, - IN EFI_PHYSICAL_ADDRESS DstBuffer OPTIONAL, IN UINT32 Attribute ) { EFI_STATUS Status; - BOOLEAN DstBufAlocated; UINTN Size; ZeroMem (&Image->ImageContext, sizeof (Image->ImageContext)); @@ -633,99 +631,67 @@ CoreLoadPeImage ( } // - // Allocate memory of the correct memory type aligned on the required image boundary + // Allocate Destination Buffer as caller did not pass it in // - DstBufAlocated = FALSE; - if (DstBuffer == 0) { - // - // Allocate Destination Buffer as caller did not pass it in - // - if (Image->ImageContext.SectionAlignment > EFI_PAGE_SIZE) { - Size = (UINTN)Image->ImageContext.ImageSize + Image->ImageContext.SectionAlignment; - } else { - Size = (UINTN)Image->ImageContext.ImageSize; - } + if (Image->ImageContext.SectionAlignment > EFI_PAGE_SIZE) { + Size = (UINTN)Image->ImageContext.ImageSize + Image->ImageContext.SectionAlignment; + } else { + Size = (UINTN)Image->ImageContext.ImageSize; + } - Image->NumberOfPages = EFI_SIZE_TO_PAGES (Size); + Image->NumberOfPages = EFI_SIZE_TO_PAGES (Size); - // - // If the image relocations have not been stripped, then load at any address. - // Otherwise load at the address at which it was linked. - // - // Memory below 1MB should be treated reserved for CSM and there should be - // no modules whose preferred load addresses are below 1MB. - // - Status = EFI_OUT_OF_RESOURCES; - // - // If Loading Module At Fixed Address feature is enabled, the module should be loaded to - // a specified address. - // - if (PcdGet64 (PcdLoadModuleAtFixAddressEnable) != 0 ) { - Status = GetPeCoffImageFixLoadingAssignedAddress (&(Image->ImageContext)); - - if (EFI_ERROR (Status)) { - // - // If the code memory is not ready, invoke CoreAllocatePage with AllocateAnyPages to load the driver. - // - DEBUG ((DEBUG_INFO|DEBUG_LOAD, "LOADING MODULE FIXED ERROR: Loading module at fixed address failed since specified memory is not available.\n")); - - Status = CoreAllocatePages ( - AllocateAnyPages, - (EFI_MEMORY_TYPE)(Image->ImageContext.ImageCodeMemoryType), - Image->NumberOfPages, - &Image->ImageContext.ImageAddress - ); - } - } else { - if ((Image->ImageContext.ImageAddress >= 0x100000) || Image->ImageContext.RelocationsStripped) { - Status = CoreAllocatePages ( - AllocateAddress, - (EFI_MEMORY_TYPE)(Image->ImageContext.ImageCodeMemoryType), - Image->NumberOfPages, - &Image->ImageContext.ImageAddress - ); - } - - if (EFI_ERROR (Status) && !Image->ImageContext.RelocationsStripped) { - Status = CoreAllocatePages ( - AllocateAnyPages, - (EFI_MEMORY_TYPE)(Image->ImageContext.ImageCodeMemoryType), - Image->NumberOfPages, - &Image->ImageContext.ImageAddress - ); - } - } + // + // If the image relocations have not been stripped, then load at any address. + // Otherwise load at the address at which it was linked. + // + // Memory below 1MB should be treated reserved for CSM and there should be + // no modules whose preferred load addresses are below 1MB. + // + Status = EFI_OUT_OF_RESOURCES; + // + // If Loading Module At Fixed Address feature is enabled, the module should be loaded to + // a specified address. + // + if (PcdGet64 (PcdLoadModuleAtFixAddressEnable) != 0 ) { + Status = GetPeCoffImageFixLoadingAssignedAddress (&(Image->ImageContext)); if (EFI_ERROR (Status)) { - return Status; - } + // + // If the code memory is not ready, invoke CoreAllocatePage with AllocateAnyPages to load the driver. + // + DEBUG ((DEBUG_INFO|DEBUG_LOAD, "LOADING MODULE FIXED ERROR: Loading module at fixed address failed since specified memory is not available.\n")); - DstBufAlocated = TRUE; + Status = CoreAllocatePages ( + AllocateAnyPages, + (EFI_MEMORY_TYPE)(Image->ImageContext.ImageCodeMemoryType), + Image->NumberOfPages, + &Image->ImageContext.ImageAddress + ); + } } else { - // - // Caller provided the destination buffer - // - - if (Image->ImageContext.RelocationsStripped && (Image->ImageContext.ImageAddress != DstBuffer)) { - // - // If the image relocations were stripped, and the caller provided a - // destination buffer address that does not match the address that the - // image is linked at, then the image cannot be loaded. - // - return EFI_INVALID_PARAMETER; + if ((Image->ImageContext.ImageAddress >= 0x100000) || Image->ImageContext.RelocationsStripped) { + Status = CoreAllocatePages ( + AllocateAddress, + (EFI_MEMORY_TYPE)(Image->ImageContext.ImageCodeMemoryType), + Image->NumberOfPages, + &Image->ImageContext.ImageAddress + ); } - if ((Image->NumberOfPages != 0) && - (Image->NumberOfPages < - (EFI_SIZE_TO_PAGES ((UINTN)Image->ImageContext.ImageSize + Image->ImageContext.SectionAlignment)))) - { - Image->NumberOfPages = EFI_SIZE_TO_PAGES ((UINTN)Image->ImageContext.ImageSize + Image->ImageContext.SectionAlignment); - return EFI_BUFFER_TOO_SMALL; + if (EFI_ERROR (Status) && !Image->ImageContext.RelocationsStripped) { + Status = CoreAllocatePages ( + AllocateAnyPages, + (EFI_MEMORY_TYPE)(Image->ImageContext.ImageCodeMemoryType), + Image->NumberOfPages, + &Image->ImageContext.ImageAddress + ); } + } - Image->NumberOfPages = EFI_SIZE_TO_PAGES ((UINTN)Image->ImageContext.ImageSize + Image->ImageContext.SectionAlignment); - Image->ImageContext.ImageAddress = DstBuffer; + if (EFI_ERROR (Status)) { + return Status; } Image->ImageBasePage = Image->ImageContext.ImageAddress; @@ -875,12 +841,9 @@ CoreLoadPeImage ( // // Free memory. // - - if (DstBufAlocated) { - CoreFreePages (Image->ImageContext.ImageAddress, Image->NumberOfPages); - Image->ImageContext.ImageAddress = 0; - Image->ImageBasePage = 0; - } + CoreFreePages (Image->ImageContext.ImageAddress, Image->NumberOfPages); + Image->ImageContext.ImageAddress = 0; + Image->ImageBasePage = 0; if (Image->ImageContext.FixupData != NULL) { CoreFreePool (Image->ImageContext.FixupData); @@ -1094,12 +1057,6 @@ CoreUnloadAndCloseImage ( @param SourceBuffer If not NULL, a pointer to the memory location containing a copy of the image to be loaded. @param SourceSize The size in bytes of SourceBuffer. - @param DstBuffer The buffer to store the image - @param NumberOfPages If not NULL, it inputs a pointer to the page - number of DstBuffer and outputs a pointer to - the page number of the image. If this number is - not enough, return EFI_BUFFER_TOO_SMALL and - this parameter contains the required number. @param ImageHandle Pointer to the returned image handle that is created when the image is successfully loaded. @param Attribute The bit mask of attributes to set for the load @@ -1132,8 +1089,6 @@ CoreLoadImageCommon ( IN EFI_DEVICE_PATH_PROTOCOL *FilePath, IN VOID *SourceBuffer OPTIONAL, IN UINTN SourceSize, - IN EFI_PHYSICAL_ADDRESS DstBuffer OPTIONAL, - IN OUT UINTN *NumberOfPages OPTIONAL, OUT EFI_HANDLE *ImageHandle, IN UINT32 Attribute ) @@ -1342,12 +1297,7 @@ CoreLoadImageCommon ( Image->Info.Revision = EFI_LOADED_IMAGE_PROTOCOL_REVISION; Image->Info.FilePath = DuplicateDevicePath (FilePath); Image->Info.ParentHandle = ParentImageHandle; - - if (NumberOfPages != NULL) { - Image->NumberOfPages = *NumberOfPages; - } else { - Image->NumberOfPages = 0; - } + Image->NumberOfPages = 0; // // Install the protocol interfaces for this image @@ -1367,21 +1317,11 @@ CoreLoadImageCommon ( // // Load the image. // - Status = CoreLoadPeImage (BootPolicy, &FHand, Image, DstBuffer, Attribute); + Status = CoreLoadPeImage (BootPolicy, &FHand, Image, Attribute); if (EFI_ERROR (Status)) { - if ((Status == EFI_BUFFER_TOO_SMALL) || (Status == EFI_OUT_OF_RESOURCES)) { - if (NumberOfPages != NULL) { - *NumberOfPages = Image->NumberOfPages; - } - } - goto Done; } - if (NumberOfPages != NULL) { - *NumberOfPages = Image->NumberOfPages; - } - // // Register the image in the Debug Image Info Table if the attribute is set // @@ -1473,7 +1413,7 @@ CoreLoadImageCommon ( // if (EFI_ERROR (Status)) { if (Image != NULL) { - CoreUnloadAndCloseImage (Image, (BOOLEAN)(DstBuffer == 0)); + CoreUnloadAndCloseImage (Image, TRUE); Image = NULL; } } else if (EFI_ERROR (SecurityStatus)) { @@ -1546,8 +1486,6 @@ CoreLoadImage ( FilePath, SourceBuffer, SourceSize, - (EFI_PHYSICAL_ADDRESS)(UINTN)NULL, - NULL, ImageHandle, EFI_LOAD_PE_IMAGE_ATTRIBUTE_RUNTIME_REGISTRATION | EFI_LOAD_PE_IMAGE_ATTRIBUTE_DEBUG_IMAGE_INFO_TABLE_REGISTRATION ); -- 2.39.2 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#105364): https://edk2.groups.io/g/devel/message/105364 Mute This Topic: https://groups.io/mt/99197134/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-