s390/compat: convert system call wrappers to C part 01
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Thu, 27 Feb 2014 08:52:01 +0000 (09:52 +0100)
committerHeiko Carstens <heiko.carstens@de.ibm.com>
Tue, 4 Mar 2014 08:05:38 +0000 (09:05 +0100)
Introduce a new compat_wrap.c file which contains the s390 specific compat
system call wrappers.
The s390 specific system call wrappers only perform sign, zero and pointer
conversion of system call arguments before actually calling the non-compat
system call.

Therefore introduce COMPAT_SYSCALL_WRAPx macros which generate C code that
is nearly identical to the assembly code. This has the advantage that the
compile will generate correct code, and we avoid the frequent copy-paste
errors seen in the compat_wrapper.S file.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
arch/s390/kernel/Makefile
arch/s390/kernel/compat_wrap.c [new file with mode: 0644]
arch/s390/kernel/compat_wrapper.S
arch/s390/kernel/syscalls.S

index 1b3ac09c11b6df2981ca3dbde3cc6df3fba5d2e9..725515f9c5db329be891cc3050af655c0509a1c1 100644 (file)
@@ -50,6 +50,7 @@ compat-obj-$(CONFIG_AUDIT)    += compat_audit.o
 obj-$(CONFIG_COMPAT)           += compat_linux.o compat_signal.o \
                                        compat_wrapper.o compat_exec_domain.o \
                                        $(compat-obj-y)
+obj-$(CONFIG_COMPAT)           += compat_wrap.o
 
 obj-$(CONFIG_STACKTRACE)       += stacktrace.o
 obj-$(CONFIG_KPROBES)          += kprobes.o
diff --git a/arch/s390/kernel/compat_wrap.c b/arch/s390/kernel/compat_wrap.c
new file mode 100644 (file)
index 0000000..5357190
--- /dev/null
@@ -0,0 +1,35 @@
+#include <linux/syscalls.h>
+#include <linux/compat.h>
+
+#define COMPAT_SYSCALL_WRAP1(name, ...) \
+       COMPAT_SYSCALL_WRAPx(1, _##name, __VA_ARGS__)
+#define COMPAT_SYSCALL_WRAP2(name, ...) \
+       COMPAT_SYSCALL_WRAPx(2, _##name, __VA_ARGS__)
+#define COMPAT_SYSCALL_WRAP3(name, ...) \
+       COMPAT_SYSCALL_WRAPx(3, _##name, __VA_ARGS__)
+#define COMPAT_SYSCALL_WRAP4(name, ...) \
+       COMPAT_SYSCALL_WRAPx(4, _##name, __VA_ARGS__)
+#define COMPAT_SYSCALL_WRAP5(name, ...) \
+       COMPAT_SYSCALL_WRAPx(5, _##name, __VA_ARGS__)
+#define COMPAT_SYSCALL_WRAP6(name, ...) \
+       COMPAT_SYSCALL_WRAPx(6, _##name, __VA_ARGS__)
+
+#define COMPAT_SYSCALL_WRAPx(x, name, ...)                                     \
+       asmlinkage long compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__));       \
+       asmlinkage long compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__))        \
+       {                                                                       \
+               return sys##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__));            \
+       }
+
+COMPAT_SYSCALL_WRAP1(exit, int, error_code);
+COMPAT_SYSCALL_WRAP1(close, unsigned int, fd);
+COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode);
+COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname);
+COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname);
+COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename);
+COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev);
+COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode);
+COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name);
+COMPAT_SYSCALL_WRAP1(alarm, unsigned int, seconds);
+COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode);
+COMPAT_SYSCALL_WRAP1(nice, int, increment);
index 16ce71880cbddea40c570f3dc0d46fcb0f0a4e2b..09e65cd2e24ee8e271542a35d5794f8e26f19240 100644 (file)
@@ -8,47 +8,10 @@
 
 #include <linux/linkage.h>
 
