mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-31 01:24:12 +02:00
UefiImageLib: Ensure consistently passing the full buffer size
This commit is contained in:
parent
002702671a
commit
c2aa73cf3d
@ -688,7 +688,7 @@ LoadUefiImage (
|
||||
IN VOID *UefiImage,
|
||||
IN UINT32 UefiImageSize,
|
||||
OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
|
||||
OUT UINT64 *ImageSize,
|
||||
OUT UINT32 *ImageSize,
|
||||
OUT EFI_PHYSICAL_ADDRESS *EntryPoint
|
||||
);
|
||||
|
||||
|
@ -28,26 +28,30 @@ LoadUefiImage (
|
||||
IN VOID *UefiImage,
|
||||
IN UINT32 UefiImageSize,
|
||||
OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
|
||||
OUT UINT64 *ImageSize,
|
||||
OUT UINT32 *DestinationSize,
|
||||
OUT EFI_PHYSICAL_ADDRESS *EntryPoint
|
||||
)
|
||||
{
|
||||
RETURN_STATUS Status;
|
||||
UEFI_IMAGE_LOADER_IMAGE_CONTEXT ImageContext;
|
||||
UINT32 ImageSize;
|
||||
VOID *Buffer;
|
||||
UINT32 BufferSize;
|
||||
UINT32 BufferPages;
|
||||
UINT32 BufferAlignment;
|
||||
|
||||
Status = UefiImageInitializeContext (&ImageContext, UefiImage, UefiImageSize);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
BufferSize = UefiImageGetImageSize (&ImageContext);
|
||||
ImageSize = UefiImageGetImageSize (&ImageContext);
|
||||
BufferPages = EFI_SIZE_TO_PAGES (ImageSize);
|
||||
BufferSize = EFI_PAGES_TO_SIZE (BufferPages);
|
||||
BufferAlignment = UefiImageGetSegmentAlignment (&ImageContext);
|
||||
|
||||
//
|
||||
// Allocate Memory for the image
|
||||
//
|
||||
Buffer = AllocateAlignedCodePages (EFI_SIZE_TO_PAGES (BufferSize), BufferAlignment);
|
||||
Buffer = AllocateAlignedCodePages (BufferPages, BufferAlignment);
|
||||
ASSERT (Buffer != 0);
|
||||
|
||||
//
|
||||
@ -57,7 +61,7 @@ LoadUefiImage (
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
*ImageAddress = (UINTN) Buffer;
|
||||
*ImageSize = BufferSize;
|
||||
*DestinationSize = BufferSize;
|
||||
*EntryPoint = (UINTN) UefiImageLoaderGetImageEntryPoint (&ImageContext);
|
||||
|
||||
return Status;
|
||||
@ -80,7 +84,7 @@ LoadDxeCoreFromFfsFile (
|
||||
VOID *UefiImage;
|
||||
UINT32 UefiImageSize;
|
||||
EFI_PHYSICAL_ADDRESS ImageAddress;
|
||||
UINT64 ImageSize;
|
||||
UINT32 DestinationSize;
|
||||
EFI_PHYSICAL_ADDRESS EntryPoint;
|
||||
VOID *BaseOfStack;
|
||||
VOID *TopOfStack;
|
||||
@ -92,7 +96,7 @@ LoadDxeCoreFromFfsFile (
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = LoadUefiImage (UefiImage, UefiImageSize, &ImageAddress, &ImageSize, &EntryPoint);
|
||||
Status = LoadUefiImage (UefiImage, UefiImageSize, &ImageAddress, &DestinationSize, &EntryPoint);
|
||||
// For NT32 Debug Status = SecWinNtPeiLoadFile (UefiImage, &ImageAddress, &ImageSize, &EntryPoint);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
@ -102,7 +106,7 @@ LoadDxeCoreFromFfsFile (
|
||||
Status = FfsGetFileInfo (FileHandle, &FvFileInfo);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
BuildModuleHob (&FvFileInfo.FileName, (EFI_PHYSICAL_ADDRESS)(UINTN)ImageAddress, EFI_SIZE_TO_PAGES ((UINT32)ImageSize) * EFI_PAGE_SIZE, EntryPoint);
|
||||
BuildModuleHob (&FvFileInfo.FileName, (EFI_PHYSICAL_ADDRESS)(UINTN)ImageAddress, DestinationSize, EntryPoint);
|
||||
|
||||
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Loading DxeCore at 0x%10p EntryPoint=0x%10p\n", (VOID *)(UINTN)ImageAddress, (VOID *)(UINTN)EntryPoint));
|
||||
|
||||
|
@ -395,19 +395,13 @@ CheckAndMarkFixLoadingMemoryUsageBitMap (
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetUefiImageFixLoadingAssignedAddress (
|
||||
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||
OUT EFI_PHYSICAL_ADDRESS *LoadAddress
|
||||
OUT EFI_PHYSICAL_ADDRESS *LoadAddress,
|
||||
IN UINT64 ValueInSectionHeader,
|
||||
IN UINT32 ImageDestSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT64 ValueInSectionHeader;
|
||||
EFI_PHYSICAL_ADDRESS FixLoadingAddress;
|
||||
UINT32 SizeOfImage;
|
||||
|
||||
Status = UefiImageGetFixedAddress (ImageContext, &ValueInSectionHeader);
|
||||
if (RETURN_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
if ((INT64)PcdGet64(PcdLoadModuleAtFixAddressEnable) > 0) {
|
||||
//
|
||||
@ -425,8 +419,7 @@ GetUefiImageFixLoadingAssignedAddress (
|
||||
//
|
||||
// Check if the memory range is available.
|
||||
//
|
||||
SizeOfImage = UefiImageGetImageSize (ImageContext);
|
||||
Status = CheckAndMarkFixLoadingMemoryUsageBitMap (FixLoadingAddress, SizeOfImage);
|
||||
Status = CheckAndMarkFixLoadingMemoryUsageBitMap (FixLoadingAddress, ImageDestSize);
|
||||
*LoadAddress = FixLoadingAddress;
|
||||
|
||||
DEBUG ((EFI_D_INFO|EFI_D_LOAD, "LOADING MODULE FIXED INFO: Loading module at fixed address 0x%11p. Status = %r \n", (VOID *)(UINTN)FixLoadingAddress, Status));
|
||||
@ -511,8 +504,11 @@ CoreLoadPeImage (
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN DstBufAlocated;
|
||||
UINT32 Size;
|
||||
UINT32 Alignment;
|
||||
UINT32 ImageSize;
|
||||
UINT32 ImageAlignment;
|
||||
UINT64 ValueInSectionHeader;
|
||||
UINT32 DstBufPages;
|
||||
UINT32 DstBufSize;
|
||||
EFI_MEMORY_TYPE ImageCodeMemoryType;
|
||||
EFI_MEMORY_TYPE ImageDataMemoryType;
|
||||
UEFI_IMAGE_LOADER_RUNTIME_CONTEXT *RelocationData;
|
||||
@ -558,8 +554,10 @@ CoreLoadPeImage (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
Size = UefiImageGetImageSize (ImageContext);
|
||||
Alignment = UefiImageGetSegmentAlignment (ImageContext);
|
||||
ImageSize = UefiImageGetImageSize (ImageContext);
|
||||
DstBufPages = EFI_SIZE_TO_PAGES (ImageSize);
|
||||
DstBufSize = EFI_PAGES_TO_SIZE (DstBufPages);
|
||||
ImageAlignment = UefiImageGetSegmentAlignment (ImageContext);
|
||||
|
||||
BufferAddress = 0;
|
||||
//
|
||||
@ -570,7 +568,7 @@ CoreLoadPeImage (
|
||||
//
|
||||
// Allocate Destination Buffer as caller did not pass it in
|
||||
//
|
||||
Image->NumberOfPages = EFI_SIZE_TO_PAGES (Size);
|
||||
Image->NumberOfPages = DstBufPages;
|
||||
|
||||
//
|
||||
// If the image relocations have not been stripped, then load at any address.
|
||||
@ -585,7 +583,12 @@ CoreLoadPeImage (
|
||||
// a specified address.
|
||||
//
|
||||
if (PcdGet64 (PcdLoadModuleAtFixAddressEnable) != 0 ) {
|
||||
Status = GetUefiImageFixLoadingAssignedAddress (ImageContext, &BufferAddress);
|
||||
Status = UefiImageGetFixedAddress (ImageContext, &ValueInSectionHeader);
|
||||
if (RETURN_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = GetUefiImageFixLoadingAssignedAddress (&BufferAddress, ValueInSectionHeader, DstBufSize);
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
if (BufferAddress != UefiImageGetPreferredAddress (ImageContext) && UefiImageGetRelocsStripped (ImageContext)) {
|
||||
@ -605,7 +608,7 @@ CoreLoadPeImage (
|
||||
Status = AllocatePagesEx (
|
||||
AllocateAddress,
|
||||
ImageCodeMemoryType,
|
||||
Image->NumberOfPages,
|
||||
DstBufPages,
|
||||
&BufferAddress
|
||||
);
|
||||
}
|
||||
@ -614,8 +617,8 @@ CoreLoadPeImage (
|
||||
Status = AllocateAlignedPagesEx (
|
||||
AllocateAnyPages,
|
||||
ImageCodeMemoryType,
|
||||
Image->NumberOfPages,
|
||||
Alignment,
|
||||
DstBufPages,
|
||||
ImageAlignment,
|
||||
&BufferAddress
|
||||
);
|
||||
}
|
||||
@ -645,14 +648,14 @@ CoreLoadPeImage (
|
||||
|
||||
if ((Image->NumberOfPages != 0) &&
|
||||
(Image->NumberOfPages <
|
||||
(EFI_SIZE_TO_PAGES (Size))))
|
||||
DstBufPages))
|
||||
{
|
||||
Image->NumberOfPages = EFI_SIZE_TO_PAGES (Size);
|
||||
Image->NumberOfPages = DstBufPages;
|
||||
ASSERT (FALSE);
|
||||
return EFI_BUFFER_TOO_SMALL;
|
||||
}
|
||||
|
||||
Image->NumberOfPages = EFI_SIZE_TO_PAGES (Size);
|
||||
Image->NumberOfPages = DstBufPages;
|
||||
BufferAddress = *DstBuffer;
|
||||
}
|
||||
|
||||
@ -691,7 +694,7 @@ CoreLoadPeImage (
|
||||
Status = UefiImageLoadImageForExecution (
|
||||
ImageContext,
|
||||
(VOID *)(UINTN)BufferAddress,
|
||||
Size,
|
||||
DstBufSize,
|
||||
RelocationData,
|
||||
RelocDataSize
|
||||
);
|
||||
@ -715,7 +718,7 @@ CoreLoadPeImage (
|
||||
//
|
||||
Image->Type = UefiImageGetSubsystem (ImageContext);
|
||||
Image->Info.ImageBase = (VOID *)(UINTN)BufferAddress;
|
||||
Image->Info.ImageSize = UefiImageGetImageSize (ImageContext);
|
||||
Image->Info.ImageSize = ImageSize;
|
||||
Image->Info.ImageCodeType = ImageCodeMemoryType;
|
||||
Image->Info.ImageDataType = ImageDataMemoryType;
|
||||
if ((Attribute & EFI_LOAD_PE_IMAGE_ATTRIBUTE_RUNTIME_REGISTRATION) != 0) {
|
||||
|
@ -102,20 +102,14 @@ CheckAndMarkFixLoadingMemoryUsageBitMap (
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetUefiImageFixLoadingAssignedAddress (
|
||||
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||
IN PEI_CORE_INSTANCE *Private,
|
||||
OUT EFI_PHYSICAL_ADDRESS *LoadAddress
|
||||
OUT EFI_PHYSICAL_ADDRESS *LoadAddress,
|
||||
IN UINT64 ValueInSectionHeader,
|
||||
IN UINT32 ImageDestSize,
|
||||
IN PEI_CORE_INSTANCE *Private
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT64 ValueInSectionHeader;
|
||||
EFI_PHYSICAL_ADDRESS FixLoadingAddress;
|
||||
UINT32 SizeOfImage;
|
||||
|
||||
Status = UefiImageGetFixedAddress (ImageContext, &ValueInSectionHeader);
|
||||
if (RETURN_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
if ((INT64)PcdGet64(PcdLoadModuleAtFixAddressEnable) > 0) {
|
||||
//
|
||||
@ -133,8 +127,7 @@ GetUefiImageFixLoadingAssignedAddress (
|
||||
//
|
||||
// Check if the memory range is available.
|
||||
//
|
||||
SizeOfImage = UefiImageGetImageSize (ImageContext);
|
||||
Status = CheckAndMarkFixLoadingMemoryUsageBitMap (Private, FixLoadingAddress, SizeOfImage);
|
||||
Status = CheckAndMarkFixLoadingMemoryUsageBitMap (Private, FixLoadingAddress, ImageDestSize);
|
||||
*LoadAddress = FixLoadingAddress;
|
||||
|
||||
DEBUG ((EFI_D_INFO|EFI_D_LOAD, "LOADING MODULE FIXED INFO: Loading module at fixed address 0x%11p. Status= %r \n", (VOID *)(UINTN)FixLoadingAddress, Status));
|
||||
@ -171,15 +164,18 @@ LoadAndRelocateUefiImage (
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN Success;
|
||||
PEI_CORE_INSTANCE *Private;
|
||||
UINT32 DynamicImageSize;
|
||||
UINT32 DynamicImageAlignment;
|
||||
UINT32 ImageSize;
|
||||
UINT32 ImageAlignment;
|
||||
UINT64 ValueInSectionHeader;
|
||||
BOOLEAN IsXipImage;
|
||||
EFI_STATUS ReturnStatus;
|
||||
BOOLEAN IsS3Boot;
|
||||
BOOLEAN IsPeiModule;
|
||||
BOOLEAN IsRegisterForShadow;
|
||||
EFI_FV_FILE_INFO FileInfo;
|
||||
EFI_PHYSICAL_ADDRESS LoadAddress;
|
||||
UINT32 DestinationPages;
|
||||
UINT32 DestinationSize;
|
||||
EFI_PHYSICAL_ADDRESS Destination;
|
||||
UINT16 Machine;
|
||||
BOOLEAN LoadDynamically;
|
||||
|
||||
@ -250,7 +246,9 @@ LoadAndRelocateUefiImage (
|
||||
}
|
||||
|
||||
LoadDynamically = FALSE;
|
||||
DynamicImageSize = 0;
|
||||
ImageSize = UefiImageGetImageSize (ImageContext);
|
||||
DestinationPages = EFI_SIZE_TO_PAGES (ImageSize);
|
||||
DestinationSize = EFI_PAGES_TO_SIZE (DestinationPages);
|
||||
|
||||
//
|
||||
// Allocate Memory for the image when memory is ready, and image is relocatable.
|
||||
@ -266,11 +264,13 @@ LoadAndRelocateUefiImage (
|
||||
Success = FALSE;
|
||||
|
||||
if (PcdGet64(PcdLoadModuleAtFixAddressEnable) != 0 && (Private->HobList.HandoffInformationTable->BootMode != BOOT_ON_S3_RESUME)) {
|
||||
Status = GetUefiImageFixLoadingAssignedAddress(ImageContext, Private, &LoadAddress);
|
||||
if (!EFI_ERROR (Status)){
|
||||
DynamicImageSize = UefiImageGetImageSize (ImageContext);
|
||||
Status = UefiImageGetFixedAddress (ImageContext, &ValueInSectionHeader);
|
||||
if (!RETURN_ERROR (Status)) {
|
||||
Status = GetUefiImageFixLoadingAssignedAddress(&Destination, ValueInSectionHeader, DestinationSize, Private);
|
||||
}
|
||||
|
||||
Success = LoadAddress == UefiImageGetPreferredAddress (ImageContext);
|
||||
if (!EFI_ERROR (Status)){
|
||||
Success = Destination == UefiImageGetPreferredAddress (ImageContext);
|
||||
|
||||
if (!Success) {
|
||||
DEBUG ((DEBUG_INFO|DEBUG_LOAD, "LOADING MODULE FIXED ERROR: Loading module at fixed address failed since relocs have been stripped.\n"));
|
||||
@ -284,14 +284,13 @@ LoadAndRelocateUefiImage (
|
||||
//
|
||||
// Allocate more buffer to avoid buffer overflow.
|
||||
//
|
||||
DynamicImageSize = UefiImageGetImageSize (ImageContext);
|
||||
DynamicImageAlignment = UefiImageGetSegmentAlignment (ImageContext);
|
||||
ImageAlignment = UefiImageGetSegmentAlignment (ImageContext);
|
||||
|
||||
LoadAddress = (UINTN)AllocateAlignedCodePages (
|
||||
EFI_SIZE_TO_PAGES (DynamicImageSize),
|
||||
DynamicImageAlignment
|
||||
Destination = (UINTN)AllocateAlignedCodePages (
|
||||
DestinationPages,
|
||||
ImageAlignment
|
||||
);
|
||||
Success = LoadAddress != 0;
|
||||
Success = Destination != 0;
|
||||
}
|
||||
|
||||
if (Success) {
|
||||
@ -301,8 +300,8 @@ LoadAndRelocateUefiImage (
|
||||
//
|
||||
Status = UefiImageLoadImageForExecution (
|
||||
ImageContext,
|
||||
(VOID *) (UINTN)LoadAddress,
|
||||
DynamicImageSize,
|
||||
(VOID *) (UINTN)Destination,
|
||||
DestinationSize,
|
||||
NULL,
|
||||
0
|
||||
);
|
||||
|
@ -216,23 +216,16 @@ CheckAndMarkFixLoadingMemoryUsageBitMap (
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetUefiImageFixLoadingAssignedAddress (
|
||||
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||
OUT EFI_PHYSICAL_ADDRESS *LoadAddress
|
||||
OUT EFI_PHYSICAL_ADDRESS *LoadAddress,
|
||||
IN UINT64 ValueInSectionHeader,
|
||||
IN UINT32 ImageDestSize
|
||||
)
|
||||
{
|
||||
RETURN_STATUS Status;
|
||||
UINT64 ValueInSectionHeader;
|
||||
EFI_PHYSICAL_ADDRESS FixLoadingAddress;
|
||||
UINT32 SizeOfImage;
|
||||
|
||||
Status = UefiImageGetFixedAddress (ImageContext, &ValueInSectionHeader);
|
||||
if (RETURN_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
FixLoadingAddress = (EFI_PHYSICAL_ADDRESS)(gLoadModuleAtFixAddressSmramBase + ValueInSectionHeader);
|
||||
SizeOfImage = UefiImageGetImageSize (ImageContext);
|
||||
Status = CheckAndMarkFixLoadingMemoryUsageBitMap (FixLoadingAddress, SizeOfImage);
|
||||
Status = CheckAndMarkFixLoadingMemoryUsageBitMap (FixLoadingAddress, ImageDestSize);
|
||||
*LoadAddress = FixLoadingAddress;
|
||||
|
||||
DEBUG ((DEBUG_INFO|DEBUG_LOAD, "LOADING MODULE FIXED INFO: Loading module at fixed address %x, Status = %r\n", FixLoadingAddress, Status));
|
||||
@ -269,14 +262,16 @@ SmmLoadImage (
|
||||
UINTN FilePathSize;
|
||||
VOID *Buffer;
|
||||
UINTN Size;
|
||||
UINTN PageCount;
|
||||
UINT32 DstBufferPages;
|
||||
EFI_GUID *NameGuid;
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS SecurityStatus;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
UINT32 ImageSize;
|
||||
UINT32 ImageAlignment;
|
||||
UINT64 ValueInSectionHeader;
|
||||
VOID *DstBuffer;
|
||||
UINT32 DstBufferSize;
|
||||
UINT32 DstBufferAlignment;
|
||||
EFI_DEVICE_PATH_PROTOCOL *FilePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *OriginalFilePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *HandleFilePath;
|
||||
@ -426,8 +421,10 @@ SmmLoadImage (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
DstBufferSize = UefiImageGetImageSize (ImageContext);
|
||||
DstBufferAlignment = UefiImageGetSegmentAlignment (ImageContext);
|
||||
ImageSize = UefiImageGetImageSize (ImageContext);
|
||||
DstBufferPages = EFI_SIZE_TO_PAGES (ImageSize);
|
||||
DstBufferSize = EFI_PAGES_TO_SIZE (DstBufferPages);
|
||||
ImageAlignment = UefiImageGetSegmentAlignment (ImageContext);
|
||||
//
|
||||
// if Loading module at Fixed Address feature is enabled, then cut out a memory range started from TESG BASE
|
||||
// to hold the Smm driver code
|
||||
@ -436,22 +433,24 @@ SmmLoadImage (
|
||||
//
|
||||
// Get the fixed loading address assigned by Build tool
|
||||
//
|
||||
Status = GetUefiImageFixLoadingAssignedAddress (ImageContext, &LoadAddress);
|
||||
Status = UefiImageGetFixedAddress (ImageContext, &ValueInSectionHeader);
|
||||
if (!RETURN_ERROR (Status)) {
|
||||
Status = GetUefiImageFixLoadingAssignedAddress (&LoadAddress, ValueInSectionHeader, DstBufferSize);
|
||||
}
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
//
|
||||
// Since the memory range to load Smm core already been cut out, so no need to allocate and free this range
|
||||
// following statements is to bypass SmmFreePages
|
||||
//
|
||||
PageCount = 0;
|
||||
DstBufferPages = 0;
|
||||
DstBuffer = (VOID *)(UINTN)LoadAddress;
|
||||
} else {
|
||||
DEBUG ((DEBUG_INFO|DEBUG_LOAD, "LOADING MODULE FIXED ERROR: Failed to load module at fixed address. \n"));
|
||||
//
|
||||
// allocate the memory to load the SMM driver
|
||||
//
|
||||
PageCount = (UINTN)EFI_SIZE_TO_PAGES ((UINTN)DstBufferSize);
|
||||
|
||||
DstBuffer = AllocateAlignedCodePages (PageCount, DstBufferAlignment);
|
||||
DstBuffer = AllocateAlignedCodePages (DstBufferPages, ImageAlignment);
|
||||
if (DstBuffer == NULL) {
|
||||
if (Buffer != NULL) {
|
||||
gBS->FreePool (Buffer);
|
||||
@ -461,9 +460,7 @@ SmmLoadImage (
|
||||
}
|
||||
}
|
||||
} else {
|
||||
PageCount = (UINTN)EFI_SIZE_TO_PAGES ((UINTN)DstBufferSize);
|
||||
|
||||
DstBuffer = AllocateAlignedCodePages (PageCount, DstBufferAlignment);
|
||||
DstBuffer = AllocateAlignedCodePages (DstBufferPages, ImageAlignment);
|
||||
if (DstBuffer == NULL) {
|
||||
if (Buffer != NULL) {
|
||||
gBS->FreePool (Buffer);
|
||||
@ -488,7 +485,7 @@ SmmLoadImage (
|
||||
gBS->FreePool (Buffer);
|
||||
}
|
||||
|
||||
FreeAlignedPages (DstBuffer, PageCount);
|
||||
FreeAlignedPages (DstBuffer, DstBufferPages);
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -497,7 +494,7 @@ SmmLoadImage (
|
||||
//
|
||||
DriverEntry->ImageEntryPoint = UefiImageLoaderGetImageEntryPoint (ImageContext);
|
||||
DriverEntry->ImageBuffer = (UINTN)DstBuffer;
|
||||
DriverEntry->NumberOfPage = PageCount;
|
||||
DriverEntry->NumberOfPage = DstBufferPages;
|
||||
|
||||
//
|
||||
// Allocate a Loaded Image Protocol in EfiBootServicesData
|
||||
@ -508,7 +505,7 @@ SmmLoadImage (
|
||||
gBS->FreePool (Buffer);
|
||||
}
|
||||
|
||||
FreeAlignedPages (DstBuffer, PageCount);
|
||||
FreeAlignedPages (DstBuffer, DstBufferPages);
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -536,14 +533,14 @@ SmmLoadImage (
|
||||
gBS->FreePool (Buffer);
|
||||
}
|
||||
|
||||
FreeAlignedPages (DstBuffer, PageCount);
|
||||
FreeAlignedPages (DstBuffer, DstBufferPages);
|
||||
return Status;
|
||||
}
|
||||
|
||||
CopyMem (DriverEntry->LoadedImage->FilePath, FilePath, GetDevicePathSize (FilePath));
|
||||
|
||||
DriverEntry->LoadedImage->ImageBase = DstBuffer;
|
||||
DriverEntry->LoadedImage->ImageSize = UefiImageGetImageSize (ImageContext);
|
||||
DriverEntry->LoadedImage->ImageSize = ImageSize;
|
||||
DriverEntry->LoadedImage->ImageCodeType = EfiRuntimeServicesCode;
|
||||
DriverEntry->LoadedImage->ImageDataType = EfiRuntimeServicesData;
|
||||
|
||||
@ -557,14 +554,14 @@ SmmLoadImage (
|
||||
}
|
||||
|
||||
gBS->FreePool (DriverEntry->LoadedImage->FilePath);
|
||||
FreeAlignedPages (DstBuffer, PageCount);
|
||||
FreeAlignedPages (DstBuffer, DstBufferPages);
|
||||
return Status;
|
||||
}
|
||||
|
||||
CopyMem (DriverEntry->SmmLoadedImage.FilePath, FilePath, GetDevicePathSize(FilePath));
|
||||
|
||||
DriverEntry->SmmLoadedImage.ImageBase = DstBuffer;
|
||||
DriverEntry->SmmLoadedImage.ImageSize = UefiImageGetImageSize (ImageContext);
|
||||
DriverEntry->SmmLoadedImage.ImageSize = ImageSize;
|
||||
DriverEntry->SmmLoadedImage.ImageCodeType = EfiRuntimeServicesCode;
|
||||
DriverEntry->SmmLoadedImage.ImageDataType = EfiRuntimeServicesData;
|
||||
|
||||
|
@ -976,8 +976,10 @@ ExecuteSmmCoreFromSmram (
|
||||
EFI_STATUS Status;
|
||||
VOID *SourceBuffer;
|
||||
UINTN SourceSize;
|
||||
UINT32 ImageSize;
|
||||
UINT32 ImageAlignment;
|
||||
UINT32 DestinationPages;
|
||||
UINT32 DestinationSize;
|
||||
UINT32 DestinationAlignment;
|
||||
UINT32 AlignSubtrahend;
|
||||
UINTN PageCount;
|
||||
EFI_IMAGE_ENTRY_POINT EntryPoint;
|
||||
@ -1014,8 +1016,10 @@ ExecuteSmmCoreFromSmram (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
DestinationSize = UefiImageGetImageSize (&gSmmCorePrivate->PiSmmCoreImageContext);
|
||||
DestinationAlignment = UefiImageGetSegmentAlignment (&gSmmCorePrivate->PiSmmCoreImageContext);
|
||||
ImageSize = UefiImageGetImageSize (&gSmmCorePrivate->PiSmmCoreImageContext);
|
||||
DestinationPages = EFI_SIZE_TO_PAGES (ImageSize);
|
||||
DestinationSize = EFI_PAGES_TO_SIZE (DestinationPages);
|
||||
ImageAlignment = UefiImageGetSegmentAlignment (&gSmmCorePrivate->PiSmmCoreImageContext);
|
||||
//
|
||||
// if Loading module at Fixed Address feature is enabled, the SMM core driver will be loaded to
|
||||
// the address assigned by build tool.
|
||||
@ -1042,9 +1046,9 @@ ExecuteSmmCoreFromSmram (
|
||||
//
|
||||
AlignSubtrahend = ALIGN_VALUE_SUBTRAHEND (
|
||||
SmramRange->CpuStart + SmramRange->PhysicalSize,
|
||||
DestinationAlignment
|
||||
ImageAlignment
|
||||
);
|
||||
PageCount = (UINTN)EFI_SIZE_TO_PAGES ((UINTN)DestinationSize) + (UINTN)EFI_SIZE_TO_PAGES ((UINTN)AlignSubtrahend);
|
||||
PageCount = (UINTN)DestinationPages + (UINTN)EFI_SIZE_TO_PAGES ((UINTN)AlignSubtrahend);
|
||||
|
||||
ASSERT ((SmramRange->PhysicalSize & EFI_PAGE_MASK) == 0);
|
||||
ASSERT (SmramRange->PhysicalSize > EFI_PAGES_TO_SIZE (PageCount));
|
||||
@ -1067,9 +1071,9 @@ ExecuteSmmCoreFromSmram (
|
||||
//
|
||||
AlignSubtrahend = ALIGN_VALUE_SUBTRAHEND (
|
||||
SmramRange->CpuStart + SmramRange->PhysicalSize,
|
||||
DestinationAlignment
|
||||
ImageAlignment
|
||||
);
|
||||
PageCount = (UINTN)EFI_SIZE_TO_PAGES ((UINTN)DestinationSize) + (UINTN)EFI_SIZE_TO_PAGES ((UINTN)AlignSubtrahend);
|
||||
PageCount = (UINTN)DestinationPages + (UINTN)EFI_SIZE_TO_PAGES ((UINTN)AlignSubtrahend);
|
||||
|
||||
ASSERT ((SmramRange->PhysicalSize & EFI_PAGE_MASK) == 0);
|
||||
ASSERT (SmramRange->PhysicalSize > EFI_PAGES_TO_SIZE (PageCount));
|
||||
|
@ -45,7 +45,7 @@ IsDrxEnabled (
|
||||
**/
|
||||
VOID
|
||||
UefiImageLoaderExtraActionCommon (
|
||||
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||
IN CONST UEFI_IMAGE_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||
IN UINTN Signature
|
||||
)
|
||||
{
|
||||
@ -217,7 +217,7 @@ UefiImageLoaderExtraActionCommon (
|
||||
VOID
|
||||
EFIAPI
|
||||
UefiImageLoaderRelocateImageExtraAction (
|
||||
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
IN CONST UEFI_IMAGE_LOADER_IMAGE_CONTEXT *ImageContext
|
||||
)
|
||||
{
|
||||
UefiImageLoaderExtraActionCommon (ImageContext, IMAGE_LOAD_SIGNATURE);
|
||||
|
@ -274,9 +274,10 @@ MmLoadImage (
|
||||
{
|
||||
UINT32 ImageSize;
|
||||
UINT32 ImageAlignment;
|
||||
UINTN PageCount;
|
||||
EFI_STATUS Status;
|
||||
VOID *DstBuffer;
|
||||
UINT32 DstBufferPages;
|
||||
UINT32 DstBufferSize;
|
||||
UEFI_IMAGE_LOADER_IMAGE_CONTEXT ImageContext;
|
||||
|
||||
DEBUG ((DEBUG_INFO, "MmLoadImage - %g\n", &DriverEntry->FileName));
|
||||
@ -291,12 +292,12 @@ MmLoadImage (
|
||||
return Status;
|
||||
}
|
||||
|
||||
ImageSize = UefiImageGetImageSize (&ImageContext, &ImageSize);
|
||||
ImageSize = UefiImageGetImageSize (&ImageContext);
|
||||
DstBufferPages = EFI_SIZE_TO_PAGES (ImageSize);
|
||||
DstBufferSize = EFI_PAGES_TO_SIZE (DstBufferPages);
|
||||
ImageAlignment = UefiImageGetSegmentAlignment (&ImageContext);
|
||||
|
||||
PageCount = (UINTN)EFI_SIZE_TO_PAGES ((UINTN) ImageSize);
|
||||
|
||||
DstBuffer = AllocateAlignedCodePages (PageCount, ImageAlignment);
|
||||
DstBuffer = AllocateAlignedCodePages (DstBufferPages, ImageAlignment);
|
||||
if (DstBuffer == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
@ -304,9 +305,9 @@ MmLoadImage (
|
||||
//
|
||||
// Load the image to our new buffer
|
||||
//
|
||||
Status = UefiImageLoadImageForExecution (&ImageContext, (VOID *) (UINTN) DstBuffer, ImageSize, NULL, 0);
|
||||
Status = UefiImageLoadImageForExecution (&ImageContext, DstBuffer, DstBufferSize, NULL, 0);
|
||||
if (EFI_ERROR (Status)) {
|
||||
FreeAlignedPages (DstBuffer, PageCount);
|
||||
FreeAlignedPages (DstBuffer, DstBufferPages);
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -315,7 +316,7 @@ MmLoadImage (
|
||||
//
|
||||
DriverEntry->ImageEntryPoint = UefiImageLoaderGetImageEntryPoint (&ImageContext);
|
||||
DriverEntry->ImageBuffer = (UINTN)DstBuffer;
|
||||
DriverEntry->NumberOfPage = PageCount;
|
||||
DriverEntry->NumberOfPage = DstBufferPages;
|
||||
|
||||
if (mEfiSystemTable != NULL) {
|
||||
Status = mEfiSystemTable->BootServices->AllocatePool (
|
||||
@ -324,7 +325,7 @@ MmLoadImage (
|
||||
(VOID **)&DriverEntry->LoadedImage
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
FreeAlignedPages (DstBuffer, PageCount);
|
||||
FreeAlignedPages (DstBuffer, DstBufferPages);
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -368,7 +369,7 @@ MmLoadImage (
|
||||
DEBUG ((
|
||||
DEBUG_INFO | DEBUG_LOAD,
|
||||
"Loading MM driver at 0x%11p EntryPoint=0x%11p ",
|
||||
(VOID *)(UINTN)ImageBase,
|
||||
DstBuffer,
|
||||
FUNCTION_ENTRY_POINT (UefiImageLoaderGetImageEntryPoint (&ImageContext))
|
||||
));
|
||||
|
||||
|
@ -24,14 +24,16 @@ LoadUefiImage (
|
||||
IN VOID *UefiImage,
|
||||
IN UINT32 UefiImageSize,
|
||||
OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
|
||||
OUT UINT64 *ImageSize,
|
||||
OUT UINT64 *DestinationSize,
|
||||
OUT EFI_PHYSICAL_ADDRESS *EntryPoint
|
||||
)
|
||||
{
|
||||
RETURN_STATUS Status;
|
||||
UEFI_IMAGE_LOADER_IMAGE_CONTEXT ImageContext;
|
||||
UINT32 ImageSize;
|
||||
UINT32 ImageAlignment;
|
||||
UINT32 BufferPages;
|
||||
UINT32 BufferSize;
|
||||
UINT32 BufferAlignment;
|
||||
VOID *Buffer;
|
||||
|
||||
Status = UefiImageInitializeContext (&ImageContext, UefiImage, UefiImageSize);
|
||||
@ -40,13 +42,15 @@ LoadUefiImage (
|
||||
return Status;
|
||||
}
|
||||
|
||||
BufferSize = UefiImageGetImageSize (&ImageContext);
|
||||
BufferAlignment = UefiImageGetSegmentAlignment (&ImageContext);
|
||||
ImageSize = UefiImageGetImageSize (&ImageContext);
|
||||
BufferPages = EFI_SIZE_TO_PAGES (ImageSize);
|
||||
BufferSize = EFI_PAGES_TO_SIZE (BufferPages);
|
||||
ImageAlignment = UefiImageGetSegmentAlignment (&ImageContext);
|
||||
|
||||
//
|
||||
// Allocate Memory for the image
|
||||
//
|
||||
Buffer = AllocateAlignedCodePages (EFI_SIZE_TO_PAGES (BufferSize), BufferAlignment);
|
||||
Buffer = AllocateAlignedCodePages (BufferPages, ImageAlignment);
|
||||
if (Buffer == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
@ -67,7 +71,7 @@ LoadUefiImage (
|
||||
}
|
||||
|
||||
*ImageAddress = (UINTN)Buffer;
|
||||
*ImageSize = BufferSize;
|
||||
*DestinationSize = BufferSize;
|
||||
*EntryPoint = UefiImageLoaderGetImageEntryPoint (&ImageContext);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@ -230,7 +234,7 @@ LoadDxeCore (
|
||||
VOID *UefiImage;
|
||||
UINT32 UefiImageSize;
|
||||
EFI_PHYSICAL_ADDRESS ImageAddress;
|
||||
UINT64 ImageSize;
|
||||
UINT64 DestinationSize;
|
||||
|
||||
PayloadFv = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdGet32 (PcdPayloadFdMemBase);
|
||||
|
||||
@ -268,12 +272,12 @@ LoadDxeCore (
|
||||
//
|
||||
// Get DXE core info
|
||||
//
|
||||
Status = LoadUefiImage (UefiImage, UefiImageSize, &ImageAddress, &ImageSize, DxeCoreEntryPoint);
|
||||
Status = LoadUefiImage (UefiImage, UefiImageSize, &ImageAddress, &DestinationSize, DxeCoreEntryPoint);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
BuildModuleHob (&FileHeader->Name, ImageAddress, EFI_SIZE_TO_PAGES ((UINT32)ImageSize) * EFI_PAGE_SIZE, *DxeCoreEntryPoint);
|
||||
BuildModuleHob (&FileHeader->Name, ImageAddress, DestinationSize, *DxeCoreEntryPoint);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user