Fix board init code to respect the C runtime environment

board_init_f_mem() alters the C runtime environment's
stack it is actually already using. This is not a valid
behaviour within a C runtime environment.

Split board_init_f_mem into C functions which do not alter
their own stack and always behave properly with respect to
their C runtime environment.

Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net>
Acked-by: Thomas Chou <thomas@wytron.com.tw>
This commit is contained in:
Albert ARIBAUD
2015-11-25 17:56:32 +01:00
committed by Tom Rini
parent 20d08f59fa
commit ecc306639e
10 changed files with 146 additions and 51 deletions

View File

@@ -224,32 +224,26 @@ void board_init_f(ulong);
void board_init_r(gd_t *, ulong) __attribute__ ((noreturn));
/**
* board_init_f_mem() - Allocate global data and set stack position
* ulong board_init_f_alloc_reserve - allocate reserved area
*
* This function is called by each architecture very early in the start-up
* code to set up the environment for board_init_f(). It allocates space for
* global_data (see include/asm-generic/global_data.h) and places the stack
* below this.
* code to allow the C runtime to reserve space on the stack for writable
* 'globals' such as GD and the malloc arena.
*
* This function requires a stack[1] Normally this is at @top. The function
* starts allocating space from 64 bytes below @top. First it creates space
* for global_data. Then it calls arch_setup_gd() which sets gd to point to
* the global_data space and can reserve additional bytes of space if
* required). Finally it allocates early malloc() memory
* (CONFIG_SYS_MALLOC_F_LEN). The new top of the stack is just below this,
* and it returned by this function.
*
* [1] Strictly speaking it would be possible to implement this function
* in C on many archs such that it does not require a stack. However this
* does not seem hugely important as only 64 byte are wasted. The 64 bytes
* are used to handle the calling standard which generally requires pushing
* addresses or registers onto the stack. We should be able to get away with
* less if this becomes important.
*
* @top: Top of available memory, also normally the top of the stack
* @return: New stack location
* @top: top of the reserve area, growing down.
* @return: bottom of reserved area
*/
ulong board_init_f_mem(ulong top);
ulong board_init_f_alloc_reserve(ulong top);
/**
* board_init_f_init_reserve - initialize the reserved area(s)
*
* This function is called once the C runtime has allocated the reserved
* area on the stack. It must initialize the GD at the base of that area.
*
* @base: top from which reservation was done
*/
void board_init_f_init_reserve(ulong base);
/**
* arch_setup_gd() - Set up the global_data pointer