From patchwork Wed Aug 17 11:46:42 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yury Norov X-Patchwork-Id: 9285707 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 976D460459 for ; Wed, 17 Aug 2016 12:00:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8BCD4291F3 for ; Wed, 17 Aug 2016 12:00:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8025D291F6; Wed, 17 Aug 2016 12:00:28 +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=-4.1 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, RCVD_IN_DNSWL_MED, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 00365291F3 for ; Wed, 17 Aug 2016 12:00:24 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1bZzUP-0002RD-2c; Wed, 17 Aug 2016 11:58:33 +0000 Received: from mail-cys01nam02on0054.outbound.protection.outlook.com ([104.47.37.54] helo=NAM02-CY1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1bZzMC-0001TE-2a for linux-arm-kernel@lists.infradead.org; Wed, 17 Aug 2016 11:50:25 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-caviumnetworks-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=fSU+Pi/3rdf118pC3zxth4Xd0E5JNqRWVASSydRpopM=; b=cjdKC9ZMW/Gm4gCbXIxnIoFJc7Hl6HkNe3iKWS7ObA21axjKQXq2NqPDKK2yV3b+B2Twelk9ChUPrR5LI+qMXrj6SJ8rtV84A60ymuEnCITGP2+UxmEC3bDCQvzlp+5YblukRD/pF6IPbk5OIt30bq7XsoRkS8d9PUsO335RuQ0= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Yuri.Norov@caviumnetworks.com; Received: from localhost (95.143.213.121) by SN1PR07MB2256.namprd07.prod.outlook.com (10.164.47.150) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.587.9; Wed, 17 Aug 2016 11:49:39 +0000 From: Yury Norov To: , , , , , , Subject: [PATCH 17/18] arm64:ilp32: add vdso-ilp32 and use for signal return Date: Wed, 17 Aug 2016 14:46:42 +0300 Message-ID: <1471434403-25291-18-git-send-email-ynorov@caviumnetworks.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1471434403-25291-1-git-send-email-ynorov@caviumnetworks.com> References: <1471434403-25291-1-git-send-email-ynorov@caviumnetworks.com> MIME-Version: 1.0 X-Originating-IP: [95.143.213.121] X-ClientProxiedBy: AM3PR03CA017.eurprd03.prod.outlook.com (10.141.191.145) To SN1PR07MB2256.namprd07.prod.outlook.com (10.164.47.150) X-MS-Office365-Filtering-Correlation-Id: ff065179-b155-44e5-97c9-08d3c69491fa X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2256; 2:lFGO1gke45buckzPQOv0T5klJHkHtYpwNQBRzAO/e97bbkDR7o+Afu7VapqXuUeFMZvFk4XCl+sJlf1JxyQC+MIWEzwIoTce1ZkF4LtY+GL+upUiKHXJRLZ4DgIBU5G+fRccgQz9qICcFX8lMs3NLSJgEN6EddioLpIINTii9WC1Ba+2nW0R/4XZWfJXutel; 3:tRUcU86ILAQui8mWjTcOdGO+E0XaGtjQRGUJtctz2L7/CE1TNJUXa2qJHPRpqNY24aj6C9xIq9v4+9cqR8VENsNS78+j0Srva1PQXpZwMkRlBmP4cLWpq1kyfZnco3Sx X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR07MB2256; X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2256; 25:KpBleKiYYfRrg7z/JN4d9sxGBZU83WvX/9jw18B3R75yHkukXBJ8u3tCK8zxWO7KJBSx8TET7eVcHIQ37D9LYqbrUrnfETUZXsUX0q850VSCaj7jE5PfL1RRvcHwTtj1imV3QlZXNk/aJyixpurNk/GSOk8ZRHewqnxLJ8GTwOtKqv0XNfeLX0GgKXlIcmELAE9/4pviAbz4xDg+NmAZ804segewFkn8JBcc8mBdZxtsqapCWuen9yt9oKzOHXSLyHpaS9EhbuWyI6RtCiAQU/Sty7VZ9Ozqk0aYBZ+8DOW2livhp3vaw2S1j+dnzjs8OE/v3qPQOkfNB96iRvloa29TilmkfAUiuoV78TaSFisujd7sdNBIptMiBCNGbHe1Y5Mn/KLHxfdbGSyLViN54QdqEGLzRR7W/xsobVPnUdL4x9B8K8Eeb/zXV34KMY2ISqdvtKIgxGhIqExrgwtx46ytYeMzdY6sqrNx9/VZxeMpPSnVDkuA9D5KkkwdT6ChqyKEBi/dP/lGlOPllHq9sfVw/MJRHhjVw7O4vkP6/7S1H/yb6alfaeyfLzu/Rb+ZAkx/PNl6K3D1kw+PPnGf9moWxu2FsxwS+65fFNnSckw98FMlVtAHm7VD8u3Ug5jzG7GY4xxqhp5mEpcF5AAFioW6EK95vQWMGT5tdk21jcVwj2smTRHNSoyLpCzcfWW9Dd+Mj/9539Dwh7qLxIchsRFdSCf/XUD3TG7pBI5i21LexSKCxzt+oMGabGB7+OdYlSNzZKhmKEDk4Pum6QDcnc+B0aqo2A6Nj99vYltUJLNTUCsGfaxCxHi5ESRudrvlbsD62XRanAdnuNJFOlCJEQ== X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2256; 31:UvZdIPLWckDTZjSosvfsa0KAeHEJTBY899njp4U1U6b0fLQg5dQlLgn4iRwgDdZknajpQrCIJP1AovK0Onukf9aaKhFc4dLvvcJ7sVjA+f96Zr6RtDn8Km60wgAPXPV0APImPOjQhaHlGSJFoMBDplSMKtxMMbfv00iRrJkrIOh99OoHXde1NkBNOTGWxuDfJqdzDu3hzCYg+CsUCsU+ttvTaKzCuP5LODXXmdvfDpE=; 20:bC6HIr1y1Lg/dpOrEdT8y1g2Xk/HYs5xrBz/VXdL3pQeGFIUnutL9ZQMCVrX2TQ/D4gHbAS2hk3d6w51nXuh4MJXzOOANrWeHd+TXLJuulTDKYAYutoZIo8RtMqY+hvLIDGXTxqH10Xt8GFU//k75Ef4lG/hN4m/yetx9yoVrT7SGzCaNsxKxRpwirf854vrEGye86Ge6TloSuXSbM2gAI1yYNSj4m4qsiKdgY/onE74n1u7dqq2JtBaI16juLluCzucUlw88gnLKLwUvsxH+5PU6qPv0FMUVvS3OFZnbNhotLv7ZvuExv3IThgfMlrjBRBJBp/mBYixoSH1Syg0kmeIwVsKH86U17T9l5cknOdBU7dJK4HiiwKKTQDBpoAs+cFpVK1xKYYXses6z0/TYKESLkPtZWwiM/ObIhLKZtJVFJ1w13WpdWQ3LgsQIZOlArx3a9cmMi8KuhYTNxsQUsJ54DO2rTHYybxH+qco0ENDW97QG28tho1RMGe9FU67xXJho/PYnEuK9Ea4ah4C15xJDouAoZU2TNWY5zpAGIO7NpANiCjDXSJ9h+7lqRONanQoqY/wbYnHUs3X57klG1peL/CrtwxkezKpgavAZl8= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(250305191791016)(180628864354917)(22074186197030); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001); SRVR:SN1PR07MB2256; BCL:0; PCL:0; RULEID:; SRVR:SN1PR07MB2256; X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2256; 4:HQZrzTIm0xz4SPDlSh2dTRmxtMBsxVlduGZbPQGYeFigFMaZ5yE30NIOuymY8mOOQqKHWPDORrU21D7q1JB4YzejgJDkybXcFDCiAUjPlvisovlp9qoW8W/p441RdKzu0q5F2DBhF4T68h/6wxrMZ+EegqaVWJic09OIdj/l2wMb2ye4UoGWH1VZok98ILhsA8p1PoXezzTb6oFFyiRbFENdwE9QrdK5TR8A3i8fcDj6rIwelWK9tpdQXnrRnB1nlf/UkGr+HDYp4VdS0WJito2CzemUdeNFitu0gou3LlATy4kgk1FclsPJ1TN9u8gJFaVFtkmqGHCwHarmIVXfb4fGIvd5Ly4N6tN+1Lbd/pLyiR6WmK4W7r3a9RGIQSO/qmcKCTz7gF4tJSFRYIwfdHFa07SlFPpaTjBE7oSHFK7cxNepClokG8n1byMOBJ21+2K2ueiWQHSbVn5nUc/5EhqvJzYAjK/19/q/SujqmzT/PhzH0Nq43+OfLj0pPhu0 X-Forefront-PRVS: 0037FD6480 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(6069001)(7916002)(189002)(199003)(586003)(106356001)(36756003)(8676002)(19580395003)(19580405001)(229853001)(2906002)(5003940100001)(33646002)(50226002)(7846002)(7736002)(47776003)(305945005)(4326007)(81156014)(3846002)(68736007)(66066001)(92566002)(189998001)(5001770100001)(97736004)(7416002)(50986999)(105586002)(76176999)(2950100001)(48376002)(101416001)(81166006)(6116002)(77096005)(15975445007)(2201001)(42186005)(50466002)(76506005)(2004002)(2101003); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR07MB2256; H:localhost; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: caviumnetworks.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR07MB2256; 23:JQXPyvq1LDei+pMr8SWec65fFunCnqdTH11WKTb/Y?= =?us-ascii?Q?nv9xXIsX2b34L62KGpFWaeaz61YtTXWrbvbhLnQad5nOCzAQ/s24KAq3z2Za?= =?us-ascii?Q?F02uPOegc5pQkwg5qHz19jxQRblAgtxlrZD7mi/Ki4B/DGlZEJg8DyYz7IXg?= =?us-ascii?Q?uB6zoTC49kTotmXaq++ef6MQ2hGoYFJiguv+jxJbRddCjaywxOzuhxk6Almd?= =?us-ascii?Q?JBL5UWdpNF7WA0nvR3Npu5d2aj/sr2RMDHOvNsytX2aRpuvX12nv/lb9K5fp?= =?us-ascii?Q?F/UJLAgqno+BhhQva7NAzpjWvY2R/AOZarqw/9C0VqBL76kO9eKPmj1A6NEL?= =?us-ascii?Q?3mBGkmeVrCrDpjz3DJKMP4aJM7ZPiMTZhvHWWc/Y5EU0OGVo+ZYa3X4M8gXy?= =?us-ascii?Q?sAmTdlZcdzEoO/+jXlZykeOldQu/KnOkCsk0xE6PuGTLd/6rWY6KdE8FBNNq?= =?us-ascii?Q?0FdeRpDJuXozFu3z6fuMkaUPKBSaSZijVDDs2S0vi8jBVXeYL/j67F73Przl?= =?us-ascii?Q?J5XYwMrZZJOksXg9YICAYoersCO623941tnT+FmOijRPvp/nuZGA6CWuViqp?= =?us-ascii?Q?Xd/1IMkY41GgEX8NqluN205vhdgQldrIQZab1FLivsPTGTG9BPPLUDv9OsiF?= =?us-ascii?Q?3QR/nbpqHzeubaVoIUG5WN76ISOPWLUfGQAvqcXNyArcYATyt3jC5PPHsxz5?= =?us-ascii?Q?qyiYwOcMoXnMvICKy3rJ/Aq+liQtOhAizskzovbGOxoXLuIYq/P+7Cqb9cip?= =?us-ascii?Q?dkD69KNPzr+3e24OtFcTaLmreesvY8gZxA6nZsSkjDt1/qlUBxKiRTcphALY?= =?us-ascii?Q?BJaZQBsDwaYxlRkRN0SIH4ASAgbrXC3DsGVAMscmqztLPTvrskBZtU7rqpc5?= =?us-ascii?Q?6MjN9wEEXIpERCPB43hpYTICm/mDDsGGhmrb9DO7SrHfif45IvEkLRt7V4/+?= =?us-ascii?Q?gpHoNvrIE1rh02ZUDwDzsG3fbpDfoWQs1pSYGulCfkjOU8UD4+E5oAR0u/GK?= =?us-ascii?Q?1kK07AIP8nVtiMG7+PMwNnPnVpPKXTpLx+dI2hTXQoL7AYz9FYS+vqtj/nxS?= =?us-ascii?Q?miIEmB9ctw03phlTl96dyyq55z6hvskw0Gje/LMZEmE9BESrTkJX0Dmk0zqg?= =?us-ascii?Q?cYyr1bhgJVUh2NAlwtHwVJy1vLw6X/N3Xsf5szgdzBB3k2DP+HW6XHR5pIRb?= =?us-ascii?Q?goaSKmuAg2NkMo=3D?= X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2256; 6:xl3yed2TKFZux8pWDgFc9kvXIWYMmX0KdYgXnbSpkDCIHEcpcpXy5fZQH+lmcQfvMYPigsL6mldQQAo9Ct/eXnND/N1I7oVKUQukoMlJKBeZ3kBsYKs4EjABrzGBZZzXAWPFd5v+XIX473cvbJwB5+D3a8qfzboqxeCOg5Jq8p6MofbhYANnOLPIWTC1reLMjsTUVt6jzScn5UUzZzqR1UN99yHwzBoHyBpTXLkxHJUzA8GhnTlPsbxawURhIy5sGc6XuL3YID81Qy6QhzXbKtopGBJpKDCBdTWB63P483Q=; 5:Ne8tYoL8FtSw45BKvsGjNBE3DiyGQJ7GPUF9llWLnhXew/zfvKjjD4Qo4+vSH0W++bvezjXE0iVqKSvDDx0F4hSViO4hyqV7Ups/OFMG0H3AVclhGl2waQ5iz0YtAjoorxUd8ujiJTLEeOaJ5zd1Ug==; 24:2njaNjVRtwL3dDSp7TupLzywG74eqdMOK8MpavG28GzxS/cELc6W9Gh5hxnbcDbfb4VcuAjgqACD12tzNcpcfVHtxLKEg1VKnPmaKnS7804=; 7:pN3NR29lnl4l+oylPUekdipD7Lz+U/75n6lFZSt/r2lOpmwuCVS2nPJgSzvyRQUOKZ7KDHTZMaOq3SqjjoGzA45WccfNfe+ncoK1X+vKgAm9+ButNZjsGWmsenjXwZGCPbCiz3VHuSLvU/QErdY2CJsyDZ3q2mePK9pXPaHlJFXAk91mMq4DA/lLo7dqgPW3yf6rEMfV8qWuGmkmImKEn94iBltSHmuwdl5OHvL6tcA8InouyrgcqQM9AUCTPmlX SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Aug 2016 11:49:39.2307 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR07MB2256 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160817_045004_739618_8B6E3945 X-CRM114-Status: GOOD ( 11.97 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: szabolcs.nagy@arm.com, heiko.carstens@de.ibm.com, cmetcalf@ezchip.com, ynorov@caviumnetworks.com, philipp.tomsich@theobroma-systems.com, joseph@codesourcery.com, zhouchengming1@huawei.com, Prasun.Kapoor@caviumnetworks.com, agraf@suse.de, geert@linux-m68k.org, kilobyte@angband.pl, manuel.montezelo@gmail.com, pinskia@gmail.com, linyongting@huawei.com, klimov.linux@gmail.com, broonie@kernel.org, bamvor.zhangjian@huawei.com, maxim.kuvyrkov@linaro.org, Nathan_Lynch@mentor.com, schwidefsky@de.ibm.com, davem@davemloft.net, christoph.muellner@theobroma-systems.com 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: Philipp Tomsich ILP32 VDSO exports next symbols: __kernel_rt_sigreturn; __kernel_gettimeofday; __kernel_clock_gettime; __kernel_clock_getres; What shared object to use, kernel selects depending on result of is_ilp32_compat_task() in arch/arm64/kernel/vdso.c, so it substitutes correct pages and spec. Adjusted to move the move data page before code pages in sync with commit 601255ae3c98fdeeee3a8bb4696425e4f868b4f1 Signed-off-by: Philipp Tomsich Signed-off-by: Christoph Muellner Signed-off-by: Yury Norov --- arch/arm64/include/asm/vdso.h | 6 ++ arch/arm64/kernel/Makefile | 11 ++++ arch/arm64/kernel/asm-offsets.c | 7 ++ arch/arm64/kernel/signal.c | 2 + arch/arm64/kernel/vdso-ilp32/.gitignore | 2 + arch/arm64/kernel/vdso-ilp32/Makefile | 74 +++++++++++++++++++++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S | 33 ++++++++++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S | 95 +++++++++++++++++++++++++++ arch/arm64/kernel/vdso.c | 75 ++++++++++++++++----- arch/arm64/kernel/vdso/gettimeofday.S | 18 ++++- 10 files changed, 305 insertions(+), 18 deletions(-) create mode 100644 arch/arm64/kernel/vdso-ilp32/.gitignore create mode 100644 arch/arm64/kernel/vdso-ilp32/Makefile create mode 100644 arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S create mode 100644 arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h index 839ce00..649a9a4 100644 --- a/arch/arm64/include/asm/vdso.h +++ b/arch/arm64/include/asm/vdso.h @@ -29,6 +29,12 @@ #include +#ifdef CONFIG_ARM64_ILP32 +#include +#else +#define vdso_offset_sigtramp_ilp32 +#endif + #define VDSO_SYMBOL(base, name) \ ({ \ (void *)(vdso_offset_##name - VDSO_LBASE + (unsigned long)(base)); \ diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 7038ffb..86a12ba 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -53,6 +53,17 @@ arm64-obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o \ cpu-reset.o obj-y += $(arm64-obj-y) vdso/ probes/ +obj-$(CONFIG_ARM64_ILP32) += vdso-ilp32/ obj-m += $(arm64-obj-m) head-y := head.o extra-y += $(head-y) vmlinux.lds + +# vDSO - this must be built first to generate the symbol offsets +$(call objectify,$(arm64-obj-y)): $(obj)/vdso/vdso-offsets.h +$(obj)/vdso/vdso-offsets.h: $(obj)/vdso + +ifeq ($(CONFIG_ARM64_ILP32),y) +# vDSO - this must be built first to generate the symbol offsets +$(call objectify,$(arm64-obj-y)): $(obj)/vdso-ilp32/vdso-ilp32-offsets.h +$(obj)/vdso-ilp32/vdso-ilp32-offsets.h: $(obj)/vdso-ilp32 +endif diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index 19a6883..5815015 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -118,6 +118,13 @@ int main(void) DEFINE(TSPEC_TV_SEC, offsetof(struct timespec, tv_sec)); DEFINE(TSPEC_TV_NSEC, offsetof(struct timespec, tv_nsec)); BLANK(); +#ifdef CONFIG_COMPAT + DEFINE(COMPAT_TVAL_TV_SEC, offsetof(struct compat_timeval, tv_sec)); + DEFINE(COMPAT_TVAL_TV_USEC, offsetof(struct compat_timeval, tv_usec)); + DEFINE(COMPAT_TSPEC_TV_SEC, offsetof(struct compat_timespec, tv_sec)); + DEFINE(COMPAT_TSPEC_TV_NSEC, offsetof(struct compat_timespec, tv_nsec)); + BLANK(); +#endif DEFINE(TZ_MINWEST, offsetof(struct timezone, tz_minuteswest)); DEFINE(TZ_DSTTIME, offsetof(struct timezone, tz_dsttime)); BLANK(); diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 241bfeb..7142b12 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -267,6 +267,8 @@ void setup_return(struct pt_regs *regs, struct k_sigaction *ka, if (ka->sa.sa_flags & SA_RESTORER) sigtramp = ka->sa.sa_restorer; + else if (is_ilp32_compat_task()) + sigtramp = VDSO_SYMBOL(current->mm->context.vdso, sigtramp_ilp32); else sigtramp = VDSO_SYMBOL(current->mm->context.vdso, sigtramp); diff --git a/arch/arm64/kernel/vdso-ilp32/.gitignore b/arch/arm64/kernel/vdso-ilp32/.gitignore new file mode 100644 index 0000000..61806c3 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/.gitignore @@ -0,0 +1,2 @@ +vdso-ilp32.lds +vdso-ilp32-offsets.h diff --git a/arch/arm64/kernel/vdso-ilp32/Makefile b/arch/arm64/kernel/vdso-ilp32/Makefile new file mode 100644 index 0000000..0671e88 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/Makefile @@ -0,0 +1,74 @@ +# +# Building a vDSO image for AArch64. +# +# Author: Will Deacon +# Heavily based on the vDSO Makefiles for other archs. +# + +obj-ilp32-vdso := gettimeofday-ilp32.o note-ilp32.o sigreturn-ilp32.o + +# Build rules +targets := $(obj-ilp32-vdso) vdso-ilp32.so vdso-ilp32.so.dbg +obj-ilp32-vdso := $(addprefix $(obj)/, $(obj-ilp32-vdso)) + +ccflags-y := -shared -fno-common -fno-builtin +ccflags-y += -nostdlib -Wl,-soname=linux-ilp32-vdso.so.1 \ + $(call cc-ldoption, -Wl$(comma)--hash-style=sysv) + +obj-y += vdso-ilp32.o +extra-y += vdso-ilp32.lds vdso-ilp32-offsets.h +CPPFLAGS_vdso-ilp32.lds += -P -C -U$(ARCH) -mabi=ilp32 + +# Force dependency (incbin is bad) +$(obj)/vdso-ilp32.o : $(obj)/vdso-ilp32.so + +# Link rule for the .so file, .lds has to be first +$(obj)/vdso-ilp32.so.dbg: $(src)/vdso-ilp32.lds $(obj-ilp32-vdso) + $(call if_changed,vdso-ilp32ld) + +# Strip rule for the .so file +$(obj)/%.so: OBJCOPYFLAGS := -S +$(obj)/%.so: $(obj)/%.so.dbg FORCE + $(call if_changed,objcopy) + +# Generate VDSO offsets using helper script +gen-vdsosym := $(srctree)/$(src)/../vdso/gen_vdso_offsets.sh +quiet_cmd_vdsosym = VDSOSYM $@ +define cmd_vdsosym + $(NM) $< | $(gen-vdsosym) | LC_ALL=C sort > $@ && \ + cp $@ include/generated/ +endef + +$(obj)/vdso-ilp32-offsets.h: $(obj)/vdso-ilp32.so.dbg FORCE + $(call if_changed,vdsosym) + +# Assembly rules for the .S files +#$(obj-ilp32-vdso): %.o: $(src)/../vdso/$(subst -ilp32,,%.S) +# $(call if_changed_dep,vdso-ilp32as) + +$(obj)/gettimeofday-ilp32.o: $(src)/../vdso/gettimeofday.S + $(call if_changed_dep,vdso-ilp32as) + +$(obj)/note-ilp32.o: $(src)/../vdso/note.S + $(call if_changed_dep,vdso-ilp32as) + +# This one should be fine because ILP32 uses the same generic +# __NR_rt_sigreturn syscall number. +$(obj)/sigreturn-ilp32.o: $(src)/../vdso/sigreturn.S + $(call if_changed_dep,vdso-ilp32as) + +# Actual build commands +quiet_cmd_vdso-ilp32ld = VDSOILP32L $@ + cmd_vdso-ilp32ld = $(CC) $(c_flags) -mabi=ilp32 -Wl,-n -Wl,-T $^ -o $@ +quiet_cmd_vdso-ilp32as = VDSOILP32A $@ + cmd_vdso-ilp32as = $(CC) $(a_flags) -mabi=ilp32 -c -o $@ $< + +# Install commands for the unstripped file +quiet_cmd_vdso_install = INSTALL $@ + cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@ + +vdso-ilp32.so: $(obj)/vdso-ilp32.so.dbg + @mkdir -p $(MODLIB)/vdso + $(call cmd,vdso_install) + +vdso_install: vdso-ilp32.so diff --git a/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S new file mode 100644 index 0000000..46ac072 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2012 ARM Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Author: Will Deacon + */ + +#include +#include +#include +#include + + __PAGE_ALIGNED_DATA + + .globl vdso_ilp32_start, vdso_ilp32_end + .balign PAGE_SIZE +vdso_ilp32_start: + .incbin "arch/arm64/kernel/vdso-ilp32/vdso-ilp32.so" + .balign PAGE_SIZE +vdso_ilp32_end: + + .previous diff --git a/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S new file mode 100644 index 0000000..1dde31f --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S @@ -0,0 +1,95 @@ +/* + * GNU linker script for the VDSO library. + * + * Copyright (C) 2012 ARM Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Author: Will Deacon + * Heavily based on the vDSO linker scripts for other archs. + */ + +#include +#include +#include + +SECTIONS +{ + PROVIDE(_vdso_data = . - PAGE_SIZE); + . = VDSO_LBASE + SIZEOF_HEADERS; + + .hash : { *(.hash) } :text + .gnu.hash : { *(.gnu.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + + .note : { *(.note.*) } :text :note + + . = ALIGN(16); + + .text : { *(.text*) } :text =0xd503201f + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr + .eh_frame : { KEEP (*(.eh_frame)) } :text + + .dynamic : { *(.dynamic) } :text :dynamic + + .rodata : { *(.rodata*) } :text + + _end = .; + PROVIDE(end = .); + + /DISCARD/ : { + *(.note.GNU-stack) + *(.data .data.* .gnu.linkonce.d.* .sdata*) + *(.bss .sbss .dynbss .dynsbss) + } +} + +/* + * We must supply the ELF program headers explicitly to get just one + * PT_LOAD segment, and set the flags explicitly to make segments read-only. + */ +PHDRS +{ + text PT_LOAD FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */ + dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ + note PT_NOTE FLAGS(4); /* PF_R */ + eh_frame_hdr PT_GNU_EH_FRAME; +} + +/* + * This controls what symbols we export from the DSO. + */ +VERSION +{ + LINUX_4.6 { + global: + __kernel_rt_sigreturn; + __kernel_gettimeofday; + __kernel_clock_gettime; + __kernel_clock_getres; + local: *; + }; +} + +/* + * Make the sigreturn code visible to the kernel. + */ +VDSO_sigtramp_ilp32 = __kernel_rt_sigreturn; diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 0adc4fb..cbf147b 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -40,6 +40,12 @@ extern char vdso_start, vdso_end; static unsigned long vdso_pages; static struct page **vdso_pagelist; +#ifdef CONFIG_ARM64_ILP32 +extern char vdso_ilp32_start, vdso_ilp32_end; +static unsigned long vdso_ilp32_pages; +static struct page **vdso_ilp32_pagelist; +#endif + /* * The vDSO data page. */ @@ -110,57 +116,94 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) } #endif /* CONFIG_AARCH32_EL0 */ -static struct vm_special_mapping vdso_spec[2]; - -static int __init vdso_init(void) +static int __init vdso_init_common(char *init_vdso_start, char *init_vdso_end, + unsigned long *vdso_pagesp, + struct page ***vdso_pagelistp, + struct vm_special_mapping* vdso_spec) { int i; + unsigned long init_vdso_pages; + struct page **init_vdso_pagelist; - if (memcmp(&vdso_start, "\177ELF", 4)) { + if (memcmp(init_vdso_start, "\177ELF", 4)) { pr_err("vDSO is not a valid ELF object!\n"); return -EINVAL; } - vdso_pages = (&vdso_end - &vdso_start) >> PAGE_SHIFT; + init_vdso_pages = (init_vdso_end - init_vdso_start) >> PAGE_SHIFT; + *vdso_pagesp = init_vdso_pages; pr_info("vdso: %ld pages (%ld code @ %p, %ld data @ %p)\n", - vdso_pages + 1, vdso_pages, &vdso_start, 1L, vdso_data); + init_vdso_pages + 1, init_vdso_pages, + init_vdso_start, 1L, vdso_data); /* Allocate the vDSO pagelist, plus a page for the data. */ - vdso_pagelist = kcalloc(vdso_pages + 1, sizeof(struct page *), + init_vdso_pagelist = kcalloc(init_vdso_pages + 1, sizeof(struct page *), GFP_KERNEL); - if (vdso_pagelist == NULL) + *vdso_pagelistp = init_vdso_pagelist; + if (init_vdso_pagelist == NULL) return -ENOMEM; /* Grab the vDSO data page. */ - vdso_pagelist[0] = pfn_to_page(PHYS_PFN(__pa(vdso_data))); + init_vdso_pagelist[0] = pfn_to_page(PHYS_PFN(__pa(vdso_data))); /* Grab the vDSO code pages. */ - for (i = 0; i < vdso_pages; i++) - vdso_pagelist[i + 1] = pfn_to_page(PHYS_PFN(__pa(&vdso_start)) + i); + for (i = 0; i < init_vdso_pages; i++) + init_vdso_pagelist[i + 1] = + pfn_to_page(PHYS_PFN(__pa(init_vdso_start)) + i); /* Populate the special mapping structures */ vdso_spec[0] = (struct vm_special_mapping) { .name = "[vvar]", - .pages = vdso_pagelist, + .pages = init_vdso_pagelist, }; vdso_spec[1] = (struct vm_special_mapping) { .name = "[vdso]", - .pages = &vdso_pagelist[1], + .pages = &init_vdso_pagelist[1], }; return 0; } + +static struct vm_special_mapping vdso_spec[2]; + +static int __init vdso_init(void) +{ + return vdso_init_common(&vdso_start, &vdso_end, + &vdso_pages, &vdso_pagelist, + vdso_spec); +} arch_initcall(vdso_init); +#ifdef CONFIG_ARM64_ILP32 +static struct vm_special_mapping vdso_ilp32_spec[2]; + +static int __init vdso_ilp32_init(void) +{ + return vdso_init_common(&vdso_ilp32_start, &vdso_ilp32_end, + &vdso_ilp32_pages, &vdso_ilp32_pagelist, + vdso_ilp32_spec); +} +arch_initcall(vdso_ilp32_init); +#endif + int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { struct mm_struct *mm = current->mm; unsigned long vdso_base, vdso_text_len, vdso_mapping_len; void *ret; + unsigned long pages = vdso_pages; + struct vm_special_mapping *spec = vdso_spec; + +#ifdef CONFIG_ARM64_ILP32 + if (is_ilp32_compat_task()) { + pages = vdso_ilp32_pages; + spec = vdso_ilp32_spec; + } +#endif - vdso_text_len = vdso_pages << PAGE_SHIFT; + vdso_text_len = pages << PAGE_SHIFT; /* Be sure to map the data page */ vdso_mapping_len = vdso_text_len + PAGE_SIZE; @@ -173,7 +216,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, } ret = _install_special_mapping(mm, vdso_base, PAGE_SIZE, VM_READ|VM_MAYREAD, - &vdso_spec[0]); + &spec[0]); if (IS_ERR(ret)) goto up_fail; @@ -182,7 +225,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, ret = _install_special_mapping(mm, vdso_base, vdso_text_len, VM_READ|VM_EXEC| VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, - &vdso_spec[1]); + &spec[1]); if (IS_ERR(ret)) goto up_fail; diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S index e00b467..143b39e 100644 --- a/arch/arm64/kernel/vdso/gettimeofday.S +++ b/arch/arm64/kernel/vdso/gettimeofday.S @@ -25,6 +25,16 @@ #define NSEC_PER_SEC_LO16 0xca00 #define NSEC_PER_SEC_HI16 0x3b9a +#ifdef __LP64__ +#define PTR_REG(n) x##n +#define OFFSET(n) n +#define DELOUSE(n) +#else +#define PTR_REG(n) w##n +#define OFFSET(n) COMPAT_##n +#define DELOUSE(n) mov w##n, w##n +#endif + vdso_data .req x6 seqcnt .req w7 w_tmp .req w8 @@ -136,6 +146,8 @@ x_tmp .req x8 /* int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz); */ ENTRY(__kernel_gettimeofday) .cfi_startproc + DELOUSE(0) + DELOUSE(1) adr vdso_data, _vdso_data /* If tv is NULL, skip to the timezone code. */ cbz x0, 2f @@ -160,7 +172,7 @@ ENTRY(__kernel_gettimeofday) mov x13, #1000 lsl x13, x13, x12 udiv x11, x11, x13 - stp x10, x11, [x0, #TVAL_TV_SEC] + stp PTR_REG(10), PTR_REG(11), [x0, #OFFSET(TVAL_TV_SEC)] 2: /* If tz is NULL, return 0. */ cbz x1, 3f @@ -182,6 +194,7 @@ ENDPROC(__kernel_gettimeofday) /* int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp); */ ENTRY(__kernel_clock_gettime) .cfi_startproc + DELOUSE(1) cmp w0, #JUMPSLOT_MAX b.hi syscall adr vdso_data, _vdso_data @@ -297,6 +310,7 @@ ENDPROC(__kernel_clock_gettime) /* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res); */ ENTRY(__kernel_clock_getres) .cfi_startproc + DELOUSE(1) cmp w0, #CLOCK_REALTIME ccmp w0, #CLOCK_MONOTONIC, #0x4, ne ccmp w0, #CLOCK_MONOTONIC_RAW, #0x4, ne @@ -311,7 +325,7 @@ ENTRY(__kernel_clock_getres) ldr x2, 6f 2: cbz w1, 3f - stp xzr, x2, [x1] + stp PTR_REG(zr), PTR_REG(2), [x1] 3: /* res == NULL. */ mov w0, wzr