* [PATCH] [POWERPC] Check that the syscall table matches the syscall numbers
@ 2008-01-03 5:41 Stephen Rothwell
2008-01-07 5:12 ` Stephen Rothwell
0 siblings, 1 reply; 2+ messages in thread
From: Stephen Rothwell @ 2008-01-03 5:41 UTC (permalink / raw)
To: paulus; +Cc: ppc-dev
Hopefully this will catch any out of order additions to the
table in the future.
Signed-off-by: Stephen Rothwell <sfr@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@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/
^ permalink raw reply related [flat|nested] 2+ messages in thread* [PATCH] [POWERPC] Check that the syscall table matches the syscall numbers
2008-01-03 5:41 [PATCH] [POWERPC] Check that the syscall table matches the syscall numbers Stephen Rothwell
@ 2008-01-07 5:12 ` Stephen Rothwell
0 siblings, 0 replies; 2+ messages in thread
From: Stephen Rothwell @ 2008-01-07 5:12 UTC (permalink / raw)
To: paulus; +Cc: ppc-dev, Milton Miller
Also check that __NR_syscalls has been updated appropriately.
Hopefully this will catch any out of order additions to the
table in the future.
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
---
arch/powerpc/kernel/Makefile | 10 ++++++
arch/powerpc/kernel/systbl_chk.c | 58 +++++++++++++++++++++++++++++++++++++
arch/powerpc/kernel/systbl_chk.sh | 33 +++++++++++++++++++++
3 files changed, 101 insertions(+), 0 deletions(-)
create mode 100644 arch/powerpc/kernel/systbl_chk.c
create mode 100644 arch/powerpc/kernel/systbl_chk.sh
This version does not modify the current code for generating the syscall
tables and does more checking.
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
index 9374bc9..d9b3770 100644
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -91,3 +91,13 @@ obj-$(CONFIG_PPC64) += $(obj64-y)
extra-$(CONFIG_PPC_FPU) += fpu.o
extra-$(CONFIG_PPC64) += entry_64.o
+
+extra-y += systbl_chk.i
+$(obj)/systbl.o: systbl_chk
+
+quiet_cmd_systbl_chk = CALL $<
+ cmd_systbl_chk = $(CONFIG_SHELL) $< $(obj)/systbl_chk.i
+
+PHONY += systbl_chk
+systbl_chk: $(src)/systbl_chk.sh $(obj)/systbl_chk.i
+ $(call cmd,systbl_chk)
diff --git a/arch/powerpc/kernel/systbl_chk.c b/arch/powerpc/kernel/systbl_chk.c
new file mode 100644
index 0000000..238aa63
--- /dev/null
+++ b/arch/powerpc/kernel/systbl_chk.c
@@ -0,0 +1,58 @@
+/*
+ * This file, when run through CPP produces a list of syscall numbers
+ * in the order of systbl.h. That way we can check for gaps and syscalls
+ * that are out of order.
+ *
+ * Unfortunately, we cannot check for the correct ordering of entries
+ * using SYSX().
+ *
+ * Copyright © IBM Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include <asm/unistd.h>
+
+#define SYSCALL(func) __NR_##func
+#define COMPAT_SYS(func) __NR_##func
+#define PPC_SYS(func) __NR_##func
+#ifdef CONFIG_PPC64
+#define OLDSYS(func) -1
+#define SYS32ONLY(func) -1
+#else
+#define OLDSYS(func) __NR_old##func
+#define SYS32ONLY(func) __NR_##func
+#endif
+#define SYSX(f, f3264, f32) -1
+
+#define SYSCALL_SPU(func) SYSCALL(func)
+#define COMPAT_SYS_SPU(func) COMPAT_SYS(func)
+#define PPC_SYS_SPU(func) PPC_SYS(func)
+#define SYSX_SPU(f, f3264, f32) SYSX(f, f3264, f32)
+
+/* Just insert a marker for ni_syscalls */
+#define __NR_ni_syscall -1
+
+/*
+ * These are the known exceptions.
+ * Hopefully, there will be no 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 __NR_olddebug_setcontext __NR_sys_debug_setcontext
+
+/* We call sys_ugetrlimit for syscall number __NR_getrlimit */
+#define getrlimit ugetrlimit
+
+START_TABLE
+#include <asm/systbl.h>
+END_TABLE __NR_syscalls
diff --git a/arch/powerpc/kernel/systbl_chk.sh b/arch/powerpc/kernel/systbl_chk.sh
new file mode 100644
index 0000000..19415e7
--- /dev/null
+++ b/arch/powerpc/kernel/systbl_chk.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+#
+# Just process the CPP output from systbl_chk.c and complain
+# if anything is out of order.
+#
+# Copyright © 2008 IBM Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version
+# 2 of the License, or (at your option) any later version.
+
+awk 'BEGIN { num = -1; } # Ignore the beginning of the file
+ /^#/ { next; }
+ /^[ \t]*$/ { next; }
+ /^START_TABLE/ { num = 0; next; }
+ /^END_TABLE/ {
+ if (num != $2) {
+ printf "__NR_syscalls (%s) is not one more than the last syscall (%s)\n",
+ $2, num - 1;
+ exit(1);
+ }
+ num = -1; # Ignore the rest of the file
+ }
+ {
+ if (num == -1) next;
+ if (($1 != -1) && ($1 != num)) {
+ printf "Syscall %s out of order (expected %s)\n",
+ $1, num;
+ exit(1);
+ };
+ num++;
+ }' "$1"
--
1.5.3.7
--
Cheers,
Stephen Rothwell sfr@canb.auug.org.au
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-01-07 5:12 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-03 5:41 [PATCH] [POWERPC] Check that the syscall table matches the syscall numbers Stephen Rothwell
2008-01-07 5:12 ` Stephen Rothwell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox