
Hi Simon,
On Sun, Nov 20, 2016 at 4:25 AM, Simon Glass sjg@chromium.org wrote:
Move the core relocation code into a separate function so that the checking code can be used for 64-bit relocation also.
Signed-off-by: Simon Glass sjg@chromium.org
Changes in v2: None
arch/x86/lib/relocate.c | 57 ++++++++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 24 deletions(-)
diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c index 0d683bf..21cd1db 100644 --- a/arch/x86/lib/relocate.c +++ b/arch/x86/lib/relocate.c @@ -47,38 +47,18 @@ int clear_bss(void) return 0; }
-/*
- This function has more error checking than you might expect. Please see
- the commit message for more informaiton.
- */
-int do_elf_reloc_fixups(void) +static void do_elf_reloc_fixups32(unsigned int text_base, uintptr_t size,
Elf32_Rel *re_src, Elf32_Rel *re_end)
{
Elf32_Rel *re_src = (Elf32_Rel *)(&__rel_dyn_start);
Elf32_Rel *re_end = (Elf32_Rel *)(&__rel_dyn_end);
Elf32_Addr *offset_ptr_rom, *last_offset = NULL; Elf32_Addr *offset_ptr_ram;
unsigned int text_base = 0;
/* The size of the region of u-boot that runs out of RAM. */
uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
if (gd->flags & GD_FLG_SKIP_RELOC)
return 0;
if (re_src == re_end)
panic("No relocation data");
-#ifdef CONFIG_SYS_TEXT_BASE
text_base = CONFIG_SYS_TEXT_BASE;
-#else
panic("No CONFIG_SYS_TEXT_BASE");
-#endif do { /* Get the location from the relocation entry */
offset_ptr_rom = (Elf32_Addr *)re_src->r_offset;
offset_ptr_rom = (Elf32_Addr *)(uintptr_t)re_src->r_offset; /* Check that the location of the relocation is in .text */
if (offset_ptr_rom >= (Elf32_Addr *)text_base &&
if (offset_ptr_rom >= (Elf32_Addr *)(uintptr_t)text_base && offset_ptr_rom > last_offset) { /* Switch to the in-RAM version */
@@ -103,6 +83,35 @@ int do_elf_reloc_fixups(void) last_offset = offset_ptr_rom;
} while (++re_src < re_end);
+}
+/*
- This function has more error checking than you might expect. Please see
- the commit message for more informaiton.
nits: I suspect we should add the commit id here since you refactored the code in this commit, so guess it's not easy for people to track previous commit id..
- */
+int do_elf_reloc_fixups(void) +{
void *re_src = (void *)(&__rel_dyn_start);
void *re_end = (void *)(&__rel_dyn_end);
uint text_base;
/* The size of the region of u-boot that runs out of RAM. */
uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
if (gd->flags & GD_FLG_SKIP_RELOC)
return 0;
if (re_src == re_end) {
printf("No relocation data %p %p", re_src, re_end);
can we use: panic() instead of printf() here?
while (1);
panic("No relocation data");
The above 2 lines are not needed
}
+#ifdef CONFIG_SYS_TEXT_BASE
text_base = CONFIG_SYS_TEXT_BASE;
+#else
panic("No CONFIG_SYS_TEXT_BASE");
+#endif
do_elf_reloc_fixups32(text_base, size, re_src, re_end); return 0;
}
Regards, Bin