Hello Alexey, Alexey Brodkin wrote onĀ 2014-01-15: > "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. > > Signed-off-by: Alexey Brodkin <abrod...@synopsys.com> > > Cc: Tom Rini <tr...@ti.com> > Cc: Simon Glass <s...@chromium.org> > Cc: Masahiro Yamada <yamad...@jp.panasonic.com> > Cc: Doug Anderson <diand...@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; > +
I think this is only required/possible for architectures which define CONFIG_NEEDS_MANUAL_RELOC, others don't have "gd->reloc_off" > if (initcall_run_list(init_sequence_r)) > hang(); > Best Regards, Thomas --- There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors. --- _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot