@@ -26,14 +26,14 @@
#include <grub/arm/reloc.h>
static inline grub_uint32_t
-thumb_get_instruction_word(grub_uint16_t *target)
+thumb_get_instruction_word (grub_uint16_t *target)
{
/* Extract instruction word in alignment-safe manner */
return grub_le_to_cpu16 ((*target)) << 16 | grub_le_to_cpu16 (*(target + 1));
}
static inline void
-thumb_set_instruction_word(grub_uint16_t *target, grub_uint32_t insword)
+thumb_set_instruction_word (grub_uint16_t *target, grub_uint32_t insword)
{
*target = grub_cpu_to_le16 (insword >> 16);
*(target + 1) = grub_cpu_to_le16 (insword & 0xffff);
@@ -70,9 +70,7 @@ grub_arm_thm_call_get_offset (grub_uint16_t *target)
grub_uint32_t insword;
grub_int32_t offset;
- /* Extract instruction word in alignment-safe manner */
- insword = (grub_le_to_cpu16 (*target) << 16)
- | (grub_le_to_cpu16(*(target + 1)));
+ insword = thumb_get_instruction_word (target);
/* Extract bitfields from instruction words */
sign = (insword >> 26) & 1;
@@ -97,9 +95,7 @@ grub_arm_thm_call_set_offset (grub_uint16_t *target, grub_int32_t offset)
grub_uint32_t insword;
int is_blx;
- /* Extract instruction word in alignment-safe manner */
- insword = (grub_le_to_cpu16 (*target) << 16)
- | (grub_le_to_cpu16(*(target + 1)));
+ insword = thumb_get_instruction_word (target);
if (((insword >> 12) & 0xd) == 0xc)
is_blx = 1;
@@ -122,9 +118,7 @@ grub_arm_thm_call_set_offset (grub_uint16_t *target, grub_int32_t offset)
(((offset >> 12) & 0x03ff) << 16) |
(j1 << 13) | (j2 << 11) | ((offset >> 1) & 0x07ff);
- /* Write instruction word back in alignment-safe manner */
- *target = grub_cpu_to_le16 ((insword >> 16) & 0xffff);
- *(target + 1) = grub_cpu_to_le16 (insword & 0xffff);
+ thumb_set_instruction_word (target, insword);
grub_dprintf ("dl", " *insword = 0x%08x", insword);
@@ -137,9 +131,7 @@ grub_arm_thm_jump19_get_offset (grub_uint16_t *target)
grub_int32_t offset;
grub_uint32_t insword;
- /* Extract instruction word in alignment-safe manner */
- insword = (grub_le_to_cpu16 (*target) << 16)
- | (grub_le_to_cpu16(*(target + 1)));
+ insword = thumb_get_instruction_word (target);
/* Extract and sign extend offset */
offset = ((insword >> 26) & 1) << 19
@@ -163,9 +155,7 @@ grub_arm_thm_jump19_set_offset (grub_uint16_t *target, grub_int32_t offset)
offset >>= 1;
offset &= 0xfffff;
- /* Extract instruction word in alignment-safe manner */
- insword = grub_le_to_cpu16 ((*target)) << 16
- | grub_le_to_cpu16 (*(target + 1));
+ insword = thumb_get_instruction_word (target);
/* Reassemble instruction word and write back */
insword &= insmask;
@@ -174,8 +164,7 @@ grub_arm_thm_jump19_set_offset (grub_uint16_t *target, grub_int32_t offset)
| ((offset >> 17) & 1) << 13
| ((offset >> 11) & 0x3f) << 16
| (offset & 0x7ff);
- *target = grub_cpu_to_le16 (insword >> 16);
- *(target + 1) = grub_cpu_to_le16 (insword & 0xffff);
+ thumb_set_instruction_word (target, insword);
}
int
@@ -186,6 +175,32 @@ grub_arm_thm_jump19_check_offset (grub_int32_t offset)
return 1;
}
+grub_uint16_t
+grub_arm_thm_movw_movt_get_value (grub_uint16_t *target)
+{
+ grub_uint32_t insword;
+
+ insword = thumb_get_instruction_word (target);
+
+ return ((insword & 0xf0000) >> 4) | ((insword & 0x04000000) >> 15) | \
+ ((insword & 0x7000) >> 4) | (insword & 0xff);
+}
+
+void
+grub_arm_thm_movw_movt_set_value (grub_uint16_t *target, grub_uint16_t value)
+{
+ grub_uint32_t insword;
+ const grub_uint32_t insmask = 0xfbf08f00;
+
+ insword = thumb_get_instruction_word (target);
+ insword &= insmask;
+
+ insword |= ((value & 0xf000) << 4) | ((value & 0x0800) << 15) | \
+ ((value & 0x0700) << 4) | (value & 0xff);
+
+ thumb_set_instruction_word (target, insword);
+}
+
/***********************************************************
* ARM (A32) relocations: *
@@ -228,28 +243,3 @@ grub_arm_jump24_set_offset (grub_uint32_t *target,
*target = grub_cpu_to_le32 (insword);
}
-
-grub_uint16_t
-grub_arm_thm_movw_movt_get_value (grub_uint16_t *target)
-{
- grub_uint32_t insword;
-
- insword = thumb_get_instruction_word (target);
-
- return ((insword & 0xf0000) >> 4) | ((insword & 0x04000000) >> 15) | \
- ((insword & 0x7000) >> 4) | (insword & 0xff);
-}
-
-void
-grub_arm_thm_movw_movt_set_value (grub_uint16_t *target, grub_uint16_t value)
-{
- grub_uint32_t insword;
-
- insword = thumb_get_instruction_word (target);
- insword &= 0xfbf08f00;
-
- insword |= ((value & 0xf000) << 4) | ((value & 0x0800) << 15) | \
- ((value & 0x0700) << 4) | (value & 0xff);
-
- thumb_set_instruction_word (target, insword);
-}
Use the new thumb_get_instruction_word/thumb_set_instruction_word helpers throughout. Style cleanup (missing spaces). Move Thumb MOVW/MOVT handlers into Thumb relocation section of file. Signed-off-by: Leif Lindholm <leif.lindholm@linaro.org> --- grub-core/kern/arm/dl_helper.c | 78 ++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 44 deletions(-)