From patchwork Sat Feb 18 20:37:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Bugaev X-Patchwork-Id: 65217 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 69FF638493E6 for ; Sat, 18 Feb 2023 20:37:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 69FF638493E6 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1676752677; bh=kHUQysNl+lRIh2OlRIXwAEDdiPpu/39tpfdW9giRcTY=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=SgYrpC35o0OcHXN6G9YaaF4VqvNP/qwkcf3lzMbUh0kpnHtUuD7h19W/SJVbUAiye l9BM83BsI4j67jeZtH8SKQlak/v5AgQbFXDfJJVNsKOOZjXTTlES2MnUwLEVsVZvof SMRQ4tBgfQexFRAuSgzjyRwYnyRXLkauP8q9z2UI= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-lj1-x233.google.com (mail-lj1-x233.google.com [IPv6:2a00:1450:4864:20::233]) by sourceware.org (Postfix) with ESMTPS id C1DE33858D38 for ; Sat, 18 Feb 2023 20:37:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C1DE33858D38 Received: by mail-lj1-x233.google.com with SMTP id j3so1396325lji.7 for ; Sat, 18 Feb 2023 12:37:34 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kHUQysNl+lRIh2OlRIXwAEDdiPpu/39tpfdW9giRcTY=; b=3pOCH1SGBStfZYTFdgR0p5gZE81AqLoGaoyKV/CFVSqAbnzKVn8AtzmJb3U+SgSe6R UdOo6JbU5DmzsoM2asI+9b/tdPWKH+IztGKoVbGSe2sqC7VIo4B7iVxCCCOFyMc4eDxY ENquVyHUPG1MxfsTUnrZpA9xJ3BqG2aBv46x4qx6c72FN25S3i5ipor9uJuS1q61/Bmz zW1LMQh4bE2zMeAIibBHAoDmgO1nn7gGUgDZaDSWzL9dy0HNpOVES7Tbh35LwFpOj33L vOKudrZUBf03qaLmfRL/d6g1pUR5oUWJw+xw1KX2huDTDzrkeQJlRDgaeNJKXwr6RxHD YgmQ== X-Gm-Message-State: AO0yUKUmBxyXILNa2bnkO/mXnQ4BIVfkJq7nKlzHh2t6bm983JZBs1M0 S8Q0Agxr5J1u5GQ10lgArYA= X-Google-Smtp-Source: AK7set/Ldrt1D4d6325tXG4G2gJvmI3X2cTUcuvmWuM3pR0NRniAePHGgDV5QA4bkzCmyN+I1NQJuA== X-Received: by 2002:a2e:a808:0:b0:290:4ddb:ed42 with SMTP id l8-20020a2ea808000000b002904ddbed42mr2592265ljq.21.1676752653200; Sat, 18 Feb 2023 12:37:33 -0800 (PST) Received: from surface-pro-6.. ([2a00:1370:818c:4a57:e4a7:ca9:e8d7:4ead]) by smtp.gmail.com with ESMTPSA id u15-20020a05651c130f00b002934febffe4sm1004049lja.128.2023.02.18.12.37.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 18 Feb 2023 12:37:31 -0800 (PST) To: bug-hurd@gnu.org, libc-alpha@sourceware.org Cc: =?utf-8?q?Fl=C3=A1vio_Cruz?= , Sergey Bugaev Subject: [RFC PATCH 1/9] hurd: Move thread state manipulation into _hurd_tls_new () Date: Sat, 18 Feb 2023 23:37:09 +0300 Message-Id: <20230218203717.373211-2-bugaevc@gmail.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230218203717.373211-1-bugaevc@gmail.com> References: <20230218203717.373211-1-bugaevc@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Sergey Bugaev via Libc-alpha From: Sergey Bugaev Reply-To: Sergey Bugaev Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" This is going to be done differently on x86_64. Signed-off-by: Sergey Bugaev --- 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. */