-ENTRY(sys32_exit_wrapper)
-       lgfr    %r2,%r2                 # int
-       jg      sys_exit                # branch to sys_exit
-
-ENTRY(sys32_close_wrapper)
-       llgfr   %r2,%r2                 # unsigned int
-       jg      sys_close               # branch to system call
-
-ENTRY(sys32_creat_wrapper)
-       llgtr   %r2,%r2                 # const char *
-       lgfr    %r3,%r3                 # int
-       jg      sys_creat               # branch to system call
-
-ENTRY(sys32_link_wrapper)
-       llgtr   %r2,%r2                 # const char *
-       llgtr   %r3,%r3                 # const char *
-       jg      sys_link                # branch to system call
-
-ENTRY(sys32_unlink_wrapper)
-       llgtr   %r2,%r2                 # const char *
-       jg      sys_unlink              # branch to system call
-
-ENTRY(sys32_chdir_wrapper)
-       llgtr   %r2,%r2                 # const char *
-       jg      sys_chdir               # branch to system call
-
 ENTRY(sys32_time_wrapper)
        llgtr   %r2,%r2                 # int *
        jg      compat_sys_time         # branch to system call
 
-ENTRY(sys32_mknod_wrapper)
-       llgtr   %r2,%r2                 # const char *
-       lgfr    %r3,%r3                 # int
-       llgfr   %r4,%r4                 # dev
-       jg      sys_mknod               # branch to system call
-
-ENTRY(sys32_chmod_wrapper)
-       llgtr   %r2,%r2                 # const char *
-       llgfr   %r3,%r3                 # mode_t
-       jg      sys_chmod               # branch to system call
-
 #sys32_getpid_wrapper                          # void
 
 ENTRY(sys32_mount_wrapper)
@@ -59,10 +22,6 @@ ENTRY(sys32_mount_wrapper)
        llgtr   %r6,%r6                 # void *
        jg      compat_sys_mount        # branch to system call
 
-ENTRY(sys32_oldumount_wrapper)
-       llgtr   %r2,%r2                 # char *
-       jg      sys_oldumount           # branch to system call
-
 ENTRY(sys32_ptrace_wrapper)
        lgfr    %r2,%r2                 # long
        lgfr    %r3,%r3                 # long
@@ -70,26 +29,11 @@ ENTRY(sys32_ptrace_wrapper)
        llgfr   %r5,%r5                 # long
        jg      compat_sys_ptrace       # branch to system call
 
-ENTRY(sys32_alarm_wrapper)
-       llgfr   %r2,%r2                 # unsigned int
-       jg      sys_alarm               # branch to system call
-
 ENTRY(compat_sys_utime_wrapper)
        llgtr   %r2,%r2                 # char *
        llgtr   %r3,%r3                 # struct compat_utimbuf *
        jg      compat_sys_utime        # branch to system call
 
-ENTRY(sys32_access_wrapper)
-       llgtr   %r2,%r2                 # const char *
-       lgfr    %r3,%r3                 # int
-       jg      sys_access              # branch to system call
-
-ENTRY(sys32_nice_wrapper)
-       lgfr    %r2,%r2                 # int
-       jg      sys_nice                # branch to system call
-
-#sys32_sync_wrapper                    # void
-
 ENTRY(sys32_kill_wrapper)
        lgfr    %r2,%r2                 # int
        lgfr    %r3,%r3                 # int
index 5a83f6a52c0ef25c1c9174887487d3f69c2278b3..ec1de1b3ecd2f1130c853016ab4945115f96a2ed 100644 (file)
@@ -9,40 +9,40 @@
 #define NI_SYSCALL SYSCALL(sys_ni_syscall,sys_ni_syscall,sys_ni_syscall)
 
 NI_SYSCALL                                                     /* 0 */
-SYSCALL(sys_exit,sys_exit,sys32_exit_wrapper)
+SYSCALL(sys_exit,sys_exit,compat_sys_exit)
 SYSCALL(sys_fork,sys_fork,sys_fork)
 SYSCALL(sys_read,sys_read,compat_sys_s390_read)
 SYSCALL(sys_write,sys_write,compat_sys_s390_write)
 SYSCALL(sys_open,sys_open,compat_sys_open)                     /* 5 */
