board_r - fixup functions table after relocation
This is only required for "PIC" relocation and doesn't apply to modern "PIE" relocation which does data relocation as well as code. "init_sequence_r" is just an array that consists of compile-time adresses of init functions. Since this is basically an array of integers (pointers to "void" to be more precise) it won't be modified during relocation - it will be just copied to new location as it is. As a consequence on execution after relocation "initcall_run_list" will be jumping to pre-relocation addresses. As long as we don't overwrite pre-relocation memory area init calls are executed correctly. But still it is dangerous because after relocation we don't expect initially used memory to stay untouched. Cc: Tom Rini <trini@ti.com> Cc: Masahiro Yamada <yamada.m@jp.panasonic.com> Cc: Doug Anderson <dianders@chromium.org> Cc: Thomas Langer <thomas.langer@lantiq.com> Cc: Albert ARIBAUD <albert.u.boot@aribaud.net> Acked-by: Simon Glass <sjg@chromium.org> Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
This commit is contained in:
parent
2b36fe579c
commit
7395398ad2
@ -903,9 +903,19 @@ init_fnc_t init_sequence_r[] = {
|
||||
|
||||
void board_init_r(gd_t *new_gd, ulong dest_addr)
|
||||
{
|
||||
#ifdef CONFIG_NEEDS_MANUAL_RELOC
|
||||
int i;
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_X86
|
||||
gd = new_gd;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NEEDS_MANUAL_RELOC
|
||||
for (i = 0; i < ARRAY_SIZE(init_sequence_r); i++)
|
||||
init_sequence_r[i] += gd->reloc_off;
|
||||
#endif
|
||||
|
||||
if (initcall_run_list(init_sequence_r))
|
||||
hang();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user