Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935976AbcJUUuO (ORCPT ); Fri, 21 Oct 2016 16:50:14 -0400 Received: from mail-bn3nam01on0070.outbound.protection.outlook.com ([104.47.33.70]:35674 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932967AbcJUUuF (ORCPT ); Fri, 21 Oct 2016 16:50:05 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Yuri.Norov@caviumnetworks.com; From: Yury Norov To: , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , Andrew Pinski , Andrew Pinski , Bamvor Zhang Jian Subject: [PATCH 12/18] arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it Date: Fri, 21 Oct 2016 23:33:11 +0300 Message-ID: <1477081997-4770-13-git-send-email-ynorov@caviumnetworks.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1477081997-4770-1-git-send-email-ynorov@caviumnetworks.com> References: <1477081997-4770-1-git-send-email-ynorov@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [95.143.213.121] X-ClientProxiedBy: VI1PR07CA0077.eurprd07.prod.outlook.com (10.164.94.173) To DM3PR07MB2250.namprd07.prod.outlook.com (10.164.33.148) X-MS-Office365-Filtering-Correlation-Id: 9f0e2b78-c70c-4f09-88b1-08d3f9f1d0c4 X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2250;2:kNKBOMgbTdLd5ZEIqeKmyCI5kAF5UNrFm3hzlU1/B3egN1chV9XFeglA8MW6kS0SRvnpYY/P9ts8WrVJW5rLBKtgTub0geFarhHb+KErP7Mqzrr0yZIGbE8Lx8BJRV40+s4GV5P1ecnGgNWE8N1c8KSOIM+IZhbW3f5uoTEAVZwuTURCjn1XxTbwgHCLiXjxNIFAKXGQXflIBxl9QU+nyA==;3:/vxPVchcZNnfSURORsIc0rhw+oOQC8I2BrrAyO2uqgT2Jiitj91dqYnuRJ013+QPqdBtqpkTN7EETH2AxCW/u2UTZOp3QCIk9IH77j1r3T43xpJGNYkw6isi4gkFSdVtUNDYcS9Ih3hMcBpotwL3aw==;25:RALd9WDfiw9/Oa9umCUKoQdiWJx8kZlXy2epv2txZtSRWNRr+RqxmBRVOj6aM3NPte2jySliKRxqSfSV1s/Gbc/KXbCQwVIhMIgUD/qsnIOAnfl2TLLwenflyu3tr2JW7tOLCm0CICHw2AfPZt7coRKXDVOTbUosp7x2RYGV3cim2r9H9VyQpl67l9WV1VCjGDjG9VIoyrsl4r6G3xV382cf+z6hB+73qyoZIcitNuj5OrWEcEMzhXlJ2a3xRaZdLr94a6jNCBJhWJYsNpt5XOMsjZ0vkiE735EnKC9Tv/6VF9QB8O30eO+fJ8Fk9WExoQeVjM7YZjGGEDEcwczymnUrmtzl2AHHtxIcxmxbNVsj5jfzGtw/8KOQt/gYjv5NjgAPyafvF0qLmWxLDXkmB9dBDx7DeFPno0HgnD6sb8lqUW2iG2frgKvcuquLORXf X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM3PR07MB2250; X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2250;31:oxLsB2Xm5dbfYDu3eQVB6BmIyVfKEXieySbz++O3EZAUOAHF3JXVxROKfstvhWua7K/u1yteVj7Z9VmfJpcdBfARl2LVU7CuNpFM3ALzFCOGXEByiun0KbAAOSVmm0mL0PRGlGn/vO3vtmW70KK+MO0sff+VHLdWmv22uPPf2zuVAHkPV11Fik0WTJTQ/DsXSKzP8wK491m0XV9dqZZTvfVFxJEJK8lhOiWZ6JP+sqT3T4OKCTgoWcrQJJWaDba8RD9fzTxcF/FPNGEdGl7LRA==;20:ostDIlMNsTabgWxK94sZ+h6VBXdvyBCH/tGIFnQY++NLtbZUP2aRGcuJf8FO7mV/gLq55eTCxm0N3fnSU8cTxLst+SA9ZB/8rNmxiLYR3Y3gM/3zIHem4D4xdW4zvjlhFLNJFTZPNJi1iuEx1VVw+igDBiJfamdInqYESXVQX2hryaZ/h04wXi6jjCkkd6tM2WqYVQu86b9vDaQ6qCZsv6i13FTPpM0eFckMLYtvHFThRdyv0416VGr9ARgOjK7OOykIZ0FLCO7WVvOcCoXcPLx7S312fizgt8HTLF4vQL11xDdv7f07uZYkD3+v29hfRdqGXd2cwW6fl4Bbh7U8Ri6FVE7vWHJpFxsqbpJcPC7MH+8QHKzguJfLIDc4TLcPITEd7G53I1hmsPwN3UNi0llOUO+C7W298f6RlVyT5mejG/FFWIHm9TKGdMSgXendo/ooDlaz//RjS9tnGXQr0CUx07K0Mk8TGoKh2SinQhNfIVMT60wY7+B6/lLUhBk/Qet/spSwUppQbYTfCYINJYbaudan6RB50bN0VC66+TkPsRrSMfd5pQs3vqmg5OSU1mX3UQwnBW4IHS5rduxQFr6CekcvSO7ipC925S9BVPA= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(250305191791016)(22074186197030); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001);SRVR:DM3PR07MB2250;BCL:0;PCL:0;RULEID:;SRVR:DM3PR07MB2250; X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2250;4:8eyCaWV9uGL5A+nVHJQxPHrqqveQYYhoYaR1DLwXKZFzkXzC1i2K14YUZdBJNSVUvM3HwqEzYdnson0VXb6t1PZt5Ej5wItXzy5to4joYFl+hETwbeIWsJnx8l9RRmpJbL73ck/szQpFQrIDzYkhlkMFEiW2y8E/kmFzNbWr7v6bOVCFxwHlaUIss0KYdpa86HK+k901MbzfsRMZvTSCNrhjSIobYzAsRNYnGai0j+sMbgNzemzQEsAWnwHmhXeVASIC/n+y4yNzjG414cIEXxtuXUdakaiXkPKY1dAU7n9zFLHMt8e9ryvuZQO1rbEUeuuxmUEPIGHfq9D+7GAxeuAhJnxrdEnSjpzRtH5ZBF+ZOhYfzCVWAWSWvWQFXdk9ykCRdQAHZxPy3+xjkHAW9Cf+ilrdmEkdLWK2dhYH7De+pgPACYlKUNOxQYmDILHugQV3f91Y+0Sc1MHXS4K+wu53DdGQkGFqoFtXJhkdHEg= X-Forefront-PRVS: 01026E1310 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6069001)(7916002)(189002)(199003)(76176999)(50986999)(7416002)(8676002)(81166006)(81156014)(586003)(5001770100001)(97736004)(77096005)(68736007)(33646002)(36756003)(76506005)(42186005)(105586002)(2906002)(4326007)(15975445007)(106356001)(3846002)(6116002)(229853001)(5660300001)(50466002)(48376002)(5003940100001)(7846002)(305945005)(50226002)(7736002)(101416001)(66066001)(19580395003)(19580405001)(2950100002)(47776003)(92566002)(6666003)(189998001)(2201001)(2004002)(2101003);DIR:OUT;SFP:1101;SCL:1;SRVR:DM3PR07MB2250;H:localhost;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DM3PR07MB2250;23:fQIe3jMLA5tH2mWAuDEud3Qqs3L9H9cqrf8w3VWh0?= =?us-ascii?Q?FV8abrlxxPSeL3QzQqEoZ8kQPHBQ4QO9EwHv4ZmlWdaREKg67OX6GgPnZi+N?= =?us-ascii?Q?41py705ND5hB8R0MzPOzsDwotZ5Z/mZQqtXrWN6qRYPTaz9uVxpRvsEg9itK?= =?us-ascii?Q?RF+qJdkOFZml4XMV03UkdjLDabS7BsfW+JUcXV9RxLa20u/bVXddi1o69W/r?= =?us-ascii?Q?DWaE6cqlb6jtLbnaRBsHwWO+V0cMknl4yS45eE860wJlzAHly53zOJI7XHfZ?= =?us-ascii?Q?P1kUukV+OCaWAhk/+qewsDnK1BYbfYlEowhm+9LRczXLHIrPxouU1Qji8hnA?= =?us-ascii?Q?jnf4hHxuvj59SlAHWIHVaUYpInAskw4nXrFpXwqkI14Vuwo4eHgLCwP/fDZp?= =?us-ascii?Q?hYAMOnu5TOfITuapKKaj5s43EOnevzZWKVtKPck3IdyU3poeh7aHf0B+QYMD?= =?us-ascii?Q?qzHR+y/AbqcNVehmAybcuwGSIp4i3D/IU7IDFsI0bCixt+gSSJNlWJY7ZaCV?= =?us-ascii?Q?fsbWlL/7GWU77gPCb3aluSBvDx4iifiSXNqEn1usYX+RTRqiQPJpAfLCjkiS?= =?us-ascii?Q?dyDVf9bSKhik14KdudJB/mTVE8r19xovbde3INONlsFRgn+7O6SJQQbz7UyF?= =?us-ascii?Q?oPJfDgCrU7T72UjJnzhUOlaX8RgnySDHF9IOpMFgZuCSNqGGNi2X21gdHTSm?= =?us-ascii?Q?bNjXJNEK63bTxnIPRPOXG0Ol7+uc9KFdmilAqWViJ8IR19MIrNpQ3RrWbxF2?= =?us-ascii?Q?jQDZBbgTum7XBT399r863GO+GugOqksC3EQPN84yhDxPR2mPlZQzX1WWZCV2?= =?us-ascii?Q?SRyE4O5t2RXh4ZST1W/YvuXCdNL61zfgF1+rys1kqC2cwXGV8qM4fGufmZ3R?= =?us-ascii?Q?nmuEVkHsrsoFVqRCp+xcjuXWksnIaR0MsUWgu1tzLAIyrBIk3EvvzY8kacjE?= =?us-ascii?Q?ncEcKcJwouwXZTi9QWa7AG8WNo5mhVjg2aGCPL4YXzPIE78MgK6N3lRMDrVm?= =?us-ascii?Q?pqWboVOoZ4osCagOJjxDoWIwGvqbDw8hsCtw855LTxDGm4KQZc2KvswaTNQ5?= =?us-ascii?Q?TopQ5YUVgqKuuMDIt9vXrM9bJ9MSF6pMm9zFIz4dAbbDpmIH7oXIUAnfCfBc?= =?us-ascii?Q?VYcfyGoJpN1/fS55eC8EfPH8xiD57ZHyYloQSDDQRixj4FZyo9nF4emScqS1?= =?us-ascii?Q?18zzTX0ZXbzOjsMrxpAISV9tdXRHA6dIuSObSFfo2H5DLnAeqaJB8YuJg=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2250;6:HTuAjPpIuFn3TimpytNUSJHV1PPw0O7RTFY3R6E6H0li7eYWM65RnHDjCwpJOStOR9GGerDCdMkg1yuuiU8IT1gvMB6a5lXAbPvGKD1o5/e9+VanjcSmSCAmtkJ4TH3p4dGAR8KqLvONXyb0Sxin86iSu5wfghvHh/EoUGHAqO2/gh1dnTIbJ59Xiqx8RxcvLmjTyhtOqm0f8ObCQzDG9UmLTTmNjJIl15i9haCTXqMnjaD3iLxkvfWM3ZeXzaJn6Ttcy061uunhTmg5U6aEiAZarzBp8jS0m56WKplaU5L4QqYAHyP17P6HPy6kJ2OH;5:IBFRsk3rozIiS+Pcsje5SeSg9MHFjYSIuhlMi4DLdmgmI0SBXQgywNHGC9/DaX22Sg/xw4J4e1ZO5krmRYcCWyKF2g0WYaQ+/PG238V/L0fFveXcdgBeUX5cthrr3iAi7+OpPr0+oideHieGJj5en6skvEop2qOaLqPd8zw9yYI=;24:E98eoFFRyjYm0rXNLV5AgR6fDfpaArMXbYibUCozycwsTTrUxQM2wM/nFms/0p/02WvQG7uakZPhCGr1vWUetG+eolghOnU7m6S5UDUMUWk=;7:SEH8CWWBMiC5hAVpF2UHoHaBFk4yoF6q7KW0UU2bP86OY62nF4JCCGMaHh3K+wrvoMr+q0F8L3PDp1KdqXvtX4YhFMap/yv2G7ILaoA34bXvzgFFAXEJqm2IcZBVOTprNLE/PbMookc0KVu1wESe2bN8mKif9j2kLuB0yK9oh3jFkO/S2lEXg4KXOi8UjK5Hnc9V5Ch009pGJnF6Imn4+fQZJxSQJ8R0bToC3J9va8vP/dnfkk9xkyZG0scoTq7KNgrAXN+Oap3x+a9LET6R2QAiKd6ou2OYSfxiLo5Ub8E7kwP+aysgb7AbD4pmKabHD6X7ITDHyu7VJNAIBH57Kril707s5E1IA3FlbEnKEB8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Oct 2016 20:35:37.0334 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM3PR07MB2250 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 8256 Lines: 245 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 Signed-off-by: Bamvor Zhang Jian --- arch/arm64/include/asm/unistd.h | 8 ++- arch/arm64/include/uapi/asm/unistd.h | 12 +++++ arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/entry.S | 28 +++++++++- arch/arm64/kernel/sys_ilp32.c | 100 +++++++++++++++++++++++++++++++++++ 5 files changed, 145 insertions(+), 5 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..851cc8a 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_COMPAT_STAT64 +#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/include/uapi/asm/unistd.h b/arch/arm64/include/uapi/asm/unistd.h index 043d17a..b4cd688 100644 --- a/arch/arm64/include/uapi/asm/unistd.h +++ b/arch/arm64/include/uapi/asm/unistd.h @@ -14,6 +14,18 @@ * along with this program. If not, see . */ +/* + * Use AARCH32 interface for sys_sync_file_range() as it passes 64-bit arguments. + */ +#if defined(__ILP32__) || defined(__SYSCALL_COMPAT) +#define __ARCH_WANT_SYNC_FILE_RANGE2 +#endif + +/* + * AARCH64/ILP32 is introduced after renameat() was replaced with renameat2(). + */ +#if !(defined(__ILP32__) || defined(__SYSCALL_COMPAT)) #define __ARCH_WANT_RENAMEAT +#endif #include diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 9123bb8..06070f5 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,7 +29,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 +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 b6fb14b..b152aab 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -249,6 +249,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. */ @@ -517,6 +534,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 @@ -739,15 +757,21 @@ 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 + 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..fbf2f00 --- /dev/null +++ b/arch/arm64/kernel/sys_ilp32.c @@ -0,0 +1,100 @@ +/* + * 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 + +/* + * AARCH32 requires 4-page alignment for shared memory, + * but AARCH64 - only 1 page. This is the only difference + * between compat and native sys_shmat(). So ILP32 just pick + * AARCH64 version. + */ +#define compat_sys_shmat sys_shmat + +/* + * ILP32 needs special handling for some ptrace requests. + */ +#define sys_ptrace compat_sys_ptrace + +/* + * Using AARCH32 interface for syscalls that take 64-bit + * parameters in registers. + */ +#define compat_sys_fadvise64_64 compat_sys_fadvise64_64_wrapper +#define compat_sys_fallocate compat_sys_fallocate_wrapper +#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_sync_file_range2 compat_sys_sync_file_range2_wrapper +#define compat_sys_truncate64 compat_sys_truncate64_wrapper +#define sys_mmap2 compat_sys_mmap2_wrapper + +/* + * Using AARCH32 interface for syscalls that take the size of + * sfruct statfs as an argument, as it's calculated differently + * in kernel and user spaces. + */ +#define compat_sys_fstatfs64 compat_sys_fstatfs64_wrapper +#define compat_sys_statfs64 compat_sys_statfs64_wrapper + +/* + * Using custom wrapper for rt_sigreturn() to handle custom + * struct rt_sigframe. + */ +#define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper + +asmlinkage long compat_sys_fstatfs64_wrapper(void); +asmlinkage long compat_sys_statfs64_wrapper(void); +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); + +#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