x86: board_r: Set the global data pointer after relocation
Since 'gd' is just a normal variable on 64-bit x86, it is relocated by the time we get to board_init_r(). The old 'gd' variable is passed in as parameter to board_init_r(), presumably for this situation. Assign it on 64-bit x86 so that gd points to the correct data. Options to improve this: - Make gd a fixed register and remove the board_init_r() parameter - Make all archs use this board_init_r() parameter The second has a TODO in the code. The first has a TODO in a future commit ('x86: Support global_data on x86_64') Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
4acff45247
commit
fb92308b98
|
@ -947,6 +947,16 @@ static init_fnc_t init_sequence_r[] = {
|
||||||
|
|
||||||
void board_init_r(gd_t *new_gd, ulong dest_addr)
|
void board_init_r(gd_t *new_gd, ulong dest_addr)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Set up the new global data pointer. So far only x86 does this
|
||||||
|
* here.
|
||||||
|
* TODO(sjg@chromium.org): Consider doing this for all archs, or
|
||||||
|
* dropping the new_gd parameter.
|
||||||
|
*/
|
||||||
|
#if CONFIG_IS_ENABLED(X86_64)
|
||||||
|
arch_setup_gd(new_gd);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_NEEDS_MANUAL_RELOC
|
#ifdef CONFIG_NEEDS_MANUAL_RELOC
|
||||||
int i;
|
int i;
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue