At comment about lock position.
[kopensolaris-gnu/glibc.git] / nptl / sysdeps / unix / sysv / linux / i386 / createthread.c
1 /* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 /* The "thread register" gets initialized from a segment descriptor.
21    Initialize such a descriptor first.  */
22 #define PREPARE_CREATE \
23   union user_desc_init desc;                                                  \
24                                                                               \
25   /* Describe the thread-local storage segment.  */                           \
26                                                                               \
27   /* The 'entry_number' field.  The first three bits of the segment           \
28      register value select the GDT, ignore them.  We get the index            \
29      from the value of the %gs register in the current thread.  */            \
30   desc.vals[0] = TLS_GET_GS () >> 3;                                          \
31   /* The 'base_addr' field.  Pointer to the TCB.  */                          \
32   desc.vals[1] = (unsigned long int) pd;                                      \
33   /* The 'limit' field.  We use 4GB which is 0xfffff pages.  */               \
34   desc.vals[2] = 0xfffff;                                                     \
35   /* Collapsed value of the bitfield:                                         \
36        .seg_32bit = 1                                                         \
37        .contents = 0                                                          \
38        .read_exec_only = 0                                                    \
39        .limit_in_pages = 1                                                    \
40        .seg_not_present = 0                                                   \
41        .useable = 1 */                                                        \
42   desc.vals[3] = 0x51
43
44 /* Value passed to 'clone' for initialization of the thread register.  */
45 #define TLS_VALUE &desc.desc
46
47
48 /* Get the real implementation.  */
49 #include <nptl/sysdeps/pthread/createthread.c>