]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Use C code instead of inline assembler in macros of tls.h for i386 (for Intel MPX...
authorLiubov Dmitrieva <liubov.dmitrieva@intel.com>
Mon, 21 Jan 2013 11:35:12 +0000 (15:35 +0400)
committerLiubov Dmitrieva <ldmitrie@sourceware.org>
Wed, 23 Oct 2013 15:07:34 +0000 (19:07 +0400)
nptl/sysdeps/i386/tls.h

index 3d18b1de73296aaed6876584f0eed09ed4e7bdce..bf300887a00b11c9ef7d33ffcc5e5bee29ae577a 100644 (file)
@@ -259,11 +259,24 @@ union user_desc_init
    assignments like
        pthread_descr self = thread_self();
    do not get optimized away.  */
-# define THREAD_SELF \
+
+# ifndef __CHKP__
+#  define THREAD_SELF \
   ({ struct pthread *__self;                                                 \
      asm ("movl %%gs:%c1,%0" : "=r" (__self)                                 \
          : "i" (offsetof (struct pthread, header.self)));                    \
      __self;})
+# else
+#  define THREAD_SELF \
+  ({ struct pthread *__self;                                                 \
+     asm ("movl %%gs:%c1,%0" : "=r" (__self)                                 \
+         : "i" (offsetof (struct pthread, header.self)));                    \
+    /* Set first minimum bounds to make possible reading stackblock and stackblock_size. */ \
+         __self = __bnd_set_ptr_bounds(__self, TLS_INIT_TCB_SIZE);                   \
+    /* Set actual correct bounds. */ \
+     (struct pthread*) __bnd_copy_ptr_bounds(__self, __bnd_set_ptr_bounds(__self->stackblock, \
+      __self->stackblock_size)); })
+# endif
 
 /* Magic for libthread_db to know how to do THREAD_SELF.  */
 # define DB_THREAD_SELF \
@@ -272,7 +285,8 @@ union user_desc_init
 
 
 /* Read member of the thread descriptor directly.  */
-# define THREAD_GETMEM(descr, member) \
+# ifndef __CHKP__
+#  define THREAD_GETMEM(descr, member) \
   ({ __typeof (descr->member) __value;                                       \
      if (sizeof (__value) == 1)                                                      \
        asm volatile ("movb %%gs:%P2,%b0"                                     \
@@ -296,10 +310,15 @@ union user_desc_init
                         "i" (offsetof (struct pthread, member) + 4));        \
        }                                                                     \
      __value; })
-
+# else
+#  define THREAD_GETMEM(descr, member) \
+   ({ struct pthread *__self = THREAD_SELF;  \
+      __self->member; })
+# endif
 
 /* Same as THREAD_GETMEM, but the member offset can be non-constant.  */
-# define THREAD_GETMEM_NC(descr, member, idx) \
+# ifndef __CHKP__
+#  define THREAD_GETMEM_NC(descr, member, idx) \
   ({ __typeof (descr->member[0]) __value;                                    \
      if (sizeof (__value) == 1)                                                      \
        asm volatile ("movb %%gs:%P2(%3),%b0"                                 \
@@ -325,10 +344,15 @@ union user_desc_init
                          "r" (idx));                                         \
        }                                                                     \
      __value; })
-
+# else
+#  define THREAD_GETMEM_NC(descr, member, idx) \
+   ({ struct pthread *__self = THREAD_SELF;  \
+      __self->member[idx]; })
+# endif
 
 /* Same as THREAD_SETMEM, but the member offset can be non-constant.  */
-# define THREAD_SETMEM(descr, member, value) \
+# ifndef __CHKP__
+#  define THREAD_SETMEM(descr, member, value) \
   ({ if (sizeof (descr->member) == 1)                                        \
        asm volatile ("movb %b0,%%gs:%P1" :                                   \
                     : "iq" (value),                                          \
@@ -350,10 +374,15 @@ union user_desc_init
                         "i" (offsetof (struct pthread, member)),             \
                         "i" (offsetof (struct pthread, member) + 4));        \
        }})
-
+# else
+#  define THREAD_SETMEM(descr, member, value) \
+   ({ struct pthread *__self = THREAD_SELF;  \
+      __self->member = value; })
+#endif
 
 /* Set member of the thread descriptor directly.  */
-# define THREAD_SETMEM_NC(descr, member, idx, value) \
+# ifndef __CHKP__
+#  define THREAD_SETMEM_NC(descr, member, idx, value) \
   ({ if (sizeof (descr->member[0]) == 1)                                     \
        asm volatile ("movb %b0,%%gs:%P1(%2)" :                               \
                     : "iq" (value),                                          \
@@ -377,7 +406,11 @@ union user_desc_init
                         "i" (offsetof (struct pthread, member)),             \
                         "r" (idx));                                          \
        }})
-
+# else
+#  define THREAD_SETMEM_NC(descr, member, idx, value) \
+   ({ struct pthread *__self = THREAD_SELF;  \
+      __self->member[idx] = value; })
+# endif
 
 /* Atomic compare and exchange on TLS, returning old value.  */
 #define THREAD_ATOMIC_CMPXCHG_VAL(descr, member, newval, oldval) \
@@ -417,7 +450,8 @@ union user_desc_init
 
 
 /* Call the user-provided thread function.  */
-#define CALL_THREAD_FCT(descr) \
+#ifndef __CHKP__
+# define CALL_THREAD_FCT(descr) \
   ({ void *__res;                                                            \
      int __ignore1, __ignore2;                                               \
      asm volatile ("pushl %%eax\n\t"                                         \
@@ -430,7 +464,11 @@ union user_desc_init
                   : "i" (offsetof (struct pthread, start_routine)),          \
                     "i" (offsetof (struct pthread, arg)));                   \
      __res; })
-
+# else
+#  define CALL_THREAD_FCT(descr) \
+   ({ struct pthread *__self = THREAD_SELF;  \
+      __self->start_routine(__self->arg); })
+# endif
 
 /* Set the stack guard field in TCB head.  */
 #define THREAD_SET_STACK_GUARD(value) \