From patchwork Tue Jul 24 15:52:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 28588 Received: (qmail 21121 invoked by alias); 24 Jul 2018 15:52:13 -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 21109 invoked by uid 89); 24 Jul 2018 15:52:12 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.3 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, 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= X-HELO: mail-oi0-f68.google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to:cc; bh=hMJqTo7HQXz8y1uKUqgLo0z70CoBX9R3XLq4hDaicIo=; b=FMSl/SQwLLiogfUpkdz7lA6gu7Vtk885hCQTi1oU0D1Yz/MJX780kplRN1P++Owfwg fX10fSC13xIunuRin3xy3MeSmlRZh2L1LwvqDKoh/NJZJ2UgVKBEi9HBGl+iftj1D/w7 HCvn2QB3kD8+epxHEjSDiEBIaY/1lCVDItm2pwJswxsUP8eHsInV/XgAq8aOfEas0eqr kac+grSHvgwszMMNMFeLgd+uUDtPm5qP2GiYFD5iM/zOMxXssUFKTMewfL2T4M9g6WAX NHTgPlBdUJ8rWsC94LPrXPauyxdQjcAOPbW1Yqu/rMSzSdz53EADXwGmSPoWnkl2K+ty jQBg== MIME-Version: 1.0 From: "H.J. Lu" Date: Tue, 24 Jul 2018 08:52:08 -0700 Message-ID: Subject: V3 [PATCH 04/12] x86/CET: Extend arch_prctl syscall for CET control To: "Carlos O'Donell" Cc: Joseph Myers , GNU C Library On Tue, Jul 24, 2018 at 8:29 AM, Carlos O'Donell wrote: > On 07/24/2018 10:28 AM, Joseph Myers wrote: >> On Tue, 24 Jul 2018, H.J. Lu wrote: >> >>> Note: sysdeps/unix/sysv/linux/x86/bits/prctl-internal.h should be >>> renamed to sysdeps/unix/sysv/linux/x86/bits/prctl.h after the CET >>> kernel interface has been committed into the public kernel. >> >> bits/ should not be used for any internal headers; it's purely a naming >> convention for public headers. So there should be no >> bits/prctl-internal.h header. > > OK. > >> I don't think there should be bits/prctl.h at all either. Not with this >> patch (because there isn't anything for it to do), and not once the >> interface is in the kernel (because existing practice is that we rely on >> the include of from to provide the values to >> users of glibc). > > Good point. > >> Rather, for the uses of these constants within glibc, to avoid relying on >> new kernel headers, provide an x86 include/sys/prctl.h that does >> #include_next and then defines these constants if not >> already defined. And make sure that header gets a prominent comment >> naming the upstream kernel version with the constants (once they are >> upstream), so it's obvious at what point we can remove that header. > > OK, that makes sense, so a purely internal header via include/ wrapping > with the constants there. > CET arch_prctl bits should be defined in from Linux kernel header files. Here is the updated patch to add x86 . OK for master? From 630bfa00750c823cd4bea26ca6e1eabfd7abba99 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 7 Jul 2018 07:33:04 -0700 Subject: [PATCH] x86/CET: Extend arch_prctl syscall for CET control CET arch_prctl bits should be defined in from Linux kernel header files. Add x86 for pre-CET kernel header files. Note: sysdeps/unix/sysv/linux/x86/include/asm/prctl.h should be removed after the CET kernel interface has been committed into the public kernel. /* CET features: IBT: GNU_PROPERTY_X86_FEATURE_1_IBT SHSTK: GNU_PROPERTY_X86_FEATURE_1_SHSTK */ /* Return CET features in unsigned long long *addr: features: addr[0]. shadow stack base address: addr[1]. shadow stack size: addr[2]. */ # define ARCH_CET_STATUS 0x3001 /* Disable CET features in unsigned int features. */ # define ARCH_CET_DISABLE 0x3002 /* Lock all CET features. */ # define ARCH_CET_LOCK 0x3003 /* Allocate a new shadow stack with unsigned long long *addr: IN: requested shadow stack size: *addr. OUT: allocated shadow stack address: *addr. */ # define ARCH_CET_ALLOC_SHSTK 0x3004 /* Return legacy region bitmap info in unsigned long long *addr: address: addr[0]. size: addr[1]. */ # define ARCH_CET_LEGACY_BITMAP 0x3005 * sysdeps/unix/sysv/linux/x86/include/asm/prctl.h: New file. * sysdeps/unix/sysv/linux/x86/cpu-features.c: Include and . (get_cet_status): Call arch_prctl with ARCH_CET_STATUS. * sysdeps/unix/sysv/linux/x86/dl-cet.h: Include and . (dl_cet_allocate_legacy_bitmap): Call arch_prctl with ARCH_CET_LEGACY_BITMAP. (dl_cet_disable_cet): Call arch_prctl with ARCH_CET_DISABLE. (dl_cet_lock_cet): Call arch_prctl with ARCH_CET_LOCK. * sysdeps/x86/libc-start.c: Include . --- sysdeps/unix/sysv/linux/x86/cpu-features.c | 8 +++++ sysdeps/unix/sysv/linux/x86/dl-cet.h | 30 +++++++++++++---- .../unix/sysv/linux/x86/include/asm/prctl.h | 32 +++++++++++++++++++ sysdeps/x86/libc-start.c | 3 ++ 4 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/x86/include/asm/prctl.h diff --git a/sysdeps/unix/sysv/linux/x86/cpu-features.c b/sysdeps/unix/sysv/linux/x86/cpu-features.c index 7c9df9b794..8566a265b8 100644 --- a/sysdeps/unix/sysv/linux/x86/cpu-features.c +++ b/sysdeps/unix/sysv/linux/x86/cpu-features.c @@ -17,9 +17,17 @@ . */ #if CET_ENABLED +# include +# include + static inline int __attribute__ ((always_inline)) get_cet_status (void) { + unsigned long long cet_status[3]; + INTERNAL_SYSCALL_DECL (err); + if (INTERNAL_SYSCALL (arch_prctl, err, 2, ARCH_CET_STATUS, + cet_status) == 0) + return cet_status[0]; return 0; } diff --git a/sysdeps/unix/sysv/linux/x86/dl-cet.h b/sysdeps/unix/sysv/linux/x86/dl-cet.h index ae81e2f2ca..3fbcfebed5 100644 --- a/sysdeps/unix/sysv/linux/x86/dl-cet.h +++ b/sysdeps/unix/sysv/linux/x86/dl-cet.h @@ -15,23 +15,41 @@ License along with the GNU C Library; if not, see . */ +#include +#include + static inline int __attribute__ ((always_inline)) dl_cet_allocate_legacy_bitmap (unsigned long *legacy_bitmap) { - /* FIXME: Need syscall support. */ - return -1; + /* Allocate legacy bitmap. */ + INTERNAL_SYSCALL_DECL (err); +#ifdef __LP64__ + return (int) INTERNAL_SYSCALL (arch_prctl, err, 2, + ARCH_CET_LEGACY_BITMAP, legacy_bitmap); +#else + unsigned long long legacy_bitmap_u64[2]; + int res = INTERNAL_SYSCALL (arch_prctl, err, 2, + ARCH_CET_LEGACY_BITMAP, legacy_bitmap_u64); + if (res == 0) + { + legacy_bitmap[0] = legacy_bitmap_u64[0]; + legacy_bitmap[1] = legacy_bitmap_u64[1]; + } + return res; +#endif } static inline int __attribute__ ((always_inline)) dl_cet_disable_cet (unsigned int cet_feature) { - /* FIXME: Need syscall support. */ - return -1; + INTERNAL_SYSCALL_DECL (err); + return (int) INTERNAL_SYSCALL (arch_prctl, err, 2, ARCH_CET_DISABLE, + cet_feature); } static inline int __attribute__ ((always_inline)) dl_cet_lock_cet (void) { - /* FIXME: Need syscall support. */ - return -1; + INTERNAL_SYSCALL_DECL (err); + return (int) INTERNAL_SYSCALL (arch_prctl, err, 2, ARCH_CET_LOCK, 0); } diff --git a/sysdeps/unix/sysv/linux/x86/include/asm/prctl.h b/sysdeps/unix/sysv/linux/x86/include/asm/prctl.h new file mode 100644 index 0000000000..c92c4104af --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/include/asm/prctl.h @@ -0,0 +1,32 @@ +/* FIXME: This file should be removed after the CET kernel interface + has been committed into the public kernel. All CET arch_prctl bits + should come from the kernel . */ + +#include_next + +#ifndef ARCH_CET_STATUS +/* CET features: + IBT: GNU_PROPERTY_X86_FEATURE_1_IBT + SHSTK: GNU_PROPERTY_X86_FEATURE_1_SHSTK + */ +/* Return CET features in unsigned long long *addr: + features: addr[0]. + shadow stack base address: addr[1]. + shadow stack size: addr[2]. + */ +# define ARCH_CET_STATUS 0x3001 +/* Disable CET features in unsigned int features. */ +# define ARCH_CET_DISABLE 0x3002 +/* Lock all CET features. */ +# define ARCH_CET_LOCK 0x3003 +/* Allocate a new shadow stack with unsigned long long *addr: + IN: requested shadow stack size: *addr. + OUT: allocated shadow stack address: *addr. + */ +# define ARCH_CET_ALLOC_SHSTK 0x3004 +/* Return legacy region bitmap info in unsigned long long *addr: + address: addr[0]. + size: addr[1]. + */ +# define ARCH_CET_LEGACY_BITMAP 0x3005 +#endif /* ARCH_CET_STATUS */ diff --git a/sysdeps/x86/libc-start.c b/sysdeps/x86/libc-start.c index 43aba9d061..eb5335c154 100644 --- a/sysdeps/x86/libc-start.c +++ b/sysdeps/x86/libc-start.c @@ -16,6 +16,9 @@ . */ #ifndef SHARED +/* Define I386_USE_SYSENTER to support syscall during startup in static + PIE. */ +# include # include # include # include -- 2.17.1