mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
hurd: Move thread state manipulation into _hurd_tls_new ()
This is going to be done differently on x86_64. Signed-off-by: Sergey Bugaev <bugaevc@gmail.com> Message-Id: <20230218203717.373211-2-bugaevc@gmail.com>
This commit is contained in:
parent
a307e1b315
commit
e48f33e76b
@ -83,25 +83,11 @@ weak_alias (__mach_setup_thread, mach_setup_thread)
|
||||
kern_return_t
|
||||
__mach_setup_tls (thread_t thread)
|
||||
{
|
||||
kern_return_t error;
|
||||
struct machine_thread_state ts;
|
||||
mach_msg_type_number_t tssize = MACHINE_THREAD_STATE_COUNT;
|
||||
tcbhead_t *tcb;
|
||||
|
||||
tcb = _dl_allocate_tls (NULL);
|
||||
tcbhead_t *tcb = _dl_allocate_tls (NULL);
|
||||
if (tcb == NULL)
|
||||
return KERN_RESOURCE_SHORTAGE;
|
||||
|
||||
if (error = __thread_get_state (thread, MACHINE_THREAD_STATE_FLAVOR,
|
||||
(natural_t *) &ts, &tssize))
|
||||
return error;
|
||||
assert (tssize == MACHINE_THREAD_STATE_COUNT);
|
||||
|
||||
_hurd_tls_new (thread, &ts, tcb);
|
||||
|
||||
error = __thread_set_state (thread, MACHINE_THREAD_STATE_FLAVOR,
|
||||
(natural_t *) &ts, tssize);
|
||||
return error;
|
||||
return _hurd_tls_new (thread, tcb);
|
||||
}
|
||||
|
||||
weak_alias (__mach_setup_tls, mach_setup_tls)
|
||||
|
@ -378,16 +378,25 @@ _hurd_tls_fork (thread_t child, thread_t orig, struct i386_thread_state *state)
|
||||
}
|
||||
|
||||
static inline kern_return_t __attribute__ ((unused))
|
||||
_hurd_tls_new (thread_t child, struct i386_thread_state *state, tcbhead_t *tcb)
|
||||
_hurd_tls_new (thread_t child, tcbhead_t *tcb)
|
||||
{
|
||||
error_t err;
|
||||
/* Fetch the target thread's state. */
|
||||
struct i386_thread_state state;
|
||||
mach_msg_type_number_t state_count = i386_THREAD_STATE_COUNT;
|
||||
err = __thread_get_state (child, i386_REGS_SEGS_STATE,
|
||||
(thread_state_t) &state,
|
||||
&state_count);
|
||||
if (err)
|
||||
return err;
|
||||
assert (state_count == i386_THREAD_STATE_COUNT);
|
||||
/* Fetch the selector set by _hurd_tls_init. */
|
||||
int sel;
|
||||
asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0));
|
||||
if (sel == state->ds) /* _hurd_tls_init was never called. */
|
||||
if (sel == state.ds) /* _hurd_tls_init was never called. */
|
||||
return 0;
|
||||
|
||||
HURD_TLS_DESC_DECL (desc, tcb);
|
||||
error_t err;
|
||||
|
||||
tcb->tcb = tcb;
|
||||
tcb->self = child;
|
||||
@ -397,8 +406,14 @@ _hurd_tls_new (thread_t child, struct i386_thread_state *state, tcbhead_t *tcb)
|
||||
else
|
||||
err = __i386_set_gdt (child, &sel, desc);
|
||||
|
||||
state->gs = sel;
|
||||
return err;
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Update gs to use the selector. */
|
||||
state.gs = sel;
|
||||
return __thread_set_state (child, i386_REGS_SEGS_STATE,
|
||||
(thread_state_t) &state,
|
||||
state_count);
|
||||
}
|
||||
|
||||
/* Global scope switch support. */
|
||||
|
Loading…
Reference in New Issue
Block a user