#include "BasePeCoffLibInternals.h"\r
#include <Library/BaseLib.h>\r
\r
-\r
/**\r
Pass in a pointer to an ARM MOVT or MOVW immediate instruciton and\r
return the immediate data encoded in the instruction.\r
**/\r
UINT16\r
ThumbMovtImmediateAddress (\r
- IN UINT16 *Instruction\r
+ IN UINT16 *Instruction\r
)\r
{\r
UINT32 Movt;\r
return Address;\r
}\r
\r
-\r
/**\r
Update an ARM MOVT or MOVW immediate instruction immediate data.\r
\r
**/\r
VOID\r
ThumbMovtImmediatePatch (\r
- IN OUT UINT16 *Instruction,\r
- IN UINT16 Address\r
+ IN OUT UINT16 *Instruction,\r
+ IN UINT16 Address\r
)\r
{\r
UINT16 Patch;\r
\r
// First 16-bit chunk of instruciton\r
- Patch = ((Address >> 12) & 0x000f); // imm4\r
+ Patch = ((Address >> 12) & 0x000f); // imm4\r
Patch |= (((Address & BIT11) != 0) ? BIT10 : 0); // i\r
// Mask out instruction bits and or in address\r
*(Instruction) = (*Instruction & ~0x040f) | Patch;\r
*Instruction = (*Instruction & ~0x70ff) | Patch;\r
}\r
\r
-\r
-\r
/**\r
Pass in a pointer to an ARM MOVW/MOVT instruciton pair and\r
return the immediate data encoded in the two` instruction.\r
**/\r
UINT32\r
ThumbMovwMovtImmediateAddress (\r
- IN UINT16 *Instructions\r
+ IN UINT16 *Instructions\r
)\r
{\r
UINT16 *Word;\r
return (ThumbMovtImmediateAddress (Top) << 16) + ThumbMovtImmediateAddress (Word);\r
}\r
\r
-\r
/**\r
Update an ARM MOVW/MOVT immediate instruction instruction pair.\r
\r
**/\r
VOID\r
ThumbMovwMovtImmediatePatch (\r
- IN OUT UINT16 *Instructions,\r
- IN UINT32 Address\r
+ IN OUT UINT16 *Instructions,\r
+ IN UINT32 Address\r
)\r
{\r
UINT16 *Word;\r
ThumbMovtImmediatePatch (Top, (UINT16)(Address >> 16));\r
}\r
\r
-\r
-\r
/**\r
Performs an ARM-based specific relocation fixup and is a no-op on other\r
instruction sets.\r
**/\r
RETURN_STATUS\r
PeCoffLoaderRelocateImageEx (\r
- IN UINT16 *Reloc,\r
- IN OUT CHAR8 *Fixup,\r
- IN OUT CHAR8 **FixupData,\r
- IN UINT64 Adjust\r
+ IN UINT16 *Reloc,\r
+ IN OUT CHAR8 *Fixup,\r
+ IN OUT CHAR8 **FixupData,\r
+ IN UINT64 Adjust\r
)\r
{\r
- UINT16 *Fixup16;\r
- UINT32 FixupVal;\r
+ UINT16 *Fixup16;\r
+ UINT32 FixupVal;\r
\r
- Fixup16 = (UINT16 *) Fixup;\r
+ Fixup16 = (UINT16 *)Fixup;\r
\r
switch ((*Reloc) >> 12) {\r
+ case EFI_IMAGE_REL_BASED_ARM_MOV32T:\r
+ FixupVal = ThumbMovwMovtImmediateAddress (Fixup16) + (UINT32)Adjust;\r
+ ThumbMovwMovtImmediatePatch (Fixup16, FixupVal);\r
+\r
+ if (*FixupData != NULL) {\r
+ *FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT64));\r
+ // Fixup16 is not aligned so we must copy it. Thumb instructions are streams of 16 bytes.\r
+ CopyMem (*FixupData, Fixup16, sizeof (UINT64));\r
+ *FixupData = *FixupData + sizeof (UINT64);\r
+ }\r
\r
- case EFI_IMAGE_REL_BASED_ARM_MOV32T:\r
- FixupVal = ThumbMovwMovtImmediateAddress (Fixup16) + (UINT32)Adjust;\r
- ThumbMovwMovtImmediatePatch (Fixup16, FixupVal);\r
-\r
- if (*FixupData != NULL) {\r
- *FixupData = ALIGN_POINTER(*FixupData, sizeof(UINT64));\r
- // Fixup16 is not aligned so we must copy it. Thumb instructions are streams of 16 bytes.\r
- CopyMem (*FixupData, Fixup16, sizeof (UINT64));\r
- *FixupData = *FixupData + sizeof(UINT64);\r
- }\r
- break;\r
-\r
- case EFI_IMAGE_REL_BASED_ARM_MOV32A:\r
- ASSERT (FALSE);\r
- // break omitted - ARM instruction encoding not implemented\r
- default:\r
- return RETURN_UNSUPPORTED;\r
+ break;\r
+\r
+ case EFI_IMAGE_REL_BASED_ARM_MOV32A:\r
+ ASSERT (FALSE);\r
+ // break omitted - ARM instruction encoding not implemented\r
+ default:\r
+ return RETURN_UNSUPPORTED;\r
}\r
\r
return RETURN_SUCCESS;\r
**/\r
RETURN_STATUS\r
PeHotRelocateImageEx (\r
- IN UINT16 *Reloc,\r
- IN OUT CHAR8 *Fixup,\r
- IN OUT CHAR8 **FixupData,\r
- IN UINT64 Adjust\r
+ IN UINT16 *Reloc,\r
+ IN OUT CHAR8 *Fixup,\r
+ IN OUT CHAR8 **FixupData,\r
+ IN UINT64 Adjust\r
)\r
{\r
UINT16 *Fixup16;\r
Fixup16 = (UINT16 *)Fixup;\r
\r
switch ((*Reloc) >> 12) {\r
-\r
- case EFI_IMAGE_REL_BASED_ARM_MOV32T:\r
- *FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT64));\r
- if (*(UINT64 *) (*FixupData) == ReadUnaligned64 ((UINT64 *)Fixup16)) {\r
- FixupVal = ThumbMovwMovtImmediateAddress (Fixup16) + (UINT32)Adjust;\r
- ThumbMovwMovtImmediatePatch (Fixup16, FixupVal);\r
- }\r
- *FixupData = *FixupData + sizeof(UINT64);\r
- break;\r
-\r
- case EFI_IMAGE_REL_BASED_ARM_MOV32A:\r
- ASSERT (FALSE);\r
+ case EFI_IMAGE_REL_BASED_ARM_MOV32T:\r
+ *FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT64));\r
+ if (*(UINT64 *)(*FixupData) == ReadUnaligned64 ((UINT64 *)Fixup16)) {\r
+ FixupVal = ThumbMovwMovtImmediateAddress (Fixup16) + (UINT32)Adjust;\r
+ ThumbMovwMovtImmediatePatch (Fixup16, FixupVal);\r
+ }\r
+\r
+ *FixupData = *FixupData + sizeof (UINT64);\r
+ break;\r
+\r
+ case EFI_IMAGE_REL_BASED_ARM_MOV32A:\r
+ ASSERT (FALSE);\r
// break omitted - ARM instruction encoding not implemented\r
- default:\r
- DEBUG ((DEBUG_ERROR, "PeHotRelocateEx:unknown fixed type\n"));\r
- return RETURN_UNSUPPORTED;\r
+ default:\r
+ DEBUG ((DEBUG_ERROR, "PeHotRelocateEx:unknown fixed type\n"));\r
+ return RETURN_UNSUPPORTED;\r
}\r
\r
return RETURN_SUCCESS;\r