From 2c69d6ffee7a9a17262b58dd454e7e9476302cb8 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Tue, 14 Jul 2015 08:15:28 +0000 Subject: BaseTools/PeCoffLib: handle EFI_IMAGE_REL_BASED_DIR64 in generic code Relocations of type EFI_IMAGE_REL_BASED_DIR64 are handled in exactly the same way on all 64-bit machine types (IPF, X64 and AARCH64). So move the handling of this type to the generic part of the relocation routine PeCoffLoaderRelocateImage (). Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel Reviewed-by: Liming Gao Reviewed-by: Yingke Liu git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17942 6f19259b-4bc3-4df7-8a09-765794883524 --- BaseTools/Source/C/Common/BasePeCoff.c | 33 ++++------- BaseTools/Source/C/Common/PeCoffLoaderEx.c | 90 ------------------------------ 2 files changed, 11 insertions(+), 112 deletions(-) (limited to 'BaseTools/Source/C') diff --git a/BaseTools/Source/C/Common/BasePeCoff.c b/BaseTools/Source/C/Common/BasePeCoff.c index afb45df40b..9652557d13 100644 --- a/BaseTools/Source/C/Common/BasePeCoff.c +++ b/BaseTools/Source/C/Common/BasePeCoff.c @@ -56,14 +56,6 @@ PeCoffLoaderRelocateIa32Image ( IN UINT64 Adjust ); -RETURN_STATUS -PeCoffLoaderRelocateX64Image ( - IN UINT16 *Reloc, - IN OUT CHAR8 *Fixup, - IN OUT CHAR8 **FixupData, - IN UINT64 Adjust - ); - RETURN_STATUS PeCoffLoaderRelocateIpfImage ( IN UINT16 *Reloc, @@ -80,14 +72,6 @@ PeCoffLoaderRelocateArmImage ( IN UINT64 Adjust ); -RETURN_STATUS -PeCoffLoaderRelocateAArch64Image ( - IN UINT16 *Reloc, - IN OUT CHAR8 *Fixup, - IN OUT CHAR8 **FixupData, - IN UINT64 Adjust - ); - STATIC RETURN_STATUS PeCoffLoaderGetPeHeader ( @@ -619,6 +603,7 @@ Returns: CHAR8 *FixupBase; UINT16 *F16; UINT32 *F32; + UINT64 *F64; CHAR8 *FixupData; PHYSICAL_ADDRESS BaseAddress; UINT16 MachineType; @@ -778,6 +763,16 @@ Returns: } break; + case EFI_IMAGE_REL_BASED_DIR64: + F64 = (UINT64 *) Fixup; + *F64 = *F64 + (UINT64) Adjust; + if (FixupData != NULL) { + FixupData = ALIGN_POINTER (FixupData, sizeof (UINT64)); + *(UINT64 *) FixupData = *F64; + FixupData = FixupData + sizeof (UINT64); + } + break; + case EFI_IMAGE_REL_BASED_HIGHADJ: // // Return the same EFI_UNSUPPORTED return code as @@ -795,15 +790,9 @@ Returns: case EFI_IMAGE_MACHINE_ARMT: Status = PeCoffLoaderRelocateArmImage (&Reloc, Fixup, &FixupData, Adjust); break; - case EFI_IMAGE_MACHINE_X64: - Status = PeCoffLoaderRelocateX64Image (Reloc, Fixup, &FixupData, Adjust); - break; case EFI_IMAGE_MACHINE_IA64: Status = PeCoffLoaderRelocateIpfImage (Reloc, Fixup, &FixupData, Adjust); break; - case EFI_IMAGE_MACHINE_AARCH64: - Status = PeCoffLoaderRelocateAArch64Image (Reloc, Fixup, &FixupData, Adjust); - break; default: Status = RETURN_UNSUPPORTED; break; diff --git a/BaseTools/Source/C/Common/PeCoffLoaderEx.c b/BaseTools/Source/C/Common/PeCoffLoaderEx.c index b7b7227f57..382138a893 100644 --- a/BaseTools/Source/C/Common/PeCoffLoaderEx.c +++ b/BaseTools/Source/C/Common/PeCoffLoaderEx.c @@ -133,16 +133,6 @@ Returns: switch ((*Reloc) >> 12) { - case EFI_IMAGE_REL_BASED_DIR64: - F64 = (UINT64 *) Fixup; - *F64 = *F64 + (UINT64) Adjust; - if (*FixupData != NULL) { - *FixupData = ALIGN_POINTER(*FixupData, sizeof(UINT64)); - *(UINT64 *)(*FixupData) = *F64; - *FixupData = *FixupData + sizeof(UINT64); - } - break; - case EFI_IMAGE_REL_BASED_IA64_IMM64: // @@ -270,46 +260,6 @@ Returns: return RETURN_SUCCESS; } -RETURN_STATUS -PeCoffLoaderRelocateX64Image ( - IN UINT16 *Reloc, - IN OUT CHAR8 *Fixup, - IN OUT CHAR8 **FixupData, - IN UINT64 Adjust - ) -/** - Performs an x64 specific relocation fixup - - @param Reloc Pointer to the relocation record - @param Fixup Pointer to the address to fix up - @param FixupData Pointer to a buffer to log the fixups - @param Adjust The offset to adjust the fixup - - @retval RETURN_SUCCESS Success to perform relocation - @retval RETURN_UNSUPPORTED Unsupported. -**/ -{ - UINT64 *F64; - - switch ((*Reloc) >> 12) { - - case EFI_IMAGE_REL_BASED_DIR64: - F64 = (UINT64 *) Fixup; - *F64 = *F64 + (UINT64) Adjust; - if (*FixupData != NULL) { - *FixupData = ALIGN_POINTER(*FixupData, sizeof(UINT64)); - *(UINT64 *)(*FixupData) = *F64; - *FixupData = *FixupData + sizeof(UINT64); - } - break; - - default: - return RETURN_UNSUPPORTED; - } - - return RETURN_SUCCESS; -} - /** Pass in a pointer to an ARM MOVT or MOVW immediate instruciton and return the immediate data encoded in the instruction @@ -465,43 +415,3 @@ PeCoffLoaderRelocateArmImage ( return RETURN_SUCCESS; } - -RETURN_STATUS -PeCoffLoaderRelocateAArch64Image ( - IN UINT16 *Reloc, - IN OUT CHAR8 *Fixup, - IN OUT CHAR8 **FixupData, - IN UINT64 Adjust - ) -/** - Performs an AArch64 specific relocation fixup - - @param Reloc Pointer to the relocation record - @param Fixup Pointer to the address to fix up - @param FixupData Pointer to a buffer to log the fixups - @param Adjust The offset to adjust the fixup - - @retval RETURN_SUCCESS Success to perform relocation - @retval RETURN_UNSUPPORTED Unsupported. -**/ -{ - UINT64 *F64; - - switch ((*Reloc) >> 12) { - - case EFI_IMAGE_REL_BASED_DIR64: - F64 = (UINT64 *) Fixup; - *F64 = *F64 + (UINT64) Adjust; - if (*FixupData != NULL) { - *FixupData = ALIGN_POINTER(*FixupData, sizeof(UINT64)); - *(UINT64 *)(*FixupData) = *F64; - *FixupData = *FixupData + sizeof(UINT64); - } - break; - - default: - return RETURN_UNSUPPORTED; - } - - return RETURN_SUCCESS; -} -- cgit v1.2.3