arm: move gd handling outside of C code
As of gcc 5.2.1 for Thumb-1, it is not possible any more to assign gd from C code, as gd is mapped to r9, and r9 may now be saved in the prolog sequence, and restored in the epilog sequence, of any C functions. Therefore arch_setup_gd(), which is supposed to set r9, may actually have no effect, causing U-Boot to use a bad address to access GD. Fix this by never calling arch_setup_gd() for ARM, and instead setting r9 in arch/arm/lib/crt0.S, to the value returned by board_init_f_alloc_reserve(). Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -21,13 +21,13 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||
#define _USE_MEMCPY
|
||||
#endif
|
||||
|
||||
/* Unfortunately x86 can't compile this code as gd cannot be assigned */
|
||||
#ifndef CONFIG_X86
|
||||
/* Unfortunately x86 or ARM can't compile this code as gd cannot be assigned */
|
||||
#if !defined(CONFIG_X86) && !defined(CONFIG_ARM)
|
||||
__weak void arch_setup_gd(struct global_data *gd_ptr)
|
||||
{
|
||||
gd = gd_ptr;
|
||||
}
|
||||
#endif /* !CONFIG_X86 */
|
||||
#endif /* !CONFIG_X86 && !CONFIG_ARM */
|
||||
|
||||
/*
|
||||
* Allocate reserved space for use as 'globals' from 'top' address and
|
||||
@@ -128,7 +128,7 @@ void board_init_f_init_reserve(ulong base)
|
||||
*ptr++ = 0;
|
||||
#endif
|
||||
/* set GD unless architecture did it already */
|
||||
#ifndef CONFIG_X86
|
||||
#if !defined(CONFIG_X86) && !defined(CONFIG_ARM)
|
||||
arch_setup_gd(gd_ptr);
|
||||
#endif
|
||||
/* next alloc will be higher by one GD plus 16-byte alignment */
|
||||
|
||||
Reference in New Issue
Block a user