
Hi Alexey,
On Wed, 15 Jan 2014 15:19:56 +0400, Alexey Brodkin Alexey.Brodkin@synopsys.com wrote:
"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.
IIRC, in ARM we switched from GOT to ELF relocation precisely so that data would be relocated as well as code, and I think it actually is, otherwise we'd have a lot of complains. Therefore I fail to understand the statements above. Can someone tell me what I'm getting wrong?
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.
Signed-off-by: Alexey Brodkin abrodkin@synopsys.com
Cc: Tom Rini trini@ti.com Cc: Simon Glass sjg@chromium.org Cc: Masahiro Yamada yamada.m@jp.panasonic.com Cc: Doug Anderson dianders@chromium.org
common/board_r.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/common/board_r.c b/common/board_r.c index 86ca1cb..8f45943 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -903,9 +903,14 @@ init_fnc_t init_sequence_r[] = {
void board_init_r(gd_t *new_gd, ulong dest_addr) {
- int i;
#ifndef CONFIG_X86 gd = new_gd; #endif
- /* Fixup table after relocation */
- for (i = 0; i < sizeof(init_sequence_r)/sizeof(void *); i++)
init_sequence_r[i] += gd->reloc_off;
- if (initcall_run_list(init_sequence_r)) hang();
Amicalement,