From patchwork Fri Nov 23 16:18:48 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: 30272 Received: (qmail 109338 invoked by alias); 23 Nov 2018 16:19:29 -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 109328 invoked by uid 89); 23 Nov 2018 16:19:28 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.0 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=Hx-languages-length:4674 X-HELO: mail-ot1-f68.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=SySDEMyPadDq1lKohMmV7htwNbzPiubtojqdAtCrOwg=; b=tVNp5mG66MEQahjt05Jg8KooD1uRQNVBhh4lJPTM7IUKAKjb7iAeJGAhD2BB/cloKO qy//XJUvXl4Oxkia9dPHaYYJI4qU3mzuUtR6gaqdz9oIA70OvPwiXYuLbFCsMjnY+BPd M81WfFShRysphzgH9qCZEVn+SdZ3zkwa7b8iWgs9Kd3r5/AEHXLZbl4FYAhNXkFV8djl RtX3+TjFVJTi5WmeZmkE08/jDUUL1wK6OWy4Ah7iaysNydnySND18oeWbdeRUL4qtiVM A6KzIvWGAtdRvaKZNn+IYUubIRGlvkMgwiiYSq4MzWRYYHJcHH/NfVXKeAfsWpWDYpOF KdIQ== MIME-Version: 1.0 References: <20181120142214.20783-1-hjl.tools@gmail.com> <875zwrenrs.fsf@oldenburg.str.redhat.com> <87sgzu2fw1.fsf@oldenburg.str.redhat.com> <87y39jubim.fsf@oldenburg.str.redhat.com> In-Reply-To: <87y39jubim.fsf@oldenburg.str.redhat.com> From: "H.J. Lu" Date: Fri, 23 Nov 2018 08:18:48 -0800 Message-ID: Subject: Re: [PATCH] x86/CET: Renumber ARCH_CET_LEGACY_BITMAP to 0x3006 To: Florian Weimer Cc: GNU C Library On Fri, Nov 23, 2018 at 6:14 AM Florian Weimer wrote: > > * H. J. Lu: > > > + _dl_exception_create_format > > + (&exception, DSO_FILENAME (l->l_name), > > + "mmap size 0x%Zx failed", legacy_bitmap_size); > > + _dl_signal_cexception > > I think you should mark the string as translateable and say that it's > for the legacy bitmap. > Like this? From d7223b8e323efe7d468c1007da76932601caa217 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..408e7e89d4 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; + _dl_exception_create_format + (&exception, DSO_FILENAME (l->l_name), + N_("mmap size 0x%zx for legacy bitmap 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