Skip to content

Commit

Permalink
MdeModulePkg/Core: Replaced UEFI_IMAGE_LOADER_IMAGE_CONTEXT with HOB_…
Browse files Browse the repository at this point in the history
…IMAGE_CONTEXT.
  • Loading branch information
Mikhail Krichanov committed Sep 1, 2023
1 parent f70fc3e commit 4401a04
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 9 deletions.
36 changes: 35 additions & 1 deletion MdeModulePkg/Core/Dxe/Image/Image.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ CoreInitializeImageServices (
VOID *DxeCoreEntryPoint;
EFI_PEI_HOB_POINTERS DxeCoreHob;
EFI_HOB_GUID_TYPE *GuidHob;
HOB_IMAGE_CONTEXT *Hob;

//
// Searching for image hob
Expand Down Expand Up @@ -239,7 +240,40 @@ CoreInitializeImageServices (
ASSERT (FALSE);
}

CopyMem (ImageContext, GET_GUID_HOB_DATA (GuidHob), sizeof (*ImageContext));
Hob = (HOB_IMAGE_CONTEXT *)GET_GUID_HOB_DATA (GuidHob);

ImageContext->FormatIndex = Hob->FormatIndex;

if (ImageContext->FormatIndex == UefiImageFormatPe) {
ImageContext->Ctx.Pe.ImageBuffer = (VOID *)(UINTN)Hob->Ctx.Pe.ImageBuffer;
ImageContext->Ctx.Pe.AddressOfEntryPoint = Hob->Ctx.Pe.AddressOfEntryPoint;
ImageContext->Ctx.Pe.ImageType = Hob->Ctx.Pe.ImageType;
ImageContext->Ctx.Pe.FileBuffer = (CONST VOID *)(UINTN)Hob->Ctx.Pe.FileBuffer;
ImageContext->Ctx.Pe.ExeHdrOffset = Hob->Ctx.Pe.ExeHdrOffset;
ImageContext->Ctx.Pe.SizeOfImage = Hob->Ctx.Pe.SizeOfImage;
ImageContext->Ctx.Pe.FileSize = Hob->Ctx.Pe.FileSize;
ImageContext->Ctx.Pe.Subsystem = Hob->Ctx.Pe.Subsystem;
ImageContext->Ctx.Pe.SectionAlignment = Hob->Ctx.Pe.SectionAlignment;
ImageContext->Ctx.Pe.SectionsOffset = Hob->Ctx.Pe.SectionsOffset;
ImageContext->Ctx.Pe.NumberOfSections = Hob->Ctx.Pe.NumberOfSections;
ImageContext->Ctx.Pe.SizeOfHeaders = Hob->Ctx.Pe.SizeOfHeaders;
} else if (ImageContext->FormatIndex == UefiImageFormatUe) {
ImageContext->Ctx.Ue.ImageBuffer = (VOID *)(UINTN)Hob->Ctx.Ue.ImageBuffer;
ImageContext->Ctx.Ue.FileBuffer = (CONST UINT8 *)(UINTN)Hob->Ctx.Ue.FileBuffer;
ImageContext->Ctx.Ue.EntryPointAddress = Hob->Ctx.Ue.EntryPointAddress;
ImageContext->Ctx.Ue.LoadTablesFileOffset = Hob->Ctx.Ue.LoadTablesFileOffset;
ImageContext->Ctx.Ue.NumLoadTables = Hob->Ctx.Ue.NumLoadTables;
ImageContext->Ctx.Ue.LoadTables = (CONST UE_LOAD_TABLE *)(UINTN)Hob->Ctx.Ue.LoadTables;
ImageContext->Ctx.Ue.Segments = (CONST VOID *)(UINTN)Hob->Ctx.Ue.Segments;
ImageContext->Ctx.Ue.LastSegmentIndex = Hob->Ctx.Ue.LastSegmentIndex;
ImageContext->Ctx.Ue.SegmentAlignment = Hob->Ctx.Ue.SegmentAlignment;
ImageContext->Ctx.Ue.ImageSize = Hob->Ctx.Ue.ImageSize;
ImageContext->Ctx.Ue.Subsystem = Hob->Ctx.Ue.Subsystem;
ImageContext->Ctx.Ue.SegmentImageInfoIterSize = Hob->Ctx.Ue.SegmentImageInfoIterSize;
ImageContext->Ctx.Ue.SegmentsFileOffset = Hob->Ctx.Ue.SegmentsFileOffset;
} else {
ASSERT (FALSE);
}

ASSERT ((UINTN) DxeCoreEntryPoint == UefiImageLoaderGetImageEntryPoint (ImageContext));

Expand Down
4 changes: 2 additions & 2 deletions MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ DxeLoadCore (
//
FileHandle = DxeIplFindDxeCore ();

ImageContext = BuildGuidHob (&gUefiImageLoaderImageContextGuid, sizeof (UEFI_IMAGE_LOADER_IMAGE_CONTEXT));
ImageContext = BuildGuidHob (&gUefiImageLoaderImageContextGuid, sizeof (HOB_IMAGE_CONTEXT));
ASSERT (ImageContext != NULL);

//
Expand All @@ -417,7 +417,7 @@ DxeLoadCore (
ASSERT_EFI_ERROR (Status);

Status = LoadFile->LoadFile (
(EFI_PEI_LOAD_FILE_PPI *)&ImageContext,
(CONST EFI_PEI_LOAD_FILE_PPI *)&ImageContext,
FileHandle,
&DxeCoreAddress,
&DxeCoreSize,
Expand Down
42 changes: 38 additions & 4 deletions MdeModulePkg/Core/Pei/Image/Image.c
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ PeiGetPe32Data (
**/
EFI_STATUS
PeiLoadImageLoadImage (
IN EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_FILE_HANDLE FileHandle,
OUT EFI_PHYSICAL_ADDRESS *ImageAddressArg OPTIONAL,
OUT UINT64 *ImageSizeArg OPTIONAL,
Expand All @@ -464,6 +464,7 @@ PeiLoadImageLoadImage (
UINTN Instance;
EFI_PEI_LOAD_FILE_PPI *LoadFile;
BOOLEAN IsHook;
HOB_IMAGE_CONTEXT *Hob;

*EntryPoint = 0;
*AuthenticationState = 0;
Expand Down Expand Up @@ -517,7 +518,40 @@ PeiLoadImageLoadImage (
} while (!EFI_ERROR (Status));

if (IsHook) {
CopyMem (*PeiServices, &ImageContext, sizeof (ImageContext));
Hob = (HOB_IMAGE_CONTEXT *)*PeiServices;

Hob->FormatIndex = ImageContext.FormatIndex;

if (Hob->FormatIndex == UefiImageFormatPe) {
Hob->Ctx.Pe.ImageBuffer = (UINT32)(UINTN)ImageContext.Ctx.Pe.ImageBuffer;
Hob->Ctx.Pe.AddressOfEntryPoint = ImageContext.Ctx.Pe.AddressOfEntryPoint;
Hob->Ctx.Pe.ImageType = ImageContext.Ctx.Pe.ImageType;
Hob->Ctx.Pe.FileBuffer = (UINT32)(UINTN)ImageContext.Ctx.Pe.FileBuffer;
Hob->Ctx.Pe.ExeHdrOffset = ImageContext.Ctx.Pe.ExeHdrOffset;
Hob->Ctx.Pe.SizeOfImage = ImageContext.Ctx.Pe.SizeOfImage;
Hob->Ctx.Pe.FileSize = ImageContext.Ctx.Pe.FileSize;
Hob->Ctx.Pe.Subsystem = ImageContext.Ctx.Pe.Subsystem;
Hob->Ctx.Pe.SectionAlignment = ImageContext.Ctx.Pe.SectionAlignment;
Hob->Ctx.Pe.SectionsOffset = ImageContext.Ctx.Pe.SectionsOffset;
Hob->Ctx.Pe.NumberOfSections = ImageContext.Ctx.Pe.NumberOfSections;
Hob->Ctx.Pe.SizeOfHeaders = ImageContext.Ctx.Pe.SizeOfHeaders;
} else if (Hob->FormatIndex == UefiImageFormatUe) {
Hob->Ctx.Ue.ImageBuffer = (UINT32)(UINTN)ImageContext.Ctx.Ue.ImageBuffer;
Hob->Ctx.Ue.FileBuffer = (UINT32)(UINTN)ImageContext.Ctx.Ue.FileBuffer;
Hob->Ctx.Ue.EntryPointAddress = ImageContext.Ctx.Ue.EntryPointAddress;
Hob->Ctx.Ue.LoadTablesFileOffset = ImageContext.Ctx.Ue.LoadTablesFileOffset;
Hob->Ctx.Ue.NumLoadTables = ImageContext.Ctx.Ue.NumLoadTables;
Hob->Ctx.Ue.LoadTables = (UINT32)(UINTN)ImageContext.Ctx.Ue.LoadTables;
Hob->Ctx.Ue.Segments = (UINT32)(UINTN)ImageContext.Ctx.Ue.Segments;
Hob->Ctx.Ue.LastSegmentIndex = ImageContext.Ctx.Ue.LastSegmentIndex;
Hob->Ctx.Ue.SegmentAlignment = ImageContext.Ctx.Ue.SegmentAlignment;
Hob->Ctx.Ue.ImageSize = ImageContext.Ctx.Ue.ImageSize;
Hob->Ctx.Ue.Subsystem = ImageContext.Ctx.Ue.Subsystem;
Hob->Ctx.Ue.SegmentImageInfoIterSize = ImageContext.Ctx.Ue.SegmentImageInfoIterSize;
Hob->Ctx.Ue.SegmentsFileOffset = ImageContext.Ctx.Ue.SegmentsFileOffset;
} else {
ASSERT (FALSE);
}
}

//
Expand Down Expand Up @@ -586,7 +620,7 @@ PeiLoadImageLoadImage (
EFI_STATUS
EFIAPI
PeiLoadImageLoadImageWrapper (
IN EFI_PEI_LOAD_FILE_PPI *This,
IN CONST EFI_PEI_LOAD_FILE_PPI *This,
IN EFI_PEI_FILE_HANDLE FileHandle,
OUT EFI_PHYSICAL_ADDRESS *ImageAddressArg OPTIONAL,
OUT UINT64 *ImageSizeArg OPTIONAL,
Expand All @@ -595,7 +629,7 @@ PeiLoadImageLoadImageWrapper (
)
{
return PeiLoadImageLoadImage (
(EFI_PEI_SERVICES **)This,
(CONST EFI_PEI_SERVICES **)This,
FileHandle,
ImageAddressArg,
ImageSizeArg,
Expand Down
2 changes: 1 addition & 1 deletion MdeModulePkg/Core/Pei/PeiMain.h
Original file line number Diff line number Diff line change
Expand Up @@ -1466,7 +1466,7 @@ PeiGetPe32Data (
EFI_STATUS
EFIAPI
PeiLoadImageLoadImageWrapper (
IN EFI_PEI_LOAD_FILE_PPI *This,
IN CONST EFI_PEI_LOAD_FILE_PPI *This,
IN EFI_PEI_FILE_HANDLE FileHandle,
OUT EFI_PHYSICAL_ADDRESS *ImageAddressArg OPTIONAL,
OUT UINT64 *ImageSizeArg OPTIONAL,
Expand Down
39 changes: 39 additions & 0 deletions MdePkg/Include/Library/UefiImageLib.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,45 @@ typedef enum {
#define UEFI_IMAGE_SOURCE_ALL 2U
#define UEFI_IMAGE_SOURCE_MAX 3U

typedef struct {
UINT32 ImageBuffer;
UINT32 AddressOfEntryPoint;
UINT8 ImageType;
UINT32 FileBuffer;
UINT32 ExeHdrOffset;
UINT32 SizeOfImage;
UINT32 FileSize;
UINT16 Subsystem;
UINT32 SectionAlignment;
UINT32 SectionsOffset;
UINT16 NumberOfSections;
UINT32 SizeOfHeaders;
} PE_HOB_IMAGE_CONTEXT;

typedef struct {
UINT32 ImageBuffer;
UINT32 FileBuffer;
UINT32 EntryPointAddress;
UINT32 LoadTablesFileOffset;
UINT8 NumLoadTables;
UINT32 LoadTables;
UINT32 Segments;
UINT8 LastSegmentIndex;
UINT32 SegmentAlignment;
UINT32 ImageSize;
UINT8 Subsystem;
UINT8 SegmentImageInfoIterSize;
UINT32 SegmentsFileOffset;
} UE_HOB_IMAGE_CONTEXT;

typedef struct {
UINT8 FormatIndex;
union {
UE_HOB_IMAGE_CONTEXT Ue;
PE_HOB_IMAGE_CONTEXT Pe;
} Ctx;
} HOB_IMAGE_CONTEXT;

typedef UINT8 UEFI_IMAGE_SOURCE;

typedef struct {
Expand Down
2 changes: 1 addition & 1 deletion MdePkg/Include/Ppi/LoadFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ typedef struct _EFI_PEI_LOAD_FILE_PPI EFI_PEI_LOAD_FILE_PPI;
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_LOAD_FILE)(
IN EFI_PEI_LOAD_FILE_PPI *This,
IN CONST EFI_PEI_LOAD_FILE_PPI *This,
IN EFI_PEI_FILE_HANDLE FileHandle,
OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
OUT UINT64 *ImageSize,
Expand Down

0 comments on commit 4401a04

Please sign in to comment.