replace PTR_LA in the very begining, e.g. in
        arch/mips/cpu/start.S
        arch/mips/lib/cache_init.S
to write position independence code. this is helpfull for make
single binary can be loaded to different ram/rom addresses.

FIXME: only tested on 32 bit system

Signed-off-by: Du Huanpeng <d...@hodcarrier.cn>
---
 arch/mips/include/asm/asm.h | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/arch/mips/include/asm/asm.h b/arch/mips/include/asm/asm.h
index a6876e1..f93281f 100644
--- a/arch/mips/include/asm/asm.h
+++ b/arch/mips/include/asm/asm.h
@@ -289,6 +289,27 @@ symbol             =       value
 #define PTRLOG         3
 #endif
 
+#ifdef __ASSEMBLER__
+/*
+ * helpers for writing position independence code
+ * FIXME: only tested on 32 bit system
+ */
+       .macro  REL_LA reg lable
+       .set    push
+       .set    noat
+       .set    noreorder
+       move    $at, $ra        /* preserve ra */
+       bal     888f
+       nop
+888:   la      \reg, 888b
+       subu    \reg, $ra, \reg /* offset store in reg */
+       move    $ra, $at        /* restroe ra */
+       la      $at, \lable
+       addu    \reg, $at, \reg
+       .set    pop
+       .endm
+#endif
+
 /*
  * Some cp0 registers were extended to 64bit for MIPS III.
  */
-- 
2.7.4

Reply via email to