summaryrefslogtreecommitdiffstats
path: root/arch/arm/include/asm/barebox-arm.h
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2012-10-07 19:06:30 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2013-03-07 12:38:01 +0100
commita81ec0225f5a100341c20b4329c8b1d81ab025c4 (patch)
tree0d38efb6ba77f80dc0759513d33ab73f7f9bc868 /arch/arm/include/asm/barebox-arm.h
parentb08e08506b9752d3768e42d075283f91d2ed5180 (diff)
downloadbarebox-a81ec0225f5a100341c20b4329c8b1d81ab025c4.tar.gz
barebox-a81ec0225f5a100341c20b4329c8b1d81ab025c4.tar.xz
ARM: Add relocatable binary support
For making the same binary executable on different SoCs which have different DRAM addresses we have to be independent of the compile time link address. This patch adds relocatable binary support for the ARM architecture. With this two new functions are available. relocate_to_current_adr will fixup the binary to continue executing from the current position. relocate_to_adr will copy the binary to a given address, fixup the binary and continue executing from there. For the PBL and the real image relocatable support can be enabled independently. This is done to (hopefully) better cope with setups where the PBL runs from SRAM or ROM and the real binary does not. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/include/asm/barebox-arm.h')
-rw-r--r--arch/arm/include/asm/barebox-arm.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/arch/arm/include/asm/barebox-arm.h b/arch/arm/include/asm/barebox-arm.h
index 11ef848773..54da10a1e4 100644
--- a/arch/arm/include/asm/barebox-arm.h
+++ b/arch/arm/include/asm/barebox-arm.h
@@ -26,6 +26,7 @@
#define _BAREBOX_ARM_H_
#include <sizes.h>
+#include <asm-generic/memory_layout.h>
/* cpu/.../cpu.c */
int cleanup_before_linux(void);
@@ -40,6 +41,8 @@ void board_init_lowlevel(void);
uint32_t get_runtime_offset(void);
void setup_c(void);
+void relocate_to_current_adr(void);
+void relocate_to_adr(unsigned long target);
void __noreturn barebox_arm_entry(uint32_t membase, uint32_t memsize, uint32_t boarddata);
#if defined(CONFIG_RELOCATABLE) && defined(CONFIG_ARM_EXCEPTIONS)
@@ -50,4 +53,27 @@ static inline void arm_fixup_vectors(void)
}
#endif
+/*
+ * For relocatable binaries find a suitable start address for the
+ * relocated binary. Beginning at the memory end substract the reserved
+ * space and round down a bit at the end. This is used by the pbl to
+ * extract the image to a suitable place so that the uncompressed image
+ * does not have to copy itself to another place. Also it's used by
+ * the uncompressed image to relocate itself to the same place.
+ */
+static inline unsigned long arm_barebox_image_place(unsigned long endmem)
+{
+ endmem -= STACK_SIZE;
+ endmem -= SZ_32K; /* ttb */
+ endmem -= SZ_128K; /* early malloc */
+ endmem -= SZ_1M; /* place for barebox image */
+
+ /*
+ * round down to make translating the objdump easier
+ */
+ endmem &= ~(SZ_1M - 1);
+
+ return endmem;
+}
+
#endif /* _BAREBOX_ARM_H_ */