Hi Alexey, On 15 January 2014 04:19, Alexey Brodkin <[email protected]>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. > > 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 <[email protected]> > > Cc: Tom Rini <[email protected]> > Cc: Simon Glass <[email protected]> > Cc: Masahiro Yamada <[email protected]> > Cc: Doug Anderson <[email protected]> > --- > 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; > + > ARRAY_SIZE() might be better. I have not checked to make sure that the array contents remains un-relocated. Did you see this? if (initcall_run_list(init_sequence_r)) > hang(); > > -- > 1.8.4.2 > > Regards, Simon
_______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

