From patchwork Mon Jun 18 15:06:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Salyzyn X-Patchwork-Id: 10472073 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id D44D2601D7 for ; Mon, 18 Jun 2018 15:24:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C2659286A4 for ; Mon, 18 Jun 2018 15:24:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B6F9C2890E; Mon, 18 Jun 2018 15:24:10 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 4275B286A4 for ; Mon, 18 Jun 2018 15:24:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=KGkF6ItZ+FwkA6dnQvdW0Kc4No3nK/A37+Bl2Mzglls=; b=Jm1UhiuUzkH7GnDUixy1bkGYhx 5MfSNw1dvljsEm66ZxpHB0IKnGRw2Xn7xbcq64wIDPLc7zIqWFiOU2Mh+5/HQD8VUMaqDCReygNS1 tS28Bvo/XYA8m5XarV9El0p+jmAO9wDuUroLElGy+hxKsmbY0wL9DYCsrYmITI1+F0Yq48iehSIWj Ufoi288ZCwiVTxVkZ9ddfuWAfMBiJe2WYUzi9CCQlkd8wcMqv96Exkg/aUVOw6iQpEgd3MwYQzJFn ucUNYkIFTZxZaGyK9wcdLJuzbqnajwRiR6ikIPWAPSTsbfrdKEEANSo1wpqyPa/1NJRucDeN5UisM P4KZNzzg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fUw0b-0004JQ-DP; Mon, 18 Jun 2018 15:23:57 +0000 Received: from merlin.infradead.org ([2001:8b0:10b:1231::1]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fUvvh-0000OV-Gm for linux-arm-kernel@bombadil.infradead.org; Mon, 18 Jun 2018 15:18:53 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=merlin.20170209; h=References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=2pfESoiXW7kZE4xChCGGKPZSQMnBX5sI3eDemQAvvzk=; b=nSr2hC/oSvPPwdXAEFar2ks6a cHQGYgUJOJl5stO45Q6/j9013Ec4SLuPbXmbEXU9CSuQcIu5znlLzL3yYKuShCHPIK5OPxqnafmRy qF9HDCNwnc7Vd1C6cK9vpMPsvY3g3noMNjqmVLnCacxB9+s+OHokUrqfuwCvaiNSY5DVkl6pcZH3y YQ0lPGaCFYfT2Lw86NQh0ObEt0Zq4FVdXFvzZLX8XR1LwFmzy3EnuSObN7u7ZaLd3Ah22R21IDIfq OMKV+DerWLfLtH4BbgKyBFjTjXp+fe1wsWLI4AK2Ps3poYworLgNjjR2bkmP43E3h5bd1wqH+k2k9 B07W2VB2w==; Received: from mail-pl0-x244.google.com ([2607:f8b0:400e:c01::244]) by merlin.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fUvnd-0000M3-FY for linux-arm-kernel@lists.infradead.org; Mon, 18 Jun 2018 15:10:34 +0000 Received: by mail-pl0-x244.google.com with SMTP id b14-v6so9197789pls.5 for ; Mon, 18 Jun 2018 08:10:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=android.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=2pfESoiXW7kZE4xChCGGKPZSQMnBX5sI3eDemQAvvzk=; b=EHsBfzvL8GWOY24pk8dwcVmsQX2cOQ0pKwpoxENUIb++3Ak+5K7M2P9wT3WE8RLgrh YLmDCFUWV+dJSQillLfx/BlCDG8Ut250QNQEXyQ8hsXfVefFraX44rgAwco9OvUMKIlF 1apURrqENPQRF9vCL6ezGMfBoG2MfOQrx2QuhKIIzokNvMzYkQTunfK7t2wDs463ND2/ mKQyaodXlYp+E1t8PUQgFGYwa29m/EU9g3SDmGzic1u7TuMkpHqidK6ZFgIT/D1CUUH7 nAXfLnjzGOAAF7ykD4wlhJ9ZQyBTKbp4RB4ee7R0LxUDJqR333ZjZmxCnQUnP7h3uLiy q97Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=2pfESoiXW7kZE4xChCGGKPZSQMnBX5sI3eDemQAvvzk=; b=as8wUto57D0Lu+Qiqt0SZY18tCBEzt/7rQYss7f2xGitrIA+/9y4DtQz3Ehmfn4J5f 6WAAseNwofVsUYkSQR2F6XIsPpstq2ebtfC8C64cEtLovOv2xoY+vSm9kzXi9nlQdKZe yeiBq4s8l7WMbpCQS3nHMlObirpDM9khZuLfqHASSshiHqXQoVz6RVTtvjGD/T9CBqJB AymdoenHlGEVe0KaIOL5ApEIvTOQhP4Owmn2glxbiFL9MNJHq2zqb+NkathZRtisn6q3 CrWFrmt7hd0bdohM6yEVqqPfp+TdLPu9SOc5l2/x/S5RsIN/WGr9CJTpyQ/m/UGNaNee E1Ng== X-Gm-Message-State: APt69E2qPmjVvjH6VBQW5Ygsya0CY1iwVe/+PF0ewNp4wR5m19+5eZkT VATZ/Tzf99xjjN3XZg+bQSNsCA== X-Google-Smtp-Source: ADUXVKJHY0ybKm9xMrCU22gORgxP/w9WdqNmWtVqvQUESgTcsUYd136P0K6z0lNXx0xAv4sktLcGcQ== X-Received: by 2002:a17:902:7105:: with SMTP id a5-v6mr14448095pll.171.1529334620971; Mon, 18 Jun 2018 08:10:20 -0700 (PDT) Received: from nebulus.mtv.corp.google.com ([2620:0:1000:1611:6077:8eec:bc7e:d0f4]) by smtp.gmail.com with ESMTPSA id i7-v6sm54830660pfa.34.2018.06.18.08.10.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Jun 2018 08:10:20 -0700 (PDT) From: Mark Salyzyn To: linux-kernel@vger.kernel.org Subject: RESEND [PATCH 5/6] arm64: compat: 32-bit vDSO setup Date: Mon, 18 Jun 2018 08:06:08 -0700 Message-Id: <20180618150613.10322-23-salyzyn@android.com> X-Mailer: git-send-email 2.18.0.rc1.244.gcf134e6275-goog In-Reply-To: <20180618150613.10322-1-salyzyn@android.com> References: <20180618150613.10322-1-salyzyn@android.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180618_111033_587238_D2BF5F83 X-CRM114-Status: GOOD ( 22.91 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , Laura Abbott , Kees Cook , Ard Biesheuvel , Catalin Marinas , Kevin Brodsky , Will Deacon , Russell King , Jeremy Linton , Mark Salyzyn , James Morse , Andrew Pinski , Dmitry Safonov , Andy Gross , John Stultz , Thomas Gleixner , Andy Lutomirski , linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP From: Kevin Brodsky If the compat vDSO is enabled, install it in compat processes. In this case, the compat vDSO replaces the sigreturn page (it provides its own sigreturn trampolines). Signed-off-by: Kevin Brodsky Signed-off-by: Mark Salyzyn Cc: James Morse Cc: Russell King Cc: Catalin Marinas Cc: Will Deacon Cc: Andy Lutomirski Cc: Dmitry Safonov Cc: John Stultz Cc: Mark Rutland Cc: Laura Abbott Cc: Kees Cook Cc: Ard Biesheuvel Cc: Andy Gross Cc: Andrew Pinski Cc: Thomas Gleixner Cc: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: Jeremy Linton --- arch/arm64/kernel/vdso.c | 55 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 8529e85a521f..9fb1e0d380ab 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -58,6 +58,7 @@ struct vdso_data *vdso_data = &vdso_data_store.data; /* * Create and map the vectors page for AArch32 tasks. */ +#if !defined(CONFIG_VDSO32) || defined(CONFIG_KUSER_HELPERS) static struct page *vectors_page[] __ro_after_init; static const struct vm_special_mapping compat_vdso_spec[] = { { @@ -73,6 +74,7 @@ static const struct vm_special_mapping compat_vdso_spec[] = { #endif }; static struct page *vectors_page[ARRAY_SIZE(compat_vdso_spec)] __ro_after_init; +#endif static int __init alloc_vectors_page(void) { @@ -82,6 +84,7 @@ static int __init alloc_vectors_page(void) unsigned long kuser_vpage; #endif +#ifndef CONFIG_VDSO32 extern char __aarch32_sigret_code_start[], __aarch32_sigret_code_end[]; size_t sigret_sz = __aarch32_sigret_code_end - __aarch32_sigret_code_start; @@ -90,19 +93,24 @@ static int __init alloc_vectors_page(void) sigret_vpage = get_zeroed_page(GFP_ATOMIC); if (!sigret_vpage) return -ENOMEM; +#endif #ifdef CONFIG_KUSER_HELPERS kuser_vpage = get_zeroed_page(GFP_ATOMIC); if (!kuser_vpage) { +#ifndef CONFIG_VDSO32 free_page(sigret_vpage); +#endif return -ENOMEM; } #endif +#ifndef CONFIG_VDSO32 /* sigreturn code */ memcpy((void *)sigret_vpage, __aarch32_sigret_code_start, sigret_sz); flush_icache_range(sigret_vpage, sigret_vpage + PAGE_SIZE); vectors_page[0] = virt_to_page(sigret_vpage); +#endif #ifdef CONFIG_KUSER_HELPERS /* kuser helpers */ @@ -116,6 +124,7 @@ static int __init alloc_vectors_page(void) } arch_initcall(alloc_vectors_page); +#ifndef CONFIG_VDSO32 int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) { struct mm_struct *mm = current->mm; @@ -151,6 +160,7 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) return PTR_ERR_OR_ZERO(ret); } +#endif /* !CONFIG_VDSO32 */ #endif /* CONFIG_COMPAT */ static int vdso_mremap(const struct vm_special_mapping *sm, @@ -221,6 +231,23 @@ static int __init vdso_mappings_init(const char *name, return 0; } +#ifdef CONFIG_COMPAT +#ifdef CONFIG_VDSO32 + +static struct vdso_mappings vdso32_mappings __ro_after_init; + +static int __init vdso32_init(void) +{ + extern char vdso32_start[], vdso32_end[]; + + return vdso_mappings_init("vdso32", vdso32_start, vdso32_end, + &vdso32_mappings); +} +arch_initcall(vdso32_init); + +#endif /* CONFIG_VDSO32 */ +#endif /* CONFIG_COMPAT */ + static struct vdso_mappings vdso_mappings __ro_after_init; static int __init vdso_init(void) @@ -263,6 +290,34 @@ static int vdso_setup(struct mm_struct *mm, return PTR_ERR_OR_ZERO(ret); } +#ifdef CONFIG_COMPAT +#ifdef CONFIG_VDSO32 +int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) +{ + struct mm_struct *mm = current->mm; + void *ret; + + if (down_write_killable(&mm->mmap_sem)) + return -EINTR; + + ret = ERR_PTR(vdso_setup(mm, &vdso32_mappings)); +#ifdef CONFIG_KUSER_HELPERS + if (!IS_ERR(ret)) + /* Map the kuser helpers at the ABI-defined high address. */ + ret = _install_special_mapping(mm, AARCH32_KUSER_HELPERS_BASE, + PAGE_SIZE, + VM_READ|VM_EXEC| + VM_MAYREAD|VM_MAYEXEC, + &compat_vdso_spec[1]); +#endif + + up_write(&mm->mmap_sem); + + return PTR_ERR_OR_ZERO(ret); +} +#endif /* CONFIG_VDSO32 */ +#endif /* CONFIG_COMPAT */ + int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { struct mm_struct *mm = current->mm;