x86: Allow relocation code to build without text base
This code currently requires CONFIG_SYS_TEXT_BASE but this should be unnecessary. As a first step, remove the build-time limitation and report an error instead. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
d6c099c2a1
commit
a42bfe02d3
|
@ -58,6 +58,7 @@ int do_elf_reloc_fixups(void)
|
||||||
|
|
||||||
Elf32_Addr *offset_ptr_rom, *last_offset = NULL;
|
Elf32_Addr *offset_ptr_rom, *last_offset = NULL;
|
||||||
Elf32_Addr *offset_ptr_ram;
|
Elf32_Addr *offset_ptr_ram;
|
||||||
|
unsigned int text_base = 0;
|
||||||
|
|
||||||
/* The size of the region of u-boot that runs out of RAM. */
|
/* The size of the region of u-boot that runs out of RAM. */
|
||||||
uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
|
uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
|
||||||
|
@ -67,29 +68,33 @@ int do_elf_reloc_fixups(void)
|
||||||
if (re_src == re_end)
|
if (re_src == re_end)
|
||||||
panic("No relocation data");
|
panic("No relocation data");
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYS_TEXT_BASE
|
||||||
|
text_base = CONFIG_SYS_TEXT_BASE;
|
||||||
|
#else
|
||||||
|
panic("No CONFIG_SYS_TEXT_BASE");
|
||||||
|
#endif
|
||||||
do {
|
do {
|
||||||
/* Get the location from the relocation entry */
|
/* Get the location from the relocation entry */
|
||||||
offset_ptr_rom = (Elf32_Addr *)re_src->r_offset;
|
offset_ptr_rom = (Elf32_Addr *)re_src->r_offset;
|
||||||
|
|
||||||
/* Check that the location of the relocation is in .text */
|
/* Check that the location of the relocation is in .text */
|
||||||
if (offset_ptr_rom >= (Elf32_Addr *)CONFIG_SYS_TEXT_BASE &&
|
if (offset_ptr_rom >= (Elf32_Addr *)text_base &&
|
||||||
offset_ptr_rom > last_offset) {
|
offset_ptr_rom > last_offset) {
|
||||||
|
|
||||||
/* Switch to the in-RAM version */
|
/* Switch to the in-RAM version */
|
||||||
offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
|
offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
|
||||||
gd->reloc_off);
|
gd->reloc_off);
|
||||||
|
|
||||||
/* Check that the target points into .text */
|
/* Check that the target points into .text */
|
||||||
if (*offset_ptr_ram >= CONFIG_SYS_TEXT_BASE &&
|
if (*offset_ptr_ram >= text_base &&
|
||||||
*offset_ptr_ram <=
|
*offset_ptr_ram <= text_base + size) {
|
||||||
(CONFIG_SYS_TEXT_BASE + size)) {
|
|
||||||
*offset_ptr_ram += gd->reloc_off;
|
*offset_ptr_ram += gd->reloc_off;
|
||||||
} else {
|
} else {
|
||||||
debug(" %p: rom reloc %x, ram %p, value %x,"
|
debug(" %p: rom reloc %x, ram %p, value %x,"
|
||||||
" limit %" PRIXPTR "\n", re_src,
|
" limit %" PRIXPTR "\n", re_src,
|
||||||
re_src->r_offset, offset_ptr_ram,
|
re_src->r_offset, offset_ptr_ram,
|
||||||
*offset_ptr_ram,
|
*offset_ptr_ram,
|
||||||
CONFIG_SYS_TEXT_BASE + size);
|
text_base + size);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
debug(" %p: rom reloc %x, last %p\n", re_src,
|
debug(" %p: rom reloc %x, last %p\n", re_src,
|
||||||
|
|
Loading…
Reference in New Issue