[PATCH] [POWERPC] Check that the syscall table matches the syscall numbers

Stephen Rothwell sfr at canb.auug.org.au
Thu Jan 3 16:41:41 EST 2008


Hopefully this will catch any out of order additions to the
table in the future.

Signed-off-by: Stephen Rothwell <sfr at canb.auug.org.au>
---
 arch/powerpc/kernel/systbl.S                |   44 ++++++++++++++++++++----
 arch/powerpc/platforms/cell/spu_callbacks.c |    3 ++
 include/asm-powerpc/systbl.h                |   50 +++++++++++++-------------
 3 files changed, 65 insertions(+), 32 deletions(-)

diff --git a/arch/powerpc/kernel/systbl.S b/arch/powerpc/kernel/systbl.S
index 93219c3..89ea6f3 100644
--- a/arch/powerpc/kernel/systbl.S
+++ b/arch/powerpc/kernel/systbl.S
@@ -15,21 +15,50 @@
  */
 
 #include <asm/ppc_asm.h>
+#include <asm/unistd.h>
+
+/*
+ * These are here so that syscall number checking will work.
+ * Do not add any more.
+ */
+#define	__NR_llseek		__NR__llseek
+#undef	__NR_umount
+#define	__NR_umount		__NR_umount2
+#define __NR_old_getrlimit	__NR_getrlimit
+#define	__NR_newstat		__NR_stat
+#define __NR_newlstat		__NR_lstat
+#define __NR_newfstat		__NR_fstat
+#define __NR_newuname		__NR_uname
+#define __NR_sysctl		__NR__sysctl
+#define sys_ugetrlimit		sys_getrlimit
 
 #ifdef CONFIG_PPC64
-#define SYSCALL(func)		.llong	.sys_##func,.sys_##func
-#define COMPAT_SYS(func)	.llong	.sys_##func,.compat_sys_##func
-#define PPC_SYS(func)		.llong	.ppc_##func,.ppc_##func
+#define CHECK_SYS(n)		.org .sys_call_table + n * 16
+
+#define SYSCALL(func)		CHECK_SYS(__NR_##func);	\
+				.llong	.sys_##func,.sys_##func
+#define COMPAT_SYS(func)	CHECK_SYS(__NR_##func); \
+				.llong	.sys_##func,.compat_sys_##func
+#define PPC_SYS(func)		CHECK_SYS(__NR_##func); \
+				.llong	.ppc_##func,.ppc_##func
 #define OLDSYS(func)		.llong	.sys_ni_syscall,.sys_ni_syscall
 #define SYS32ONLY(func)		.llong	.sys_ni_syscall,.compat_sys_##func
 #define SYSX(f, f3264, f32)	.llong	.f,.f3264
+#define SYSCALL_NI		.llong	.sys_ni_syscall,.sys_ni_syscall
 #else
-#define SYSCALL(func)		.long	sys_##func
-#define COMPAT_SYS(func)	.long	sys_##func
-#define PPC_SYS(func)		.long	ppc_##func
+#define CHECK_SYS(n)		.org sys_call_table + n * 4
+
+#define SYSCALL(func)		CHECK_SYS(__NR_##func); \
+				.long	sys_##func
+#define COMPAT_SYS(func)	CHECK_SYS(__NR_##func); \
+				.long	sys_##func
+#define PPC_SYS(func)		CHECK_SYS(__NR_##func); \
+				.long	ppc_##func
 #define OLDSYS(func)		.long	sys_##func
-#define SYS32ONLY(func)		.long	sys_##func
+#define SYS32ONLY(func)		CHECK_SYS(__NR_##func); \
+				.long	sys_##func
 #define SYSX(f, f3264, f32)	.long	f32
+#define SYSCALL_NI		.long	sys_ni_syscall
 #endif
 #define SYSCALL_SPU(func)	SYSCALL(func)
 #define COMPAT_SYS_SPU(func)	COMPAT_SYS(func)