-SYSCALL(sys_close,sys_close,sys32_close_wrapper)
+SYSCALL(sys_close,sys_close,compat_sys_close)
 SYSCALL(sys_restart_syscall,sys_restart_syscall,sys_restart_syscall)
-SYSCALL(sys_creat,sys_creat,sys32_creat_wrapper)
-SYSCALL(sys_link,sys_link,sys32_link_wrapper)
-SYSCALL(sys_unlink,sys_unlink,sys32_unlink_wrapper)            /* 10 */
+SYSCALL(sys_creat,sys_creat,compat_sys_creat)
+SYSCALL(sys_link,sys_link,compat_sys_link)
+SYSCALL(sys_unlink,sys_unlink,compat_sys_unlink)               /* 10 */
 SYSCALL(sys_execve,sys_execve,sys32_execve_wrapper)
-SYSCALL(sys_chdir,sys_chdir,sys32_chdir_wrapper)
+SYSCALL(sys_chdir,sys_chdir,compat_sys_chdir)
 SYSCALL(sys_time,sys_ni_syscall,sys32_time_wrapper)            /* old time syscall */
-SYSCALL(sys_mknod,sys_mknod,sys32_mknod_wrapper)
-SYSCALL(sys_chmod,sys_chmod,sys32_chmod_wrapper)               /* 15 */
+SYSCALL(sys_mknod,sys_mknod,compat_sys_mknod)
+SYSCALL(sys_chmod,sys_chmod,compat_sys_chmod)                  /* 15 */
 SYSCALL(sys_lchown16,sys_ni_syscall,compat_sys_s390_lchown16)  /* old lchown16 syscall*/
 NI_SYSCALL                                                     /* old break syscall holder */
 NI_SYSCALL                                                     /* old stat syscall holder */
 SYSCALL(sys_lseek,sys_lseek,compat_sys_lseek)
 SYSCALL(sys_getpid,sys_getpid,sys_getpid)                      /* 20 */
 SYSCALL(sys_mount,sys_mount,sys32_mount_wrapper)
-SYSCALL(sys_oldumount,sys_oldumount,sys32_oldumount_wrapper)
+SYSCALL(sys_oldumount,sys_oldumount,compat_sys_oldumount)
 SYSCALL(sys_setuid16,sys_ni_syscall,compat_sys_s390_setuid16)  /* old setuid16 syscall*/
 SYSCALL(sys_getuid16,sys_ni_syscall,compat_sys_s390_getuid16)  /* old getuid16 syscall*/
 SYSCALL(sys_stime,sys_ni_syscall,sys32_stime_wrapper)          /* 25 old stime syscall */
 SYSCALL(sys_ptrace,sys_ptrace,sys32_ptrace_wrapper)
-SYSCALL(sys_alarm,sys_alarm,sys32_alarm_wrapper)
+SYSCALL(sys_alarm,sys_alarm,compat_sys_alarm)
 NI_SYSCALL                                                     /* old fstat syscall */
 SYSCALL(sys_pause,sys_pause,sys_pause)
 SYSCALL(sys_utime,sys_utime,compat_sys_utime_wrapper)          /* 30 */
 NI_SYSCALL                                                     /* old stty syscall */
 NI_SYSCALL                                                     /* old gtty syscall */
-SYSCALL(sys_access,sys_access,sys32_access_wrapper)
-SYSCALL(sys_nice,sys_nice,sys32_nice_wrapper)
+SYSCALL(sys_access,sys_access,compat_sys_access)
+SYSCALL(sys_nice,sys_nice,compat_sys_nice)
 NI_SYSCALL                                                     /* 35 old ftime syscall */
 SYSCALL(sys_sync,sys_sync,sys_sync)
 SYSCALL(sys_kill,sys_kill,sys32_kill_wrapper)