X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdePkg%2FLibrary%2FBasePeCoffLib%2FArm%2FPeCoffLoaderEx.c;fp=MdePkg%2FLibrary%2FBasePeCoffLib%2FArm%2FPeCoffLoaderEx.c;h=595377bed661676904ca5a87057ce36007983dbc;hp=a851a448d634f6f0330bcda7daae35dd7e7f2add;hb=2f88bd3a1296c522317f1c21377876de63de5be7;hpb=1436aea4d5707e672672a11bda72be2c63c936c3 diff --git a/MdePkg/Library/BasePeCoffLib/Arm/PeCoffLoaderEx.c b/MdePkg/Library/BasePeCoffLib/Arm/PeCoffLoaderEx.c index a851a448d6..595377bed6 100644 --- a/MdePkg/Library/BasePeCoffLib/Arm/PeCoffLoaderEx.c +++ b/MdePkg/Library/BasePeCoffLib/Arm/PeCoffLoaderEx.c @@ -10,7 +10,6 @@ #include "BasePeCoffLibInternals.h" #include - /** Pass in a pointer to an ARM MOVT or MOVW immediate instruciton and return the immediate data encoded in the instruction. @@ -22,7 +21,7 @@ **/ UINT16 ThumbMovtImmediateAddress ( - IN UINT16 *Instruction + IN UINT16 *Instruction ) { UINT32 Movt; @@ -43,7 +42,6 @@ ThumbMovtImmediateAddress ( return Address; } - /** Update an ARM MOVT or MOVW immediate instruction immediate data. @@ -52,14 +50,14 @@ ThumbMovtImmediateAddress ( **/ VOID ThumbMovtImmediatePatch ( - IN OUT UINT16 *Instruction, - IN UINT16 Address + IN OUT UINT16 *Instruction, + IN UINT16 Address ) { UINT16 Patch; // First 16-bit chunk of instruciton - Patch = ((Address >> 12) & 0x000f); // imm4 + Patch = ((Address >> 12) & 0x000f); // imm4 Patch |= (((Address & BIT11) != 0) ? BIT10 : 0); // i // Mask out instruction bits and or in address *(Instruction) = (*Instruction & ~0x040f) | Patch; @@ -72,8 +70,6 @@ ThumbMovtImmediatePatch ( *Instruction = (*Instruction & ~0x70ff) | Patch; } - - /** Pass in a pointer to an ARM MOVW/MOVT instruciton pair and return the immediate data encoded in the two` instruction. @@ -85,7 +81,7 @@ ThumbMovtImmediatePatch ( **/ UINT32 ThumbMovwMovtImmediateAddress ( - IN UINT16 *Instructions + IN UINT16 *Instructions ) { UINT16 *Word; @@ -97,7 +93,6 @@ ThumbMovwMovtImmediateAddress ( return (ThumbMovtImmediateAddress (Top) << 16) + ThumbMovtImmediateAddress (Word); } - /** Update an ARM MOVW/MOVT immediate instruction instruction pair. @@ -106,8 +101,8 @@ ThumbMovwMovtImmediateAddress ( **/ VOID ThumbMovwMovtImmediatePatch ( - IN OUT UINT16 *Instructions, - IN UINT32 Address + IN OUT UINT16 *Instructions, + IN UINT32 Address ) { UINT16 *Word; @@ -120,8 +115,6 @@ ThumbMovwMovtImmediatePatch ( ThumbMovtImmediatePatch (Top, (UINT16)(Address >> 16)); } - - /** Performs an ARM-based specific relocation fixup and is a no-op on other instruction sets. @@ -136,36 +129,36 @@ ThumbMovwMovtImmediatePatch ( **/ RETURN_STATUS PeCoffLoaderRelocateImageEx ( - IN UINT16 *Reloc, - IN OUT CHAR8 *Fixup, - IN OUT CHAR8 **FixupData, - IN UINT64 Adjust + IN UINT16 *Reloc, + IN OUT CHAR8 *Fixup, + IN OUT CHAR8 **FixupData, + IN UINT64 Adjust ) { - UINT16 *Fixup16; - UINT32 FixupVal; + UINT16 *Fixup16; + UINT32 FixupVal; - Fixup16 = (UINT16 *) Fixup; + Fixup16 = (UINT16 *)Fixup; switch ((*Reloc) >> 12) { + case EFI_IMAGE_REL_BASED_ARM_MOV32T: + FixupVal = ThumbMovwMovtImmediateAddress (Fixup16) + (UINT32)Adjust; + ThumbMovwMovtImmediatePatch (Fixup16, FixupVal); + + if (*FixupData != NULL) { + *FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT64)); + // Fixup16 is not aligned so we must copy it. Thumb instructions are streams of 16 bytes. + CopyMem (*FixupData, Fixup16, sizeof (UINT64)); + *FixupData = *FixupData + sizeof (UINT64); + } - case EFI_IMAGE_REL_BASED_ARM_MOV32T: - FixupVal = ThumbMovwMovtImmediateAddress (Fixup16) + (UINT32)Adjust; - ThumbMovwMovtImmediatePatch (Fixup16, FixupVal); - - if (*FixupData != NULL) { - *FixupData = ALIGN_POINTER(*FixupData, sizeof(UINT64)); - // Fixup16 is not aligned so we must copy it. Thumb instructions are streams of 16 bytes. - CopyMem (*FixupData, Fixup16, sizeof (UINT64)); - *FixupData = *FixupData + sizeof(UINT64); - } - break; - - case EFI_IMAGE_REL_BASED_ARM_MOV32A: - ASSERT (FALSE); - // break omitted - ARM instruction encoding not implemented - default: - return RETURN_UNSUPPORTED; + break; + + case EFI_IMAGE_REL_BASED_ARM_MOV32A: + ASSERT (FALSE); + // break omitted - ARM instruction encoding not implemented + default: + return RETURN_UNSUPPORTED; } return RETURN_SUCCESS; @@ -209,10 +202,10 @@ PeCoffLoaderImageFormatSupported ( **/ RETURN_STATUS PeHotRelocateImageEx ( - IN UINT16 *Reloc, - IN OUT CHAR8 *Fixup, - IN OUT CHAR8 **FixupData, - IN UINT64 Adjust + IN UINT16 *Reloc, + IN OUT CHAR8 *Fixup, + IN OUT CHAR8 **FixupData, + IN UINT64 Adjust ) { UINT16 *Fixup16; @@ -221,22 +214,22 @@ PeHotRelocateImageEx ( Fixup16 = (UINT16 *)Fixup; switch ((*Reloc) >> 12) { - - case EFI_IMAGE_REL_BASED_ARM_MOV32T: - *FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT64)); - if (*(UINT64 *) (*FixupData) == ReadUnaligned64 ((UINT64 *)Fixup16)) { - FixupVal = ThumbMovwMovtImmediateAddress (Fixup16) + (UINT32)Adjust; - ThumbMovwMovtImmediatePatch (Fixup16, FixupVal); - } - *FixupData = *FixupData + sizeof(UINT64); - break; - - case EFI_IMAGE_REL_BASED_ARM_MOV32A: - ASSERT (FALSE); + case EFI_IMAGE_REL_BASED_ARM_MOV32T: + *FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT64)); + if (*(UINT64 *)(*FixupData) == ReadUnaligned64 ((UINT64 *)Fixup16)) { + FixupVal = ThumbMovwMovtImmediateAddress (Fixup16) + (UINT32)Adjust; + ThumbMovwMovtImmediatePatch (Fixup16, FixupVal); + } + + *FixupData = *FixupData + sizeof (UINT64); + break; + + case EFI_IMAGE_REL_BASED_ARM_MOV32A: + ASSERT (FALSE); // break omitted - ARM instruction encoding not implemented - default: - DEBUG ((DEBUG_ERROR, "PeHotRelocateEx:unknown fixed type\n")); - return RETURN_UNSUPPORTED; + default: + DEBUG ((DEBUG_ERROR, "PeHotRelocateEx:unknown fixed type\n")); + return RETURN_UNSUPPORTED; } return RETURN_SUCCESS;