diff options
Diffstat (limited to 'arch/arm/cpu/common.c')
-rw-r--r-- | arch/arm/cpu/common.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/arch/arm/cpu/common.c b/arch/arm/cpu/common.c index 5ccacf2047..e9118b450d 100644 --- a/arch/arm/cpu/common.c +++ b/arch/arm/cpu/common.c @@ -59,18 +59,21 @@ void pbl_barebox_break(void) /* * relocate binary to the currently running address */ -void relocate_to_current_adr(void) +void __prereloc relocate_to_current_adr(void) { - unsigned long offset, offset_var; + unsigned long offset; unsigned long __maybe_unused *dynsym, *dynend; void *dstart, *dend; /* Get offset between linked address and runtime address */ offset = get_runtime_offset(); - offset_var = global_variable_offset(); - dstart = (void *)__rel_dyn_start + offset_var; - dend = (void *)__rel_dyn_end + offset_var; + /* + * We have yet to relocate, so using runtime_address + * to compute the relocated address + */ + dstart = runtime_address(__rel_dyn_start); + dend = runtime_address(__rel_dyn_end); #if defined(CONFIG_CPU_64) while (dstart < dend) { @@ -90,14 +93,14 @@ void relocate_to_current_adr(void) putc_ll(' '); puthex_ll(rel->r_addend); putc_ll('\n'); - panic(""); + __hang(); } dstart += sizeof(*rel); } #elif defined(CONFIG_CPU_32) - dynsym = (void *)__dynsym_start + offset_var; - dynend = (void *)__dynsym_end + offset_var; + dynsym = runtime_address(__dynsym_start); + dynend = runtime_address(__dynsym_end); while (dstart < dend) { struct elf32_rel *rel = dstart; @@ -120,7 +123,7 @@ void relocate_to_current_adr(void) putc_ll(' '); puthex_ll(rel->r_offset); putc_ll('\n'); - panic(""); + __hang(); } dstart += sizeof(*rel); |