diff --git a/ChangeLog b/ChangeLog index ad1aa6bc7c..5938d27a4b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,8 @@ * sysdeps/mach/hurd/tls.h: New file. * sysdeps/mach/hurd/i386/tls.h: New file. + * mach/errsystems.awk: Include in generated output. + * sysdeps/mach/Makefile (mach-before-compile rule): Pass generating=t, use target mach-before-compile instead of generated. (mach-before-compile): New target. diff --git a/mach/errsystems.awk b/mach/errsystems.awk index b01c1bd0eb..a5e93604bc 100644 --- a/mach/errsystems.awk +++ b/mach/errsystems.awk @@ -1,6 +1,8 @@ BEGIN { - print "#include \n#include "; - print "#define static static const" + print "#include "; + print "#include "; + print "#include "; + print "#define static static const"; nsubs = split(subsys, subs); while (nsubs > 0) printf "#include \"%s\"\n", subs[nsubs--]; print "\n\n\ 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 -#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 +# include -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 +# include +# include + /* 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 */