Message ID | 20220824020548.62625-10-rmclure@linux.ibm.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | powerpc: Syscall wrapper and register clearing | expand |
On Wed Aug 24, 2022 at 12:05 PM AEST, Rohan McLure wrote: > The table of syscall handlers and registered compatibility syscall > handlers has in past been produced using assembly, with function > references resolved at link time. This moves link-time errors to > compile-time, by rewriting systbl.S in C, and including the > linux/syscalls.h, linux/compat.h and asm/syscalls.h headers for > prototypes. Well this is pretty cool. Unrelated, but since commit ab66dcc76d6a, is arch/powerpc/kernel/systbl_chk.sh unused in the tree? > > Reported-by: Arnd Bergmann <arnd@arndb.de> > Signed-off-by: Rohan McLure <rmclure@linux.ibm.com> > --- > V1 -> V2: New patch. > --- > arch/powerpc/kernel/{systbl.S => systbl.c} | 27 ++++++++++---------- > 1 file changed, 14 insertions(+), 13 deletions(-) > > diff --git a/arch/powerpc/kernel/systbl.S b/arch/powerpc/kernel/systbl.c > similarity index 59% > rename from arch/powerpc/kernel/systbl.S > rename to arch/powerpc/kernel/systbl.c > index cb3358886203..99ffdfef6b9c 100644 > --- a/arch/powerpc/kernel/systbl.S > +++ b/arch/powerpc/kernel/systbl.c > @@ -10,31 +10,32 @@ > * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com) > */ > > -#include <asm/ppc_asm.h> > +#include <linux/syscalls.h> > +#include <linux/compat.h> > +#include <asm/unistd.h> > +#include <asm/syscalls.h> > > -.section .rodata,"a" > +#define __SYSCALL_WITH_COMPAT(nr, entry, compat) __SYSCALL(nr, entry) > > -#ifdef CONFIG_PPC64 > - .p2align 3 > -#define __SYSCALL(nr, entry) .8byte entry > +#ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER > +#define __SYSCALL(nr, entry) [nr] = __powerpc_##entry, > +#define __powerpc_sys_ni_syscall sys_ni_syscall > #else > -#define __SYSCALL(nr, entry) .long entry > +#define __SYSCALL(nr, entry) [nr] = entry, > #endif > > -#define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, native) > -.globl sys_call_table > -sys_call_table: > +void *sys_call_table[] = { Humour me, the asm version had this in rodata, does this change that or does it somehow get put back in there? Should this be const? Otherwise, Reviewed-by: Nicholas Piggin <npiggin@gmail.com> > #ifdef CONFIG_PPC64 > #include <asm/syscall_table_64.h> > #else > #include <asm/syscall_table_32.h> > #endif > +}; > > #ifdef CONFIG_COMPAT > #undef __SYSCALL_WITH_COMPAT > #define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, compat) > -.globl compat_sys_call_table > -compat_sys_call_table: > -#define compat_sys_sigsuspend sys_sigsuspend > +void *compat_sys_call_table[] = { > #include <asm/syscall_table_32.h> > -#endif > +}; > +#endif /* CONFIG_COMPAT */ > -- > 2.34.1
"Nicholas Piggin" <npiggin@gmail.com> writes: > On Wed Aug 24, 2022 at 12:05 PM AEST, Rohan McLure wrote: ... >> diff --git a/arch/powerpc/kernel/systbl.S b/arch/powerpc/kernel/systbl.c >> similarity index 59% >> rename from arch/powerpc/kernel/systbl.S >> rename to arch/powerpc/kernel/systbl.c >> index cb3358886203..99ffdfef6b9c 100644 >> --- a/arch/powerpc/kernel/systbl.S >> +++ b/arch/powerpc/kernel/systbl.c >> @@ -10,31 +10,32 @@ >> * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com) >> */ >> >> -#include <asm/ppc_asm.h> >> +#include <linux/syscalls.h> >> +#include <linux/compat.h> >> +#include <asm/unistd.h> >> +#include <asm/syscalls.h> >> >> -.section .rodata,"a" >> +#define __SYSCALL_WITH_COMPAT(nr, entry, compat) __SYSCALL(nr, entry) >> >> -#ifdef CONFIG_PPC64 >> - .p2align 3 >> -#define __SYSCALL(nr, entry) .8byte entry >> +#ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER >> +#define __SYSCALL(nr, entry) [nr] = __powerpc_##entry, >> +#define __powerpc_sys_ni_syscall sys_ni_syscall >> #else >> -#define __SYSCALL(nr, entry) .long entry >> +#define __SYSCALL(nr, entry) [nr] = entry, >> #endif >> >> -#define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, native) >> -.globl sys_call_table >> -sys_call_table: >> +void *sys_call_table[] = { > > Humour me, the asm version had this in rodata, does this change that or > does it somehow get put back in there? Should this be const? Even with const I still see it not landing in rodata for some reason. $ grep -e start_rodata -e end_rodata -e sys_call_table .build/System.map c000000000f90000 D __start_rodata c0000000012b0000 R __end_rodata c0000000027d51b0 D sys_call_table vs before the series: c000000000f80000 D __start_rodata c000000000f805f0 D sys_call_table c0000000012a0000 R __end_rodata cheers
diff --git a/arch/powerpc/kernel/systbl.S b/arch/powerpc/kernel/systbl.c similarity index 59% rename from arch/powerpc/kernel/systbl.S rename to arch/powerpc/kernel/systbl.c index cb3358886203..99ffdfef6b9c 100644 --- a/arch/powerpc/kernel/systbl.S +++ b/arch/powerpc/kernel/systbl.c @@ -10,31 +10,32 @@ * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com) */ -#include <asm/ppc_asm.h> +#include <linux/syscalls.h> +#include <linux/compat.h> +#include <asm/unistd.h> +#include <asm/syscalls.h> -.section .rodata,"a" +#define __SYSCALL_WITH_COMPAT(nr, entry, compat) __SYSCALL(nr, entry) -#ifdef CONFIG_PPC64 - .p2align 3 -#define __SYSCALL(nr, entry) .8byte entry +#ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER +#define __SYSCALL(nr, entry) [nr] = __powerpc_##entry, +#define __powerpc_sys_ni_syscall sys_ni_syscall #else -#define __SYSCALL(nr, entry) .long entry +#define __SYSCALL(nr, entry) [nr] = entry, #endif -#define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, native) -.globl sys_call_table -sys_call_table: +void *sys_call_table[] = { #ifdef CONFIG_PPC64 #include <asm/syscall_table_64.h> #else #include <asm/syscall_table_32.h> #endif +}; #ifdef CONFIG_COMPAT #undef __SYSCALL_WITH_COMPAT #define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, compat) -.globl compat_sys_call_table -compat_sys_call_table: -#define compat_sys_sigsuspend sys_sigsuspend +void *compat_sys_call_table[] = { #include <asm/syscall_table_32.h> -#endif +}; +#endif /* CONFIG_COMPAT */
The table of syscall handlers and registered compatibility syscall handlers has in past been produced using assembly, with function references resolved at link time. This moves link-time errors to compile-time, by rewriting systbl.S in C, and including the linux/syscalls.h, linux/compat.h and asm/syscalls.h headers for prototypes. Reported-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Rohan McLure <rmclure@linux.ibm.com> --- V1 -> V2: New patch. --- arch/powerpc/kernel/{systbl.S => systbl.c} | 27 ++++++++++---------- 1 file changed, 14 insertions(+), 13 deletions(-)