Add sysdeps/x86_64/x32/tls.h
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 11 May 2012 21:33:12 +0000 (14:33 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 11 May 2012 21:33:12 +0000 (14:33 -0700)
nptl/ChangeLog
nptl/sysdeps/x86_64/x32/tls.h [new file with mode: 0644]

index bf648a3..49e42ef 100644 (file)
@@ -1,5 +1,9 @@
 2012-05-11  H.J. Lu  <hongjiu.lu@intel.com>
 
+       * sysdeps/x86_64/x32/tls.h: New file.
+
+2012-05-11  H.J. Lu  <hongjiu.lu@intel.com>
+
        * sysdeps/x86_64/tls.h (THREAD_SETMEM): Use uint64_t on 64-bit
        integer.
        (THREAD_SETMEM_NC): Likewise.
diff --git a/nptl/sysdeps/x86_64/x32/tls.h b/nptl/sysdeps/x86_64/x32/tls.h
new file mode 100644 (file)
index 0000000..6cc0ea7
--- /dev/null
@@ -0,0 +1,46 @@
+/* Definition for thread-local data handling.  nptl/x32 version.
+   Copyright (C) 2012 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _X32_TLS_H
+#define _X32_TLS_H     1
+
+#include <sysdeps/x86_64/tls.h>
+
+#ifndef __ASSEMBLER__
+
+/* X32 doesn't support 32-bit indirect call via memory.  Instead, we
+   load 32-bit address from memory into the lower 32bits of return
+   register, which will automatically zero-extend the uppper 32-bits
+   of return register.  We then do the indirect call via 64-bit return
+   register.  */
+# undef CALL_THREAD_FCT
+# define CALL_THREAD_FCT(descr) \
+  ({ void *__res;                                                            \
+     asm volatile ("movl %%fs:%P2, %%edi\n\t"                                \
+                  "movl %%fs:%P1, %k0\n\t"                                   \
+                  "callq *%q0"                                               \
+                  : "=a" (__res)                                             \
+                  : "i" (offsetof (struct pthread, start_routine)),          \
+                    "i" (offsetof (struct pthread, arg))                     \
+                  : "di", "si", "cx", "dx", "r8", "r9", "r10", "r11",        \
+                    "memory", "cc");                                         \
+     __res; })
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* x32/tls.h */