From patchwork Fri Jun 17 23:54:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yury Norov X-Patchwork-Id: 13203 Received: (qmail 95701 invoked by alias); 17 Jun 2016 23:56:02 -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 95611 invoked by uid 89); 17 Jun 2016 23:56:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.2 required=5.0 tests=AWL, BAYES_40, KAM_MANYTO, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=no version=3.3.2 spammy=russell, sk:ynorov@, UD:compat.h, ynorovcaviumnetworkscom X-HELO: na01-bl2-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 16/19] arm64: signal32: move ilp32 and aarch32 common code to separated file Date: Sat, 18 Jun 2016 02:54:25 +0300 Message-ID: <1466207668-10549-17-git-send-email-ynorov@caviumnetworks.com> In-Reply-To: <1466207668-10549-1-git-send-email-ynorov@caviumnetworks.com> References: <1466207668-10549-1-git-send-email-ynorov@caviumnetworks.com> MIME-Version: 1.0 X-ClientProxiedBy: SN1PR0701CA0045.namprd07.prod.outlook.com (10.163.126.13) To SN1PR07MB2253.namprd07.prod.outlook.com (10.164.47.147) X-MS-Office365-Filtering-Correlation-Id: 2289eee9-bf5c-4e55-5f7f-08d3970ae734 X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2253; 2:kcXnzgCOSa5tgiair6C97fWuH9uTzY7eF4zQWfYxku2MayFiLLQW6GpJiVfe28EbPWo6WGkGMbThU8fE2m9QOmtiiwbb0kyTFBZZbVxjcuoCYxMAteHZbPqIJQro0wdT1Ce3HfL2QSHdmVRerlL94xTPTXfUg+X/NBDIW0AwSXn11V3qxLzSEwkDy+Lb5JFz; 3:tJnCl0Di9JiH1pyKGpI2gZwQDRxWT/Biycc1fH3tYB+ENNv2StBn3f7I3KaMH5carjnimuV5lo954izFYO/+RZpwwvnERSTg0jxbCosuL6Lg7JLjAjqtviGfgXZf08dm X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR07MB2253; X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2253; 25:L3TYASuk1AtcW63q/qD7VfdvtUmhV4qJVsOpI65g1vRe3Vm08jfurpxXMzhkczLLhabnfyjvuKF5dJcGwSShm3IlCLjBfct3a4ibmusOFFaG349ZQe5doK7CkVgSDdoyr/NAd1pUTJe5mU9BPZdVqfExXTnRotg0AIBHIUleVX88M0kwFu5cQTjGMGbkmJEnSEWqJg/8iyMVWDWfN6wOg1I9OYsGntsnizYGhKM24a4odtCm1PbpnudAthyScJWsvsRUOm2hCrmrHl2fIZSfy4uzvHqe1rvxkPHVMoQmjAOuaK7S182WXj5mdjiOcuTHtg/iPXH1lIeKZdQUuC3b4sYZ7T4EGJ5Eampw7CdkSrKaCofRS9mHaBOJ4SxgwZHuzxWW0yKerPGz+q1IuNt59Oby/8NIIrnn8KKskVR8tMv5bihGXZxUUHE4VBo2CtQbZrkQXQN49uBvvUvJbZVvTYF9u9wVcvZnln209Jpl0rLufWjW6f5PNqr4WImTTQMznV2YKJLaFqERcaJZviCK+xPyFSgwl8EDjpJ5zg4Wi8LJ3lwoJ5Ydgam+2n7hgBXcHcpXYJ7HPO0VJ8LaVhEiAEIT+g5LkuKMeCjN09CDt2LIcm+z3t34gK/FjLBENNsvmbw0cjhWCIeubdZEFUhUo00i4X4rkL9FNLsfbz4+uMpg4RB6jWneoTLrpBsNI79bFWOw8IfS/GrplHd4cUPJwkrKuwSZJhld7t6rf4aLkuGOl6SKB1mRd4jJ4EKtPEOCQl+EcfyGZ3W0tiWisdcGW1JLmRLBx0nAPBtSN/9uuoAAha+Po1hiMJHCVoe0yrRg3ZFvUdY5t9u/533z1D+3zLMxuNeYHyGpsekS6NZkUfuX1LV7nBELkWpDRpZKT6Uh X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2253; 20:YeHZizGNbL22YA5Rah4VxhVFe/+NiPXujVdfTFLbifwc4ugD91PUn4sR/Qc4nKb9qANEg6aT4rXmoM6UN0BUpjfKk3DshQU22bRcVZ9WpsXxyDLIHcsdSzB3e7YQYp8Et48RZWcn4RQfxVyNYdr2Da9y2G983qbjXFvwuWXesJWtqljYddWcCj4JgFMUkdWwlYgHh/M2g9MYkQI1QPWQJ/6sI/MvqMWwY2vso5nM6UWonXsSdsvW7+Wjzpqfe7u730NfRfmTAnaO3bMdRIVsZv2SiSx9H0E+5FH0SmbIBgihkRrL6k1h+472IGrsGuEyCTTNfXs9kKkO7N8cPEZif/2oquKQxdajwW0jknIUD+JlfhXDKjFwxSVbW/j77l9TUqbZDFxvuFipPYF2rRTAWf9qjBplL5yIUgF5c/SXI9YWTkcvsS6GmKiGCj7e+7qi69dYrOnPCQCwBt+/x83NUaqu8aDUVYQEIEMdQAarHPze5AwQ0YC9bacsajv4d2Fen7xefnqxvBhSIuBf5jdaPZFj9CCmymU6OwAlE38mZ/n/khjN4q1cMyVP9olZTmQCUIJAhHDshauifjxZo6CUI/5nUSmXzATS23t0eF4aoQM= 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:(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046); SRVR:SN1PR07MB2253; BCL:0; PCL:0; RULEID:; SRVR:SN1PR07MB2253; X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2253; 4:BlNWCXqFq0HxJGkdKhWBUVf8YFQZFqRo4G4yjAyC89vyWNkMDCOXuCbd7bNtM2MSoAGzJu92CT5TgASzb0n6vHdCtVFe72u+e55QGFLDmK5vQ0DkUXUTvxDdNL9C/gsfOIlCj1QpnMXTmvrtbdqmfldvvPYLxVDTivdMA0LjNUbRsRkjDKqmGKunEv9F2aHOX+yYApkQuZetjgqa3TPdZXPIEoqQA6cEOLjkyrNYFinl9oHLODTghgMxUIvSkdz0sm618vGe758+LIKSG0jNJBTVsmeG0C/UlnxMtGQiWc3i+xEhhdilzGZLD7Cy928gOj3jbVO8UaWdpklQrV5X/QrFJaMA9JKoYGiCxWpSCmYHBzn1Yw7b18ZQp1oxcpAWpSehQUcf3216a5UOIsno+ZPK7PMMi3JNhwLNXyz5GHADLItuMWTNrmrvSOYAIK5V3+mk4Fo68Ur4GlJHyakQrOwI94S1O2URmmBbmeip8dEo+nY8YtlNot1KlR50dyF1SlhQ2K1mGo6n0ssNV6u9Kg== X-Forefront-PRVS: 09760A0505 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6069001)(6009001)(7916002)(199003)(189002)(586003)(6116002)(3846002)(50226002)(48376002)(50466002)(36756003)(76506005)(2201001)(19580405001)(92566002)(19580395003)(33646002)(15975445007)(77096005)(81166006)(2950100001)(68736007)(42186005)(8676002)(229853001)(4326007)(2906002)(50986999)(76176999)(81156014)(106356001)(7846002)(105586002)(101416001)(66066001)(5003940100001)(47776003)(189998001)(5001770100001)(97736004)(5004730100002)(2004002)(2101003); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR07MB2253; H:localhost; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; CAT:NONE; LANG:en; CAT:NONE; Received-SPF: None (protection.outlook.com: caviumnetworks.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR07MB2253; 23:nqS9/jeq3lVB/qKb64dGe6/HT8//7a+Tz1cG/SQh1?= =?us-ascii?Q?qhH0ZTHaKKbWqDlKIhDJinjW26TRKtaR5eSE971xJ7dFeyqCkQ8Qrh/TXyw0?= =?us-ascii?Q?cHT6gdBowIRKJuSzB5M2V8Rf+u2xZgfQxjaG4NcFiS42N+c0CrxR4gaPu4Fx?= =?us-ascii?Q?oZo64TBM9d6GX1GmcJSOdgx+hohVS9DaElq8l6durH+FwbuBxz+ijdqtpHg8?= =?us-ascii?Q?JLG/IA64SLpUSI2GIj9ulZ4qXcvgimm0+JnAYGln+NvHSzQDrewywO8oyOwx?= =?us-ascii?Q?yjoS1nE7hoOI4zR9ANLoGViR4otqJ/p1IBAHARnA1oR8f37TykHCF2VOyWwd?= =?us-ascii?Q?EwgD2lcMLvw2+eclLOGCEIBegcwiF/tHT/tBCOiph3ZfFHCAsxTF81fVVuiI?= =?us-ascii?Q?Rt+gywNY8HqslQVeUMXfVvj/b/Q0L/A5ykwfcfB5I30fVZhPqHdcOKi28RWd?= =?us-ascii?Q?J1m4xsQQLbL78xe0KSE1zt6P46w8GsBEUCvGCQagQmEV3snUuARA1WLLN62c?= =?us-ascii?Q?uMTMCQPnq4YD2SPKlGKKB3hLEFvSI3yAPqrJZasKduXxpFbP7GD/HDnqjwKp?= =?us-ascii?Q?9J90hkZASyMzC1sztQLd/ikCp1V9ILANbVYbmYV9rgPJ6idTTrdO3Sf1strR?= =?us-ascii?Q?NoVst3b+l2qbQAHITaKL7fphfJmh0xcP0XY+eN/ImdlOd5hNPZ7QQaR4Tr7g?= =?us-ascii?Q?W7wm6pd34px8i5WMekYA9vr1IWBdY+0F3PGFPU6R6yD07Aoh0T1vwNwg89gt?= =?us-ascii?Q?2vByzvmAuNBvx45UNMXIk/KFWwBo1dbZJkYqTmYbT3bk8qf+Cbc5PSpBnJv/?= =?us-ascii?Q?6c/DU/1pf3c4FLW5i5XgArPFYajTYUj8yUFizTwDCRHQC7VJ+gfa5WKvl+ty?= =?us-ascii?Q?IZSnVgCi2Ojz4Z3kIXDRf6tiGYV2d5QPKBKkuiJuda0wnK94h1SUgZqkWcz1?= =?us-ascii?Q?pYUFnCK+D5MpAuVDL4wpx2/s2nLbUVpWJGBA5kStb+MfdEAGxdMMTSZpvyxB?= =?us-ascii?Q?oLbj9fDYcsXnFzPDAQzQ68ew4uRzpq0CTzU9cIvEgmEmkE4aGxASHeDsAF01?= =?us-ascii?Q?tQmmtDNLFxINZxWX2OSzSmqqrt/G7ocDNKFMUmaxTrlkMBRG2iCaoIRAFv8G?= =?us-ascii?Q?j8YBOzvZNvYLH3aO9S+0F9yLi2e+7Wo?= X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB2253; 6:A39js5qqQCqlpTVB7wqZxz4y3xQ/jFrSbfFrn/70H8lTRmv74yiHs2o3WxC3KAQzf02o3ar/fboi4UnlYB8HNdmNwWkbcxlQvIY880zgk5uxKFcl9/Dw8HfJcOCjpbYHF2bX4pQd3oWkbJeYZNXfMeuNZ8tlFZdCjsfold3pkQd4W5S1xx29NiXqd57E942tCpRnMbiGbfeaMeakpZHcdRiO22UA7zQiGcp6qVix0qOhIyOX2f90RDdDQwHlNB5baF61vOqJvp6yaSpPAh4r7DcnC0YzkGRscU9vHc3uwZs=; 5:8xkDJhfh8JQLl32/qGRSjQFU7gYOzCSltZdLCq60BTsbvoKbfo8EcIRpbEo6DyRIunwcp/bkBemIuxofUsAjMQm2dK3whnZsHaqgVc9QLfl3f8/aXUQuPSGM5+iWRchDZbMVH8VNYDx4jSh/sB+gFQ==; 24:rRYGYz6QH+ooH+szQWUZaCAyF/AJT0IFycC5LVPrV8GrDjc0PWyX+Em50uwZ2X74EgTX/d05Z9DpWE07ftEMcPkrD1R1t0gUtoU5uTZ8d3A=; 7:If+kBzoBWra6+gta3O2XhkJwqMnT2tFQWPZtuOlh4HDpmKCS7f6rCtRliTSiLB1eYC/CmoGwQDFA4Z0Yhf4cFKxVnDmAQoPtbOg+R/WTaxnMQKPnIGezCDhqwX1KuqcpKpkuVmdILqKVExccD7XdRNwtpSpIXwcjdMOuAR+Xhh7XSJJMXNOIxMQnVLKlX9RVPb1faCCzyfR7XrCtB48U2A== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jun 2016 23:55:47.1620 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR07MB2253 Signed-off-by: Yury Norov --- arch/arm64/include/asm/signal32_common.h | 25 +++++++ arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/signal32.c | 85 ----------------------- arch/arm64/kernel/signal32_common.c | 115 +++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+), 86 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_common.h b/arch/arm64/include/asm/signal32_common.h new file mode 100644 index 0000000..b4f2099 --- /dev/null +++ b/arch/arm64/include/asm/signal32_common.h @@ -0,0 +1,25 @@ +/* + * 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); + +#endif /* CONFIG_COMPAT*/ + +#endif /* __ASM_SIGNAL32_COMMON_H */ + diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 205bc03..d69bd40 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,7 +29,7 @@ arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o \ ../../arm/kernel/opcodes.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..b103af3 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c @@ -125,91 +125,6 @@ static inline int get_sigset_t(sigset_t *set, 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..8fbb609 --- /dev/null +++ b/arch/arm64/kernel/signal32_common.c @@ -0,0 +1,115 @@ +/* + * 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 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; +} +