powerpc: split compat syscall table out from native table
authorFiroz Khan <firoz.khan@linaro.org>
Mon, 17 Dec 2018 10:40:35 +0000 (16:10 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 21 Dec 2018 03:46:50 +0000 (14:46 +1100)
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 archit-
ectures.

Split out a new compat_sys_call_table symbol that contains
all the compat calls, and leave the main table for the nat-
ive calls, to more closely match the method we use every-
where else.

Suggested-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Firoz Khan <firoz.khan@linaro.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/syscall.h
arch/powerpc/kernel/entry_64.S
arch/powerpc/kernel/systbl.S
arch/powerpc/kernel/vdso.c

index ab9f3f0a8637414f32a2d18c2e5cbfe32f3a200c..1a0e7a8b1c811cf5d089c5ac68eb96d189ad702d 100644 (file)
@@ -18,9 +18,8 @@
 #include <linux/thread_info.h>
 
 /* 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)
 {
index 5fe1431083a5bad2c8bde200b32663365917f5d3..435927f549c438614ae680d31775911b3600b417 100644 (file)
@@ -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
@@ -178,7 +181,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
@@ -186,7 +189,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
        /*
index 9ff1913e9188476ea2b219e98085aedec226ca8b..0fa84e1ed462ddf54c360901ddcb45c0e542ddad 100644 (file)
 #include <asm/ppc_asm.h>
 
 #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
 
 .globl sys_call_table
 sys_call_table:
+#include <asm/systbl.h>
+
+#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:
 #define compat_sys_sigsuspend  sys_sigsuspend
 #include <asm/systbl.h>
+#endif
index 65b3bdb99f0bae809a92fc76ce66335025a8f1ae..7725a971473670080f27c299181e5c5e228c6c37 100644 (file)
@@ -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 */