diff mbox series

[uclibc-ng-devel,2/4] powerpc64: add missing tls macros

Message ID 20200405113540.25084-3-yann@sionneau.net
State Accepted
Headers show
Series uclibc-ng-test: make TLS tests run again! | expand

Commit Message

Yann Sionneau April 5, 2020, 11:35 a.m. UTC
Signed-off-by: Yann Sionneau <yann@sionneau.net>
---
 test/tls/tls-macros-powerpc64.h | 43 +++++++++++++++++++++++++++++++++
 test/tls/tls-macros.h           |  6 ++++-
 2 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 test/tls/tls-macros-powerpc64.h
diff mbox series

Patch

diff --git a/test/tls/tls-macros-powerpc64.h b/test/tls/tls-macros-powerpc64.h
new file mode 100644
index 0000000..6021664
--- /dev/null
+++ b/test/tls/tls-macros-powerpc64.h
@@ -0,0 +1,43 @@ 
+#define __TLS_CALL_CLOBBERS						\
+	"0", "4", "5", "6", "7", "8", "9", "10", "11", "12",	\
+	"lr", "ctr", "cr0", "cr1", "cr5", "cr6", "cr7"
+
+/* PowerPC64 Local Exec TLS access.  */
+#define TLS_LE(x)							      \
+  ({ int * __result;							      \
+     asm ("addis %0,13," #x "@tprel@ha\n\t"				      \
+	  "addi  %0,%0," #x "@tprel@l"					      \
+	  : "=b" (__result) );						      \
+     __result;								      \
+  })
+/* PowerPC64 Initial Exec TLS access.  */
+#define TLS_IE(x)							      \
+  ({ int * __result;							      \
+     asm ("ld  %0," #x "@got@tprel(2)\n\t"				      \
+	  "add %0,%0," #x "@tls"					      \
+	  : "=r" (__result) );						      \
+     __result;								      \
+  })
+
+/* PowerPC64 Local Dynamic TLS access.  */
+#define TLS_LD(x)							      \
+  ({ int * __result;							      \
+     asm ("addi  3,2," #x "@got@tlsld\n\t"				      \
+	  "bl    __tls_get_addr\n\t"					      \
+	  "nop   \n\t"							      \
+	  "addis %0,3," #x "@dtprel@ha\n\t"				      \
+	  "addi  %0,%0," #x "@dtprel@l"					      \
+	  : "=b" (__result) :						      \
+	  : "3", __TLS_CALL_CLOBBERS);					      \
+     __result;								      \
+  })
+/* PowerPC64 General Dynamic TLS access.  */
+#define TLS_GD(x)							      \
+  ({ register int *__result __asm__ ("r3");				      \
+     asm ("addi  3,2," #x "@got@tlsgd\n\t"				      \
+	  "bl    __tls_get_addr\n\t"					      \
+	  "nop   "							      \
+	  : "=r" (__result) :						      \
+	  : __TLS_CALL_CLOBBERS);					      \
+     __result;								      \
+  })
diff --git a/test/tls/tls-macros.h b/test/tls/tls-macros.h
index 71e8ef4..47e0b22 100644
--- a/test/tls/tls-macros.h
+++ b/test/tls/tls-macros.h
@@ -56,10 +56,14 @@ 
 #include <tls-macros-mips.h>
 #endif
 
-#ifdef __powerpc__
+#if defined(__powerpc__) && !defined(__powerpc64__)
 #include <tls-macros-powerpc.h>
 #endif
 
+#if defined(__powerpc__) && defined(__powerpc64__)
+#include <tls-macros-powerpc64.h>
+#endif
+
 #ifdef __sh__
 #include <tls-macros-sh.h>
 #endif