hi Darwin, It's a little late. > I'm hoping someone can help answer these questions about armv8 relocation. > > The CONFIG_SYS_TEXT_BASE seems to be be usually setup to a decent amount of > alignment. For the purposes of this discussion, let's say it would normally > be 0x88000000 and all is well. The relocation address moves to near the end > of memory, to say, 0xfffa8000. So far so good. > > Now let's say I want to shift the image a bit so that I can add a small > 32-byte header required by a previous bootloader. So I set > CONFIG_SYS_TEXT_BASE to 0x88000020, and the relocated address is still > 0xfffa8000 and the relocated vectors should be at 0xfffa9000. The image > crashes so after some debugging, I find that the code appears to be relocated > fine, but some sections have symbols that are not relocated properly. The > vectors try to relocate to 0xfffa8fe0 and rodata.str1.1 printf format strings > are also 0x20 off. There are likely other offset sections with issues as well. > > The relocation offset is 0x77fa7fe0 due to the calculations in > arch/arm/lib/board.c. Simplifying, they look like this: > > addr = CONFIG_SYS_SDRAM_BASE + gd->ram_size; > > /* round down to next 4 kB limit */ > addr &= ~(4096 - 1); > debug("Top of RAM usable for U-Boot at: %08lx\n", addr); > > /* > * reserve memory for U-Boot code, data & bss > * round down to next 4 kB limit > */ > addr -= gd->mon_len; > addr &= ~(4096 - 1); > > addr += 0x20; // hack to adjust relocaddr to aligned address... > > <snip> > > gd->relocaddr = addr; > gd->start_addr_sp = addr_sp; > gd->reloc_off = addr - _TEXT_BASE; > debug("relocation Offset is: %08lx\n", gd->reloc_off); > > > Since _TEXT_BASE is 0x88000020 and addr is 0xfffa8000, the reloc_off is a > number like 0x77fa7fe0. > > Now if I add 0x20 to 'addr' above just before the <snip>, relocaddr becomes > 0x77fa8000 and the relocation works perfectly and no more crashes happen. > > So my question - is the CONFIG_SYS_TEXT_BASE alignment requirement related to > to any assumptions in the linker itself about image base alignment, > specifically referring to creation of the rela.dyn sections and their use for > image relocation? > > A related question is if CONFIG_SYS_TEXT_BASE needs to be at a specific > alignment. The maximum alignment in the armv8 code base is ".align 11" which > I believe means 0x800 or 2048. > > Note that an armv7 target appears to relocate properly with smaller offsets > such as 0x20. > > Thanks. > > I traced the problem you described and found it is caused by 'adrp' instruction. 'adrp' instruction produces 4kb aligned address of a label. So, if CONFIG_SYS_TEXT_BASE is not 4kb aligned the address produced by 'adrp' and following 'add' instruction will be incorrect. For example, if CONFIG_SYS_TEXT_BASE = 0x20 then address of '_start' is 0x20 and address of '_end_ofs' is 0x30, where u-boot access variable '_end_ofs' gcc generate code as following: adrp x0, ... add x0, x0, 0x30 We noticed that 0x30 is added to 'x0' to produce the address of '_end_ofs'. So when CONFIG_SYS_TEXT_BASE=0x20 and relocated destination address is not 0x****020 register x0 contain incorrect address of '_end_ofs'.
David.
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot