1 /* Definition for thread-local data handling. NPTL/Alpha version. 2 Copyright (C) 2003, 2005 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 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 #ifndef _TLS_H 21 #define _TLS_H 1 22 23 #ifndef __ASSEMBLER__ 24 # include <stdbool.h> 25 # include <stddef.h> 26 # include <stdint.h> 27 28 /* Type for the dtv. */ 29 typedef union dtv 30 { 31 size_t counter; 32 struct 33 { 34 void *val; 35 bool is_static; 36 } pointer; 37 } dtv_t; 38 39 #else /* __ASSEMBLER__ */ 40 # include <tcb-offsets.h> 41 #endif /* __ASSEMBLER__ */ 42 43 44 /* We require TLS support in the tools. */ 45 #ifndef HAVE_TLS_SUPPORT 46 # error "TLS support is required." 47 #endif 48 49 /* Signal that TLS support is available. */ 50 # define USE_TLS 1 51 52 #ifndef __ASSEMBLER__ 53 54 /* Get system call information. */ 55 # include <sysdep.h> 56 57 /* The TP points to the start of the thread blocks. */ 58 # define TLS_DTV_AT_TP 1 59 60 /* Get the thread descriptor definition. */ 61 # include <nptl/descr.h> 62 63 typedef struct 64 { 65 dtv_t *dtv; 66 void *private; 67 } tcbhead_t; 68 69 /* This is the size of the initial TCB. */ 70 # define TLS_INIT_TCB_SIZE sizeof (tcbhead_t) 71 72 /* Alignment requirements for the initial TCB. */ 73 # define TLS_INIT_TCB_ALIGN 16 74 75 /* This is the size of the TCB. */ 76 # define TLS_TCB_SIZE sizeof (tcbhead_t) 77 78 /* This is the size we need before TCB. */ 79 # define TLS_PRE_TCB_SIZE sizeof (struct pthread) 80 81 /* Alignment requirements for the TCB. */ 82 # define TLS_TCB_ALIGN 16 83 84 /* Install the dtv pointer. The pointer passed is to the element with 85 index -1 which contain the length. */ 86 # define INSTALL_DTV(tcbp, dtvp) \ 87 (((tcbhead_t *) (tcbp))->dtv = (dtvp) + 1) 88 89 /* Install new dtv for current thread. */ 90 # define INSTALL_NEW_DTV(dtv) \ 91 (THREAD_DTV() = (dtv)) 92 93 /* Return dtv of given thread descriptor. */ 94 # define GET_DTV(tcbp) \ 95 (((tcbhead_t *) (tcbp))->dtv) 96 97 /* Code to initially initialize the thread pointer. This might need 98 special attention since 'errno' is not yet available and if the 99 operation can cause a failure 'errno' must not be touched. */ 100 # define TLS_INIT_TP(tcbp, secondcall) \ 101 (__builtin_set_thread_pointer ((void *)(tcbp)), NULL) 102 103 /* Return the address of the dtv for the current thread. */ 104 # define THREAD_DTV() \ 105 (((tcbhead_t *) __builtin_thread_pointer ())->dtv) 106 107 /* Return the thread descriptor for the current thread. */ 108 # define THREAD_SELF \ 109 ((struct pthread *)__builtin_thread_pointer () - 1) 110 111 /* Magic for libthread_db to know how to do THREAD_SELF. */ 112 # define DB_THREAD_SELF \ 113 REGISTER (64, 64, 32 * 8, -sizeof (struct pthread)) 114 115 /* Access to data in the thread descriptor is easy. */ 116 #define THREAD_GETMEM(descr, member) \ 117 descr->member 118 #define THREAD_GETMEM_NC(descr, member, idx) \ 119 descr->member[idx] 120 #define THREAD_SETMEM(descr, member, value) \ 121 descr->member = (value) 122 #define THREAD_SETMEM_NC(descr, member, idx, value) \ 123 descr->member[idx] = (value) 124 125 #endif /* __ASSEMBLER__ */ 126 127 #endif /* tls.h */ 128