Skip to content

Commit

Permalink
board_r - fixup functions table after relocation
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Masahiro Yamada <[email protected]>
Cc: Doug Anderson <[email protected]>
Cc: Thomas Langer <[email protected]>
Cc: Albert ARIBAUD <[email protected]>
Acked-by: Simon Glass <[email protected]>
Signed-off-by: Alexey Brodkin <[email protected]>
  • Loading branch information
abrodkin authored and trini committed Jan 27, 2014
1 parent 2b36fe5 commit 7395398
Showing 1 changed file with 10 additions and 0 deletions.
10 changes: 10 additions & 0 deletions common/board_r.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down

0 comments on commit 7395398

Please sign in to comment.