Skip to content

Commit fbf508d

Browse files
Firoz Khanmpe
authored andcommitted
powerpc: split compat syscall table out from native table
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>
1 parent a11b763 commit fbf508d

File tree

4 files changed

+39
-13
lines changed

4 files changed

+39
-13
lines changed

arch/powerpc/include/asm/syscall.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@
1818
#include <linux/thread_info.h>
1919

2020
/* ftrace syscalls requires exporting the sys_call_table */
21-
#ifdef CONFIG_FTRACE_SYSCALLS
2221
extern const unsigned long sys_call_table[];
23-
#endif /* CONFIG_FTRACE_SYSCALLS */
22+
extern const unsigned long compat_sys_call_table[];
2423

2524
static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
2625
{

arch/powerpc/kernel/entry_64.S

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@
5454
SYS_CALL_TABLE:
5555
.tc sys_call_table[TC],sys_call_table
5656

57+
COMPAT_SYS_CALL_TABLE:
58+
.tc compat_sys_call_table[TC],compat_sys_call_table
59+
5760
/* This value is used to mark exception frames on the stack. */
5861
exception_marker:
5962
.tc ID_EXC_MARKER[TC],STACK_FRAME_REGS_MARKER
@@ -178,15 +181,15 @@ system_call: /* label this so stack traces look sane */
178181
ld r11,SYS_CALL_TABLE@toc(2)
179182
andis. r10,r10,_TIF_32BIT@h
180183
beq 15f
181-
addi r11,r11,8 /* use 32-bit syscall entries */
184+
ld r11,COMPAT_SYS_CALL_TABLE@toc(2)
182185
clrldi r3,r3,32
183186
clrldi r4,r4,32
184187
clrldi r5,r5,32
185188
clrldi r6,r6,32
186189
clrldi r7,r7,32
187190
clrldi r8,r8,32
188191
15:
189-
slwi r0,r0,4
192+
slwi r0,r0,3
190193

191194
barrier_nospec_asm
192195
/*

arch/powerpc/kernel/systbl.S

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
#include <asm/ppc_asm.h>
1818

1919
#ifdef CONFIG_PPC64
20-
#define SYSCALL(func) .8byte DOTSYM(sys_##func),DOTSYM(sys_##func)
21-
#define COMPAT_SYS(func) .8byte DOTSYM(sys_##func),DOTSYM(compat_sys_##func)
22-
#define PPC_SYS(func) .8byte DOTSYM(ppc_##func),DOTSYM(ppc_##func)
23-
#define OLDSYS(func) .8byte DOTSYM(sys_ni_syscall),DOTSYM(sys_ni_syscall)
24-
#define SYS32ONLY(func) .8byte DOTSYM(sys_ni_syscall),DOTSYM(compat_sys_##func)
25-
#define PPC64ONLY(func) .8byte DOTSYM(ppc_##func),DOTSYM(sys_ni_syscall)
26-
#define SYSX(f, f3264, f32) .8byte DOTSYM(f),DOTSYM(f3264)
20+
#define SYSCALL(func) .8byte DOTSYM(sys_##func)
21+
#define COMPAT_SYS(func) .8byte DOTSYM(sys_##func)
22+
#define PPC_SYS(func) .8byte DOTSYM(ppc_##func)
23+
#define OLDSYS(func) .8byte DOTSYM(sys_ni_syscall)
24+
#define SYS32ONLY(func) .8byte DOTSYM(sys_ni_syscall)
25+
#define PPC64ONLY(func) .8byte DOTSYM(ppc_##func)
26+
#define SYSX(f, f3264, f32) .8byte DOTSYM(f)
2727
#else
2828
#define SYSCALL(func) .long sys_##func
2929
#define COMPAT_SYS(func) .long sys_##func
@@ -46,6 +46,27 @@
4646

4747
.globl sys_call_table
4848
sys_call_table:
49+
#include <asm/systbl.h>
50+
51+
#undef SYSCALL
52+
#undef COMPAT_SYS
53+
#undef PPC_SYS
54+
#undef OLDSYS
55+
#undef SYS32ONLY
56+
#undef PPC64ONLY
57+
#undef SYSX
4958

59+
#ifdef CONFIG_COMPAT
60+
#define SYSCALL(func) .8byte DOTSYM(sys_##func)
61+
#define COMPAT_SYS(func) .8byte DOTSYM(compat_sys_##func)
62+
#define PPC_SYS(func) .8byte DOTSYM(ppc_##func)
63+
#define OLDSYS(func) .8byte DOTSYM(sys_ni_syscall)
64+
#define SYS32ONLY(func) .8byte DOTSYM(compat_sys_##func)
65+
#define PPC64ONLY(func) .8byte DOTSYM(sys_ni_syscall)
66+
#define SYSX(f, f3264, f32) .8byte DOTSYM(f3264)
67+
68+
.globl compat_sys_call_table
69+
compat_sys_call_table:
5070
#define compat_sys_sigsuspend sys_sigsuspend
5171
#include <asm/systbl.h>
72+
#endif

arch/powerpc/kernel/vdso.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -671,15 +671,18 @@ static void __init vdso_setup_syscall_map(void)
671671
{
672672
unsigned int i;
673673
extern unsigned long *sys_call_table;
674+
#ifdef CONFIG_PPC64
675+
extern unsigned long *compat_sys_call_table;
676+
#endif
674677
extern unsigned long sys_ni_syscall;
675678

676679

677680
for (i = 0; i < NR_syscalls; i++) {
678681
#ifdef CONFIG_PPC64
679-
if (sys_call_table[i*2] != sys_ni_syscall)
682+
if (sys_call_table[i] != sys_ni_syscall)
680683
vdso_data->syscall_map_64[i >> 5] |=
681684
0x80000000UL >> (i & 0x1f);
682-
if (sys_call_table[i*2+1] != sys_ni_syscall)
685+
if (compat_sys_call_table[i] != sys_ni_syscall)
683686
vdso_data->syscall_map_32[i >> 5] |=
684687
0x80000000UL >> (i & 0x1f);
685688
#else /* CONFIG_PPC64 */

0 commit comments

Comments
 (0)