about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog26
-rw-r--r--nptl/pthreadP.h6
-rw-r--r--nptl/pthread_mutex_init.c13
-rw-r--r--sysdeps/aarch64/nptl/pthread-offsets.h5
-rw-r--r--sysdeps/alpha/nptl/pthread-offsets.h5
-rw-r--r--sysdeps/arm/nptl/pthread-offsets.h5
-rw-r--r--sysdeps/hppa/nptl/pthread-offsets.h5
-rw-r--r--sysdeps/i386/nptl/pthread-offsets.h5
-rw-r--r--sysdeps/ia64/nptl/pthread-offsets.h5
-rw-r--r--sysdeps/m68k/nptl/pthread-offsets.h5
-rw-r--r--sysdeps/microblaze/nptl/pthread-offsets.h5
-rw-r--r--sysdeps/mips/nptl/pthread-offsets.h13
-rw-r--r--sysdeps/nios2/nptl/pthread-offsets.h5
-rw-r--r--sysdeps/powerpc/nptl/pthread-offsets.h15
-rw-r--r--sysdeps/s390/nptl/pthread-offsets.h15
-rw-r--r--sysdeps/sh/nptl/pthread-offsets.h5
-rw-r--r--sysdeps/sparc/nptl/pthread-offsets.h15
-rw-r--r--sysdeps/tile/nptl/pthread-offsets.h15
-rw-r--r--sysdeps/x86_64/nptl/pthread-offsets.h5
19 files changed, 173 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 632c2a037a..6715f677b6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2017-11-07  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
+
+	* nptl/pthreadP.h (ASSERT_PTHREAD_STRING,
+	ASSERT_PTHREAD_INTERNAL_OFFSET): New macro.
+	* nptl/pthread_mutex_init.c (__pthread_mutex_init): Add build time
+	checks for internal pthread_mutex_t offsets.
+	* sysdeps/aarch64/nptl/pthread-offsets.h
+	(__PTHREAD_MUTEX_NUSERS_OFFSET, __PTHREAD_MUTEX_KIND_OFFSET,
+	__PTHREAD_MUTEX_SPINS_OFFSET, __PTHREAD_MUTEX_ELISION_OFFSET,
+	__PTHREAD_MUTEX_LIST_OFFSET): New macro.
+	* sysdeps/alpha/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/arm/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/hppa/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/i386/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/ia64/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/m68k/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/microblaze/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/mips/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/nios2/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/powerpc/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/s390/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/sh/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/sparc/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/tile/nptl/pthread-offsets.h: Likewise.
+	* sysdeps/x86_64/nptl/pthread-offsets.h: Likewise.
+
 2017-11-07  Florian Weimer  <fweimer@redhat.com>
 
 	* bits/mman-linux.h: Move ...
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index dbf46b0973..ae1b88143b 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -639,4 +639,10 @@ check_stacksize_attr (size_t st)
   return EINVAL;
 }
 
+#define ASSERT_PTHREAD_STRING(x) __STRING (x)
+#define ASSERT_PTHREAD_INTERNAL_OFFSET(type, member, offset)		\
+  _Static_assert (offsetof (type, member) == offset,			\
+		  "offset of " #member " field of " #type " != "	\
+		  ASSERT_PTHREAD_STRING (offset))
+
 #endif	/* pthreadP.h */
diff --git a/nptl/pthread_mutex_init.c b/nptl/pthread_mutex_init.c
index 6f2fc808ff..e1f911bf29 100644
--- a/nptl/pthread_mutex_init.c
+++ b/nptl/pthread_mutex_init.c
@@ -23,6 +23,7 @@
 #include <kernel-features.h>
 #include "pthreadP.h"
 #include <atomic.h>
+#include <pthread-offsets.h>
 
 #include <stap-probe.h>
 
@@ -58,6 +59,18 @@ __pthread_mutex_init (pthread_mutex_t *mutex,
   const struct pthread_mutexattr *imutexattr;
 
   assert (sizeof (pthread_mutex_t) <= __SIZEOF_PTHREAD_MUTEX_T);
+  ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__nusers,
+				  __PTHREAD_MUTEX_NUSERS_OFFSET);
+  ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__kind,
+				  __PTHREAD_MUTEX_KIND_OFFSET);
+  ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__spins,
+				  __PTHREAD_MUTEX_SPINS_OFFSET);
+#if __PTHREAD_MUTEX_LOCK_ELISION
+  ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__elision,
+				  __PTHREAD_MUTEX_ELISION_OFFSET);
+#endif
+  ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__list,
+				  __PTHREAD_MUTEX_LIST_OFFSET);
 
   imutexattr = ((const struct pthread_mutexattr *) mutexattr
 		?: &default_mutexattr);
