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_tab...@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

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to