From patchwork Tue Feb 14 17:37:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Bugaev X-Patchwork-Id: 65001 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 6097A385700E for ; Tue, 14 Feb 2023 17:37:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6097A385700E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1676396275; bh=RRwJs9KfoYSLONnf+VCi9ztUu0dkiLXr2gxfrRnyogA=; 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=AGbOww6BUHCYIedzn5xOZO4glZHEiAlY7y+vCVtpMNbheWQ+q4Ep1lXSn29vlP93J 7VH+YT1s0GDsFH59qjnXTKi3pYjcbBEqCYKROASiPB6ILYoHZPEUHdFCOvBPSsloqF he6IPQNZf/SiiHTTTqBF6DibZ5TjI1aG/mmUbBCQ= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-lf1-x132.google.com (mail-lf1-x132.google.com [IPv6:2a00:1450:4864:20::132]) by sourceware.org (Postfix) with ESMTPS id EB4233858D33 for ; Tue, 14 Feb 2023 17:37:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org EB4233858D33 Received: by mail-lf1-x132.google.com with SMTP id j17so24533130lfr.3 for ; Tue, 14 Feb 2023 09:37:30 -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=RRwJs9KfoYSLONnf+VCi9ztUu0dkiLXr2gxfrRnyogA=; b=oeuS3P60lcYOOzTeFZWugnPyPkpi2gCba9NpGmcmiBegClmLCHSALluPhikGGyXqbx 0vZIh/jccwU0dARIgPSFznFh82CXRoQLB+RasDT+XdspnbhJBb7sKEnCFSkeIDc2BKcI WUuyxohanQ0X26Xxw5nsZHMckIYV8bsV4cmdjJn4c31DSMhq4PcY+R/DZEHf8mrMON3V l9Y6k3Mlu/7l7NSjideuG8BESeLo9WRC9da0e4Y5pFZPCZUKyzXkbxDpURFJeZDOM+VE c2P4uWd2gmjNm0vb17Gmmk4xHLJkFpGwtwJqjEOONdJjYm8DG9eB/tIZPpJfiLDcvHWd vC9w== X-Gm-Message-State: AO0yUKUxqenjLlsXb2Qfj8899HzFtMQKb++TAWPCLem8wL4wldILh/3u RbpzqvWJjIBYwQK8+gX2PN3IwVN7qsETm2Nx X-Google-Smtp-Source: AK7set+Myy7C5KYjLl1mAkFMdI3P4DAsL1zzAbqDaxO89PzSO02cBDXkDr7PVnsT7K7dlSqHBigSWg== X-Received: by 2002:ac2:5198:0:b0:4d5:99e4:7fcc with SMTP id u24-20020ac25198000000b004d599e47fccmr910595lfi.13.1676396249378; Tue, 14 Feb 2023 09:37:29 -0800 (PST) Received: from surface-pro-6.. ([194.190.106.50]) by smtp.gmail.com with ESMTPSA id w12-20020a19c50c000000b004db3e7dfb8csm424185lfe.189.2023.02.14.09.37.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Feb 2023 09:37:28 -0800 (PST) To: bug-hurd@gnu.org, libc-alpha@sourceware.org Cc: Sergey Bugaev Subject: [PATCH 1/3] hurd: i386 TLS tweaks Date: Tue, 14 Feb 2023 20:37:20 +0300 Message-Id: <20230214173722.428140-2-bugaevc@gmail.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230214173722.428140-1-bugaevc@gmail.com> References: <20230214173722.428140-1-bugaevc@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-10.9 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" * Micro-optimize TLS access using GCC's native support for gs-based addressing when available; * Just use THREAD_GETMEM and THREAD_SETMEM instead of more inline assembly; * Sync tcbhead_t layout with NPTL, in particular update/fix __private_ss offset; * Statically assert that the two offsets that are a part of ABI are what we expect them to be. Signed-off-by: Sergey Bugaev --- sysdeps/mach/hurd/i386/tls.h | 48 ++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h index a6ff0107..dc43d4c7 100644 --- a/sysdeps/mach/hurd/i386/tls.h +++ b/sysdeps/mach/hurd/i386/tls.h @@ -38,11 +38,12 @@ typedef struct uintptr_t stack_guard; uintptr_t pointer_guard; int gscope_flag; - int private_futex; + unsigned int feature_1; /* Reservation of some values for the TM ABI. */ - void *__private_tm[4]; + void *__private_tm[3]; /* GCC split stack support. */ void *__private_ss; + void *__glibc_padding1; /* Keep these fields last, so offsets of fields above can continue being compatible with the i386 Linux version. */ @@ -53,6 +54,13 @@ typedef struct struct rtld_catch *rtld_catch; } tcbhead_t; +/* GCC generates %gs:0x14 to access the stack guard. */ +_Static_assert (offsetof (tcbhead_t, stack_guard) == 0x14, + "stack guard offset"); +/* libgcc uses %gs:0x30 to access the split stack pointer. */ +_Static_assert (offsetof (tcbhead_t, __private_ss) == 0x30, + "split stack pointer offset"); + /* Return tcbhead_t from a TLS segment descriptor. */ # define HURD_DESC_TLS(desc) \ ({ \ @@ -166,8 +174,25 @@ out: # define TLS_INIT_TP(descr) \ _hurd_tls_init ((tcbhead_t *) (descr)) +# if __GNUC_PREREQ (6, 0) + +# define THREAD_SELF \ + (*(tcbhead_t * __seg_gs *) offsetof (tcbhead_t, tcb)) +# define THREAD_GETMEM(descr, member) \ + (*(__typeof (descr->member) __seg_gs *) offsetof (tcbhead_t, member)) +# define THREAD_GETMEM_NC(descr, member, idx) \ + (*(__typeof (descr->member[0]) __seg_gs *) \ + (offsetof (tcbhead_t, member) + (idx) * sizeof (descr->member[0]))) +# define THREAD_SETMEM(descr, member, value) \ + (*(__typeof (descr->member) __seg_gs *) offsetof (tcbhead_t, member) = value) +# define THREAD_SETMEM_NC(descr, member, index, value) \ + (*(__typeof (descr->member[0]) __seg_gs *) \ + (offsetof (tcbhead_t, member) + (idx) * sizeof (descr->member[0]))) + +# else + /* Return the TCB address of the current thread. */ -# define THREAD_SELF \ +# define THREAD_SELF \ ({ tcbhead_t *__tcb; \ __asm__ ("movl %%gs:%c1,%0" : "=r" (__tcb) \ : "i" (offsetof (tcbhead_t, tcb))); \ @@ -200,7 +225,7 @@ out: /* Same as THREAD_GETMEM, but the member offset can be non-constant. */ -# define THREAD_GETMEM_NC(descr, member, idx) \ +# define THREAD_GETMEM_NC(descr, member, idx) \ ({ __typeof (descr->member[0]) __value; \ _Static_assert (sizeof (__value) == 1 \ || sizeof (__value) == 4 \ @@ -229,7 +254,7 @@ out: /* Set member of the thread descriptor directly. */ -# define THREAD_SETMEM(descr, member, value) \ +# define THREAD_SETMEM(descr, member, value) \ ({ \ _Static_assert (sizeof (descr->member) == 1 \ || sizeof (descr->member) == 4 \ @@ -254,7 +279,7 @@ out: /* Same as THREAD_SETMEM, but the member offset can be non-constant. */ -# define THREAD_SETMEM_NC(descr, member, idx, value) \ +# define THREAD_SETMEM_NC(descr, member, idx, value) \ ({ \ _Static_assert (sizeof (descr->member[0]) == 1 \ || sizeof (descr->member[0]) == 4 \ @@ -279,6 +304,8 @@ out: "r" (idx)); \ }}) +# endif /* __GNUC_PREREQ (6, 0) */ + /* Return the TCB address of a thread given its state. Note: this is expensive. */ # define THREAD_TCB(thread, thread_state) \ @@ -295,15 +322,10 @@ out: HURD_DESC_TLS (___desc);}) /* Install new dtv for current thread. */ -# define INSTALL_NEW_DTV(dtvp) \ - ({ asm volatile ("movl %0,%%gs:%P1" \ - : : "ir" (dtvp), "i" (offsetof (tcbhead_t, dtv))); }) +# define INSTALL_NEW_DTV(dtvp) THREAD_SETMEM (THREAD_SELF, dtv, dtvp) /* Return the address of the dtv for the current thread. */ -# define THREAD_DTV() \ - ({ dtv_t *_dtv; \ - asm ("movl %%gs:%P1,%0" : "=q" (_dtv) : "i" (offsetof (tcbhead_t, dtv)));\ - _dtv; }) +# define THREAD_DTV() THREAD_GETMEM (THREAD_SELF, dtv) /* Set the stack guard field in TCB head. */