Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp9406071imu; Wed, 5 Dec 2018 04:25:14 -0800 (PST) X-Google-Smtp-Source: AFSGD/VZlvG0OX0yLqd+hMcMVvHSCzPSegYhRQjsb6DInFMSvv/gUzVrOw2YeNV7qx8ZWdUNKiud X-Received: by 2002:a17:902:7402:: with SMTP id g2mr23442932pll.198.1544012714749; Wed, 05 Dec 2018 04:25:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544012714; cv=none; d=google.com; s=arc-20160816; b=TXmnHHixzEarfr1Yc8N32OeKbSfbN06ao3Wbjp9HqMBlroEpdwaOrjqAh71kyDpPbo 3xaAkYx/h4uDXVD0ayNy0FpWfE+4zAniQG4Y6igkq+s8Ymufz8zdcdTCIQ74FKgVMvUn n/wq/wUydtz7FBD8gYquHfyMhXxP3bkdTEGxLyaDL57dH3s70L/vXIygFw3fkSFCHa0m NcDSV/W1Fps0UYghiXopcEwi0n6rJ1uxAOVHE9QFaW4593AYacLjgfABHUVkHt9ZChLd Y3pcSQjWuTXlbLuHBxmo7+u1T3Ddr05comui7dPEpj9nOAIp/lxxVMwcPPgEwYTsQbF4 Od7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:references :in-reply-to:subject:cc:to:from; bh=EWoVBXDb9BHAAlISqSc6qkyqd2QznvPPcmqOdEnavLQ=; b=inTrht/mkGZWIx2BBEtRdatXcpMDWzq9QDbXFyq9bVcIgkouhMm7Glz0dpK4CHOnTV 61ypxEB9c7eSocpMYd6Jm454aW4EwzwpMTLO0ijs39F7RpIi0GNWqbhikRByWZ7hMMhP r72mIY4lZPlG9qbeKrxdg9l06P3CutCaep3aNHhLEbK1+o9iWM6Scz3KeITFg+H/3XIG sRhFDD2f8Nqs0F5RTVkkIpjOjnJ6TmfGnHGDltkT3P1skJmWh12y2Kx1vAQiC0RLV8Tp tR4XmAR5GuPvZi5R6IMAAnx+sLLiC45j/gREkNf2E30nl5fHB0yXCicwbKn8vb+yYNQC o+rg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d4si19903758pls.348.2018.12.05.04.24.58; Wed, 05 Dec 2018 04:25:14 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727278AbeLEMYW (ORCPT + 99 others); Wed, 5 Dec 2018 07:24:22 -0500 Received: from ozlabs.org ([203.11.71.1]:47929 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726944AbeLEMYW (ORCPT ); Wed, 5 Dec 2018 07:24:22 -0500 Received: from authenticated.ozlabs.org (localhost [127.0.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPSA id 438yb60yPcz9s8J; Wed, 5 Dec 2018 23:24:17 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ellerman.id.au From: Michael Ellerman To: Arnd Bergmann , firoz.khan@linaro.org Cc: y2038@lists.linaro.org, linux-arch@vger.kernel.org, deepa.kernel@gmail.com, Arnd Bergmann , Benjamin Herrenschmidt , Paul Mackerras , Nicholas Piggin , Madhavan Srinivasan , Christophe Leroy , Joel Stanley , linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] powerpc: split compat syscall table out from native table In-Reply-To: <20181204212340.3915309-1-arnd@arndb.de> References: <20181204212340.3915309-1-arnd@arndb.de> Date: Wed, 05 Dec 2018 23:24:16 +1100 Message-ID: <87pnugkvpr.fsf@concordia.ellerman.id.au> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Arnd Bergmann writes: > PowerPC uses a syscall table with native and compat calls interleaved, > which is a slightly simpler way to define two matching tables. > > As we move to having the tables generated, that advantage is no longer > important, but the interleaved table gets in the way of using the > same scripts as on the other architectures. > > Split out a new compat_sys_call_table symbol that contains all the > compat calls, and leave the main table for the native calls, to more > closely match the method we use everywhere else. > > Signed-off-by: Arnd Bergmann > --- > This is completely untested, it's just for illustration and to > get comments about whether this is a good idea. Seems like a good idea to me. The code's not much more complicated, in fact it's probably clearer except for the extra macros. It's more cache efficient too, though it probably doesn't really matter. cheers > Firoz, can you try to get this working? > --- > arch/powerpc/include/asm/syscall.h | 3 +-- > arch/powerpc/kernel/entry_64.S | 7 ++++-- > arch/powerpc/kernel/systbl.S | 37 ++++++++++++++++++++++++------ > arch/powerpc/kernel/vdso.c | 7 ++++-- > 4 files changed, 41 insertions(+), 13 deletions(-) > > diff --git a/arch/powerpc/include/asm/syscall.h b/arch/powerpc/include/asm/syscall.h > index ab9f3f0a8637..1a0e7a8b1c81 100644 > --- a/arch/powerpc/include/asm/syscall.h > +++ b/arch/powerpc/include/asm/syscall.h > @@ -18,9 +18,8 @@ > #include > > /* ftrace syscalls requires exporting the sys_call_table */ > -#ifdef CONFIG_FTRACE_SYSCALLS > extern const unsigned long sys_call_table[]; > -#endif /* CONFIG_FTRACE_SYSCALLS */ > +extern const unsigned long compat_sys_call_table[]; > > static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) > { > diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S > index 7b1693adff2a..5574d92646f1 100644 > --- a/arch/powerpc/kernel/entry_64.S > +++ b/arch/powerpc/kernel/entry_64.S > @@ -54,6 +54,9 @@ > SYS_CALL_TABLE: > .tc sys_call_table[TC],sys_call_table > > +COMPAT_SYS_CALL_TABLE: > + .tc compat_sys_call_table[TC],compat_sys_call_table > + > /* This value is used to mark exception frames on the stack. */ > exception_marker: > .tc ID_EXC_MARKER[TC],STACK_FRAME_REGS_MARKER > @@ -173,7 +176,7 @@ system_call: /* label this so stack traces look sane */ > ld r11,SYS_CALL_TABLE@toc(2) > andis. r10,r10,_TIF_32BIT@h > beq 15f > - addi r11,r11,8 /* use 32-bit syscall entries */ > + ld r11,COMPAT_SYS_CALL_TABLE@toc(2) > clrldi r3,r3,32 > clrldi r4,r4,32 > clrldi r5,r5,32 > @@ -181,7 +184,7 @@ system_call: /* label this so stack traces look sane */ > clrldi r7,r7,32 > clrldi r8,r8,32 > 15: > - slwi r0,r0,4 > + slwi r0,r0,3 > > barrier_nospec_asm > /* > diff --git a/arch/powerpc/kernel/systbl.S b/arch/powerpc/kernel/systbl.S > index 919a32746ede..883b8e36964c 100644 > --- a/arch/powerpc/kernel/systbl.S > +++ b/arch/powerpc/kernel/systbl.S > @@ -17,13 +17,13 @@ > #include > > #ifdef CONFIG_PPC64 > -#define SYSCALL(func) .8byte DOTSYM(sys_##func),DOTSYM(sys_##func) > -#define COMPAT_SYS(func) .8byte DOTSYM(sys_##func),DOTSYM(compat_sys_##func) > -#define PPC_SYS(func) .8byte DOTSYM(ppc_##func),DOTSYM(ppc_##func) > -#define OLDSYS(func) .8byte DOTSYM(sys_ni_syscall),DOTSYM(sys_ni_syscall) > -#define SYS32ONLY(func) .8byte DOTSYM(sys_ni_syscall),DOTSYM(compat_sys_##func) > -#define PPC64ONLY(func) .8byte DOTSYM(ppc_##func),DOTSYM(sys_ni_syscall) > -#define SYSX(f, f3264, f32) .8byte DOTSYM(f),DOTSYM(f3264) > +#define SYSCALL(func) .8byte DOTSYM(sys_##func) > +#define COMPAT_SYS(func) .8byte DOTSYM(sys_##func) > +#define PPC_SYS(func) .8byte DOTSYM(ppc_##func) > +#define OLDSYS(func) .8byte DOTSYM(sys_ni_syscall) > +#define SYS32ONLY(func) .8byte DOTSYM(sys_ni_syscall) > +#define PPC64ONLY(func) .8byte DOTSYM(ppc_##func) > +#define SYSX(f, f3264, f32) .8byte DOTSYM(f) > #else > #define SYSCALL(func) .long sys_##func > #define COMPAT_SYS(func) .long sys_##func > @@ -48,3 +48,26 @@ > sys_call_table: > > #include > + > +#undef SYSCALL > +#undef COMPAT_SYS > +#undef PPC_SYS > +#undef OLDSYS > +#undef SYS32ONLY > +#undef PPC64ONLY > +#undef SYSX > + > +#ifdef CONFIG_COMPAT > +#define SYSCALL(func) .8byte DOTSYM(sys_##func) > +#define COMPAT_SYS(func) .8byte DOTSYM(compat_sys_##func) > +#define PPC_SYS(func) .8byte DOTSYM(ppc_##func) > +#define OLDSYS(func) .8byte DOTSYM(sys_ni_syscall) > +#define SYS32ONLY(func) .8byte DOTSYM(compat_sys_##func) > +#define PPC64ONLY(func) .8byte DOTSYM(sys_ni_syscall) > +#define SYSX(f, f3264, f32) .8byte DOTSYM(f3264) > + > +.globl compat_sys_call_table > +compat_sys_call_table: > + > +#include > +#endif > diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c > index 65b3bdb99f0b..7725a9714736 100644 > --- a/arch/powerpc/kernel/vdso.c > +++ b/arch/powerpc/kernel/vdso.c > @@ -671,15 +671,18 @@ static void __init vdso_setup_syscall_map(void) > { > unsigned int i; > extern unsigned long *sys_call_table; > +#ifdef CONFIG_PPC64 > + extern unsigned long *compat_sys_call_table; > +#endif > extern unsigned long sys_ni_syscall; > > > for (i = 0; i < NR_syscalls; i++) { > #ifdef CONFIG_PPC64 > - if (sys_call_table[i*2] != sys_ni_syscall) > + if (sys_call_table[i] != sys_ni_syscall) > vdso_data->syscall_map_64[i >> 5] |= > 0x80000000UL >> (i & 0x1f); > - if (sys_call_table[i*2+1] != sys_ni_syscall) > + if (compat_sys_call_table[i] != sys_ni_syscall) > vdso_data->syscall_map_32[i >> 5] |= > 0x80000000UL >> (i & 0x1f); > #else /* CONFIG_PPC64 */ > -- > 2.18.0