فهرست منبع

riscv: add TLSDESC support

Rich Felker 1 سال پیش
والد
کامیت
407aea628a
2فایلهای تغییر یافته به همراه33 افزوده شده و 0 حذف شده
  1. 1 0
      arch/riscv64/reloc.h
  2. 32 0
      src/ldso/riscv64/tlsdesc.s

+ 1 - 0
arch/riscv64/reloc.h

@@ -17,6 +17,7 @@
 #define REL_DTPMOD      R_RISCV_TLS_DTPMOD64
 #define REL_DTPOFF      R_RISCV_TLS_DTPREL64
 #define REL_TPOFF       R_RISCV_TLS_TPREL64
+#define REL_TLSDESC     R_RISCV_TLSDESC
 
 #define CRTJMP(pc,sp) __asm__ __volatile__( \
 	"mv sp, %1 ; jr %0" : : "r"(pc), "r"(sp) : "memory" )

+ 32 - 0
src/ldso/riscv64/tlsdesc.s

@@ -0,0 +1,32 @@
+.text
+.global __tlsdesc_static
+.hidden __tlsdesc_static
+.type __tlsdesc_static,%function
+__tlsdesc_static:
+	ld a0,8(a0)
+	jr t0
+
+.global __tlsdesc_dynamic
+.hidden __tlsdesc_dynamic
+.type __tlsdesc_dynamic,%function
+__tlsdesc_dynamic:
+	add sp,sp,-16
+	sd t1,(sp)
+	sd t2,8(sp)
+
+	ld t2,-8(tp) # t2=dtv
+
+	ld a0,8(a0)  # a0=&{modidx,off}
+	ld t1,8(a0)  # t1=off
+	ld a0,(a0)   # a0=modidx
+	sll a0,a0,3  # a0=8*modidx
+
+	add a0,a0,t2 # a0=dtv+8*modidx
+	ld a0,(a0)   # a0=dtv[modidx]
+	add a0,a0,t1 # a0=dtv[modidx]+off
+	sub a0,a0,tp # a0=dtv[modidx]+off-tp
+
+	ld t1,(sp)
+	ld t2,8(sp)
+	add sp,sp,16
+	jr t0