@@ -39,6 +68,7 @@
 #ifdef CONFIG_PPC64
 #define sys_sigpending	sys_ni_syscall
 #define sys_old_getrlimit sys_ni_syscall
+#define compat_sys_ugetrlimit		compat_sys_getrlimit
 
 	.p2align	3
 #endif
diff --git a/arch/powerpc/platforms/cell/spu_callbacks.c b/arch/powerpc/platforms/cell/spu_callbacks.c
index dceb8b6..ae203be 100644
--- a/arch/powerpc/platforms/cell/spu_callbacks.c
+++ b/arch/powerpc/platforms/cell/spu_callbacks.c
@@ -40,12 +40,15 @@ static void *spu_syscall_table[] = {
 #define OLDSYS(func)		sys_ni_syscall,
 #define SYS32ONLY(func)		sys_ni_syscall,
 #define SYSX(f, f3264, f32)	sys_ni_syscall,
+#define SYSCALL_NI		sys_ni_syscall,
 
 #define SYSCALL_SPU(func)	sys_##func,
 #define COMPAT_SYS_SPU(func)	sys_##func,
 #define PPC_SYS_SPU(func)	ppc_##func,
 #define SYSX_SPU(f, f3264, f32)	f,
 
+#define sys_ugetrlimit		sys_getrlimit
+
 #include <asm/systbl.h>
 };
 
diff --git a/include/asm-powerpc/systbl.h b/include/asm-powerpc/systbl.h
index 11d5383..fa6c63b 100644
--- a/include/asm-powerpc/systbl.h
+++ b/include/asm-powerpc/systbl.h
@@ -20,7 +20,7 @@ COMPAT_SYS_SPU(time)
 SYSCALL_SPU(mknod)
 SYSCALL_SPU(chmod)
 SYSCALL_SPU(lchown)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 OLDSYS(stat)
 SYSX_SPU(sys_lseek,ppc32_lseek,sys_lseek)
 SYSCALL_SPU(getpid)
@@ -34,11 +34,11 @@ SYSCALL_SPU(alarm)
 OLDSYS(fstat)
 COMPAT_SYS(pause)
 COMPAT_SYS(utime)
-SYSCALL(ni_syscall)
-SYSCALL(ni_syscall)
+SYSCALL_NI
+SYSCALL_NI
 COMPAT_SYS_SPU(access)
 COMPAT_SYS_SPU(nice)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 SYSCALL_SPU(sync)
 COMPAT_SYS_SPU(kill)
 SYSCALL_SPU(rename)
@@ -47,7 +47,7 @@ SYSCALL_SPU(rmdir)
 SYSCALL_SPU(dup)
 SYSCALL_SPU(pipe)
 COMPAT_SYS_SPU(times)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 SYSCALL_SPU(brk)
 SYSCALL_SPU(setgid)
 SYSCALL_SPU(getgid)
@@ -56,12 +56,12 @@ SYSCALL_SPU(geteuid)
 SYSCALL_SPU(getegid)
 SYSCALL(acct)
 SYSCALL(umount)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 COMPAT_SYS_SPU(ioctl)
 COMPAT_SYS_SPU(fcntl)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 COMPAT_SYS_SPU(setpgid)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 SYSX(sys_ni_syscall,sys_olduname, sys_olduname)
 COMPAT_SYS_SPU(umask)
 SYSCALL_SPU(chroot)
@@ -101,10 +101,10 @@ SYSCALL_SPU(fchmod)
 SYSCALL_SPU(fchown)
 COMPAT_SYS_SPU(getpriority)
 COMPAT_SYS_SPU(setpriority)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 COMPAT_SYS(statfs)
 COMPAT_SYS(fstatfs)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 COMPAT_SYS_SPU(socketcall)
 COMPAT_SYS_SPU(syslog)
 COMPAT_SYS_SPU(setitimer)
@@ -113,10 +113,10 @@ COMPAT_SYS_SPU(newstat)
 COMPAT_SYS_SPU(newlstat)
 COMPAT_SYS_SPU(newfstat)
 SYSX(sys_ni_syscall,sys_uname,sys_uname)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 SYSCALL_SPU(vhangup)
