From patchwork Tue Jul 24 16:13:15 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: 28590 Received: (qmail 99610 invoked by alias); 24 Jul 2018 16:13:21 -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 99596 invoked by uid 89); 24 Jul 2018 16:13:20 -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, URIBL_RED autolearn=ham version=3.3.2 spammy= X-HELO: mail-oi0-f66.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=IcBVqa12Crjew67d+uCWQecYjj1lonjfIPu8xtOah4I=; b=Sq+CDbxGK6EQlXX+s7wylK0USqryguXvgSBpOBmq1FJXdf+q3kQWv6GZAUWX3GL7C1 5pZMw3DgLyphbPOfYHUyokbkdsAlq3/lexV3DuWpr/Y8ey8ucfVDZawsfQF19Pyjxt+I mzdTxHxwGSpDBPIhmhJ3RC3XVQZW7+1z3WC70VCuxfUZ4ULPNOLLRtghFKHmZl8/DIln ygOf9v0uu+KSMWvqZF/Zx4+z+D0ogf2l6C6eJgCA4Ld8O69j8AwgQecqvyT85obJfVSb neGIpCCBRlQUNKYZo0UWSSrVKQPiS+CISmE/7soGLDR9mGyxahdHxBWrOoJsNQmMfCtE 4IoA== MIME-Version: 1.0 From: "H.J. Lu" Date: Tue, 24 Jul 2018 09:13:15 -0700 Message-ID: Subject: V4 [PATCH 04/12] x86/CET: Extend arch_prctl syscall for CET control To: Joseph Myers Cc: "Carlos O'Donell" , GNU C Library On Tue, Jul 24, 2018 at 8:56 AM, Joseph Myers wrote: > On Tue, 24 Jul 2018, H.J. Lu wrote: > >> CET arch_prctl bits should be defined in from Linux kernel >> header files. Here is the updated patch to add x86 . >> >> OK for master? > > I don't think the relevant condition for removing such a wrapper is "after > the CET kernel interface has been committed into the public kernel". It's > after we require kernel headers recent enough to have that interface, > which may well be several years away. Once the interface has been > committed into the public kernel, the wrapper should be updated to name > the kernel version that has it and to say it should be removed once we > require kernel headers at least that recent. Like this? Reviewed-by: Carlos O'Donell From 8244c8532d22976c3d92ec25bcefeb3a7854123f 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 if from the required kernel header files contains CET arch_prctl bits. /* 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..f67f3299b9 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/include/asm/prctl.h @@ -0,0 +1,32 @@ +/* FIXME: CET arch_prctl bits should come from the kernel header files. + This file should be removed if from the required kernel + header files contains CET arch_prctl bits. */ + +#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