summaryrefslogtreecommitdiff
path: root/src/ldso
diff options
context:
space:
mode:
authorXing Li <lixing@loongson.cn>2024-09-10 09:15:33 +0800
committerRich Felker <dalias@aerifal.cx>2024-10-22 20:36:09 -0400
commit61399d4bd02ae1ec03068445aa7ffe9174466bfd (patch)
tree4a85c66e59c4068606f60d2e8eb81ea235d175f1 /src/ldso
parent9b6a24f9c56caf70289c1fa3470f4841808ef3b7 (diff)
downloadmusl-61399d4bd02ae1ec03068445aa7ffe9174466bfd.tar.gz
loongarch64: add TLSDESC support
Diffstat (limited to 'src/ldso')
-rw-r--r--src/ldso/loongarch64/tlsdesc.s37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/ldso/loongarch64/tlsdesc.s b/src/ldso/loongarch64/tlsdesc.s
new file mode 100644
index 00000000..4b6ea0e5
--- /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