diff options
-rw-r--r-- | arch/arm/include/asm/sections.h | 33 | ||||
-rw-r--r-- | arch/arm/lib/runtime-offset.S | 28 |
2 files changed, 61 insertions, 0 deletions
diff --git a/arch/arm/include/asm/sections.h b/arch/arm/include/asm/sections.h index 2b8c516038..8c7bc8cccc 100644 --- a/arch/arm/include/asm/sections.h +++ b/arch/arm/include/asm/sections.h @@ -1 +1,34 @@ +#ifndef __ASM_SECTIONS_H +#define __ASM_SECTIONS_H + +#ifndef __ASSEMBLY__ #include <asm-generic/sections.h> + +/* + * Access a linker supplied variable. Use this if your code might not be running + * at the address it is linked at. + */ +#define ld_var(name) ({ \ + unsigned long __ld_var_##name(void); \ + __ld_var_##name(); \ +}) + +#else + +/* + * Access a linker supplied variable, assembler macro version + */ +.macro ld_var name, reg, scratch + 1000: + ldr \reg, 1001f + ldr \scratch, =1000b + add \reg, \reg, \scratch + b 1002f + 1001: + .word \name - 1000b + 1002: +.endm + +#endif + +#endif /* __ASM_SECTIONS_H */ diff --git a/arch/arm/lib/runtime-offset.S b/arch/arm/lib/runtime-offset.S index ffa668cd7e..aa56c7b105 100644 --- a/arch/arm/lib/runtime-offset.S +++ b/arch/arm/lib/runtime-offset.S @@ -1,6 +1,8 @@ #include <linux/linkage.h> #include <asm/assembler.h> +.section ".text_bare_init","ax" + /* * Get the offset between the link address and the address * we are currently running at. @@ -15,3 +17,29 @@ THUMB( subs r0, r0, #1) linkadr: .word get_runtime_offset ENDPROC(get_runtime_offset) + +.globl __ld_var_base +__ld_var_base: + +/* + * Functions to calculate selected linker supplied variables during runtime. + * This is needed for relocatable binaries when the linker variables are + * needed before finxing up the relocations. + */ +.macro ld_var_entry name + ENTRY(__ld_var_\name) + ldr r0, __\name + b 1f + __\name: .word \name - __ld_var_base + ENDPROC(__ld_var_\name) +.endm + +ld_var_entry _text +ld_var_entry _barebox_image_size +ld_var_entry __bss_start +ld_var_entry __bss_stop + +1: + ldr r1, =__ld_var_base + adds r0, r0, r1 + mov pc, lr |