From patchwork Fri Jun 17 23:54:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yury Norov X-Patchwork-Id: 13201 Received: (qmail 94320 invoked by alias); 17 Jun 2016 23:55:51 -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 94156 invoked by uid 89); 17 Jun 2016 23:55:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.5 required=5.0 tests=AWL, BAYES_05, KAM_MANYTO, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=no version=3.3.2 spammy=russell, Networks, networks, H*r:sk:mail-bn X-HELO: na01-bn1-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 15/19] arm64: signal: share lp64 signal routines to ilp32 Date: Sat, 18 Jun 2016 02:54:24 +0300 Message-ID: <1466207668-10549-16-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: CY1PR04CA0040.namprd04.prod.outlook.com (10.166.187.50) To DM3PR07MB2249.namprd07.prod.outlook.com (10.164.33.147) X-MS-Office365-Filtering-Correlation-Id: 3095acfa-a9f7-4aac-1146-08d3970ae501 X-Microsoft-Exchange-Diagnostics: 1; DM3PR07MB2249; 2:FfmtQF0/zuKRPlRYKEaX8WWGqrSYykbMdqqLxGt58wi3M5JcslY+2rD7bcJf9qDgaLfZbm2zHigl5/FJMYUExjTw9aWkBEHru5BwvLC1gjYxGt4mbVgZGGiauxQFqPrW0u5gNfqfY6eZhZL8ksym65oAdv0EV+mxBmVO9J4kPRAcTtrVlwcvb/GCc0NJUsVX; 3:zAzaVs516nmzG0oj7H/YWAzrQIG2ON9fJNdXd5/W0ZLT8im4dKBkzbJi9cRrWHpnG3Mk/O4iEDQcL8o/pZH+TUtCZyja2YmoElywIph9N2yFE8SEmkirBtW76Q7sP9cw; 25:O6nZBW5Bl4goNMIG0z9sML4E7AsuAg78cyQiErCB70yeYoqOJSZnG11m5fqOlWF9Vj+oGPdgs2BPP0AvCD1gTvpIpI8HFpYeVjAzw4BJMztJZkE9rYl3JQ/7yrbctGSgOQvKNE9yD5dMQQqP1jTydO0d3+4uvsJ9NzaGZYhQ+ymgsAShVyE7U70QoOdnI3TM/LSea83lnEbsLGLQ4tPpyDQyhEZKurBk7WNXTJ3ze5yocuVfR0fVW6BpfZqb5/hg6oJqf34ztD1id/1u5p/Yg/3cwqC8QrGyaWI6YScdGeyyyBVXT+66b10rSdqE1jiZ1NBup1bF8B7XF1GbQSQW128LPgZve/sD/zCO69BODIYBT4Sc/15kK38oHYg/V/AtxmDNx8xDhcZAByMNWS1B0W5W5n+1I7ifBHpZ1qEjDfQ= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM3PR07MB2249; X-Microsoft-Exchange-Diagnostics: 1; DM3PR07MB2249; 20:6YoqUxbhYIz6fZjjH41c9l6zyRtCCxudHTSqR/XL9C76YyQP/1r6BiXJ3Fx3c6nCJrwJeBvmq4xpSWnstQ3oK3q/bJsa/BN+o0J52SgN/dc4Pu3RN0ttdKlwuVJHKp1baUcc4POO1byD+ojAQLLXY7iSDJdAiK3iqrOU6emhfD5TT3OFtVgX7+wgd+r9jhkNwQEPWP89i7tWuj31nFVQkqgWUuC5mTDWUvNzQFIf2dmDeNBkCoeMqZ+yxjf+NSPNRS+UQ0ftXOoQwlKDjJ2wxt6HYs0eIT2d8+cSjn2kg67eBpRGsXF1bZiNP1qBAD3qB7O1FHXCG+NtKSznCpfm+LvubBNsNBB9lHWVkDTfWN4ib4CkK9qWvaa+XufRa5tkfQkd7Kuys40Ox27NBDVP+r5foFEu4UY/ruRFuN3gWrn19w73tGN0Jdtvtmq0U45Fna0qjMENN7c8l0uFrGNMS4tGdsDnbqaT0whz2ac7Y/jE8hzMA34SOgkkx2FRSfi0DyzME8jA04+wYb1mCiQCL210mMo+nz+DmaKii8jl5mPFssPmqaHUx6xLowYHxdvmSJWfe/gj0Y+EHwpd0eNFTsBC+ZV9Fvn8SqV+EiEf9UI= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(250305191791016)(22074186197030); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046); SRVR:DM3PR07MB2249; BCL:0; PCL:0; RULEID:; SRVR:DM3PR07MB2249; X-Microsoft-Exchange-Diagnostics: 1; DM3PR07MB2249; 4:kB1KS7RPe8fkinjTEL7aAi7F6pFrRWqPbKuqjpc5nv01FGzI5zaIrhpaGYRQEzFVDgpaqKrxwV44NOxKFw/vn2A5WpNdZXr/4NeTZePnFNE52L9D9QDUiP4ott5uYcvJ8K47IfPt6LGQLoMBuozKufJHwi/NXRuYfQ9sfLuQ1CHk31IKrRJHv+wLBF0y6ZF1VplbaWvQWajKvf2MyjSs7eg4f7sUcEfJRGTM94a+jp0wXhEYSBNapqh5th6aAeA36Ju6UGC7Ardu4iSjKa16ODCRBqYLlyZ+n2rdvv/+2NsRSJRdhqCVi7PycjzX6RnR4cUeePZVX5VTZy3eFy6tWpuTcqDAQ1t/GTkjO426MRBHm8+jbNsuvz4E2/ul69FEKfwmCS7OLILveR1+/FPR5oCWjefZFGjy3idyqQEfTkDSP2pkXgeb9AcLLVp+/oiQ X-Forefront-PRVS: 09760A0505 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6069001)(6009001)(7916002)(189002)(199003)(76176999)(50986999)(3846002)(6116002)(66066001)(586003)(47776003)(97736004)(105586002)(5001770100001)(50226002)(189998001)(2201001)(2950100001)(229853001)(81166006)(77096005)(81156014)(15975445007)(8676002)(106356001)(68736007)(42186005)(36756003)(2906002)(76506005)(19580395003)(4326007)(19580405001)(101416001)(50466002)(48376002)(7846002)(92566002)(5004730100002)(5003940100001)(33646002)(2004002)(2101003); DIR:OUT; SFP:1101; SCL:1; SRVR:DM3PR07MB2249; 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; DM3PR07MB2249; 23:fWnn2gkGxNse2W0rWgj6Cnu+vMGQUC4GIGEsgxyld?= =?us-ascii?Q?2KMAv4ApJ7s4LfFEt/uzmRMr/eqD9mTqeo681AxhljJx4Enel9oCuxoIaLBZ?= =?us-ascii?Q?RcN6sAY0K44BOYDIsQZ4JPrQkeaTONaDS0vcPi4QqcfcRVH0igTo3FX+eGpU?= =?us-ascii?Q?4TWOzVtfNF63+o3Y30MHKTxJ4h9wtard+6SgLmdt9lPM45VFMD1WWOunhXO4?= =?us-ascii?Q?RTKBNoLNP/bR9wpGXgs6DMDXSX1HcV4eY6PCTWv9dvagUGM20hkdDCUOZnRx?= =?us-ascii?Q?fpW3YcNQ5ury4NT2P9tAonDwDfztnb7iCIeuoLccy5izSx5Hf3n4dQDD0Rld?= =?us-ascii?Q?csBRt9n3X9/LkCVoqxiNUWmaWP4Dtk7o3XR85I0FFJVm/84rtkvJ5fPNr5eF?= =?us-ascii?Q?rHvJDTRDCrfa+5wUCTlWEsBGorkprANpetinX9fabuizEmFzZKk6JMI5XnTk?= =?us-ascii?Q?RYpaAq8f0VbPcwsTo9903LqWWihjt2bzVZ0orxyjJTgKVHN4h081LTtkSvLi?= =?us-ascii?Q?kj8FBDfbxU9oox0bFBNjro95uuM7r1+L1NVL54Ev7VoAKdz7nZd9N84paUSz?= =?us-ascii?Q?qOSdW9QG0Dh0HpSS56tnhTd6R0KgK8kHpMwQ879Vtbjb8BhfT3wiIZL50wIJ?= =?us-ascii?Q?zY86Q5nyG7JGK99kp9ZJ9JUYYOmWeHWG/9Z8xDIu01rmaphHVyWmQ1FXJz37?= =?us-ascii?Q?wMukfVl2FUf4CN224g+NSr05tnA1aZi3pzVqwETH6YVQYzWiM179kBzRwHfB?= =?us-ascii?Q?y8GOhFqHPUcH0F8hIXcB9wfC0D7BA5/EUSZJ4X7kIl0ISs7sI7MLAG4jbXNP?= =?us-ascii?Q?g9gra2ApywwmpSPmivkBe0pqg/JxVTDPAWxSy4PvTP8/7AOc1i1OfANAAZOO?= =?us-ascii?Q?3fsOgZPUh65omeEKOvj3lVpVi/KJFW35xhEkwMLU91KPiCw8pTMt5gyZR5Rx?= =?us-ascii?Q?FabXx7mzS09fSBK6j5UryuwrormUCzjLXmxn8PZS7j/Lc8zMR4KzhGx/L7BN?= =?us-ascii?Q?KUw2K1TrwBqM/Necfi/SPA54QTfQXIDkCpailuEUJf08gkMVfjULtupyZHfd?= =?us-ascii?Q?VMdRaFen22N7rSBkNRge63h25/aj7BQQXfSwnj/mxtdjpfYexIowZtSDe+Aa?= =?us-ascii?Q?vjXcUc+8HW2yEflsPd7yNif7JRbZidG?= X-Microsoft-Exchange-Diagnostics: 1; DM3PR07MB2249; 6:cBAZWOuLEcXIFRnJHRX5LK2pBbb+bMyyI+nzMqS3GfLpEQbMykyRvE1fLW5CG/8KlrJjuk4C6ZbuhqiyZZdW4BR3DKMiUA7VNEv4CerI2W/0gpwzYqzF1s25OSJrllhrUUWJ18L99ZfODtg9NJt/I4XDFiaCxW1JwzLeQWaAr26BtX1Ykno89bjXHZkadBXkTm8qp0u8kFrpnJN+pjdpCR2t4KskJEb06snGj4an0xKUx1dyaBF2GxHsTv9IadWSfDqRedY+DAUDGh7jDoFy9HdELIgT80NfJ+N0Hw4mrOg=; 5:Z/nVMR3rwnJhIJoi/dEptjFU07plVzcudVgnxEIRgYaXDmmRDE7q9k67xMWB2qCHBZTuaIRmliLogeetOlYZaWSmUQmEjoO/1N3trN+lMM1+yhtCtIjxRuXZxk9eW/A1oExLKgM9CGgX1JVs3ySUpA==; 24:7XbpdFmRMwwZjZbI5F6bLNxh0lcDFmVCbKoI+vSRlZTraH9CxJ7res+iJwPCcCiPzGVY7Kx/uRYN9DYbAFQ8YgmQ9CUJx7GGX5TOoHiyTL4=; 7:dWtcXe/rrnwglwL/2hXyPQIGRN3rcsMF9hF6CKrVeV2kGFLp+UqX2uhXV/ncSN/QKhTOprxxl3oZRXuVY4pJi5IELV3iUBCHD4y9zvrBsYovqWq1FarpWZEdrbxQnQjJ8RD0mKYd/l2DxRYnLY4XljPLqNy/a3aC6hrCdeuLP5UrY2IR4BqrkJ/EgDhW1RZieCnIsdbmIqe2fee1ssAsC0ZDGOIerk2hRFcx2L18tBJkpGX4ueHqsNTOStxIeugJ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jun 2016 23:55:43.5220 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM3PR07MB2249 After that, it will be possible to reuse it in ilp32. Signed-off-by: Yury Norov --- arch/arm64/include/asm/signal_common.h | 33 ++++++++++++ arch/arm64/kernel/signal.c | 93 +++++++++++++++++++++------------- 2 files changed, 92 insertions(+), 34 deletions(-) create mode 100644 arch/arm64/include/asm/signal_common.h diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h new file mode 100644 index 0000000..756ed2c --- /dev/null +++ b/arch/arm64/include/asm/signal_common.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2016 Cavium Networks. + * + * 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_SIGNAL_COMMON_H +#define __ASM_SIGNAL_COMMON_H + +#include +#include +#include + +int preserve_fpsimd_context(struct fpsimd_context __user *ctx); +int restore_fpsimd_context(struct fpsimd_context __user *ctx); +int setup_sigcontext(struct sigcontext __user *uc_mcontext, struct pt_regs *regs); +int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sf); +void setup_return(struct pt_regs *regs, struct k_sigaction *ka, + void __user *frame, off_t sigframe_off, int usig); + +#endif /* __ASM_SIGNAL_COMMON_H */ diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index be02f65..5c73864 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -34,18 +34,26 @@ #include #include #include +#include + +#define RT_SIGFRAME_FP_POS (offsetof(struct rt_sigframe, sig) \ + + offsetof(struct sigframe, fp)) + +struct sigframe { + struct ucontext uc; + u64 fp; + u64 lr; +}; /* * Do a signal return; undo the signal stack. These are aligned to 128-bit. */ struct rt_sigframe { struct siginfo info; - struct ucontext uc; - u64 fp; - u64 lr; + struct sigframe sig; }; -static int preserve_fpsimd_context(struct fpsimd_context __user *ctx) +int preserve_fpsimd_context(struct fpsimd_context __user *ctx) { struct fpsimd_state *fpsimd = ¤t->thread.fpsimd_state; int err; @@ -65,7 +73,7 @@ static int preserve_fpsimd_context(struct fpsimd_context __user *ctx) return err ? -EFAULT : 0; } -static int restore_fpsimd_context(struct fpsimd_context __user *ctx) +int restore_fpsimd_context(struct fpsimd_context __user *ctx) { struct fpsimd_state fpsimd; __u32 magic, size; @@ -93,22 +101,30 @@ static int restore_fpsimd_context(struct fpsimd_context __user *ctx) } static int restore_sigframe(struct pt_regs *regs, - struct rt_sigframe __user *sf) + struct sigframe __user *sf) { sigset_t set; - int i, err; - void *aux = sf->uc.uc_mcontext.__reserved; - + int err; err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set)); if (err == 0) set_current_blocked(&set); + err |= restore_sigcontext(regs, &sf->uc.uc_mcontext); + return err; +} + + +int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *uc_mcontext) +{ + int i, err = 0; + void *aux = uc_mcontext->__reserved; + for (i = 0; i < 31; i++) - __get_user_error(regs->regs[i], &sf->uc.uc_mcontext.regs[i], + __get_user_error(regs->regs[i], &uc_mcontext->regs[i], err); - __get_user_error(regs->sp, &sf->uc.uc_mcontext.sp, err); - __get_user_error(regs->pc, &sf->uc.uc_mcontext.pc, err); - __get_user_error(regs->pstate, &sf->uc.uc_mcontext.pstate, err); + __get_user_error(regs->sp, &uc_mcontext->sp, err); + __get_user_error(regs->pc, &uc_mcontext->pc, err); + __get_user_error(regs->pstate, &uc_mcontext->pstate, err); /* * Avoid sys_rt_sigreturn() restarting. @@ -145,10 +161,10 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) goto badframe; - if (restore_sigframe(regs, frame)) + if (restore_sigframe(regs, &frame->sig)) goto badframe; - if (restore_altstack(&frame->uc.uc_stack)) + if (restore_altstack(&frame->sig.uc.uc_stack)) goto badframe; return regs->regs[0]; @@ -162,27 +178,36 @@ badframe: return 0; } -static int setup_sigframe(struct rt_sigframe __user *sf, +static int setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set) { - int i, err = 0; - void *aux = sf->uc.uc_mcontext.__reserved; - struct _aarch64_ctx *end; + int err = 0; /* set up the stack frame for unwinding */ __put_user_error(regs->regs[29], &sf->fp, err); __put_user_error(regs->regs[30], &sf->lr, err); + err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); + err |= setup_sigcontext(&sf->uc.uc_mcontext, regs); + + return err; +} + +int setup_sigcontext(struct sigcontext __user *uc_mcontext, + struct pt_regs *regs) +{ + void *aux = uc_mcontext->__reserved; + struct _aarch64_ctx *end; + int i, err = 0; for (i = 0; i < 31; i++) - __put_user_error(regs->regs[i], &sf->uc.uc_mcontext.regs[i], + __put_user_error(regs->regs[i], &uc_mcontext->regs[i], err); - __put_user_error(regs->sp, &sf->uc.uc_mcontext.sp, err); - __put_user_error(regs->pc, &sf->uc.uc_mcontext.pc, err); - __put_user_error(regs->pstate, &sf->uc.uc_mcontext.pstate, err); - __put_user_error(current->thread.fault_address, &sf->uc.uc_mcontext.fault_address, err); + __put_user_error(regs->sp, &uc_mcontext->sp, err); + __put_user_error(regs->pc, &uc_mcontext->pc, err); + __put_user_error(regs->pstate, &uc_mcontext->pstate, err); - err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); + __put_user_error(current->thread.fault_address, &uc_mcontext->fault_address, err); if (err == 0) { struct fpsimd_context *fpsimd_ctx = @@ -229,14 +254,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, return frame; } -static void setup_return(struct pt_regs *regs, struct k_sigaction *ka, - void __user *frame, int usig) +void setup_return(struct pt_regs *regs, struct k_sigaction *ka, + void __user *frame, off_t fp_pos, int usig) { __sigrestore_t sigtramp; regs->regs[0] = usig; regs->sp = (unsigned long)frame; - regs->regs[29] = regs->sp + offsetof(struct rt_sigframe, fp); + regs->regs[29] = regs->sp + fp_pos; regs->pc = (unsigned long)ka->sa.sa_handler; if (ka->sa.sa_flags & SA_RESTORER) @@ -257,17 +282,17 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, if (!frame) return 1; - __put_user_error(0, &frame->uc.uc_flags, err); - __put_user_error(NULL, &frame->uc.uc_link, err); + __put_user_error(0, &frame->sig.uc.uc_flags, err); + __put_user_error(NULL, &frame->sig.uc.uc_link, err); - err |= __save_altstack(&frame->uc.uc_stack, regs->sp); - err |= setup_sigframe(frame, regs, set); + err |= __save_altstack(&frame->sig.uc.uc_stack, regs->sp); + err |= setup_sigframe(&frame->sig, regs, set); if (err == 0) { - setup_return(regs, &ksig->ka, frame, usig); + setup_return(regs, &ksig->ka, frame, RT_SIGFRAME_FP_POS, usig); if (ksig->ka.sa.sa_flags & SA_SIGINFO) { err |= copy_siginfo_to_user(&frame->info, &ksig->info); regs->regs[1] = (unsigned long)&frame->info; - regs->regs[2] = (unsigned long)&frame->uc; + regs->regs[2] = (unsigned long)&frame->sig.uc; } }