fix TLS layout of TLS variant I when there is a gap above TP
[musl] / arch / mips / reloc.h
index 8aa0285..b3d59a4 100644 (file)
@@ -1,5 +1,11 @@
 #include <endian.h>
 
+#if __mips_isa_rev >= 6
+#define ISA_SUFFIX "r6"
+#else
+#define ISA_SUFFIX ""
+#endif
+
 #if __BYTE_ORDER == __LITTLE_ENDIAN
 #define ENDIAN_SUFFIX "el"
 #else
@@ -12,7 +18,7 @@
 #define FP_SUFFIX ""
 #endif
 
-#define LDSO_ARCH "mips" ENDIAN_SUFFIX FP_SUFFIX
+#define LDSO_ARCH "mips" ISA_SUFFIX ENDIAN_SUFFIX FP_SUFFIX
 
 #define TPOFF_K (-0x7000)
 
 #define REL_TPOFF       R_MIPS_TLS_TPREL32
 
 #define NEED_MIPS_GOT_RELOCS 1
-#define DYNAMIC_IS_RO 1
+#define DT_DEBUG_INDIRECT DT_MIPS_RLD_MAP
 #define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT))
 
 #define CRTJMP(pc,sp) __asm__ __volatile__( \
        "move $sp,%1 ; jr %0" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+       ".hidden " #sym "\n" \
+       ".set push \n" \
+       ".set noreorder \n" \
+       "       bal 1f \n" \
+       "        nop \n" \
+       "       .gpword . \n" \
+       "       .gpword " #sym " \n" \
+       "1:     lw %0, ($ra) \n" \
+       "       subu %0, $ra, %0 \n" \
+       "       lw $ra, 4($ra) \n" \
+       "       addu %0, %0, $ra \n" \
+       ".set pop \n" \
+       : "=r"(*(fp)) : : "memory", "ra" )