summaryrefslogtreecommitdiff
path: root/libpthread/nptl/sysdeps/unix/sysv/linux/i386/createthread.c
blob: e64c3271ba68cba4c66051baf975d417c9597f34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.

   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/>.  */

/* The "thread register" gets initialized from a segment descriptor.
   Initialize such a descriptor first.  */
#define PREPARE_CREATE \
  union user_desc_init desc;						      \
									      \
  /* Describe the thread-local storage segment.  */			      \
									      \
  /* The 'entry_number' field.  The first three bits of the segment	      \
     register value select the GDT, ignore them.  We get the index	      \
     from the value of the %gs register in the current thread.  */	      \
  desc.vals[0] = TLS_GET_GS () >> 3;					      \
  /* The 'base_addr' field.  Pointer to the TCB.  */			      \
  desc.vals[1] = (unsigned long int) pd;				      \
  /* The 'limit' field.  We use 4GB which is 0xfffff pages.  */		      \
  desc.vals[2] = 0xfffff;						      \
  /* Collapsed value of the bitfield:					      \
       .seg_32bit = 1							      \
       .contents = 0							      \
       .read_exec_only = 0						      \
       .limit_in_pages = 1						      \
       .seg_not_present = 0						      \
       .useable = 1 */							      \
  desc.vals[3] = 0x51

/* Value passed to 'clone' for initialization of the thread register.  */
#define TLS_VALUE &desc.desc


/* Get the real implementation.  */
#include <sysdeps/pthread/createthread.c>