瀏覽代碼

xtensa: add FDPIC-specific TLS macro variants

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Max Filippov 2 周之前
父節點
當前提交
764b583a36
共有 1 個文件被更改,包括 76 次插入2 次删除
  1. 76 2
      test/tls/tls-macros-xtensa.h

+ 76 - 2
test/tls/tls-macros-xtensa.h

@@ -22,6 +22,78 @@
 	  : "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15");	\
       __l; })
 #elif defined(__XTENSA_CALL0_ABI__)
+#ifdef __FDPIC__
+#define TLS_GD(x)							\
+  ({ int *__l;								\
+     int __t;								\
+     extern unsigned long _GLOBAL_OFFSET_TABLE_[];			\
+     __asm__ ("movi	%[tmp], " #x "@GOTTLSDESC\n\t"			\
+	      ".reloc	., R_XTENSA_TLS_ARG, " #x "\n\t"		\
+	      "add	a2, %[tmp], %[got]\n\t"				\
+	      ".reloc	., R_XTENSA_TLS_FUNCDESC, " #x "\n\t"		\
+	      "l32i	%[tmp], a2, 0\n\t"				\
+	      "mov	a12, a11\n\t"					\
+	      ".reloc	., R_XTENSA_TLS_GOT, " #x "\n\t"		\
+	      "l32i	a11, %[tmp], 4\n\t"				\
+	      ".reloc	., R_XTENSA_TLS_FUNC, " #x "\n\t"		\
+	      "_l32i	%[tmp], %[tmp], 0\n\t"				\
+	      ".reloc	., R_XTENSA_TLS_CALL, " #x "\n\t"		\
+	      "callx0	%[tmp]\n\t"					\
+	      "mov	a11, a12\n\t"					\
+	      "mov	%[res], a2\n\t"					\
+	      : [res] "=r" (__l), [tmp] "=&r" (__t)			\
+	      : [got] "r" (_GLOBAL_OFFSET_TABLE_)			\
+	      : "a0", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a12");\
+	      __l; })
+
+#define TLS_LD(x)							\
+  ({ int *__l;								\
+     int __t;								\
+     extern unsigned long _GLOBAL_OFFSET_TABLE_[];			\
+     __asm__ ("movi	%[tmp], _TLS_MODULE_BASE_@GOTTLSDESC\n\t"	\
+	      ".reloc	., R_XTENSA_TLS_ARG, _TLS_MODULE_BASE_\n\t"	\
+	      "add	a2, %[tmp], %[got]\n\t"				\
+	      ".reloc	., R_XTENSA_TLS_FUNCDESC, _TLS_MODULE_BASE_\n\t"\
+	      "l32i	%[tmp], a2, 0\n\t"				\
+	      "mov	a12, a11\n\t"					\
+	      ".reloc	., R_XTENSA_TLS_GOT, _TLS_MODULE_BASE_\n\t"	\
+	      "l32i	a11, %[tmp], 4\n\t"				\
+	      ".reloc	., R_XTENSA_TLS_FUNC, _TLS_MODULE_BASE_\n\t"	\
+	      "_l32i	%[tmp], %[tmp], 0\n\t"				\
+	      ".reloc	., R_XTENSA_TLS_CALL, _TLS_MODULE_BASE_\n\t"	\
+	      "callx0	%[tmp]\n\t"					\
+	      "mov	a11, a12\n\t"					\
+	      "movi	%[res], " #x "@DTPOFF\n\t"			\
+	      "add	%[res], %[res], a2\n\t"				\
+	      : [res] "=r" (__l), [tmp] "=&r" (__t)			\
+	      : [got] "r" (_GLOBAL_OFFSET_TABLE_)			\
+	      : "a0", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a12");\
+	      __l; })
+
+#define TLS_IE(x)							\
+  ({ int *__l;								\
+     int __t;								\
+     extern unsigned long _GLOBAL_OFFSET_TABLE_[];			\
+     __asm__ ("movi	%[tmp], " #x "@GOTTPOFF\n\t"			\
+	      ".reloc	., R_XTENSA_TLS_TPOFF_PTR, " #x "\n\t"		\
+	      "add	%[tmp], %[tmp], %[got]\n\t"			\
+	      ".reloc	., R_XTENSA_TLS_TPOFF_LOAD, " #x "\n\t"		\
+	      "l32i	%[tmp], %[tmp], 0\n\t"				\
+	      "rur	%[res], threadptr\n\t"				\
+	      "add	%[res], %[res], %[tmp]\n\t"			\
+	      : [res] "=r" (__l), [tmp] "=&r" (__t)			\
+	      : [got] "r" (_GLOBAL_OFFSET_TABLE_));			\
+     __l; })
+
+#define TLS_LE(x)							\
+  ({ int *__l;								\
+     int __t;								\
+     __asm__ ("rur	%0, threadptr\n\t"				\
+	      "movi	%1, " #x "@TPOFF\n\t"				\
+	      "add	%0, %0, %1\n\t"					\
+	      : "=r" (__l), "=r" (__t) );				\
+     __l; })
+#else
 #define TLS_GD(x)							\
   ({ int *__l;								\
      __asm__ ("movi  a0, " #x "@TLSFUNC\n\t"				\
@@ -44,10 +116,12 @@
 	  :								\
 	  : "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11");\
       __l; })
+#endif
 #else
 #error Unsupported Xtensa ABI
 #endif
 
+#ifndef __FDPIC__
 #define TLS_IE(x) TLS_LE(x)
 
 #define TLS_LE(x)							\
@@ -57,5 +131,5 @@
 	  "movi %1, " #x "@TPOFF\n\t"					\
 	  "add %0, %0, %1\n\t"						\
 	  : "=r" (__l), "=r" (__t) );					\
-     __l; });								\
-
+     __l; })
+#endif