1 From 16be5568a0c24b9bd1ade7fa937c94b5d53b6ab1 Mon Sep 17 00:00:00 2001
2 From: "H.J. Lu" <hjl.tools@gmail.com>
3 Date: Sun, 15 Oct 2017 07:48:58 -0700
4 Subject: [PATCH] Define __PTHREAD_MUTEX_HAVE_PREV only if undefined [BZ
7 It is incorrect to define __PTHREAD_MUTEX_HAVE_PREV to 1 only when
8 __WORDSIZE == 64. For x32, __PTHREAD_MUTEX_HAVE_PREV should be 1, but
9 it has __WORDSIZE == 32. This patch defines __PTHREAD_MUTEX_HAVE_PREV
10 based on __WORDSIZE only if it is undefined. __PTHREAD_MUTEX_HAVE_PREV
11 check is changed from "#ifdef" to "#if" to support values of 0 or 1.
14 * nptl/allocatestack.c (allocate_stack): Check if
15 __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if
16 __PTHREAD_MUTEX_HAVE_PREV is defined.
17 * nptl/descr.h (pthread): Likewise.
18 * nptl/nptl-init.c (__pthread_initialize_minimal_internal):
20 * nptl/pthread_create.c (START_THREAD_DEFN): Likewise.
21 * sysdeps/nptl/fork.c (__libc_fork): Likewise.
22 * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise.
23 * sysdeps/nptl/bits/thread-shared-types.h
24 (__PTHREAD_MUTEX_HAVE_PREV): Define only if it is undefined.
25 (__pthread_internal_list): Check __pthread_internal_list instead
27 (__PTHREAD_SPINS_DATA): Likewise.
28 (__PTHREAD_SPINS): Likewise.
29 (__pthread_mutex_s): Likewise.
30 * sysdeps/x86/nptl/bits/pthreadtypes-arch.h
31 (__PTHREAD_MUTEX_HAVE_PREV): Defined.
33 nptl/allocatestack.c | 2 +-
35 nptl/nptl-init.c | 2 +-
36 nptl/pthread_create.c | 4 ++--
37 sysdeps/nptl/bits/thread-shared-types.h | 17 ++++++++++++-----
38 sysdeps/nptl/fork.c | 2 +-
39 sysdeps/nptl/pthread.h | 2 +-
40 sysdeps/x86/nptl/bits/pthreadtypes-arch.h | 2 ++
41 8 files changed, 21 insertions(+), 12 deletions(-)
43 diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
44 index ad9add8..1cc7893 100644
45 --- a/nptl/allocatestack.c
46 +++ b/nptl/allocatestack.c
47 @@ -753,7 +753,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
48 - offsetof (pthread_mutex_t,
49 __data.__list.__next));
50 pd->robust_head.list_op_pending = NULL;
51 -#ifdef __PTHREAD_MUTEX_HAVE_PREV
52 +#if __PTHREAD_MUTEX_HAVE_PREV
53 pd->robust_prev = &pd->robust_head;
55 pd->robust_head.list = &pd->robust_head;
56 diff --git a/nptl/descr.h b/nptl/descr.h
57 index c5ad0c8..c83b17b 100644
60 @@ -169,7 +169,7 @@ struct pthread
63 /* List of robust mutexes the thread is holding. */
64 -#ifdef __PTHREAD_MUTEX_HAVE_PREV
65 +#if __PTHREAD_MUTEX_HAVE_PREV
67 struct robust_list_head robust_head;
69 diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
70 index 2921607..869e926 100644
71 --- a/nptl/nptl-init.c
72 +++ b/nptl/nptl-init.c
73 @@ -297,7 +297,7 @@ __pthread_initialize_minimal_internal (void)
75 /* Initialize the robust mutex data. */
77 -#ifdef __PTHREAD_MUTEX_HAVE_PREV
78 +#if __PTHREAD_MUTEX_HAVE_PREV
79 pd->robust_prev = &pd->robust_head;
81 pd->robust_head.list = &pd->robust_head;
82 diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
83 index 992331e..51ae60d 100644
84 --- a/nptl/pthread_create.c
85 +++ b/nptl/pthread_create.c
86 @@ -518,7 +518,7 @@ START_THREAD_DEFN
88 #ifndef __ASSUME_SET_ROBUST_LIST
89 /* If this thread has any robust mutexes locked, handle them now. */
90 -# ifdef __PTHREAD_MUTEX_HAVE_PREV
91 +# if __PTHREAD_MUTEX_HAVE_PREV
92 void *robust = pd->robust_head.list;
94 __pthread_slist_t *robust = pd->robust_list.__next;
95 @@ -536,7 +536,7 @@ START_THREAD_DEFN
97 robust = *((void **) robust);
99 -# ifdef __PTHREAD_MUTEX_HAVE_PREV
100 +# if __PTHREAD_MUTEX_HAVE_PREV
101 this->__list.__prev = NULL;
103 this->__list.__next = NULL;
104 diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h
105 index 68b82b6..d2c4f67 100644
106 --- a/sysdeps/nptl/bits/thread-shared-types.h
107 +++ b/sysdeps/nptl/bits/thread-shared-types.h
110 /* Common definition of pthread_mutex_t. */
112 -#if __WORDSIZE == 64
113 +#ifndef __PTHREAD_MUTEX_HAVE_PREV
114 +# if __WORDSIZE == 64
115 +# define __PTHREAD_MUTEX_HAVE_PREV 1
117 +# define __PTHREAD_MUTEX_HAVE_PREV 0
121 +#if __PTHREAD_MUTEX_HAVE_PREV
122 typedef struct __pthread_internal_list
124 struct __pthread_internal_list *__prev;
125 @@ -74,7 +82,7 @@ typedef struct __pthread_internal_slist
127 /* Lock elision support. */
128 #if __PTHREAD_MUTEX_LOCK_ELISION
129 -# if __WORDSIZE == 64
130 +# if __PTHREAD_MUTEX_HAVE_PREV
131 # define __PTHREAD_SPINS_DATA \
134 @@ -101,17 +109,16 @@ struct __pthread_mutex_s
135 int __lock __LOCK_ALIGNMENT;
136 unsigned int __count;
138 -#if __WORDSIZE == 64
139 +#if __PTHREAD_MUTEX_HAVE_PREV
140 unsigned int __nusers;
142 /* KIND must stay at this position in the structure to maintain
143 binary compatibility with static initializers. */
145 __PTHREAD_COMPAT_PADDING_MID
146 -#if __WORDSIZE == 64
147 +#if __PTHREAD_MUTEX_HAVE_PREV
148 __PTHREAD_SPINS_DATA;
149 __pthread_list_t __list;
150 -# define __PTHREAD_MUTEX_HAVE_PREV 1
152 unsigned int __nusers;
154 diff --git a/sysdeps/nptl/fork.c b/sysdeps/nptl/fork.c
155 index 4bb87e2..48676c2 100644
156 --- a/sysdeps/nptl/fork.c
157 +++ b/sysdeps/nptl/fork.c
158 @@ -166,7 +166,7 @@ __libc_fork (void)
159 inherit the correct value from the parent. We do not need to clear
160 the pending operation because it must have been zero when fork was
162 -# ifdef __PTHREAD_MUTEX_HAVE_PREV
163 +# if __PTHREAD_MUTEX_HAVE_PREV
164 self->robust_prev = &self->robust_head;
166 self->robust_head.list = &self->robust_head;
167 diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h
168 index 632ea7b..2b2b386 100644
169 --- a/sysdeps/nptl/pthread.h
170 +++ b/sysdeps/nptl/pthread.h
171 @@ -83,7 +83,7 @@ enum
175 -#ifdef __PTHREAD_MUTEX_HAVE_PREV
176 +#if __PTHREAD_MUTEX_HAVE_PREV
177 # define PTHREAD_MUTEX_INITIALIZER \
178 { { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { 0, 0 } } }
180 diff --git a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h
181 index fd86806..2446d8d 100644
182 --- a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h
183 +++ b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h
185 #include <bits/wordsize.h>
188 +# define __PTHREAD_MUTEX_HAVE_PREV 1
189 # if __WORDSIZE == 64
190 # define __SIZEOF_PTHREAD_MUTEX_T 40
191 # define __SIZEOF_PTHREAD_ATTR_T 56
193 # define __SIZEOF_PTHREAD_BARRIER_T 20
196 +# define __PTHREAD_MUTEX_HAVE_PREV 0
197 # define __SIZEOF_PTHREAD_MUTEX_T 24
198 # define __SIZEOF_PTHREAD_ATTR_T 36
199 # define __SIZEOF_PTHREAD_MUTEX_T 24
203 From df44f9d02b68de45ba8c3984f47ecf1a523306ec Mon Sep 17 00:00:00 2001
204 From: "H.J. Lu" <hjl.tools@gmail.com>
205 Date: Sun, 15 Oct 2017 07:23:41 -0700
206 Subject: [PATCH] x32: Verify that NPTL structures are correct [BZ #22298]
208 Add a build-time check to verify that NPTL structures are correct.
210 * sysdeps/x86_64/x32/nptl/Makefile: New file.
211 * sysdeps/x86_64/x32/nptl/nptl-check.sym: Likewise.
213 sysdeps/x86_64/x32/nptl/Makefile | 4 ++++
214 sysdeps/x86_64/x32/nptl/nptl-check.sym | 9 +++++++++
215 2 files changed, 13 insertions(+)
216 create mode 100644 sysdeps/x86_64/x32/nptl/Makefile
217 create mode 100644 sysdeps/x86_64/x32/nptl/nptl-check.sym
219 diff --git a/sysdeps/x86_64/x32/nptl/Makefile b/sysdeps/x86_64/x32/nptl/Makefile
221 index 0000000..e780bea
223 +++ b/sysdeps/x86_64/x32/nptl/Makefile
225 +ifeq ($(subdir),csu)
226 +# Verify that NPTL structures are correct.
227 +gen-as-const-headers += nptl-check.sym
229 diff --git a/sysdeps/x86_64/x32/nptl/nptl-check.sym b/sysdeps/x86_64/x32/nptl/nptl-check.sym
231 index 0000000..8573250
233 +++ b/sysdeps/x86_64/x32/nptl/nptl-check.sym
236 +#include <pthread.h>
238 +PREV offsetof (struct __pthread_internal_list, __prev)
239 +NEXT offsetof (struct __pthread_internal_list, __next)
241 +#if __PTHREAD_MUTEX_HAVE_PREV != 1
242 +#error __PTHREAD_MUTEX_HAVE_PREV must be 1