Skip to content

Commit

Permalink
powerpc: split compat syscall table out from native table
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Firoz Khan authored and Michael Ellerman committed Dec 21, 2018
1 parent a11b763 commit fbf508d
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 13 deletions.
3 changes: 1 addition & 2 deletions arch/powerpc/include/asm/syscall.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
7 changes: 5 additions & 2 deletions arch/powerpc/kernel/entry_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -178,15 +181,15 @@ 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
clrldi r6,r6,32
clrldi r7,r7,32
clrldi r8,r8,32
15:
slwi r0,r0,4
slwi r0,r0,3

barrier_nospec_asm
/*
Expand Down
35 changes: 28 additions & 7 deletions arch/powerpc/kernel/systbl.S
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@
#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
Expand All @@ -46,6 +46,27 @@

.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
7 changes: 5 additions & 2 deletions arch/powerpc/kernel/vdso.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down

0 comments on commit fbf508d

Please sign in to comment.