diff options
author | Simon Glass <sjg@chromium.org> | 2017-01-16 14:03:51 (GMT) |
---|---|---|
committer | Bin Meng <bmeng.cn@gmail.com> | 2017-02-06 03:38:46 (GMT) |
commit | fb92308b983d54f6275ae0ced0e6930dfcc5bdec (patch) | |
tree | 36fc2ee04566c78fe4c36b04d0632f560b63ecc3 | |
parent | 4acff4524783d860d873e131057602e43b8294f9 (diff) | |
download | u-boot-fb92308b983d54f6275ae0ced0e6930dfcc5bdec.tar.xz |
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>
-rw-r--r-- | common/board_r.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/common/board_r.c b/common/board_r.c index f739c8a..8077280 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -947,6 +947,16 @@ static init_fnc_t init_sequence_r[] = { 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 int i; #endif |