mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-26 06:50:07 +00:00
* sysdeps/mach/hurd/i386/tls.h (HURD_TLS_DESC_DECL): New macro.
(_hurd_tls_init): Use it. (_hurd_tls_fork): New function. * sysdeps/mach/hurd/fork.c (__fork) [USE_TLS]: Call it.
This commit is contained in:
parent
269761cad3
commit
3ba7b3831f
@ -1,3 +1,10 @@
|
||||
2004-10-27 Roland McGrath <roland@frob.com>
|
||||
|
||||
* sysdeps/mach/hurd/i386/tls.h (HURD_TLS_DESC_DECL): New macro.
|
||||
(_hurd_tls_init): Use it.
|
||||
(_hurd_tls_fork): New function.
|
||||
* sysdeps/mach/hurd/fork.c (__fork) [USE_TLS]: Call it.
|
||||
|
||||
2004-10-26 Roland McGrath <roland@frob.com>
|
||||
|
||||
* sysdeps/mach/hurd/i386/tls.h (_hurd_tls_init): Initialize TCB->tcb.
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1994,95,96,97,99,2001,02 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1994,95,96,97,99,2001,02, 04 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -26,6 +26,7 @@
|
||||
#include "set-hooks.h"
|
||||
#include <assert.h>
|
||||
#include "hurdmalloc.h" /* XXX */
|
||||
#include <tls.h>
|
||||
|
||||
#undef __fork
|
||||
|
||||
@ -529,6 +530,13 @@ __fork (void)
|
||||
|
||||
/* Set the child user thread up to return 1 from the setjmp above. */
|
||||
_hurd_longjmp_thread_state (&state, env, 1);
|
||||
|
||||
#if USE_TLS
|
||||
/* Do special thread setup for TLS if needed. */
|
||||
if (err = _hurd_tls_fork (thread, &state))
|
||||
LOSE;
|
||||
#endif
|
||||
|
||||
if (err = __thread_set_state (thread, MACHINE_THREAD_STATE_FLAVOR,
|
||||
(natural_t *) &state, statecount))
|
||||
LOSE;
|
||||
|
@ -45,21 +45,24 @@
|
||||
# include <errno.h>
|
||||
# include <assert.h>
|
||||
|
||||
#define HURD_TLS_DESC_DECL(desc, tcb) \
|
||||
struct descriptor desc = \
|
||||
{ /* low word: */ \
|
||||
0xffff /* limit 0..15 */ \
|
||||
| (((unsigned int) (tcb)) << 16) /* base 0..15 */ \
|
||||
, /* high word: */ \
|
||||
((((unsigned int) (tcb)) >> 16) & 0xff) /* base 16..23 */ \
|
||||
| ((0x12 | 0x60 | 0x80) << 8) /* access = ACC_DATA_W|ACC_PL_U|ACC_P */ \
|
||||
| (0xf << 16) /* limit 16..19 */ \
|
||||
| ((4 | 8) << 20) /* granularity = SZ_32|SZ_G */ \
|
||||
| (((unsigned int) (tcb)) & 0xff000000) /* base 24..31 */ \
|
||||
}
|
||||
|
||||
|
||||
static inline const char * __attribute__ ((unused))
|
||||
_hurd_tls_init (tcbhead_t *tcb, int secondcall)
|
||||
{
|
||||
const unsigned int base = (unsigned int) tcb;
|
||||
struct descriptor desc =
|
||||
{ /* low word: */
|
||||
0xffff /* limit 0..15 */
|
||||
| (base << 16) /* base 0..15 */
|
||||
, /* high word: */
|
||||
((base >> 16) & 0xff) /* base 16..23 */
|
||||
| ((0x12 | 0x60 | 0x80) << 8) /* access = ACC_DATA_W|ACC_PL_U|ACC_P */
|
||||
| (0xf << 16) /* limit 16..19 */
|
||||
| ((4 | 8) << 20) /* granularity = SZ_32|SZ_G */
|
||||
| (base & 0xff000000) /* base 24..31 */
|
||||
};
|
||||
HURD_TLS_DESC_DECL (desc, tcb);
|
||||
|
||||
if (!secondcall)
|
||||
{
|
||||
@ -140,6 +143,29 @@ _hurd_tls_init (tcbhead_t *tcb, int secondcall)
|
||||
asm ("movl %%gs:%P1,%0" : "=q" (_dtv) : "i" (offsetof (tcbhead_t, dtv)));\
|
||||
_dtv; })
|
||||
|
||||
/* Set up TLS in the new thread of a fork child, copying from our own. */
|
||||
static inline error_t __attribute__ ((unused))
|
||||
_hurd_tls_fork (thread_t child, struct machine_thread_state *state)
|
||||
{
|
||||
/* Fetch the selector set by _hurd_tls_init. */
|
||||
int sel;
|
||||
asm ("mov %%gs, %w0" : "=q" (sel));
|
||||
if (sel == state->ds) /* _hurd_tls_init was never called. */
|
||||
return 0;
|
||||
|
||||
tcbhead_t *const tcb = THREAD_SELF;
|
||||
HURD_TLS_DESC_DECL (desc, tcb);
|
||||
error_t err;
|
||||
|
||||
if (__builtin_expect (sel, 0x50) & 4) /* LDT selector */
|
||||
err = __i386_set_ldt (child, sel, &desc, 1);
|
||||
else
|
||||
err = __i386_set_gdt (child, &sel, desc);
|
||||
|
||||
state->gs = sel;
|
||||
return err;
|
||||
}
|
||||
|
||||
# endif /* !ASSEMBLER */
|
||||
#endif /* HAVE_TLS_SUPPORT */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user