From patchwork Tue Nov 20 14:22:14 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: 30221 Received: (qmail 40107 invoked by alias); 20 Nov 2018 14:22:19 -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 39129 invoked by uid 89); 20 Nov 2018 14:22:18 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.2 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_NUMSUBJECT, SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy=gl, GL, HContent-Transfer-Encoding:8bit X-HELO: mga05.intel.com From: "H.J. Lu" To: libc-alpha@sourceware.org Subject: [PATCH] x86/CET: Renumber ARCH_CET_LEGACY_BITMAP to 0x3006 Date: Tue, 20 Nov 2018 06:22:14 -0800 Message-Id: <20181120142214.20783-1-hjl.tools@gmail.com> MIME-Version: 1.0 The current CET kernel: https://github.com/yyu168/linux_cet changed legacy region bitmap allocation from kernel to user space and renumbered the prctl number from 0x3005 to 0x3006. This patch updates glibc with: /* Enable legacy region bitmap with unsigned long long *addr: address: addr[0]. size: addr[1]. */ # define ARCH_CET_LEGACY_BITMAP 0x3006 * sysdeps/unix/sysv/linux/x86/dl-cet.h (dl_cet_allocate_legacy_bitmap ): Removed. (dl_cet_enable_legacy_bitmap): New. * sysdeps/unix/sysv/linux/x86/include/asm/prctl.h (ARCH_CET_LEGACY_BITMAP): Renumbered to 0x3006. * sysdeps/x86/dl-cet.c (dl_cet_check): Mmap legacy bitmap. Call dl_cet_enable_legacy_bitmap instead of dl_cet_allocate_legacy_bitmap. --- sysdeps/unix/sysv/linux/x86/dl-cet.h | 17 +++++------- .../unix/sysv/linux/x86/include/asm/prctl.h | 4 +-- sysdeps/x86/dl-cet.c | 27 ++++++++++++++++--- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/sysdeps/unix/sysv/linux/x86/dl-cet.h b/sysdeps/unix/sysv/linux/x86/dl-cet.h index 3fbcfebed5..4da8d165dc 100644 --- a/sysdeps/unix/sysv/linux/x86/dl-cet.h +++ b/sysdeps/unix/sysv/linux/x86/dl-cet.h @@ -19,24 +19,19 @@ #include static inline int __attribute__ ((always_inline)) -dl_cet_allocate_legacy_bitmap (unsigned long *legacy_bitmap) +dl_cet_enable_legacy_bitmap (unsigned long *legacy_bitmap) { /* Allocate legacy bitmap. */ INTERNAL_SYSCALL_DECL (err); #ifdef __LP64__ - return (int) INTERNAL_SYSCALL (arch_prctl, err, 2, - ARCH_CET_LEGACY_BITMAP, legacy_bitmap); + unsigned long *legacy_bitmap_u64 = 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; + legacy_bitmap_u64[0] = legacy_bitmap[0]; + legacy_bitmap_u64[1] = legacy_bitmap[1]; #endif + return (int) INTERNAL_SYSCALL (arch_prctl, err, 2, + ARCH_CET_LEGACY_BITMAP, legacy_bitmap_u64); } static inline int __attribute__ ((always_inline)) diff --git a/sysdeps/unix/sysv/linux/x86/include/asm/prctl.h b/sysdeps/unix/sysv/linux/x86/include/asm/prctl.h index f67f3299b9..94196aa768 100644 --- a/sysdeps/unix/sysv/linux/x86/include/asm/prctl.h +++ b/sysdeps/unix/sysv/linux/x86/include/asm/prctl.h @@ -24,9 +24,9 @@ OUT: allocated shadow stack address: *addr. */ # define ARCH_CET_ALLOC_SHSTK 0x3004 -/* Return legacy region bitmap info in unsigned long long *addr: +/* Enable legacy region bitmap with unsigned long long *addr: address: addr[0]. size: addr[1]. */ -# define ARCH_CET_LEGACY_BITMAP 0x3005 +# define ARCH_CET_LEGACY_BITMAP 0x3006 #endif /* ARCH_CET_STATUS */ diff --git a/sysdeps/x86/dl-cet.c b/sysdeps/x86/dl-cet.c index 78f36bcf53..983caa0018 100644 --- a/sysdeps/x86/dl-cet.c +++ b/sysdeps/x86/dl-cet.c @@ -202,13 +202,34 @@ mprotect_failure: N_("mprotect legacy bitmap failed")); } } - else + else if (!GL(dl_x86_legacy_bitmap)[0]) { - /* Allocate legacy bitmap. */ - int res = dl_cet_allocate_legacy_bitmap + /* Allocate and enable legacy bitmap. */ + size_t legacy_bitmap_size + = ((uintptr_t) __libc_stack_end + / GLRO(dl_pagesize) / 8); + void *legacy_bitmap_addr + = __mmap (NULL, legacy_bitmap_size, + PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_NORESERVE, + -1, 0); + if (legacy_bitmap_addr == MAP_FAILED) + { + if (program) + _dl_fatal_printf ("%s: mmap legacy bitmap failed\n", + l->l_name); + else + _dl_signal_error (EINVAL, l->l_name, "dlopen", + N_("mmap legacy bitmap failed")); + } + GL(dl_x86_legacy_bitmap)[0] + = (uintptr_t) legacy_bitmap_addr; + GL(dl_x86_legacy_bitmap)[1] = legacy_bitmap_size; + int res = dl_cet_enable_legacy_bitmap (GL(dl_x86_legacy_bitmap)); if (res != 0) { + __munmap (legacy_bitmap_addr, legacy_bitmap_size); if (program) _dl_fatal_printf ("%s: legacy bitmap isn't available\n", l->l_name);