From patchwork Wed Feb 7 17:58:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 127202 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp709276ljc; Wed, 7 Feb 2018 09:58:55 -0800 (PST) X-Google-Smtp-Source: AH8x224kavg3gFRB1aTCiCE/vOf+cngXep3dXjR4rSg3uv8yWNKgDWzBQ+0/9LpEPa+SNa3EviSh X-Received: by 10.98.108.133 with SMTP id h127mr6860433pfc.50.1518026335304; Wed, 07 Feb 2018 09:58:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518026335; cv=none; d=google.com; s=arc-20160816; b=VILoWCtqSdDG66ijfb4Bnt5ZW1hgzNYbRVRTxBhsno4sSdgsuMP19tqhqzMMalFzpe CSssEg322MH+W07s4IZu0CEMmWVUB6eZwSVVVkH0gR1+9Gf55JtO0zGRx02QpK9+5Th8 JvR8NNogR12O3ptwhgvlfArGNi5dtPJKvoWvMC5xrLZ1RgvBH970I3RcrxbTjICVglbz bUm/lsEWKYVmFkLRVt7v/vgh6dmuC5tuFJq5W2xBNrdxZhF/keahu48rMXgk7Xnd/YtJ 1CmmjdlghIr8hfj5C8tKxGwfGKXXpPwkRpE7noLJI9Lh9BIE631NtuX8Jg58Kfz2XmOb goug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:date:subject:to:from:delivered-to:sender:list-help :list-post:list-archive:list-subscribe:list-unsubscribe:list-id :precedence:mailing-list:dkim-signature:domainkey-signature :arc-authentication-results; bh=ZcjsZyw3+kw3elRc7UtXU7biOKF0ZvhS54IE50tYzNM=; b=v/10DEhVk7F1UgNUxH+uHYADaoto2uzCbS6wkWb3UePsEk+zJ79J43EZ6vSw0RxV2u wfpJSu7DUpgwIxG0fbjL05PMyI3iCauk44GIRo5ip3cl88zIAK/IKJBIVQov/hZVJuel Ww+gBt81eI/78YjreBMMT/bjjC1184ZFWU74K+2K8Ci9Rp1RjkEViSWsIbYUsTrXDkpR dUeY7PDwOefGhBE6fCIWFqjuQKV3wcPhShufYKSJoNbHjiRQH1LYra0boMzpzSkJtVR1 gsIdlmVhVulW0Cew/FKBOgbUdIcBQu766tRtZOjiQhjVHhPtvc/IFCWggKY0FMqx3dtd Kj/w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=hC41B7K4; spf=pass (google.com: domain of libc-alpha-return-90122-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-90122-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id bf1-v6si1406444plb.373.2018.02.07.09.58.54 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 07 Feb 2018 09:58:55 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-90122-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=hC41B7K4; spf=pass (google.com: domain of libc-alpha-return-90122-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-90122-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id; q=dns; s= default; b=HIDo8sboVt0TyAXpcg0WFffrTp/70NSqLG3tdC+H7JdAhQITyJKjX SS7d2bM/vuTZeROPIsk5DKqbOeqDcie8tfFa8SRXtnC2Ko9XOwGMFiJUxSpib7b8 vplUd9nzKKd/ugVilqreCa1aoYxEp/UBncoTRBHcPQyRZwRCjo8dNg= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id; s=default; bh=EER40cCZxaQxGfJKKOuWTsW3AX8=; b=hC41B7K4KzsDepCImocfmNsyw9qT D9bRlYzUPPKzktw7/oAGUS/bx9MkAoApgWu1SJND08z+jUsqeQzjIOAk9qhX77kY mDJJuEC53WjLbhg+oC8E69VzGddIEerNzwPSQtQFeZesn+UfQJ2BYRSanjceVqR1 IyrvyB1Q4xWLElM= Received: (qmail 23081 invoked by alias); 7 Feb 2018 17:58:46 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 23071 invoked by uid 89); 7 Feb 2018 17:58:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=83, Magic, advertise, Hx-languages-length:6742 X-HELO: mail-qt0-f173.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=ZcjsZyw3+kw3elRc7UtXU7biOKF0ZvhS54IE50tYzNM=; b=fM+z56XlhWXUhaT1Tq33ki5YJa9wzHtu4TDIOrFfZknRn7JwQCcEYxUfHLnwGr7fa5 nxIks2a2TG73GGi/sYjvdLYod9ncfEbf0UPzuMzgQaP9BkkmUlmP8y4TTZm2TpBLk2dn P0uAzH0ldLKZ/SnFx4NkXKgKgSTw8R0Tsm3QX2THTuyf8jNOdcN9Koro7aaRYyWHOF5P 84wGXf9ycYc8XC2yuHT72WkzvLcpGqaSVI6CYXM27hGNtqraUk4PCea60TVPxXO63Hoj s/L1o7akGLkffOkUJ2q6t1k3hUhLZWSzWRNpHYQSfmrRydvl5nKCZ+KROn544aknhRzF 85Sg== X-Gm-Message-State: APf1xPCU+oWInm/fgLFQ50ltwYevNMaknaLYOTE6SZEPV+FhEbyIkDaD yrOnzzR1F/qvzkvDAwaOIYvYxiE+27g= X-Received: by 10.237.56.99 with SMTP id j90mr11247355qte.334.1518026321207; Wed, 07 Feb 2018 09:58:41 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH] aarch64: Add split-stack TCB field Date: Wed, 7 Feb 2018 15:58:33 -0200 Message-Id: <1518026313-22248-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds split-stack support pointer guard on glibc for aarch64. Different from other architectures (powerpc, s390) where the memory is placed on TCB, aarch64 one is placed before thread pointer initial position. It has an advantage over extending TCB because for aarch64 TLS variable placement take in consideration tcbhead_t size and by changing its value would require to also update the static linker (and it would also add incompatibility with glibc and older linkers). For aarch64 tcb direct access is fastest for thread local variable on all mode and related TLS access. It requires just a direct load with displacement of -8 (since thread pointer points to tcbhead_t). It also adds a loader symbol (__tcb_private_ss) to signal the existence of the split stack guard area. Checked on aarch64-linux-gnu. * sysdeps/aarch64/Makefile [$(subdir) = elf] (sysdeps-dl-routines): Add tcb-version. * sysdeps/aarch64/Versions [ld] (GLIBC_2.26): Add __libc_tcb_private_ss. * sysdeps/aarch64/nptl/tls.h (tcbprehead_t): New struct. (TLS_PRE_TCB_SIZE): Take tcbprehead_t in consideration. (TLS_DEFINE_INIT_TP): Likewise. (THREAD_SELF): Likewise. (DB_THREAD_SELF): Likewise. * sysdeps/aarch64/tcb-version.c: New file. * sysdeps/unix/sysv/linux/aarch64/ld.abilist (GLIBC_2.26): Add. (__libc_tcb_private_ss): Likewise. * sysdeps/aarch64/nptl/tcb-offsets.sym (PTHREAD_SIZEOF): Rename to PTHREAD_PRE_TCB_SIZE. --- ChangeLog | 17 +++++++++++++++++ sysdeps/aarch64/Makefile | 2 +- sysdeps/aarch64/Versions | 8 ++++++++ sysdeps/aarch64/nptl/tcb-offsets.sym | 2 +- sysdeps/aarch64/nptl/tls.h | 25 ++++++++++++++++++++----- sysdeps/aarch64/tcb-version.c | 23 +++++++++++++++++++++++ sysdeps/unix/sysv/linux/aarch64/ld.abilist | 2 ++ 7 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 sysdeps/aarch64/tcb-version.c -- 2.7.4 diff --git a/sysdeps/aarch64/Makefile b/sysdeps/aarch64/Makefile index 5f3e203..141442a 100644 --- a/sysdeps/aarch64/Makefile +++ b/sysdeps/aarch64/Makefile @@ -1,7 +1,7 @@ long-double-fcts = yes ifeq ($(subdir),elf) -sysdep-dl-routines += tlsdesc dl-tlsdesc +sysdep-dl-routines += tlsdesc dl-tlsdesc tcb-version gen-as-const-headers += dl-link.sym endif diff --git a/sysdeps/aarch64/Versions b/sysdeps/aarch64/Versions index e1aa44f..dcc395c 100644 --- a/sysdeps/aarch64/Versions +++ b/sysdeps/aarch64/Versions @@ -3,3 +3,11 @@ libc { _mcount; } } + +ld { + GLIBC_2.28 { + # Symbol used to version control the private GLIBC TCB split-stack + # field. + __libc_tcb_private_ss; + } +} diff --git a/sysdeps/aarch64/nptl/tcb-offsets.sym b/sysdeps/aarch64/nptl/tcb-offsets.sym index 238647d..6004379 100644 --- a/sysdeps/aarch64/nptl/tcb-offsets.sym +++ b/sysdeps/aarch64/nptl/tcb-offsets.sym @@ -3,4 +3,4 @@ PTHREAD_MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) PTHREAD_TID_OFFSET offsetof (struct pthread, tid) -PTHREAD_SIZEOF sizeof (struct pthread) +PTHREAD_PRE_TCB_SIZE TLS_PRE_TCB_SIZE diff --git a/sysdeps/aarch64/nptl/tls.h b/sysdeps/aarch64/nptl/tls.h index ac39c24..2d88310 100644 --- a/sysdeps/aarch64/nptl/tls.h +++ b/sysdeps/aarch64/nptl/tls.h @@ -26,6 +26,7 @@ # include # include # include +# include #else /* __ASSEMBLER__ */ # include @@ -49,6 +50,12 @@ typedef struct void *private; } tcbhead_t; +typedef struct +{ + /* GCC split stack support. */ + void *__private_ss; +} tcbprehead_t; + /* This is the size of the initial TCB. */ # define TLS_INIT_TCB_SIZE sizeof (tcbhead_t) @@ -58,8 +65,14 @@ typedef struct /* This is the size of the TCB. */ # define TLS_TCB_SIZE sizeof (tcbhead_t) -/* This is the size we need before TCB. */ -# define TLS_PRE_TCB_SIZE sizeof (struct pthread) +/* This is the size we need before TCB. Check if there is room for + tcbprehead_t in struct pthread's final padding and if not add it on + required pre-tcb size. */ +# define TLS_PRE_TCB_SIZE \ + (sizeof (struct pthread) \ + + (PTHREAD_STRUCT_END_PADDING < sizeof (tcbprehead_t) \ + ? ALIGN_UP (sizeof (tcbprehead_t), __alignof__ (struct pthread)) \ + : 0)) /* Alignment requirements for the TCB. */ # define TLS_TCB_ALIGN __alignof__ (struct pthread) @@ -84,7 +97,8 @@ typedef struct ({ __asm __volatile ("msr tpidr_el0, %0" : : "r" (tcbp)); NULL; }) /* Value passed to 'clone' for initialization of the thread register. */ -# define TLS_DEFINE_INIT_TP(tp, pd) void *tp = (pd) + 1 +# define TLS_DEFINE_INIT_TP(tp, pd) \ + void *tp = (void*)((uintptr_t) (pd) + TLS_PRE_TCB_SIZE) /* Return the address of the dtv for the current thread. */ # define THREAD_DTV() \ @@ -92,11 +106,12 @@ typedef struct /* Return the thread descriptor for the current thread. */ # define THREAD_SELF \ - ((struct pthread *)__builtin_thread_pointer () - 1) + ((struct pthread *)((uintptr_t) __builtin_thread_pointer () \ + - TLS_PRE_TCB_SIZE)) /* Magic for libthread_db to know how to do THREAD_SELF. */ # define DB_THREAD_SELF \ - CONST_THREAD_AREA (64, sizeof (struct pthread)) + CONST_THREAD_AREA (64, TLS_PRE_TCB_SIZE) /* Access to data in the thread descriptor is easy. */ # define THREAD_GETMEM(descr, member) \ diff --git a/sysdeps/aarch64/tcb-version.c b/sysdeps/aarch64/tcb-version.c new file mode 100644 index 0000000..c94e5d3 --- /dev/null +++ b/sysdeps/aarch64/tcb-version.c @@ -0,0 +1,23 @@ +/* TCB field abi advertise symbols. + Copyright (C) 2017 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 + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +/* Symbol used to version control the private GLIBC TCB split-stack + field. */ +long int attribute_relro __libc_tcb_private_ss; diff --git a/sysdeps/unix/sysv/linux/aarch64/ld.abilist b/sysdeps/unix/sysv/linux/aarch64/ld.abilist index ec7f617..aaddb24 100644 --- a/sysdeps/unix/sysv/linux/aarch64/ld.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/ld.abilist @@ -8,3 +8,5 @@ GLIBC_2.17 calloc F GLIBC_2.17 free F GLIBC_2.17 malloc F GLIBC_2.17 realloc F +GLIBC_2.28 GLIBC_2.28 A +GLIBC_2.28 __libc_tcb_private_ss D 0x8