[U-Boot] [PATCH] ARM: fix the misset of global data pointer

Simon Glass sjg at chromium.org
Mon Aug 17 17:08:13 CEST 2015


Hi Masahiro,

On 17 August 2015 at 06:36, Masahiro Yamada
<yamada.masahiro at socionext.com> wrote:
> I found some of my boards would not boot since commit 2afddae07523
> ("Align global_data to a 16-byte boundary").  Probably, many ARM
> boards using Generic Board framework are broken, including ARM64
> ones.  That commit aligned the global data pointer, i.e. inserted
> some spaces between the gd and the bd.
>
> The assembly code in arch/arm/lib/crt0(_64).S must be adjusted
> because the new gd is no longer just below the bd.  Otherwise,
> r9 (x18) holds a wrong pointer to the global data.
>
> This commit uses GD_NEW_GD to directly reference the offset to the
> new_gd.
>
> Signed-off-by: Masahiro Yamada <yamada.masahiro at socionext.com>

This is very unfortunate, sorry. I suggest a straight revert of that
commit for now. My testing shows this will not break x86 at present
since the alignment is precautionary. I can pick up Masahiro's fix and
post a new series after looking at aarch64.

I'll post a revert. Also I'd like to look at moving ARM to use
board_init_f_mem() which I think is a better solution long term.

> ---
>
> Tom,
>
> I guess many ARM boards are broken.
> This issue should be fixed asap.
>
> I confirmed this commit fixes the problem on my boards.
>
> Since I have no ARM64 board, I hope somebody could test it
> for ARM64.
>
>
>  arch/arm/lib/crt0.S    | 3 +--
>  arch/arm/lib/crt0_64.S | 3 +--
>  lib/asm-offsets.c      | 2 ++
>  3 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/lib/crt0.S b/arch/arm/lib/crt0.S
> index afd4f10..c7bdfbf 100644
> --- a/arch/arm/lib/crt0.S
> +++ b/arch/arm/lib/crt0.S
> @@ -119,8 +119,7 @@ clr_gd:
>  #else
>         bic     sp, sp, #7      /* 8-byte alignment for ABI compliance */
>  #endif
> -       ldr     r9, [r9, #GD_BD]                /* r9 = gd->bd */
> -       sub     r9, r9, #GD_SIZE                /* new GD is below bd */
> +       ldr     r9, [r9, #GD_NEW_GD]            /* r9 = gd->new_gd */
>
>         adr     lr, here
>         ldr     r0, [r9, #GD_RELOC_OFF]         /* r0 = gd->reloc_off */
> diff --git a/arch/arm/lib/crt0_64.S b/arch/arm/lib/crt0_64.S
> index 98a906e..13960d0 100644
> --- a/arch/arm/lib/crt0_64.S
> +++ b/arch/arm/lib/crt0_64.S
> @@ -90,8 +90,7 @@ zero_gd:
>   */
>         ldr     x0, [x18, #GD_START_ADDR_SP]    /* x0 <- gd->start_addr_sp */
>         bic     sp, x0, #0xf    /* 16-byte alignment for ABI compliance */
> -       ldr     x18, [x18, #GD_BD]              /* x18 <- gd->bd */
> -       sub     x18, x18, #GD_SIZE              /* new GD is below bd */
> +       ldr     x18, [x18, #GD_NEW_GD]          /* x18 <- gd->new_gd */
>
>         adr     lr, relocation_return
>         ldr     x9, [x18, #GD_RELOC_OFF]        /* x9 <- gd->reloc_off */
> diff --git a/lib/asm-offsets.c b/lib/asm-offsets.c
> index 221ebbf..88afedf 100644
> --- a/lib/asm-offsets.c
> +++ b/lib/asm-offsets.c
> @@ -36,6 +36,8 @@ int main(void)
>
>         DEFINE(GD_RELOC_OFF, offsetof(struct global_data, reloc_off));
>
> +       DEFINE(GD_NEW_GD, offsetof(struct global_data, new_gd));
> +
>         DEFINE(GD_START_ADDR_SP, offsetof(struct global_data, start_addr_sp));
>
>         return 0;
> --
> 1.9.1
>

Regards,
Simon


More information about the U-Boot mailing list