Applied, thanks! Sergey Bugaev, le sam. 18 févr. 2023 23:37:09 +0300, a ecrit: > This is going to be done differently on x86_64. > > Signed-off-by: Sergey Bugaev <buga...@gmail.com> > --- > mach/setup-thread.c | 18 ++---------------- > sysdeps/mach/hurd/i386/tls.h | 25 ++++++++++++++++++++----- > 2 files changed, 22 insertions(+), 21 deletions(-) > > diff --git a/mach/setup-thread.c b/mach/setup-thread.c > index 6ce5c13d..ae24a149 100644 > --- a/mach/setup-thread.c > +++ b/mach/setup-thread.c > @@ -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) > diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h > index 590abd47..0f8dd241 100644 > --- a/sysdeps/mach/hurd/i386/tls.h > +++ b/sysdeps/mach/hurd/i386/tls.h > @@ -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. */ > -- > 2.39.2 > >
-- Samuel --- Pour une évaluation indépendante, transparente et rigoureuse ! Je soutiens la Commission d'Évaluation de l'Inria.