From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754302AbcFTMua (ORCPT ); Mon, 20 Jun 2016 08:50:30 -0400 Received: from mail-by2on0091.outbound.protection.outlook.com ([207.46.100.91]:23159 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751819AbcFTMtW (ORCPT ); Mon, 20 Jun 2016 08:49:22 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Yuri.Norov@caviumnetworks.com; Date: Mon, 20 Jun 2016 15:48:34 +0300 From: Yury Norov To: , , , , , , CC: , , , , , , , , , , , , , , , , , , , Andrew Pinski , Andrew Pinski Subject: Re: [PATCH 14/19] arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it Message-ID: <20160620124834.GA12429@yury-N73SV> References: <1466207668-10549-1-git-send-email-ynorov@caviumnetworks.com> <1466207668-10549-15-git-send-email-ynorov@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <1466207668-10549-15-git-send-email-ynorov@caviumnetworks.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Originating-IP: [95.143.213.121] X-ClientProxiedBy: AM4PR01CA0029.eurprd01.prod.exchangelabs.com (10.164.74.167) To BN4PR07MB2243.namprd07.prod.outlook.com (10.164.63.149) X-MS-Office365-Filtering-Correlation-Id: c4a220b3-fa27-4bd5-197b-08d399093629 X-Microsoft-Exchange-Diagnostics: 1;BN4PR07MB2243;2:Wok8I2Nuc0eSvasuEL/VThXH6sO/keCBm+FkijilQVzhnmjKIlCWoJMd0DY22L1D550Q1cON7RY5AIcE9T57zoZx6N58FvFRMHlqZOftNNQZZBchVopXpu0ScebwtpnC6YVRK85uC+jq6S9mnToFOipuBDntJ1KmJPCtJ7B5pfou427gLSsA++a4ymhigslO;3:czE7VdQckrwVcKP6Z87KjejJCekWAEMMurIjCNqjQdxHUAhW9fhu4i1XrT/nzDUsva9Uzk8cHIhE0fZ9FD21WvMjZMqq1jxFdRSEKurk7yCU3kR/AMH83e0ojG5Bbq30 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN4PR07MB2243; X-Microsoft-Exchange-Diagnostics: 1;BN4PR07MB2243;25:fzMNMQtBveKg2JtmSLRAqdIDH54tbqL66+lV4rHTvmNKF8SjCXkYkZls12fZH/aWvnDwmW04BysQ8JGnccShfBTzwKNtHvUcwBlNaQUSgUkI3wFWJAT+Ah22VTVvn2j2mMOLMDfelJzPizlrLMiUhakNw7+Y6WF5+L9jgAPuYcauAsUZ6+DAK8Ekm376UjC7a7p3o/rsTHjGOap8vwnGnRDttMG4/Z6sKNqpoIPUSVSTis3CbE8oecF13YD0CK61ByWW+M08ol7Txo/+st1KM7zH8bm0wU/QTZFJkR+CWW4wlCHLK+5bWr6UA6ysMxivqTarOSqwhwmlZhquTe29WqoTDCIkWQdL/CWsxDysCI/7KjGUxxpl4aWztGV4pxhARos6YDh8PQlQDglvheEi5J1jQAWpaG0U/1oBK1ZKxKL+b2epqmm4R+zMkDB9qcLkRmBZG8atwozNI2K8V6aq/jQTZWpMhAn16scdzbAZeWlUhR1FQuB4LtUQQfYYSiq4NuTlKsoaGqzmx0ir8RAN6rKWIm2Brkdafam4bV3ZmhCbIeIlqm91M35osD2402L9NhIvtwrdjzqxUzVYoqAHfr6IoLiT6HXGc+Kt2h2xSpwXgxUGKwbygeAHEEhy7qZ0oMUit8HNSWEl/Vm/Q1WYqHKgx1IEZtA7wLO1aON2FgaXRQOYXYdIgQCPZCWdGkfwN7Jn1pSsa1gGWAY6JDre72nvxRgXh6LnBUdT5tIv6npQjCn3Gh+nYFi+ibvcBilmGLOAlECzu1+eYgtJDEHXOM+E4m0CVhwhEZDV5PJPsMrzmpqUwB8HS3J/GuUC6thZlJqCVyt71Kjwah1a9PyX+A== X-Microsoft-Exchange-Diagnostics: 1;BN4PR07MB2243;20:/fNke7wBX3iguSyJxQ8ifULFppoCVVoUb5rTDp3XVMsR/0cqQ0ZF6r/m4XwWyzUmbrYv5Hr69uj1ggPkuSU9Qx88s09Evy9La8RUQVxQ35I19lCjJ8QXS/26zbneeddsWFSTokPVmT88H9IzktVMiFdzHoPqaQYRGwDn5hdn1CsGmT8Wok6IP/iA079+kIaGcHfZs7yj+qQ1C5qaPApx8vVt3ftmJN+Y4v4VaZEkUkNlGz21s033eb9xasqHHvVDUQdqWe6VOdt32U0vkfWffg470OTQ5Gc0ijoU6QPqmAMNunGqFZ/ysRHsHym7hfl5lLUVAD7zdlXDplz++DAlDpP2dUfpDu768UoQfVIbd5zye0nnaGxuB1ybNGUsYSz59PLw33el3w5Ue0AGZZL7nO+iRxBYmS3Gy/0jCvfaZY93WYBTT/42gNP3dwnCgMsl6Ia+7tUA/URml/++DQts3TbTfxa9iKmFN3XcfV7Q/3p2SYO8qYO1XXguUCNnvoPq381E3V3VI6t4f6oFO/L/V+EJYsPfTsh64OK8z04oqQ9CKUm7T+1uqDY8JlCe0WvzlUGetSnWq+FXPXrwkkvpjgEgTE26PCYVgs7Cs2AmwhU= 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:BN4PR07MB2243;BCL:0;PCL:0;RULEID:;SRVR:BN4PR07MB2243; X-Microsoft-Exchange-Diagnostics: 1;BN4PR07MB2243;4:Fkc2bQF7uZ0RcP3EBTamt4EmR79MogdgHW/vSsB1JXcHEhpmo+0HCCIZ2S99/T7j2fRDkaEVsfyasxk1KL8WUkzcPwoUPJ/Nxpy6miauY1Jr5XYwy1Dzt2WBClL1xA6oHsSsIrEJ4YjD/63NgYkaLuORzzI2WL4byyWqbRK7FdDAwyFKf05s1OypgGtxAPD+3zTeEZZuaB4AE6qEBBlY0QRXw03RggQT61+tSReTWmJGHCnCv1wFKMlqCXh0Ad92GvlBcOjnyECms53U8U3RDMw1yOBvrGCh34og7RRUlcl/M+JrdW24gwA8HHx/pRzXJUe1+fCUtjzXwjxdGvL+VFWuY9qozd5YDKib3AzAeLhZFWRgiMKkBVk3BYSoLJQqGaiCJPqmVFOkHfhfP1eGZTcGXKaHuGNiSe6kbddaO3Vs9swTMYOLpwkzqQ5LRn9j X-Forefront-PRVS: 09796A1B83 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6069001)(7916002)(24454002)(189002)(199003)(76176999)(77096005)(54356999)(47776003)(2906002)(66066001)(50986999)(3846002)(33716001)(97736004)(107886002)(19580395003)(586003)(4326007)(9686002)(101416001)(76506005)(1076002)(6116002)(23726003)(4001350100001)(189998001)(19580405001)(50466002)(46406003)(5001770100001)(42186005)(92566002)(15975445007)(81156014)(7846002)(105586002)(33656002)(2201001)(81166006)(8676002)(4001430100002)(97756001)(68736007)(2950100001)(83506001)(5004730100002)(106356001)(2004002)(2101003);DIR:OUT;SFP:1101;SCL:1;SRVR:BN4PR07MB2243;H:localhost;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN4PR07MB2243;23:PUjmYMJCIU2NbQK7byw6KsTTT/1rLCis3Kk+7kQoL?= =?us-ascii?Q?NtkqVvh9ixhWwUBuzo1jIPSAbrM6cYF3W+6kJeFaHfNv8pBcGkHHoO4X2Y10?= =?us-ascii?Q?fTvMLsgPW3I/pCTtYuJQFaMDWhgE8mJC1IhdtByvMrR6Cp+f3a79U5NADekW?= =?us-ascii?Q?8ilHFiwpbE15hg1JfPhxr773w/q2dYDoQRQPEh1WWTitQ+p0i7jCvJan7646?= =?us-ascii?Q?iibJGNkz7/xCN0tdLsmfEAyepcbDF8fVJW1d1jx/TuRmrzorE/y1nlOMyNu2?= =?us-ascii?Q?nuVbYModdj9NjLUzZb/McvxJbMkXOPF4HAlOBNQFlivoZOb8m34FfeeSQiXd?= =?us-ascii?Q?LVXJAIlAaUzw8b1/x//0xNUZrQApHctzjZ3P8HjdrF6wUphgNLdsLXsz4izW?= =?us-ascii?Q?mifQQvMu+hs3O6f/hohN8GjGIuPp0TO1062utC3nmHtDeVBa76ZWFviPE2yf?= =?us-ascii?Q?tsMCDz6Cf3AT/OYyUaIK8A9CHFpsG++oP99LwBeQ/Ivsqjt/YU5uQ4VUPrRk?= =?us-ascii?Q?ZfVgCqIVzloX/sDcnqLFt1XWad7gMv06U6vPXm+EzgiImSpj0De2GeverFAG?= =?us-ascii?Q?EBIyCWOMusUOLqoDQs/c9DwgrGdRd98pFS8ge3VvL1rtu5JcNlWua4CTacWe?= =?us-ascii?Q?Zx8V0/BP4cUQUkKMAbOqrYE/9sNlONU13uxj/MU1Zk3XjDuryLZILP7nFlN/?= =?us-ascii?Q?P00IMooOfEQpoXOHFSw2UcwVolNn8EuaasYTtQ813cYCeVq776e6FEykKXkS?= =?us-ascii?Q?5wwQiw89XOdvS6TXXoyrtBbMNlP+cyi+wsiJhDKAdVt4e2aXoDNPbteff+WO?= =?us-ascii?Q?Fogkzg9ZMeSbl5OUkGGuJM7GdPevMYLMxn+rXuJZUOF0JYO5tD/C+o3qx0eC?= =?us-ascii?Q?7JbIez4HaGApk4ceiPYqQV6ovgNSyUbX4u90ysgqWDTD1Qodof+yuRaJBWq5?= =?us-ascii?Q?lfL5Y0Ievgdsm8JkfbW+0cyjgKkx8OVBCXuyObhTF8CRJ3ABFatD9fal07+G?= =?us-ascii?Q?BcKH6EmhM0MLKMSsDoVuXiibK/YvKrc1NL/zLw1kZK6EglOnsrJSvr2VCVPc?= =?us-ascii?Q?YG4SPNfLqpvMuAJwg08dLV4ekctUr8nzqsI2O4Oq9EvewEy1rQGNjdhIpw+S?= =?us-ascii?Q?lxN33SnjAYeiYYuYH7qARShkSY61hCk5MLxnuOZSnuxoDAsc8Qpk5kxzJO5S?= =?us-ascii?Q?bpOAzCZW/HWDP+vEjf9WDkbKzPHNhRY+iA0tCU+nPFF2fg8GvDDlHqmH7lXN?= =?us-ascii?Q?kU3+impAMTAxTTiLJZzxEmK3N5gIzxwDgsOIMlvyGPB2I59zG443dkevu0oO?= =?us-ascii?Q?ds0I10yxut7v1XL1rT+d1o=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN4PR07MB2243;6:fnrnXbZ7avnRe6dOUIfgAglmw56Nhpth27RrzOkItHsx2umnlCxiloQ0+f6U2TJEDWB6Nb4pFuLx/Ytw3i0brEebTrjZpN+UzSJdKZGAIB5HKqfFnX/sI7y0gvam+vWHpLrVv+uIPeBJUn1g+GdmzsIhzB5ZjtdE+lE+YJg2iBKM1VAG2TYzPS6nVqjlw7OvJp8JovWCVJ1RcyTAB71RujZks1SHOMjsfyfJ2Grs0j8bjkIx6RLvZpuYz78qXRUr8SJFZUAzVwCS8xgzIX23pjxSEkMK+83Setlp70atmtE=;5:+/tG2bBmYvnosI1h+/JcKBpZLRJFU7ncuebBau6+c0uLy9HSE4jBR6qj7LmUqh/YMxsiNsbM0EskSxitOpUDyY54U2BVyBXXiLbhqG/H53GAhFXg7B3UDg0SLb0J2YJazXRlq21U1jy/zMyswogyyw==;24:gUz2pZ5I6/U1Y37bGp2tDs/fNYfU/7REDPG5bMcTu8qHqe/sq1mBpu8I9XvNTwUGnXvRBxWF8OqSU8Ad/JlRb+aBGnO5XzLhJ1fAjpF1WOc=;7:+ANKFVFy9fC2KLjG6Y27QO8UUAhcJGEYAPgLuA6Q31T8UqTH5hZ5wd0q/n1l3QYyR1nJ6lp0CRI27VUXaf+nHl8NeC0Ln41NSIFq1jHECligV20LZUKnxEC7tzr+96xBXbxwrFEKbJMwqEPc5C2OGM+ouqAgw/W++EswuXdybA81qMztVwkbyDQPwf2R7UHfubvrQI0KAsQVIgwLIGiwWNF3laE82eUsxDxGFiR3/q+YvOPuuwNR+oEVPmfCHW6P SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2016 12:48:42.8720 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN4PR07MB2243 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, Jun 18, 2016 at 02:54:23AM +0300, Yury Norov wrote: > From: Andrew Pinski > > Add a separate syscall-table for ILP32, which dispatches either to native > LP64 system call implementation or to compat-syscalls, as appropriate. > > Signed-off-by: Andrew Pinski > Signed-off-by: Yury Norov > --- > arch/arm64/include/asm/unistd.h | 6 ++- > arch/arm64/kernel/Makefile | 2 +- > arch/arm64/kernel/entry.S | 29 +++++++++++++- > arch/arm64/kernel/sys_ilp32.c | 84 +++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 117 insertions(+), 4 deletions(-) > create mode 100644 arch/arm64/kernel/sys_ilp32.c > > diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h > index fe9d6c1..250654c 100644 > --- a/arch/arm64/include/asm/unistd.h > +++ b/arch/arm64/include/asm/unistd.h > @@ -13,13 +13,17 @@ > * 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_SYS_LLSEEK > +#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 > -#define __ARCH_WANT_SYS_LLSEEK > #define __ARCH_WANT_SYS_NICE > #define __ARCH_WANT_SYS_SIGPENDING > #define __ARCH_WANT_SYS_SIGPROCMASK > diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile > index d11572d..205bc03 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_COMPAT) += entry32_common.o > arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o > arm64-obj-$(CONFIG_MODULES) += arm64ksyms.o module.o > diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S > index 21a0624..b2b9725 100644 > --- a/arch/arm64/kernel/entry.S > +++ b/arch/arm64/kernel/entry.S > @@ -239,6 +239,23 @@ tsk .req x28 // current thread_info > > .text > > +#ifdef CONFIG_ARM64_ILP32 > +/* > + * AARCH64/ILP32. Zero top halves of x0-x7 > + * registers as userspace may put garbage there. > + */ > + .macro delouse_input_regs > + mov w0, w0 > + mov w1, w1 > + mov w2, w2 > + mov w3, w3 > + mov w4, w4 > + mov w5, w5 > + mov w6, w6 > + mov w7, w7 > + .endm > +#endif > + > /* > * Exception vectors. > */ > @@ -501,6 +518,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 > @@ -717,15 +735,22 @@ 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 > + b.eq el0_svc_naked // We are using LP64 syscall table > + mov stbl, x17 // We are using ILP32 syscall table > + delouse_input_regs > +#endif It should be like this: #ifdef CONFIG_ARM64_ILP32 tst x16, #_TIF_32BIT_AARCH64 b.eq el0_svc_naked // We are using LP64 syscall table adrp stbl, sys_call_ilp32_table // load ilp32 syscall table pointer delouse_input_regs #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..00c4d4b > --- /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 aarch32 syscall handlerss where off_t is passed. > + */ > +#define compat_sys_fadvise64_64 compat_sys_fadvise64_64_wrapper > +#define compat_sys_fallocate compat_sys_fallocate_wrapper > +#define compat_sys_fcntl64 sys_fcntl > +#define compat_sys_ftruncate64 compat_sys_ftruncate64_wrapper > +#define compat_sys_pread64 compat_sys_pread64_wrapper > +#define compat_sys_pwrite64 compat_sys_pwrite64_wrapper > +#define compat_sys_readahead compat_sys_readahead_wrapper > +#define compat_sys_shmat sys_shmat > +#define compat_sys_sync_file_range compat_sys_sync_file_range2_wrapper > +#define compat_sys_truncate64 compat_sys_truncate64_wrapper > +#define sys_mmap2 compat_sys_mmap2_wrapper > +#define sys_ptrace compat_sys_ptrace > + > +/* > + * Use non-compat syscall handlerss where stat and statfs structure > + * pointers are passed, as their layout is identical to LP64. > + */ > +#define compat_sys_fstatfs64 sys_fstatfs > +#define compat_sys_statfs64 sys_statfs > +#define sys_fstat64 sys_newfstat > +#define sys_fstatat64 sys_newfstatat > + > +asmlinkage long compat_sys_fadvise64_64_wrapper(void); > +asmlinkage long compat_sys_fallocate_wrapper(void); > +asmlinkage long compat_sys_ftruncate64_wrapper(void); > +asmlinkage long compat_sys_mmap2_wrapper(void); > +asmlinkage long compat_sys_pread64_wrapper(void); > +asmlinkage long compat_sys_pwrite64_wrapper(void); > +asmlinkage long compat_sys_readahead_wrapper(void); > +asmlinkage long compat_sys_sync_file_range2_wrapper(void); > +asmlinkage long compat_sys_truncate64_wrapper(void); > + > +asmlinkage long ilp32_sys_rt_sigreturn_wrapper(void); > +#define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper > + > +#include > + > +#undef __SYSCALL > +#define __SYSCALL(nr, sym) [nr] = 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 > +}; > -- > 2.7.4