From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752743AbcENPEd (ORCPT ); Sat, 14 May 2016 11:04:33 -0400 Received: from mail-bn1on0065.outbound.protection.outlook.com ([157.56.110.65]:28832 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752120AbcENPE3 (ORCPT ); Sat, 14 May 2016 11:04:29 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Yuri.Norov@caviumnetworks.com; Date: Sat, 14 May 2016 18:03:52 +0300 From: Yury Norov To: , , , CC: , , , , , , , , , , , , , , , Andrew Pinski , Andrew Pinski Subject: Re: [PATCH 20/25] arm64:ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it Message-ID: <20160514150352.GA30533@yury-N73SV> References: <1459894127-17698-1-git-send-email-ynorov@caviumnetworks.com> <1459894127-17698-21-git-send-email-ynorov@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <1459894127-17698-21-git-send-email-ynorov@caviumnetworks.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Originating-IP: [95.143.213.121] X-ClientProxiedBy: HE1PR03CA0019.eurprd03.prod.outlook.com (10.163.170.157) To DM3PR07MB2235.namprd07.prod.outlook.com (10.164.33.145) X-MS-Office365-Filtering-Correlation-Id: e844abb4-c8fd-44d0-451c-08d37c090a07 X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2235;2:02FdjIsbq/j4T8+B1tlfJSZ73M9w7TZKgIJ5dUYnUgOyNWDXn1wU63ExqW2Sew7EuIKQeWjF2DMTAebhTC6w5rZcZaGApHw6O7qZkSmQLIYNQOgDpi/CpqLlME7LAsP6NElaMIkG2r3mIdAKjmSxf6FPJhVvdBhQEnk5mTncaGTGtIAesTReYu/zpb3TWGc2;3:lZ99p9/XHY6loo/4H7ILKqtxsM0ORU4gsLdk+2OXVmHFcHde51NY5Rea/NhEuo2O0EPcE6VbIzOKuPMzM1q9Kvwj67svgzTS8bqDO/o1KPAb1rTQcmEh0BVkRNP/FPAn X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM3PR07MB2235; X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2235;25:7SufJnaCALT9DDLmJjwsP3EjHMggsd9q/ABv2I9EBBZC+QzO4nanGoSxzdRXIouXFDCPvUOrY1EcPNz6VAMIOEFtzocEAmQMuUa+JVJd3kSB6rZYjezdxqa2614NbUIHWQQFaLaohKlw2+uAxJyITjuYZF617QtAQaKn5zqUosA+nBNADZjOZo6OVNu0qT15itWwc6Dv5Oz15MjkaYPJOw9j8/4+eQgqbx7FNBXN+fKYm1e2uldvP6M6BXftBReNxhuvhqc7EpciQxfKfPDY3/EvW3cyPZGA+q1T4VWPJougVI+rLcWNOH1IC9CBQBBEA/6LyByWkb3qW7EzAgYR7U8kiz+Mk9CbiG7UYogss4E3vgHTnjUp9rgZPLxzReGtGBVdK7d0SsbCH5HZoo9qUNl5yNKsMvRYE0KfBLobuO8bynIIaBVtRiAtobYSHQ08HwssJtLeqeryjGhyDlmMdRYPq5gn2qPc3hseuLT8AXMsLTB+URd/LX8GNu9NE41ZbzrlQe3XckiP6moj99zjwOEIc1B91zamjdm6atCVkG6sKQKGfZ8jtpe7ds8J5cbUmkhcj0z+tp8t89RY41+qssgvqQjqcz8AcjemjpkLWi9T2nGYAeQ4Vl2Zr8gStlsfJpxnRTdHWDGQEiyO3YyeI4KVDkPyejHuPgGiriQqVPL6CrsVD3gTpp1MoZgp2iZ3Ng17DIJFZsp6fURoNtEdyf5vGNUHQ95/iox1QAvM64Dc7z4OJb++Jik2XRAkLq89Vp1h9YXj2JLJU4+dTFTicCFnnDaOdL1G36GnxTnn7KOyvgSstnHBJnFhXBBbtha+ X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2235;20:2/zjyxONOw6RYIuwOx0BIATc10AKE8uoqg0xOkPH7cuBhenqiN45lB1l+h2yP3w4zyS2QuHaFlrx30QZxClQ6N1D6lmzVtpjQBnlIwl2IAJaaGA+7arSVKyTeDbsPWT9daj4LfKaXwhA9G4bv5ax5R49/G8fPulrrp0tHOurqWD9LFCAjOYkMHs93eKQQL1RKoAzPBW9AwmFIllLgwc7s9URGfqfSP+fwtrOQuvcWQ+lt/MLb/ZqHZ2/RXTqVDJ4bgqdLJJMZguDswZizGA5JqaVWYOq6Df6svIAC0LGZpuiQidN/xa+Fjf3JbalNg3bf8ikVb71Qgz3J0w5yrbS+OCFCw3Mry8ovj0GIIYncSC6SLIVaQu9tOeHXs9NGbIMk9n1i2Sk0uPEzdu+6FQD05s0cLc+sdbZafy7AIv4dAt7XQgxJI71hmWHWVOUimuAXQ+d7yCysSSvryQo7AiqAFYzqIQbjdlBT297iyPMP6GycjsZ+5lxN8QPSP1ho/kA5TdUlSJGHim7V/YxuM+/2oACkwMvHWkGDWyR/g3wQzzIR0zFcr8xFU53QxFaa/tUKRyFvZOSCgfvN05vfCU3vuLDw/m9HJhTRUqpf3gsmQQ= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001);SRVR:DM3PR07MB2235;BCL:0;PCL:0;RULEID:;SRVR:DM3PR07MB2235; X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2235;4:4wzvQaP1wZzvAuZX5E/0nupTw4abXA44R7Z4Hgxn6PzCm+rMW7Kx8bB9L7zzM8dKQCPd8taw7dyhqhY3hVutoN3M+dUtjp3EvLmCoTo3LgDVTl528pKOIP1yEMshvtqcACiqjWfgART76z1buaQ2KmeLxyFQsCJK+BmRFkM6ZJMCjCIuNgl1sa2ILPzCzytoes2U9WtmiMqFostfCGhQQtUJGfQyOepqqvgE9mUFCi238hZu5mf4/t3Xh8ZtJC6MHscUZuknV57QiTVpQ6GKSDYQFsNrWonaWX0qD8T1pb5DN2k7kYspBjfKl9Bl6ZuuKfTWlygdPfebl4rIEgLLEi5la0ZldkQhzUQeAePbEvo= X-Forefront-PRVS: 094213BFEA X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6069001)(6009001)(189002)(199003)(97756001)(2201001)(83506001)(101416001)(33716001)(76176999)(50986999)(54356999)(97736004)(4001350100001)(5001770100001)(107886002)(92566002)(189998001)(105586002)(106356001)(68736007)(8676002)(81156014)(81166006)(9686002)(586003)(2906002)(4326007)(23726003)(6116002)(3846002)(1076002)(76506005)(42186005)(4001430100002)(2950100001)(15975445007)(77096005)(5004730100002)(5008740100001)(33656002)(66066001)(47776003)(19580395003)(19580405001)(50466002)(46406003)(2004002)(2101003);DIR:OUT;SFP:1101;SCL:1;SRVR:DM3PR07MB2235;H:localhost;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DM3PR07MB2235;23:DO8xai0lU5dN0KygbLWoXBBxWD311S+8IQcZy/O9f?= =?us-ascii?Q?bEzO+Kz1hkrnF1cZEwR9x+dbqn1VhwERjk3GKk5IoLBXnJ/b7xKhdw92ZHIp?= =?us-ascii?Q?bhR9yesl+/ojydRXmG7DBcxCGiXurFdfjsiSFSQnmIMBirp5jmW0YORclYVC?= =?us-ascii?Q?6T1SYigNfGiRaAG6QsIfdN2Dduy3rkkgMXE9GCTAz6qXQb4cBg6QFq1OeNTw?= =?us-ascii?Q?8GiCXE4NCZeR4r3dgso2IJ7Sy+pGLnj1ZpFkbAPpDjN+hmNlqOSMU9uvWb43?= =?us-ascii?Q?s5XhlHBXMzz1nOyHo8/3HFYHqpJ+ZS6DeQN45xWaBKD725nLQyBNSOiY0UHJ?= =?us-ascii?Q?gNm0TfA4r93JP2ofLrTbl1fh1aJcXtyR4W6yQJ8CkUxsA5Q349AMBg6nhVFt?= =?us-ascii?Q?TbjDDioK0zHoK3ZGhaEdcTWpS0H0RixwGWwicCL0BGm5LmD2IWdrntb9pR33?= =?us-ascii?Q?iBFUh1p6QGMtyr2N1Z0pUOeR3alPg9bGXzOgfcqQcY1lgdvEyVDjovewmR6u?= =?us-ascii?Q?SDCGSlxg7Ec1C6A5AqqG2Ltu+HNrUS2V2UGLdv1S5RhThzTXnEamULzo3fIi?= =?us-ascii?Q?+Pzon4N/wPUx0jm+YujqeRza/OKScGnj5YmpplGtBu1d+1GE9ThvSY5C0HT/?= =?us-ascii?Q?RlV3//d3mWwPXDE4UkB8hLVvFkBh1jdjQ1n5PmQD1RbfzMrEdDiKOG4BCz+F?= =?us-ascii?Q?00EPAxzxCMpDrOBFB17jXGysr0KH2CycX5DDOex3qRNX51BTzIxo2d/NH5Io?= =?us-ascii?Q?3NNbqFMmhNz/6CToGrqYBX0/9CV5pvvMu/om1+EXXFdf9fzj0fclYN/4PTZQ?= =?us-ascii?Q?m1COAjm8NCbH8jKuPr/WIFO8HWEbkv8eL5ZRbZiB5apOpe4deYuLfD/+JGn8?= =?us-ascii?Q?nkkKpxEZbptAEjf74ERzO9pStgw0X6+/B8Q89W70l8Froegsv+9JeTpdkzGH?= =?us-ascii?Q?a851WvLIPUllQcw778ilGxl5g+LMN7j9+qxoinUwQKRYGzNkh62gvqEtQfFf?= =?us-ascii?Q?tF+jxlAiP3yxcxG4T9klwEc1316Z9TyeGTOA1Ey5v7HiAU2rFAPjWQXiZkb8?= =?us-ascii?Q?kIDECoN9ydxVE+qJBTfayJzADAW55k+/4JyMy+k0bkMHsc7guUAdLn8SEZ0Q?= =?us-ascii?Q?iNEPN9dchTO/XZajhM/Zu7qNLy8oy6dfbZxlJsTamsCFEAVkhyLUEiVozh4+?= =?us-ascii?Q?LS8K1IW4/3y9gyz3Z/A1fa3oJhE2EWb3Jms8RqTiHESaOjx2VNOuOcOHcd/W?= =?us-ascii?Q?ddHmr91svQW0CsAIFrEIwAWVbc/bo4IRfua9GPj?= X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2235;5:dZEMHAUEXrwUmiRE5vLwxzacxXADxbpef4ABnkmRH5q49W+TV1HZfIc4Nxw/lmeNcrLGLJ5e2NJh371xw/nGKLFzeqTpPA56iAVh6WrL1C+i8JoVGx5BuQ5hKuVHljtY+sZebsyPBMLoU5YIydDRUw==;24:1ZJd7SHvmL73zHU6cOJI6AIzviUpVdhD2lS0aBvrtaGFpSdVz531/+gv7Mu39iT/fRFOmhox2mmh5AdFK3VsdUd5AwkGhKo2BxOqsIFQnYY=;7:6uv/OGHZ8gMlMwNhvGof6/tT1CAzkaUGLR3wqAh28x7b7Yx6/cz1IUFbWF7+vQzmdumUqP2DFeblT32GnckdBZhw9ERuL77qDR7ggQ1425txxFzj8PKzG14VTzIhAKA3OEpI4hTZBVQySOfGtjbDEl8EuyY2WkMStqvXbvfnEbAVpL1gJYmdOPX+MFj8D8xh SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 May 2016 15:04:24.9014 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM3PR07MB2235 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org So, after all discussions, this patch is looking like this. Changes: - assembler part reworked to be more clear, as Catalin recommended; - mmap now points to mmap2, as in 1st versions (suggested by Bamvor), and ilp32 wrapper delouses required arguments; - pread64 and pwrite64 wrappers introduced to delouse args as well; - removed unneeded #undefs; Did I miss something? diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index 2971dea..5ea18ef 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -13,9 +13,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + +#ifdef CONFIG_COMPAT +#define __ARCH_WANT_COMPAT_STAT64 +#endif + +#ifdef CONFIG_ARM64_ILP32 +#define __ARCH_WANT_COMPAT_SYS_PREADV64 +#define __ARCH_WANT_COMPAT_SYS_PWRITEV64 +#endif + #ifdef CONFIG_AARCH32_EL0 #define __ARCH_WANT_COMPAT_SYS_GETDENTS64 -#define __ARCH_WANT_COMPAT_STAT64 #define __ARCH_WANT_SYS_GETHOSTNAME #define __ARCH_WANT_SYS_PAUSE #define __ARCH_WANT_SYS_GETPGRP diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 9dfdf86..7aa65ea 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 \ ../../arm/kernel/opcodes.o binfmt_elf32.o -arm64-obj-$(CONFIG_ARM64_ILP32) += binfmt_ilp32.o +arm64-obj-$(CONFIG_ARM64_ILP32) += binfmt_ilp32.o sys_ilp32.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/entry.S b/arch/arm64/kernel/entry.S index cf4d1ae..0f651bc 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -500,6 +500,7 @@ el0_svc_compat: * AArch32 syscall handling */ adrp stbl, compat_sys_call_table // load compat syscall table pointer + ldr x16, [tsk, #TI_FLAGS] uxtw scno, w7 // syscall number in w7 (r7) mov sc_nr, #__NR_compat_syscalls b el0_svc_naked @@ -716,15 +717,20 @@ ENDPROC(ret_from_fork) .align 6 el0_svc: adrp stbl, sys_call_table // load syscall table pointer + ldr x16, [tsk, #TI_FLAGS] uxtw scno, w8 // syscall number in w8 mov sc_nr, #__NR_syscalls +#ifdef CONFIG_ARM64_ILP32 + adrp x17, sys_call_ilp32_table // load ilp32 syscall table pointer + tst x16, #_TIF_32BIT_AARCH64 + csel stbl, stbl, x17, eq // We are using ILP32 +#endif el0_svc_naked: // compat entry point stp x0, scno, [sp, #S_ORIG_X0] // save the original x0 and syscall number enable_dbg_and_irq ct_user_exit 1 - ldr x16, [tsk, #TI_FLAGS] // check for syscall hooks - tst x16, #_TIF_SYSCALL_WORK + tst x16, #_TIF_SYSCALL_WORK // check for syscall hooks b.ne __sys_trace cmp scno, sc_nr // check upper syscall limit b.hs ni_sys diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c new file mode 100644 index 0000000..64db612 --- /dev/null +++ b/arch/arm64/kernel/sys_ilp32.c @@ -0,0 +1,84 @@ +/* + * AArch64- ILP32 specific system calls implementation + * + * Copyright (C) 2016 Cavium Inc. + * Author: Andrew Pinski + * + * 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 . + */ + +#define __SYSCALL_COMPAT + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Using non-compat syscalls where necessary */ +#define compat_sys_fadvise64_64 sys_fadvise64_64 +#define compat_sys_fallocate sys_fallocate +#define compat_sys_ftruncate64 sys_ftruncate +#define compat_sys_lookup_dcookie sys_lookup_dcookie +#define compat_sys_readahead sys_readahead +#define compat_sys_shmat sys_shmat +#define compat_sys_sync_file_range sys_sync_file_range +#define compat_sys_truncate64 sys_truncate +#define sys_llseek sys_lseek + +SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len, + unsigned long, prot, unsigned long, flags, unsigned long, fd, + unsigned long, pgoff) +{ + if (pgoff & (~PAGE_MASK >> 12)) + return -EINVAL; + + return sys_mmap_pgoff((compat_uptr_t) addr, (compat_size_t) len, + (int) prot, (int) flags, (int) fd, + pgoff >> (PAGE_SHIFT-12)); +} + +COMPAT_SYSCALL_DEFINE4(pread64, unsigned int, fd, compat_uptr_t __user *, ubuf, + compat_size_t, count, off_t, offset) +{ + return sys_pread64(fd, (char *) ubuf, count, offset); +} + +COMPAT_SYSCALL_DEFINE4(pwrite64, unsigned int, fd, compat_uptr_t __user *, ubuf, + compat_size_t, count, off_t, offset) +{ + return sys_pwrite64(fd, (char *) ubuf, count, offset); +} + +#include + +#undef __SYSCALL +#undef __SC_WRAP + +#define __SYSCALL(nr, sym) [nr] = sym, +#define __SC_WRAP(nr, sym) [nr] = compat_##sym, + +/* + * The sys_call_ilp32_table array must be 4K aligned to be accessible from + * kernel/entry.S. + */ +void *sys_call_ilp32_table[__NR_syscalls] __aligned(4096) = { + [0 ... __NR_syscalls - 1] = sys_ni_syscall, +#include +};