diff mbox

[U-Boot,v2,28/63] x86: Refactor relocation to prepare for 64-bit

Message ID 1479587152-25065-29-git-send-email-sjg@chromium.org
State Superseded
Delegated to: Bin Meng
Headers show

Commit Message

Simon Glass Nov. 19, 2016, 8:25 p.m. UTC
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(-)

Comments

Bin Meng Dec. 28, 2016, 10:29 a.m. UTC | #1
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
diff mbox

Patch

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.
+ */
+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);
+		while (1);
+		panic("No relocation data");
+	}
+
+#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;
 }