-SYSCALL(ni_syscall)
-SYSCALL(ni_syscall)
+SYSCALL_NI
+SYSCALL_NI
 COMPAT_SYS_SPU(wait4)
 SYSCALL(swapoff)
 COMPAT_SYS_SPU(sysinfo)
@@ -126,21 +126,21 @@ SYS32ONLY(sigreturn)
 PPC_SYS(clone)
 COMPAT_SYS_SPU(setdomainname)
 PPC_SYS_SPU(newuname)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 COMPAT_SYS_SPU(adjtimex)
 SYSCALL_SPU(mprotect)
 SYSX(sys_ni_syscall,compat_sys_sigprocmask,sys_sigprocmask)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 SYSCALL(init_module)
 SYSCALL(delete_module)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 SYSCALL(quotactl)
 COMPAT_SYS_SPU(getpgid)
 SYSCALL_SPU(fchdir)
 SYSCALL_SPU(bdflush)
 COMPAT_SYS(sysfs)
 SYSX_SPU(ppc64_personality,ppc64_personality,sys_personality)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 SYSCALL_SPU(setfsuid)
 SYSCALL_SPU(setfsgid)
 SYSCALL_SPU(llseek)
@@ -169,7 +169,7 @@ COMPAT_SYS_SPU(nanosleep)
 SYSCALL_SPU(mremap)
 SYSCALL_SPU(setresuid)
 SYSCALL_SPU(getresuid)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 SYSCALL_SPU(poll)
 COMPAT_SYS(nfsservctl)
 SYSCALL_SPU(setresgid)
@@ -190,10 +190,10 @@ SYSCALL_SPU(capget)
 SYSCALL_SPU(capset)
 COMPAT_SYS(sigaltstack)
 SYSX_SPU(sys_sendfile64,compat_sys_sendfile,sys_sendfile)
-SYSCALL(ni_syscall)
-SYSCALL(ni_syscall)
+SYSCALL_NI
+SYSCALL_NI
 PPC_SYS(vfork)
-COMPAT_SYS_SPU(getrlimit)
+COMPAT_SYS_SPU(ugetrlimit)
 COMPAT_SYS_SPU(readahead)
 SYS32ONLY(mmap2)
 SYS32ONLY(truncate64)
@@ -204,7 +204,7 @@ SYSX(sys_ni_syscall,sys_fstat64,sys_fstat64)
 SYSCALL(pciconfig_read)
 SYSCALL(pciconfig_write)
 SYSCALL(pciconfig_iobase)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 SYSCALL_SPU(getdents64)
 SYSCALL_SPU(pivot_root)
 SYSX(sys_ni_syscall,compat_sys_fcntl64,sys_fcntl64)
@@ -227,8 +227,8 @@ SYSCALL_SPU(fremovexattr)
 COMPAT_SYS_SPU(futex)
 COMPAT_SYS_SPU(sched_setaffinity)
 COMPAT_SYS_SPU(sched_getaffinity)
-SYSCALL(ni_syscall)
-SYSCALL(ni_syscall)
+SYSCALL_NI
+SYSCALL_NI
 SYS32ONLY(sendfile64)
 COMPAT_SYS_SPU(io_setup)
 SYSCALL_SPU(io_destroy)
@@ -260,7 +260,7 @@ COMPAT_SYS_SPU(fstatfs64)
 SYSX(sys_ni_syscall, ppc_fadvise64_64, ppc_fadvise64_64)
 PPC_SYS_SPU(rtas)
 OLDSYS(debug_setcontext)
-SYSCALL(ni_syscall)
+SYSCALL_NI
 COMPAT_SYS(migrate_pages)
 COMPAT_SYS(mbind)
 COMPAT_SYS(get_mempolicy)
-- 
1.5.3.7

-- 
Cheers,
Stephen Rothwell                    sfr at canb.auug.org.au
http://www.canb.auug.org.au/~sfr/



More information about the Linuxppc-dev mailing list