diff options
author | Xing Li <lixing@loongson.cn> | 2024-09-10 09:15:33 +0800 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2024-10-22 20:36:09 -0400 |
commit | 61399d4bd02ae1ec03068445aa7ffe9174466bfd (patch) | |
tree | 4a85c66e59c4068606f60d2e8eb81ea235d175f1 | |
parent | 9b6a24f9c56caf70289c1fa3470f4841808ef3b7 (diff) | |
download | musl-master.zip musl-master.tar.gz musl-master.tar.bz2 |
-rw-r--r-- | arch/loongarch64/reloc.h | 1 | ||||
-rw-r--r-- | include/elf.h | 1 | ||||
-rw-r--r-- | src/ldso/loongarch64/tlsdesc.s | 37 |
3 files changed, 39 insertions, 0 deletions
diff --git a/arch/loongarch64/reloc.h b/arch/loongarch64/reloc.h index 61eaca9..a4db6a9 100644 --- a/arch/loongarch64/reloc.h +++ b/arch/loongarch64/reloc.h @@ -17,6 +17,7 @@ #define REL_TPOFF R_LARCH_TLS_TPREL64 #define REL_RELATIVE R_LARCH_RELATIVE #define REL_SYMBOLIC R_LARCH_64 +#define REL_TLSDESC R_LARCH_TLS_DESC64 #define CRTJMP(pc,sp) __asm__ __volatile__( \ "move $sp, %1 ; jr %0" : : "r"(pc), "r"(sp) : "memory" ) diff --git a/include/elf.h b/include/elf.h index 3d5e13e..8b622f6 100644 --- a/include/elf.h +++ b/include/elf.h @@ -3329,6 +3329,7 @@ enum #define R_LARCH_TLS_TPREL32 10 #define R_LARCH_TLS_TPREL64 11 #define R_LARCH_IRELATIVE 12 +#define R_LARCH_TLS_DESC64 14 #define R_LARCH_MARK_LA 20 #define R_LARCH_MARK_PCREL 21 #define R_LARCH_SOP_PUSH_PCREL 22 diff --git a/src/ldso/loongarch64/tlsdesc.s b/src/ldso/loongarch64/tlsdesc.s new file mode 100644 index 0000000..4b6ea0e --- /dev/null +++ b/src/ldso/loongarch64/tlsdesc.s @@ -0,0 +1,37 @@ +.text +.global __tlsdesc_static +.hidden __tlsdesc_static +.type __tlsdesc_static,%function +__tlsdesc_static: + ld.d $a0, $a0, 8 + jr $ra +# size_t __tlsdesc_dynamic(size_t *a) +# { +# struct {size_t modidx,off;} *p = (void*)a[1]; +# size_t *dtv = *(size_t**)(tp - 8); +# return dtv[p->modidx] + p->off - tp; +# } +.global __tlsdesc_dynamic +.hidden __tlsdesc_dynamic +.type __tlsdesc_dynamic,%function +__tlsdesc_dynamic: + addi.d $sp, $sp, -16 + st.d $t1, $sp, 0 + st.d $t2, $sp, 8 + + ld.d $t2, $tp, -8 # t2=dtv + + ld.d $a0, $a0, 8 # a0=&{modidx,off} + ld.d $t1, $a0, 8 # t1=off + ld.d $a0, $a0, 0 # a0=modidx + slli.d $a0, $a0, 3 # a0=8*modidx + + add.d $a0, $a0, $t2 # a0=dtv+8*modidx + ld.d $a0, $a0, 0 # a0=dtv[modidx] + add.d $a0, $a0, $t1 # a0=dtv[modidx]+off + sub.d $a0, $a0, $tp # a0=dtv[modidx]+off-tp + + ld.d $t1, $sp, 0 + ld.d $t2, $sp, 8 + addi.d $sp, $sp, 16 + jr $ra |