From patchwork Thu Nov 22 17:40:51 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: 30263 Received: (qmail 38959 invoked by alias); 22 Nov 2018 17:41:33 -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 38944 invoked by uid 89); 22 Nov 2018 17:41:31 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.9 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_NUMSUBJECT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=diagnose X-HELO: mail-ot1-f66.google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=i2dk5sTlc9Y1ntEQdx6+KS/21Q/yrMhk6fV/9UzwCKI=; b=EGzoZzhx6jNm2zPGjJkFT3jYKHD3+Qv637KUr1vX/6HrskfaJvRdkE/vSJwB5oAuz8 52LEFjAo6FCuNsljxaXOC7B0tx5SiIipHh/PhtciZ8lQEZP7bYffaAqTWfa+t2IEnDut TZFNbFNZSJEp/GT7K80eaQu+wkilyes1vafRpnc+9KHqbCRBDyTeVGrsReAW15b3tmLl CwpzC+a0m2alr+oRiM4y4h5pRvesyE0Y79o0UdUbWbuXVoZ/xAEEw2L+w0yXVDq0fv1e NitlB7k5AacrmQ7xTLLxqSaffSmw+QImcv8at3ki2nn3PvCNVshCXllvMwE0dI2BbaJS 4mWA== MIME-Version: 1.0 References: <20181120142214.20783-1-hjl.tools@gmail.com> <875zwrenrs.fsf@oldenburg.str.redhat.com> <87sgzu2fw1.fsf@oldenburg.str.redhat.com> In-Reply-To: <87sgzu2fw1.fsf@oldenburg.str.redhat.com> From: "H.J. Lu" Date: Thu, 22 Nov 2018 09:40:51 -0800 Message-ID: Subject: Re: [PATCH] x86/CET: Renumber ARCH_CET_LEGACY_BITMAP to 0x3006 To: Florian Weimer Cc: GNU C Library On Wed, Nov 21, 2018 at 3:02 PM Florian Weimer wrote: > > * H. J. Lu: > > >> Maybe you can log the size of the mapping attempt? That could be useful > >> to diagnose failures. > > > > It isn't easy since _dl_signal_error only takes strings. > > Ah. We have _dl_exception_create_format and _dl_signal_exception for > that; this functionality is split across two function. > Here is the updated patch, which depends on https://sourceware.org/ml/libc-alpha/2018-11/msg00596.html to add support for %x, %lx and %Zx to _dl_exception_create_format. From d7f6e11594bd094ea719a6c452600748561a56c3 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 31 Oct 2018 13:59:29 -0700 Subject: [PATCH] x86/CET: Renumber ARCH_CET_LEGACY_BITMAP to 0x3006 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 | 29 +++++++++++++++++-- 3 files changed, 34 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..b43387f6b4 100644 --- a/sysdeps/x86/dl-cet.c +++ b/sysdeps/x86/dl-cet.c @@ -202,13 +202,36 @@ 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) + { + struct dl_exception exception; + /* NB: We cannot translate the message. */ + _dl_exception_create_format + (&exception, DSO_FILENAME (l->l_name), + "mmap size 0x%Zx failed", legacy_bitmap_size); + _dl_signal_cexception + (errno, &exception, N_("legacy bitmap error")); + _dl_exception_free (&exception); + } + 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); -- 2.19.1