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 <ard.biesheuvel@linaro.org> Reviewed-by: Liming Gao <liming.gao@intel.com> Reviewed-by: Yingke Liu <yingke.d.liu@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17942 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
committed by
abiesheuvel
parent
5e0cdec196
commit
2c69d6ffee
@ -56,14 +56,6 @@ PeCoffLoaderRelocateIa32Image (
|
|||||||
IN UINT64 Adjust
|
IN UINT64 Adjust
|
||||||
);
|
);
|
||||||
|
|
||||||
RETURN_STATUS
|
|
||||||
PeCoffLoaderRelocateX64Image (
|
|
||||||
IN UINT16 *Reloc,
|
|
||||||
IN OUT CHAR8 *Fixup,
|
|
||||||
IN OUT CHAR8 **FixupData,
|
|
||||||
IN UINT64 Adjust
|
|
||||||
);
|
|
||||||
|
|
||||||
RETURN_STATUS
|
RETURN_STATUS
|
||||||
PeCoffLoaderRelocateIpfImage (
|
PeCoffLoaderRelocateIpfImage (
|
||||||
IN UINT16 *Reloc,
|
IN UINT16 *Reloc,
|
||||||
@ -80,14 +72,6 @@ PeCoffLoaderRelocateArmImage (
|
|||||||
IN UINT64 Adjust
|
IN UINT64 Adjust
|
||||||
);
|
);
|
||||||
|
|
||||||
RETURN_STATUS
|
|
||||||
PeCoffLoaderRelocateAArch64Image (
|
|
||||||
IN UINT16 *Reloc,
|
|
||||||
IN OUT CHAR8 *Fixup,
|
|
||||||
IN OUT CHAR8 **FixupData,
|
|
||||||
IN UINT64 Adjust
|
|
||||||
);
|
|
||||||
|
|
||||||
STATIC
|
STATIC
|
||||||
RETURN_STATUS
|
RETURN_STATUS
|
||||||
PeCoffLoaderGetPeHeader (
|
PeCoffLoaderGetPeHeader (
|
||||||
@ -619,6 +603,7 @@ Returns:
|
|||||||
CHAR8 *FixupBase;
|
CHAR8 *FixupBase;
|
||||||
UINT16 *F16;
|
UINT16 *F16;
|
||||||
UINT32 *F32;
|
UINT32 *F32;
|
||||||
|
UINT64 *F64;
|
||||||
CHAR8 *FixupData;
|
CHAR8 *FixupData;
|
||||||
PHYSICAL_ADDRESS BaseAddress;
|
PHYSICAL_ADDRESS BaseAddress;
|
||||||
UINT16 MachineType;
|
UINT16 MachineType;
|
||||||
@ -778,6 +763,16 @@ Returns:
|
|||||||
}
|
}
|
||||||
break;
|
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:
|
case EFI_IMAGE_REL_BASED_HIGHADJ:
|
||||||
//
|
//
|
||||||
// Return the same EFI_UNSUPPORTED return code as
|
// Return the same EFI_UNSUPPORTED return code as
|
||||||
@ -795,15 +790,9 @@ Returns:
|
|||||||
case EFI_IMAGE_MACHINE_ARMT:
|
case EFI_IMAGE_MACHINE_ARMT:
|
||||||
Status = PeCoffLoaderRelocateArmImage (&Reloc, Fixup, &FixupData, Adjust);
|
Status = PeCoffLoaderRelocateArmImage (&Reloc, Fixup, &FixupData, Adjust);
|
||||||
break;
|
break;
|
||||||
case EFI_IMAGE_MACHINE_X64:
|
|
||||||
Status = PeCoffLoaderRelocateX64Image (Reloc, Fixup, &FixupData, Adjust);
|
|
||||||
break;
|
|
||||||
case EFI_IMAGE_MACHINE_IA64:
|
case EFI_IMAGE_MACHINE_IA64:
|
||||||
Status = PeCoffLoaderRelocateIpfImage (Reloc, Fixup, &FixupData, Adjust);
|
Status = PeCoffLoaderRelocateIpfImage (Reloc, Fixup, &FixupData, Adjust);
|
||||||
break;
|
break;
|
||||||
case EFI_IMAGE_MACHINE_AARCH64:
|
|
||||||
Status = PeCoffLoaderRelocateAArch64Image (Reloc, Fixup, &FixupData, Adjust);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
Status = RETURN_UNSUPPORTED;
|
Status = RETURN_UNSUPPORTED;
|
||||||
break;
|
break;
|
||||||
|
@ -133,16 +133,6 @@ Returns:
|
|||||||
|
|
||||||
switch ((*Reloc) >> 12) {
|
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:
|
case EFI_IMAGE_REL_BASED_IA64_IMM64:
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -270,46 +260,6 @@ Returns:
|
|||||||
return RETURN_SUCCESS;
|
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
|
Pass in a pointer to an ARM MOVT or MOVW immediate instruciton and
|
||||||
return the immediate data encoded in the instruction
|
return the immediate data encoded in the instruction
|
||||||
@ -465,43 +415,3 @@ PeCoffLoaderRelocateArmImage (
|
|||||||
|
|
||||||
return RETURN_SUCCESS;
|
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;
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user