summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2003-02-16 03:55:27 +0000
committerRoland McGrath <roland@gnu.org>2003-02-16 03:55:27 +0000
commitb0104b6f8d369692d0ca8f265b631a87df7eaeed (patch)
tree555ffba82bc5007faae6c14b52a648d050e09b7d
parent8321ef15ae777fc7e7a0716e2e931adb099f310a (diff)
* mach/errsystems.awk: Include <errno.h> in generated output.
-rw-r--r--ChangeLog2
-rw-r--r--mach/errsystems.awk6
-rw-r--r--sysdeps/mach/hurd/i386/tls.h26
-rw-r--r--sysdeps/mach/hurd/tls.h19
4 files changed, 40 insertions, 13 deletions
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 <errno.h> 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 <mach/error.h>\n#include <errorlib.h>";
- print "#define static static const"
+ print "#include <errno.h>";
+ print "#include <mach/error.h>";
+ print "#include <errorlib.h>";
+ 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 <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 */