Skip to content

Commit

Permalink
powerpc: Enable compile-time check for syscall handlers
Browse files Browse the repository at this point in the history
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>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220921065605.1051927-18-rmclure@linux.ibm.com
  • Loading branch information
Rohan McLure authored and Michael Ellerman committed Sep 28, 2022
1 parent 8cd1def commit 39859ae
Showing 1 changed file with 11 additions and 21 deletions.
32 changes: 11 additions & 21 deletions arch/powerpc/kernel/systbl.S → arch/powerpc/kernel/systbl.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,36 +10,26 @@
* 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>

#ifdef CONFIG_RELOCATABLE
.section .data.rel.ro,"aw"
#else
.section .rodata,"a"
#endif
#define __SYSCALL_WITH_COMPAT(nr, entry, compat) __SYSCALL(nr, entry)
#define __SYSCALL(nr, entry) [nr] = (unsigned long) &entry,

#ifdef CONFIG_PPC64
.p2align 3
#define __SYSCALL(nr, entry) .8byte entry
#else
.p2align 2
#define __SYSCALL(nr, entry) .long entry
#endif

#define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, native)
.globl sys_call_table
sys_call_table:
const unsigned long 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
const unsigned long compat_sys_call_table[] = {
#include <asm/syscall_table_32.h>
#endif
};
#endif /* CONFIG_COMPAT */

0 comments on commit 39859ae

Please sign in to comment.