/** @file Support for functions common to all Image formats. Copyright (c) 2021, Marvin Häuser. All rights reserved.
SPDX-License-Identifier: BSD-3-Clause **/ #include #include #include #include #include #include #include RETURN_STATUS UefiImageRelocateImageInplaceForExecution ( IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context ) { RETURN_STATUS Status; UINTN ImageAddress; UINTN ImageSize; Status = UefiImageRelocateImageInplace (Context); if (RETURN_ERROR (Status)) { return Status; } ImageAddress = UefiImageLoaderGetImageAddress (Context); ImageSize = UefiImageGetImageSize (Context); // // Flush the instruction cache so the image data is written before // execution. // InvalidateInstructionCacheRange ((VOID *) ImageAddress, ImageSize); return RETURN_SUCCESS; } // FIXME: Check Subsystem here RETURN_STATUS UefiImageLoadImageForExecution ( IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context, OUT VOID *Destination, IN UINT32 DestinationSize, OUT UEFI_IMAGE_LOADER_RUNTIME_CONTEXT *RuntimeContext OPTIONAL, IN UINT32 RuntimeContextSize ) { RETURN_STATUS Status; UINTN BaseAddress; UINTN SizeOfImage; // // Load the Image into the memory space. // Status = UefiImageLoadImage (Context, Destination, DestinationSize); if (RETURN_ERROR (Status)) { return Status; } // // Relocate the Image to the address it has been loaded to. // BaseAddress = UefiImageLoaderGetImageAddress (Context); Status = UefiImageRelocateImage ( Context, BaseAddress, RuntimeContext, RuntimeContextSize ); if (RETURN_ERROR (Status)) { return Status; } SizeOfImage = UefiImageGetImageSize (Context); // // Flush the instruction cache so the image data is written before execution. // InvalidateInstructionCacheRange ((VOID *) BaseAddress, SizeOfImage); return RETURN_SUCCESS; } RETURN_STATUS UefiImageRuntimeRelocateImageForExecution ( IN OUT VOID *Image, IN UINT32 ImageSize, IN UINT64 BaseAddress, IN CONST UEFI_IMAGE_LOADER_RUNTIME_CONTEXT *RuntimeContext ) { RETURN_STATUS Status; // // Relocate the Image to the new address. // Status = UefiImageRuntimeRelocateImage ( Image, ImageSize, BaseAddress, RuntimeContext ); if (RETURN_ERROR (Status)) { return Status; } // // Flush the instruction cache so the image data is written before execution. // InvalidateInstructionCacheRange (Image, ImageSize); return RETURN_SUCCESS; }