diff options
Diffstat (limited to 'sysdeps/mach/hurd')
-rw-r--r-- | sysdeps/mach/hurd/i386/tls.h | 26 | ||||
-rw-r--r-- | sysdeps/mach/hurd/tls.h | 19 |
2 files changed, 34 insertions, 11 deletions
diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h index 454d16472a..4b21349545 100644 --- a/sysdeps/mach/hurd/i386/tls.h +++ b/sysdeps/mach/hurd/i386/tls.h @@ -28,22 +28,28 @@ /* Indiciate that TLS support is available. */ # define USE_TLS 1 +/* The TCB can have any size and the memory following the address the + thread pointer points to is unspecified. Allocate the TCB there. */ +# define TLS_TCB_AT_TP 1 + +# ifndef ASSEMBLER + /* Use i386-specific RPCs to arrange that %gs segment register prefix addresses the TCB in each thread. */ # include <mach/i386/mach_i386.h> -#ifndef HAVE_I386_SET_GDT -# define __i386_set_gdt(thr, sel, desc) ((thr), (sel), (desc), MIG_BAD_ID) -#endif +# ifndef HAVE_I386_SET_GDT +# define __i386_set_gdt(thr, sel, desc) ((thr), (sel), (desc), MIG_BAD_ID) +# endif -static inline int _hurd_tls_init (tcbhead_t *, int secondcall) - __attribute__ ((unused)); +# include <errno.h> +# include <assert.h> -static inline const char * +static inline const char * __attribute__ ((unused)) _hurd_tls_init (tcbhead_t *tcb, int secondcall) { const unsigned int base = (unsigned int) tcb; - const struct descriptor desc = + struct descriptor desc = { /* low word: */ 0xffff /* limit 0..15 */ | (base << 16) /* base 0..15 */ @@ -62,7 +68,7 @@ _hurd_tls_init (tcbhead_t *tcb, int secondcall) /* Get the first available selector. */ int sel = -1; - error_t err = __i386_set_gdt (tcb->self, &sel, &desc); + error_t err = __i386_set_gdt (tcb->self, &sel, desc); if (err == MIG_BAD_ID) { /* Old kernel, use a per-thread LDT. */ @@ -93,7 +99,7 @@ _hurd_tls_init (tcbhead_t *tcb, int secondcall) } else { - error_t err = __i386_set_gdt (tcb->self, &sel, &desc); + error_t err = __i386_set_gdt (tcb->self, &sel, desc); assert_perror (err); return "i386_set_gdt failed"; } @@ -116,7 +122,7 @@ _hurd_tls_init (tcbhead_t *tcb, int secondcall) # define THREAD_DTV() \ ({ void *_dtv; __asm__ ("movl %%gs:0, %0" : "=r" (_dtv)); _dtv; }) - +# endif /* !ASSEMBLER */ #endif /* HAVE_TLS_SUPPORT */ #endif /* i386/tls.h */ diff --git a/sysdeps/mach/hurd/tls.h b/sysdeps/mach/hurd/tls.h index f550ed3a51..bc15b4dab6 100644 --- a/sysdeps/mach/hurd/tls.h +++ b/sysdeps/mach/hurd/tls.h @@ -20,7 +20,12 @@ #ifndef _TLS_H #define _TLS_H -#ifdef HAVE_TLS_SUPPORT +#if defined HAVE_TLS_SUPPORT && !defined ASSEMBLER + +# include <stddef.h> +# include <mach/mig_errors.h> +# include <mach.h> + /* Type for the dtv. */ typedef union dtv @@ -38,6 +43,7 @@ typedef struct thread_t self; /* This thread's control port. */ } tcbhead_t; + /* This is the size of the initial TCB. */ # define TLS_INIT_TCB_SIZE sizeof (tcbhead_t) @@ -50,6 +56,17 @@ typedef struct /* Alignment requirements for the TCB. */ # define TLS_TCB_ALIGN TLS_INIT_TCB_ALIGN /* XXX */ + +/* Install the dtv pointer. The pointer passed is to the element with + index -1 which contain the length. */ +# define INSTALL_DTV(descr, dtvp) \ + ((tcbhead_t *) (descr))->dtv = (dtvp) + 1 + +/* Return dtv of given thread descriptor. */ +# define GET_DTV(descr) \ + (((tcbhead_t *) (descr))->dtv) + #endif /* HAVE_TLS_SUPPORT */ + #endif /* tls.h */ |