[U-Boot] [PATCH 1/4] ppc: Add const void *link_off(const void *addr)
Joakim Tjernlund
Joakim.Tjernlund at transmode.se
Wed Dec 30 16:08:29 CET 2009
Calculates the offset between global data link address
and where the data is actually loaded. Add this offset
to 'addr' arg and return the result.
Useful for true PIC and when relocating code to RAM.
---
include/common.h | 7 +++++++
lib_ppc/reloc.S | 21 +++++++++++++++++++++
2 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/include/common.h b/include/common.h
index 7df9afa..b37cb1d 100644
--- a/include/common.h
+++ b/include/common.h
@@ -108,6 +108,13 @@ typedef volatile unsigned char vu_char;
#include <asm/blackfin.h>
#endif
+#ifdef CONFIG_LINK_OFF
+const void * link_off(const void * addr);
+#else
+#define link_off(addr) ((const void *) (addr))
+#endif
+#define LINK_OFF(x) ((__typeof__(&(x)[0]))link_off(x))
+
#include <part.h>
#include <flash.h>
#include <image.h>
diff --git a/lib_ppc/reloc.S b/lib_ppc/reloc.S
index 50f9a83..3ec26cc 100644
--- a/lib_ppc/reloc.S
+++ b/lib_ppc/reloc.S
@@ -47,3 +47,24 @@ trap_reloc:
blr
.size trap_reloc, .-trap_reloc
#endif
+
+#ifdef CONFIG_LINK_OFF
+ /* Calculate the offset between global data link address
+ * and where the data is actually loaded. Add this offset
+ * to 'addr' arg and return the result.
+ * Useful for true PIC and when relocating code to RAM */
+ .globl link_off
+ .type link_off, @function
+link_off: /* const void * link_off(const void * addr) */
+ /* In asm as we cannot use the stack */
+ mflr r5
+ bl _GLOBAL_OFFSET_TABLE_ at local-4
+ mflr r4
+ mtlr r5
+ addi r4,r4,12 /* find first .got2 entry */
+ lwz r5,0(r4) /* get link address */
+ subf r4,r5,r4 /* r4 = r4 - r5 */
+ add r3,r3,r4 /* r3 = r4 + r3 */
+ blr
+ .size link_off, .-link_off
+#endif
--
1.6.4.4
More information about the U-Boot
mailing list