From patchwork Wed Aug 17 11:46:39 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yury Norov X-Patchwork-Id: 660080 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3sDnZl4dSDz9t0m for ; Wed, 17 Aug 2016 21:49:35 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b=AGsOWXau; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-type; q=dns; s=default; b=VS12e jkMCvjqX/LUyRc0qbVatvuMtkaAWQu9fslFi69p/rh9nJFxvBEQMnVvh7gTTOPVs BL93X4gHsDDjjThaRr9SIuBVeERI0Whsv+UoRRZ9BdLbf18SsZPq/b9TKq+7l9PZ KbZYLzRE4ro71Ua3mbn7J/vTCPaxwFwBkgymv4= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-type; s=default; bh=3ZCSB0elKgr qeBQ83QkJ4DrQhfA=; b=AGsOWXaudaA7WC+blLlaKq2qARdjYsolMsczcuTXMQC KdDYezYLWQZJ+msN/+YfUkSmYb1i4EJrQubz8zGdaJg7/XMVc0rrc8W2jhJi6kmt 75xMUVcC0titdzsqJ4bz0eT2fEyeCg+CnFHXD281f82HbGN5Xl8C+4RHgexj1RSM = Received: (qmail 114310 invoked by alias); 17 Aug 2016 11:49:26 -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 114157 invoked by uid 89); 17 Aug 2016 11:49:25 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.7 required=5.0 tests=AWL, BAYES_50, KAM_MANYTO, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=no version=3.3.2 spammy=King, HX-Exchange-Antispam-Report-Test:192374486261705, Based, 1, 28 X-HELO: NAM03-CO1-obe.outbound.protection.outlook.com Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Yuri.Norov@caviumnetworks.com; From: Yury Norov To: , , , , , , CC: , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH 14/18] arm64: signal32: move ilp32 and aarch32 common code to separated file Date: Wed, 17 Aug 2016 14:46:39 +0300 Message-ID: <1471434403-25291-15-git-send-email-ynorov@caviumnetworks.com> 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-ClientProxiedBy: AM3PR03CA023.eurprd03.prod.outlook.com (10.141.191.151) To CY1PR07MB2247.namprd07.prod.outlook.com (10.164.112.149) X-MS-Office365-Filtering-Correlation-Id: 1aaa820f-c05f-4be1-979e-08d3c6948089 X-Microsoft-Exchange-Diagnostics: 1; CY1PR07MB2247; 2:E0PNUXhub8Ml56qiuoGg4HAHBNcmW68e0x0PpnqPzVkNaADoE5sxRc+fjjXcckLzdcdxcSDEz4KvvwcSH2ISzFeeHAbyaAxzivKsBoQm8Vt0z2nC0kOsUN3TMSUNhRoMd7G3McT8UOLLXcGwcS8I5ajODJPM84TG3XHHOViss+TUIIM8L+qNNpGEi4u7LtC5; 3:mvyIXC+ZHaYZgTwbfv0DaP+ikWxTH7GyA5bcwwY/Jm9n0o2a7/uJttawhBYtByfaRcGEg0BtwqJofMi8wk7/L07GaGe8s8/1gz//4Fup/l/UU1uEDlZLLlShfaxx9bUH X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR07MB2247; X-Microsoft-Exchange-Diagnostics: 1; CY1PR07MB2247; 25:ns1/8qQSFhopfhxejLtI+IKlpdiNNZpYbEQHUg5xlaZDrEnzHuONxwrC4QI0SavRdkp6gQrtL4Ufc8vKXPu1n9sqGQ7ROHWkxEOnGPRy9l+YUWVvewqFqZTZ+pLkCk6L7lXEsRTUzaV04Hyp3klV27rFyqfQcDjeGtPMmIbc9C98+DdF8gF7LyrhLXnjdMTTEEnx32F7IYBt9H4MoBwwdS/0Lz1J+hDSrwRuItcSSamFXqoTDCZ0V6X5T6Fvnz1QZpsE50ICm0jpMXtpOLHOYr+lMyY1OnSmM60p1Kq4WPIKwjvd2ygdqOOQspdoajavS2e/q4bk1u6eeXhLVcUglkDcTFl2cnvtQ8LsnLG8AH6TJxHMP3uSk3lm2jg096deZnnRdR5lLt1vq+bA5z1iGsLg255aHGWi153AsM7riC4HobfYU7sbYdou83aJgYhdU0kevL2Drk4YCWHzd/mFRkQnEJfcfTPKLgXUCsXmaNHuY1q5NY4uA13D+MaGGb0YKu4vGOigSMx0eG0zpizQTnCvcO9rrmXZRnnaqgck/UpiLfPYsM9sElRZCRY/IAsGS3Pz8OJf8ndyETsBI4UFzMhg8lt38zyNtAuB/eenKSXpX7kgDcpaJVBR/WE+7zKb/waL7SRAV/iQykGvaGw9JvqKXxyVKsfahbBSZzDrzhLPShK0iOOlyVyWt1aCfq9E9BOFtdaGWxSlErx50dxluzdiOHUSCat2grGCBCaK6ra9rharJj2caGLMITWbg+mFEUqRk7auOnmTqvVJgvDzcHoAaiKF4OGJntf7aQuOtQIAknLy+TDKjXYDosWN3Uj4UN7vp4LphjAOYIwjuypS7H7rFgMmWi0r7/2zF2MY8Vra/G6QKkCawa0NHYl/RVbu X-Microsoft-Exchange-Diagnostics: 1; CY1PR07MB2247; 31:2nrZufcy4kRT19n5wBQGK/lymvYZHw3BjrO04Hp9ScsQEtZbGweufsl1l0kgnmtJJVv7euAMfoiG+LqyLS1z9eo/FnxkXxuvOmHx5CSozPO/K5IvrWnuq+E7D651QzrSTEUY7oT90RFWySFQTNKdvr/Ll0DUCrF6A3iF2xLwVqjLSKrfLZRNP4mdUe0X/rpdKF50hzUAPOSsUaA/E8hFaGBi0dkubRDQnyTva3CnH8o=; 20:cN148PcihzH46URzkUdFdU75bKoAtKqKBPaJ4FN1YOurUm0ZYC6AGzGQtWUa3hEqKGZzW5IAHteux4MXAyI5yijZHzbnW532Feh5fTB7ZJxBJVkLbCRlWNki3DQFg9V+9qiApvAZcXOecv5M9jjWlajpx7+q5/3wqCWootxoAqAymtz5hKRQ5mDblv41+/6KePJ/z62GJnIVf+Zj2G+WwkzIuM4/YY8cV38FHr8NNqBXttpW84inirhd9gMxbzidmlbq+a+PT3OI88c37pvuMh3qeB1yhwRX/dUizq82jXMyJoMGHC8NCl5nzthlF6CQtmXDgSuT60UQ6daJVFmo1UuvZM1jW+16SRIcK4l3tVHR5XUfThrRQdRw5JoU9ysllxeQ4jrQ8/FcH9jm5v19F+uWpefdTcGI2dWPOu7axRpEj16CiKAH6OhiZIJSxPLjjp8WWGcoPvSAGh+9ML40QZYS97OAmEiMOMnSxuyVT2efSuwx+q1C679kSWXvDOYYLnUIfrJ4FzkYjIsBSx0apEXfVixWlk42Pn9W0qzuPXHNqcPbMLsnAHJ8VMpAEuH6qBSH1l53u493SEmdItjZDWyVYc63iHFluImzuEsSzwA= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(250305191791016)(180628864354917)(22074186197030)(192374486261705); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046); SRVR:CY1PR07MB2247; BCL:0; PCL:0; RULEID:; SRVR:CY1PR07MB2247; X-Microsoft-Exchange-Diagnostics: 1; CY1PR07MB2247; 4:ZGJPOTydY54XlqIEt40KjIzDgyaQxgi9veTFni5eLeKoipfAEyGJTRIeP3Nii/UYNSkblPUI80G5z0H19igeVNYRbA8JC8YjQfJAspIG832y1eTL6InPKaVLh3ncJMi3hDamujIybbsXe9H7TXDnHFusIFtmth3FHghiOQrRkD5A6+8k8UpqW7gjMCh34L9XNj67S1vCo+uTPiM9Cu9508ZaJyWcZfaLobVzaVjral9SuWiOfrLGAPh0NDeyXC32jCyuXYDMc7EFY+2FoRLut0w0zqumJODW0wJItzRC2C2pb1fJuK1m6hhKCAw7raVrQpEKCxYLq+K9CczgbmlNeCCYsek0DZzhXB4rEu/26UizKy9Ea6PxJ0d5GZJb8Pw3VSPUdstNiTWNasCX8ITpoFyce3Kim0GZEmT8RM9WRRGjGvtQ179NRI0psBwa9Rj452H47D+Ef5q5MS3OYDg/elhn9i3uNoXi8+njlIYkXlqzHSMzNsIX8sCMcP0oc8cyZVAFC9YUrWcbES4rmxh6pwu10/eoYbiLwNBATSMHXrg= X-Forefront-PRVS: 0037FD6480 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6069001)(6009001)(7916002)(199003)(189002)(81156014)(50466002)(36756003)(50986999)(81166006)(586003)(76176999)(8676002)(47776003)(66066001)(7416002)(6116002)(3846002)(48376002)(50226002)(92566002)(2201001)(77096005)(229853001)(2950100001)(15975445007)(305945005)(42186005)(97736004)(105586002)(68736007)(5001770100001)(76506005)(33646002)(106356001)(7846002)(7736002)(2906002)(189998001)(101416001)(19580405001)(5003940100001)(19580395003)(4326007)(2004002)(2101003); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR07MB2247; H:localhost; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX: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; CY1PR07MB2247; 23:unhfSCCBVupEGFNVFtrVr+9S5OQeU6yOEmiy4asP8?= =?us-ascii?Q?IQy6UhFlp7lDI/uWlicObTCQ8ee4qyDkJYc+0sv4bdxdRrrD+gMy1Xv+imDz?= =?us-ascii?Q?8I8X7Z+lnRWdyVjLGBdY1MHefLrRyz7Cv7PVESob6h46/0eNgMcDoeWQI8Dg?= =?us-ascii?Q?EdXrKJU8tPFn0MjquuVAtV5izNuAIY9xLKXt+uEABcZhrFIX8Qp/fDAp9uoV?= =?us-ascii?Q?iaMn2/9WUd3oPpZNodaA9YS57yNTs5WQPmO2NU0f2jPss0JPJDsdbhv1JpTM?= =?us-ascii?Q?1/PHYWrH/O0GgxdvTFzr0bLcnLCfSRceQO+yxZnRKjKTGUTKCk93ViMagOsp?= =?us-ascii?Q?amHh2a90rNH+lK3z+YbTUiwSqbzAXXZfMUcwS80WZb/M2D92+/32w0dyjngu?= =?us-ascii?Q?MwAFKyc2qtYpK/zjv0sbot+QiZwGZIz3QhTGxiLri1jQXahCfefxkxDa5Kj6?= =?us-ascii?Q?OOWQtA4H7SQjRYWGsWwpEMiqdEFIKEOY4nTJgIcOB3pATCjDjCwmsmPen0kM?= =?us-ascii?Q?eITtZqTUQjipgXIqxfNq/1dBFiYGrlTIqdoRt81PdtRveV4o5DHoxxiRA5xW?= =?us-ascii?Q?RRR3+pBCDZY7+B59byyAzZwS5Cl3K9ICL8/1rzahH5yWtBVKdzIqdpAElDRR?= =?us-ascii?Q?AOtQ0/kvLjphnQHEoadDVUQ2fO/VjMZdo1YRu+jTEvw7lfwjQMPd+RDADnvq?= =?us-ascii?Q?NG8RKtfxCQNZnmnACtIeMYycRxsA1KTP/rZb0uz8mm+A9uGjUYEa+GC2xRJJ?= =?us-ascii?Q?zqo0tMbbYbGHaDXDMfEpir1mDosOWCliewWwlVY6ECznLWFLKMyRqLA+LNkp?= =?us-ascii?Q?yfr4keMwRoOztSV7cg12e3MSltAHM1Ymu59oktF3dt4Ln/HMzcqlHxccu75u?= =?us-ascii?Q?pBSse6sxd8JHVvTdo83WUC4qvcBwQAf4IfrzAAdpiwEQDJchj0LPBx+3yigC?= =?us-ascii?Q?DHTV1UeOPOv394gJzLBQFvSlWo3ttYc5GNPDMVpm6oXUB1fmh4y5QFHQ+0F/?= =?us-ascii?Q?dAqBwnARlwbRu3x7I6VjvUxfCRw02MLAg+TpdJ5qay7YrntPmGwRCqamwDR/?= =?us-ascii?Q?Kp+gQissV9VKD7bFTOtgstH4UOVMGgKZB6DgdLspDbDPg1jsemumpyTI5Kw5?= =?us-ascii?Q?ZCgSGpJJ/L4I7jd1l1Z1TAIU2v/3V+FeuU0yDP2a/rue+l7BSxqB4w1pUHKf?= =?us-ascii?Q?sDBhxYF9Aq7Ldg=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR07MB2247; 6:QQ39P4eTudgCCFIBR1NAfcGjB1DNB0/xlrPVnEwwdxCaq1omMGFGk0bSHcnt3hGWgCSLdrO1MpLQonrKv7RgZZlsoX9SKFoD35fZwi/HCYZai0ayLPfma22FYWdhqcOio0TdJVcw8DFWx+SXnnqHGo5g9rMSYiN3HhCEUKRbq9UEWt7FifXCRavFV1IPKEq6STkUvXRXAdZZw7rTrUS0wNdknxMpO01c683HIgkHztM19gs4airAuXU7bflpcwd2+p82OyWX3CGDshZ42OG1n9IQR6xXawlARqsGBSlFQEo=; 5:eVz57rNEKkcNzEe5739xrY3rY3OgiccnBR8gY3YrhCM/kCLOfNVt1WejnrynbjXXJcwQKPGZpKmz7/NNWgY7acV+BJ+ol/8M8LbYZhYZRC8j4CbsQtSPf94WXP3MVhnRTNHn9+imPVygmFvtS7p5Uw==; 24:u/8EfwDFjY1Nvimms6OHLMjxiwzgvgZ/KTiezjsVRuGXFMreTmQO63isv4qO5wWGGvj+pk2ZcrUXRS3JMEQ4OnjBkfZlAdf11F3Xp4KsOo4=; 7:mWMD9Zq/4c/xLRSh3sXHW5ma6UTPWiOcrcRnXDOAyJxZyb/6Yj53OFr5fVQsnHr2Wrj7GBqANXXxUPkt9VY2YvoAQLeN33k+IL0cqQoL0ZOcxuixtSEdyv7DarpI+S2aY2l5aOCQIacIVAYLjsrI6Sz9EDtZybLAHE/T/JzCWdJjM9mV7YCvwSMw1NKjkXZoQXpFExffpz2XB/lkXSqMqwYcpbbkjWqyrtpZyHYgBDA9Q+uNXFWm2r3e0OgbiJJ9 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Aug 2016 11:49:09.8807 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR07MB2247 Signed-off-by: Yury Norov --- arch/arm64/include/asm/signal32.h | 3 + arch/arm64/include/asm/signal32_common.h | 28 +++++++ arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/signal32.c | 107 ------------------------ arch/arm64/kernel/signal32_common.c | 136 +++++++++++++++++++++++++++++++ 5 files changed, 168 insertions(+), 108 deletions(-) create mode 100644 arch/arm64/include/asm/signal32_common.h create mode 100644 arch/arm64/kernel/signal32_common.c diff --git a/arch/arm64/include/asm/signal32.h b/arch/arm64/include/asm/signal32.h index e68fcce..1c4ede7 100644 --- a/arch/arm64/include/asm/signal32.h +++ b/arch/arm64/include/asm/signal32.h @@ -13,6 +13,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + +#include + #ifndef __ASM_SIGNAL32_H #define __ASM_SIGNAL32_H diff --git a/arch/arm64/include/asm/signal32_common.h b/arch/arm64/include/asm/signal32_common.h new file mode 100644 index 0000000..e3e2d01 --- /dev/null +++ b/arch/arm64/include/asm/signal32_common.h @@ -0,0 +1,28 @@ +/* + * 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 . + */ +#ifndef __ASM_SIGNAL32_COMMON_H +#define __ASM_SIGNAL32_COMMON_H + +#ifdef CONFIG_COMPAT + +int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from); +int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from); + +int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set); +int get_sigset_t(sigset_t *set, const compat_sigset_t __user *uset); + +#endif /* CONFIG_COMPAT*/ + +#endif /* __ASM_SIGNAL32_COMMON_H */ + diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 36257b7..20e8e66 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -28,7 +28,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o arm64-obj-$(CONFIG_ARM64_ILP32) += binfmt_ilp32.o sys_ilp32.o -arm64-obj-$(CONFIG_COMPAT) += entry32_common.o +arm64-obj-$(CONFIG_COMPAT) += entry32_common.o signal32_common.o arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES) += arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c index b7063de..f2c1a38 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c @@ -103,113 +103,6 @@ struct compat_rt_sigframe { #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) -static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set) -{ - compat_sigset_t cset; - - cset.sig[0] = set->sig[0] & 0xffffffffull; - cset.sig[1] = set->sig[0] >> 32; - - return copy_to_user(uset, &cset, sizeof(*uset)); -} - -static inline int get_sigset_t(sigset_t *set, - const compat_sigset_t __user *uset) -{ - compat_sigset_t s32; - - if (copy_from_user(&s32, uset, sizeof(*uset))) - return -EFAULT; - - set->sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); - return 0; -} - -int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) -{ - int err; - - if (!access_ok(VERIFY_WRITE, to, sizeof(*to))) - return -EFAULT; - - /* If you change siginfo_t structure, please be sure - * this code is fixed accordingly. - * It should never copy any pad contained in the structure - * to avoid security leaks, but must copy the generic - * 3 ints plus the relevant union member. - * This routine must convert siginfo from 64bit to 32bit as well - * at the same time. - */ - err = __put_user(from->si_signo, &to->si_signo); - err |= __put_user(from->si_errno, &to->si_errno); - err |= __put_user((short)from->si_code, &to->si_code); - if (from->si_code < 0) - err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, - SI_PAD_SIZE); - else switch (from->si_code & __SI_MASK) { - case __SI_KILL: - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - break; - case __SI_TIMER: - err |= __put_user(from->si_tid, &to->si_tid); - err |= __put_user(from->si_overrun, &to->si_overrun); - err |= __put_user(from->si_int, &to->si_int); - break; - case __SI_POLL: - err |= __put_user(from->si_band, &to->si_band); - err |= __put_user(from->si_fd, &to->si_fd); - break; - case __SI_FAULT: - err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr, - &to->si_addr); -#ifdef BUS_MCEERR_AO - /* - * Other callers might not initialize the si_lsb field, - * so check explicitly for the right codes here. - */ - if (from->si_signo == SIGBUS && - (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO)) - err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); -#endif - break; - case __SI_CHLD: - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - err |= __put_user(from->si_status, &to->si_status); - err |= __put_user(from->si_utime, &to->si_utime); - err |= __put_user(from->si_stime, &to->si_stime); - break; - case __SI_RT: /* This is not generated by the kernel as of now. */ - case __SI_MESGQ: /* But this is */ - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - err |= __put_user(from->si_int, &to->si_int); - break; - case __SI_SYS: - err |= __put_user((compat_uptr_t)(unsigned long) - from->si_call_addr, &to->si_call_addr); - err |= __put_user(from->si_syscall, &to->si_syscall); - err |= __put_user(from->si_arch, &to->si_arch); - break; - default: /* this is just in case for now ... */ - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - break; - } - return err; -} - -int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) -{ - if (copy_from_user(to, from, __ARCH_SI_PREAMBLE_SIZE) || - copy_from_user(to->_sifields._pad, - from->_sifields._pad, SI_PAD_SIZE)) - return -EFAULT; - - return 0; -} - /* * VFP save/restore code. * diff --git a/arch/arm64/kernel/signal32_common.c b/arch/arm64/kernel/signal32_common.c new file mode 100644 index 0000000..4a45aa6 --- /dev/null +++ b/arch/arm64/kernel/signal32_common.c @@ -0,0 +1,136 @@ +/* + * Based on arch/arm/kernel/signal.c + * + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Modified by Will Deacon + * + * 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 . + */ + +#include +#include +#include + +#include +#include +#include +#include +#include + +int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set) +{ + compat_sigset_t cset; + + cset.sig[0] = set->sig[0] & 0xffffffffull; + cset.sig[1] = set->sig[0] >> 32; + + return copy_to_user(uset, &cset, sizeof(*uset)); +} + +int get_sigset_t(sigset_t *set, const compat_sigset_t __user *uset) +{ + compat_sigset_t s32; + + if (copy_from_user(&s32, uset, sizeof(*uset))) + return -EFAULT; + + set->sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); + return 0; +} + +int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) +{ + int err; + + if (!access_ok(VERIFY_WRITE, to, sizeof(*to))) + return -EFAULT; + + /* If you change siginfo_t structure, please be sure + * this code is fixed accordingly. + * It should never copy any pad contained in the structure + * to avoid security leaks, but must copy the generic + * 3 ints plus the relevant union member. + * This routine must convert siginfo from 64bit to 32bit as well + * at the same time. + */ + err = __put_user(from->si_signo, &to->si_signo); + err |= __put_user(from->si_errno, &to->si_errno); + err |= __put_user((short)from->si_code, &to->si_code); + if (from->si_code < 0) + err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, + SI_PAD_SIZE); + else switch (from->si_code & __SI_MASK) { + case __SI_KILL: + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + break; + case __SI_TIMER: + err |= __put_user(from->si_tid, &to->si_tid); + err |= __put_user(from->si_overrun, &to->si_overrun); + err |= __put_user(from->si_int, &to->si_int); + break; + case __SI_POLL: + err |= __put_user(from->si_band, &to->si_band); + err |= __put_user(from->si_fd, &to->si_fd); + break; + case __SI_FAULT: + err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr, + &to->si_addr); +#ifdef BUS_MCEERR_AO + /* + * Other callers might not initialize the si_lsb field, + * so check explicitly for the right codes here. + */ + if (from->si_signo == SIGBUS && + (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO)) + err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); +#endif + break; + case __SI_CHLD: + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + err |= __put_user(from->si_status, &to->si_status); + err |= __put_user(from->si_utime, &to->si_utime); + err |= __put_user(from->si_stime, &to->si_stime); + break; + case __SI_RT: /* This is not generated by the kernel as of now. */ + case __SI_MESGQ: /* But this is */ + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + err |= __put_user(from->si_int, &to->si_int); + break; + case __SI_SYS: + err |= __put_user((compat_uptr_t)(unsigned long) + from->si_call_addr, &to->si_call_addr); + err |= __put_user(from->si_syscall, &to->si_syscall); + err |= __put_user(from->si_arch, &to->si_arch); + break; + default: /* this is just in case for now ... */ + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + break; + } + return err; +} + +int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) +{ + if (copy_from_user(to, from, __ARCH_SI_PREAMBLE_SIZE) || + copy_from_user(to->_sifields._pad, + from->_sifields._pad, SI_PAD_SIZE)) + return -EFAULT; + + return 0; +} +