diff --git a/sysdeps/aarch64/nptl/pthread-offsets.h b/sysdeps/aarch64/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..16c6b0d9fd
--- /dev/null
+++ b/sysdeps/aarch64/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   12
+#define __PTHREAD_MUTEX_KIND_OFFSET     16
+#define __PTHREAD_MUTEX_SPINS_OFFSET    20
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     24
diff --git a/sysdeps/alpha/nptl/pthread-offsets.h b/sysdeps/alpha/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..16c6b0d9fd
--- /dev/null
+++ b/sysdeps/alpha/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   12
+#define __PTHREAD_MUTEX_KIND_OFFSET     16
+#define __PTHREAD_MUTEX_SPINS_OFFSET    20
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     24
diff --git a/sysdeps/arm/nptl/pthread-offsets.h b/sysdeps/arm/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..9617354dc7
--- /dev/null
+++ b/sysdeps/arm/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
+#define __PTHREAD_MUTEX_KIND_OFFSET     12
+#define __PTHREAD_MUTEX_SPINS_OFFSET    20
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     20
diff --git a/sysdeps/hppa/nptl/pthread-offsets.h b/sysdeps/hppa/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..8ae01b9d95
--- /dev/null
+++ b/sysdeps/hppa/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   32
+#define __PTHREAD_MUTEX_KIND_OFFSET     12
+#define __PTHREAD_MUTEX_SPINS_OFFSET    36
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     36
diff --git a/sysdeps/i386/nptl/pthread-offsets.h b/sysdeps/i386/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..9617354dc7
--- /dev/null
+++ b/sysdeps/i386/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
+#define __PTHREAD_MUTEX_KIND_OFFSET     12
+#define __PTHREAD_MUTEX_SPINS_OFFSET    20
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     20
diff --git a/sysdeps/ia64/nptl/pthread-offsets.h b/sysdeps/ia64/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..16c6b0d9fd
--- /dev/null
+++ b/sysdeps/ia64/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   12
+#define __PTHREAD_MUTEX_KIND_OFFSET     16
+#define __PTHREAD_MUTEX_SPINS_OFFSET    20
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     24
diff --git a/sysdeps/m68k/nptl/pthread-offsets.h b/sysdeps/m68k/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..9617354dc7
--- /dev/null
+++ b/sysdeps/m68k/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
+#define __PTHREAD_MUTEX_KIND_OFFSET     12
+#define __PTHREAD_MUTEX_SPINS_OFFSET    20
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     20
diff --git a/sysdeps/microblaze/nptl/pthread-offsets.h b/sysdeps/microblaze/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..9617354dc7
--- /dev/null
+++ b/sysdeps/microblaze/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
+#define __PTHREAD_MUTEX_KIND_OFFSET     12
+#define __PTHREAD_MUTEX_SPINS_OFFSET    20
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     20
diff --git a/sysdeps/mips/nptl/pthread-offsets.h b/sysdeps/mips/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..0ac3eda3fb
--- /dev/null
+++ b/sysdeps/mips/nptl/pthread-offsets.h
@@ -0,0 +1,13 @@
+#if _MIPS_SIM == _ABI64
+# define __PTHREAD_MUTEX_NUSERS_OFFSET   12
+# define __PTHREAD_MUTEX_KIND_OFFSET     16
+# define __PTHREAD_MUTEX_SPINS_OFFSET    20
+# define __PTHREAD_MUTEX_ELISION_OFFSET  22
+# define __PTHREAD_MUTEX_LIST_OFFSET     24
+#else
+# define __PTHREAD_MUTEX_NUSERS_OFFSET   16
+# define __PTHREAD_MUTEX_KIND_OFFSET     12
+# define __PTHREAD_MUTEX_SPINS_OFFSET    20
+# define __PTHREAD_MUTEX_ELISION_OFFSET  22
+# define __PTHREAD_MUTEX_LIST_OFFSET     20
+#endif
diff --git a/sysdeps/nios2/nptl/pthread-offsets.h b/sysdeps/nios2/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..9617354dc7
--- /dev/null
+++ b/sysdeps/nios2/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
+#define __PTHREAD_MUTEX_KIND_OFFSET     12
+#define __PTHREAD_MUTEX_SPINS_OFFSET    20
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     20
diff --git a/sysdeps/powerpc/nptl/pthread-offsets.h b/sysdeps/powerpc/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..bdda1f197e
--- /dev/null
+++ b/sysdeps/powerpc/nptl/pthread-offsets.h
@@ -0,0 +1,15 @@
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 64
+# define __PTHREAD_MUTEX_NUSERS_OFFSET   12
+# define __PTHREAD_MUTEX_KIND_OFFSET     16
+# define __PTHREAD_MUTEX_SPINS_OFFSET    20
+# define __PTHREAD_MUTEX_ELISION_OFFSET  22
+# define __PTHREAD_MUTEX_LIST_OFFSET     24
+#else
+# define __PTHREAD_MUTEX_NUSERS_OFFSET   16
+# define __PTHREAD_MUTEX_KIND_OFFSET     12
+# define __PTHREAD_MUTEX_SPINS_OFFSET    20
+# define __PTHREAD_MUTEX_ELISION_OFFSET  22
+# define __PTHREAD_MUTEX_LIST_OFFSET     20
+#endif
diff --git a/sysdeps/s390/nptl/pthread-offsets.h b/sysdeps/s390/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..bdda1f197e
--- /dev/null
+++ b/sysdeps/s390/nptl/pthread-offsets.h
@@ -0,0 +1,15 @@
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 64
+# define __PTHREAD_MUTEX_NUSERS_OFFSET   12
+# define __PTHREAD_MUTEX_KIND_OFFSET     16
+# define __PTHREAD_MUTEX_SPINS_OFFSET    20
+# define __PTHREAD_MUTEX_ELISION_OFFSET  22
+# define __PTHREAD_MUTEX_LIST_OFFSET     24
+#else
+# define __PTHREAD_MUTEX_NUSERS_OFFSET   16
+# define __PTHREAD_MUTEX_KIND_OFFSET     12
+# define __PTHREAD_MUTEX_SPINS_OFFSET    20
+# define __PTHREAD_MUTEX_ELISION_OFFSET  22
+# define __PTHREAD_MUTEX_LIST_OFFSET     20
+#endif
diff --git a/sysdeps/sh/nptl/pthread-offsets.h b/sysdeps/sh/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..9617354dc7
--- /dev/null
+++ b/sysdeps/sh/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
+#define __PTHREAD_MUTEX_KIND_OFFSET     12
+#define __PTHREAD_MUTEX_SPINS_OFFSET    20
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     20
diff --git a/sysdeps/sparc/nptl/pthread-offsets.h b/sysdeps/sparc/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..bdda1f197e
--- /dev/null
+++ b/sysdeps/sparc/nptl/pthread-offsets.h
@@ -0,0 +1,15 @@
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 64
+# define __PTHREAD_MUTEX_NUSERS_OFFSET   12
+# define __PTHREAD_MUTEX_KIND_OFFSET     16
+# define __PTHREAD_MUTEX_SPINS_OFFSET    20
+# define __PTHREAD_MUTEX_ELISION_OFFSET  22
+# define __PTHREAD_MUTEX_LIST_OFFSET     24
+#else
+# define __PTHREAD_MUTEX_NUSERS_OFFSET   16
+# define __PTHREAD_MUTEX_KIND_OFFSET     12
+# define __PTHREAD_MUTEX_SPINS_OFFSET    20
+# define __PTHREAD_MUTEX_ELISION_OFFSET  22
+# define __PTHREAD_MUTEX_LIST_OFFSET     20
+#endif
diff --git a/sysdeps/tile/nptl/pthread-offsets.h b/sysdeps/tile/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..bdda1f197e
--- /dev/null
+++ b/sysdeps/tile/nptl/pthread-offsets.h
@@ -0,0 +1,15 @@
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 64
+# define __PTHREAD_MUTEX_NUSERS_OFFSET   12
+# define __PTHREAD_MUTEX_KIND_OFFSET     16
+# define __PTHREAD_MUTEX_SPINS_OFFSET    20
+# define __PTHREAD_MUTEX_ELISION_OFFSET  22
+# define __PTHREAD_MUTEX_LIST_OFFSET     24
+#else
+# define __PTHREAD_MUTEX_NUSERS_OFFSET   16
+# define __PTHREAD_MUTEX_KIND_OFFSET     12
+# define __PTHREAD_MUTEX_SPINS_OFFSET    20
+# define __PTHREAD_MUTEX_ELISION_OFFSET  22
+# define __PTHREAD_MUTEX_LIST_OFFSET     20
+#endif
diff --git a/sysdeps/x86_64/nptl/pthread-offsets.h b/sysdeps/x86_64/nptl/pthread-offsets.h
new file mode 100644
index 0000000000..16c6b0d9fd
--- /dev/null
+++ b/sysdeps/x86_64/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   12
+#define __PTHREAD_MUTEX_KIND_OFFSET     16
+#define __PTHREAD_MUTEX_SPINS_OFFSET    20
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     24