aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2014-02-27 03:52:01 -0500
committerHeiko Carstens <heiko.carstens@de.ibm.com>2014-03-04 03:05:38 -0500
commitb07edab23c7f93db0e7ab09bd7f5eddc421f6e8c (patch)
treee2234efdafec06a41c47dd705081406026122492 /arch/s390
parent5383d2c8b3ee61a762043818d7c07bbc0049b031 (diff)
s390/compat: convert system call wrappers to C part 01
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>
Diffstat (limited to 'arch/s390')
-rw-r--r--arch/s390/kernel/Makefile1
-rw-r--r--arch/s390/kernel/compat_wrap.c35
-rw-r--r--arch/s390/kernel/compat_wrapper.S56
-rw-r--r--arch/s390/kernel/syscalls.S24
4 files changed, 48 insertions, 68 deletions
diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile
index 1b3ac09c11b6..725515f9c5db 100644
--- a/arch/s390/kernel/Makefile
+++ b/arch/s390/kernel/Makefile
@@ -50,6 +50,7 @@ compat-obj-$(CONFIG_AUDIT) += compat_audit.o
50obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o \ 50obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o \
51 compat_wrapper.o compat_exec_domain.o \ 51 compat_wrapper.o compat_exec_domain.o \
52 $(compat-obj-y) 52 $(compat-obj-y)
53obj-$(CONFIG_COMPAT) += compat_wrap.o
53 54
54obj-$(CONFIG_STACKTRACE) += stacktrace.o 55obj-$(CONFIG_STACKTRACE) += stacktrace.o
55obj-$(CONFIG_KPROBES) += kprobes.o 56obj-$(CONFIG_KPROBES) += kprobes.o
diff --git a/arch/s390/kernel/compat_wrap.c b/arch/s390/kernel/compat_wrap.c
new file mode 100644
index 000000000000..5357190c814e
--- /dev/null
+++ b/arch/s390/kernel/compat_wrap.c
@@ -0,0 +1,35 @@
1#include <linux/syscalls.h>
2#include <linux/compat.h>
3
4#define COMPAT_SYSCALL_WRAP1(name, ...) \
5 COMPAT_SYSCALL_WRAPx(1, _##name, __VA_ARGS__)
6#define COMPAT_SYSCALL_WRAP2(name, ...) \
7 COMPAT_SYSCALL_WRAPx(2, _##name, __VA_ARGS__)
8#define COMPAT_SYSCALL_WRAP3(name, ...) \
9 COMPAT_SYSCALL_WRAPx(3, _##name, __VA_ARGS__)
10#define COMPAT_SYSCALL_WRAP4(name, ...) \
11 COMPAT_SYSCALL_WRAPx(4, _##name, __VA_ARGS__)
12#define COMPAT_SYSCALL_WRAP5(name, ...) \
13 COMPAT_SYSCALL_WRAPx(5, _##name, __VA_ARGS__)
14#define COMPAT_SYSCALL_WRAP6(name, ...) \
15 COMPAT_SYSCALL_WRAPx(6, _##name, __VA_ARGS__)
16
17#define COMPAT_SYSCALL_WRAPx(x, name, ...) \
18 asmlinkage long compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
19 asmlinkage long compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
20 { \
21 return sys##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__)); \
22 }
23
24COMPAT_SYSCALL_WRAP1(exit, int, error_code);
25COMPAT_SYSCALL_WRAP1(close, unsigned int, fd);
26COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode);
27COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname);
28COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname);
29COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename);
30COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev);
31COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode);
32COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name);
33COMPAT_SYSCALL_WRAP1(alarm, unsigned int, seconds);
34COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode);
35COMPAT_SYSCALL_WRAP1(nice, int, increment);
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S
index 16ce71880cbd..09e65cd2e24e 100644
--- a/arch/s390/kernel/compat_wrapper.S
+++ b/arch/s390/kernel/compat_wrapper.S
@@ -8,47 +8,10 @@
8 8
9#include <linux/linkage.h> 9#include <linux/linkage.h>
10 10
11ENTRY(sys32_exit_wrapper)
12 lgfr %r2,%r2 # int
13 jg sys_exit # branch to sys_exit
14
15ENTRY(sys32_close_wrapper)
16 llgfr %r2,%r2 # unsigned int
17 jg sys_close # branch to system call
18
19ENTRY(sys32_creat_wrapper)
20 llgtr %r2,%r2 # const char *
21 lgfr %r3,%r3 # int
22 jg sys_creat # branch to system call
23
24ENTRY(sys32_link_wrapper)
25 llgtr %r2,%r2 # const char *
26 llgtr %r3,%r3 # const char *
27 jg sys_link # branch to system call
28
29ENTRY(sys32_unlink_wrapper)
30 llgtr %r2,%r2 # const char *
31 jg sys_unlink # branch to system call
32
33ENTRY(sys32_chdir_wrapper)
34 llgtr %r2,%r2 # const char *
35 jg sys_chdir # branch to system call
36
37ENTRY(sys32_time_wrapper) 11ENTRY(sys32_time_wrapper)
38 llgtr %r2,%r2 # int * 12 llgtr %r2,%r2 # int *
39 jg compat_sys_time # branch to system call 13 jg compat_sys_time # branch to system call
40 14
41ENTRY(sys32_mknod_wrapper)
42 llgtr %r2,%r2 # const char *
43 lgfr %r3,%r3 # int
44 llgfr %r4,%r4 # dev
45 jg sys_mknod # branch to system call
46
47ENTRY(sys32_chmod_wrapper)
48 llgtr %r2,%r2 # const char *
49 llgfr %r3,%r3 # mode_t
50 jg sys_chmod # branch to system call
51
52#sys32_getpid_wrapper # void 15#sys32_getpid_wrapper # void
53 16
54ENTRY(sys32_mount_wrapper) 17ENTRY(sys32_mount_wrapper)
@@ -59,10 +22,6 @@ ENTRY(sys32_mount_wrapper)
59 llgtr %r6,%r6 # void * 22 llgtr %r6,%r6 # void *
60 jg compat_sys_mount # branch to system call 23 jg compat_sys_mount # branch to system call
61 24
62ENTRY(sys32_oldumount_wrapper)
63 llgtr %r2,%r2 # char *
64 jg sys_oldumount # branch to system call
65
66ENTRY(sys32_ptrace_wrapper) 25ENTRY(sys32_ptrace_wrapper)
67 lgfr %r2,%r2 # long 26 lgfr %r2,%r2 # long
68 lgfr %r3,%r3 # long 27 lgfr %r3,%r3 # long
@@ -70,26 +29,11 @@ ENTRY(sys32_ptrace_wrapper)
70 llgfr %r5,%r5 # long 29 llgfr %r5,%r5 # long
71 jg compat_sys_ptrace # branch to system call 30 jg compat_sys_ptrace # branch to system call
72 31
73ENTRY(sys32_alarm_wrapper)
74 llgfr %r2,%r2 # unsigned int
75 jg sys_alarm # branch to system call
76
77ENTRY(compat_sys_utime_wrapper) 32ENTRY(compat_sys_utime_wrapper)
78 llgtr %r2,%r2 # char * 33 llgtr %r2,%r2 # char *
79 llgtr %r3,%r3 # struct compat_utimbuf * 34 llgtr %r3,%r3 # struct compat_utimbuf *
80 jg compat_sys_utime # branch to system call 35 jg compat_sys_utime # branch to system call
81 36
82ENTRY(sys32_access_wrapper)
83 llgtr %r2,%r2 # const char *
84 lgfr %r3,%r3 # int
85 jg sys_access # branch to system call
86
87ENTRY(sys32_nice_wrapper)
88 lgfr %r2,%r2 # int
89 jg sys_nice # branch to system call
90
91#sys32_sync_wrapper # void
92
93ENTRY(sys32_kill_wrapper) 37ENTRY(sys32_kill_wrapper)
94 lgfr %r2,%r2 # int 38 lgfr %r2,%r2 # int
95 lgfr %r3,%r3 # int 39 lgfr %r3,%r3 # int
diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S
index 5a83f6a52c0e..ec1de1b3ecd2 100644
--- a/arch/s390/kernel/syscalls.S
+++ b/arch/s390/kernel/syscalls.S
@@ -9,40 +9,40 @@
9#define NI_SYSCALL SYSCALL(sys_ni_syscall,sys_ni_syscall,sys_ni_syscall) 9#define NI_SYSCALL SYSCALL(sys_ni_syscall,sys_ni_syscall,sys_ni_syscall)
10 10
11NI_SYSCALL /* 0 */ 11NI_SYSCALL /* 0 */
12SYSCALL(sys_exit,sys_exit,sys32_exit_wrapper) 12SYSCALL(sys_exit,sys_exit,compat_sys_exit)
13SYSCALL(sys_fork,sys_fork,sys_fork) 13SYSCALL(sys_fork,sys_fork,sys_fork)
14SYSCALL(sys_read,sys_read,compat_sys_s390_read) 14SYSCALL(sys_read,sys_read,compat_sys_s390_read)
15SYSCALL(sys_write,sys_write,compat_sys_s390_write) 15SYSCALL(sys_write,sys_write,compat_sys_s390_write)
16SYSCALL(sys_open,sys_open,compat_sys_open) /* 5 */ 16SYSCALL(sys_open,sys_open,compat_sys_open) /* 5 */
17SYSCALL(sys_close,sys_close,sys32_close_wrapper) 17SYSCALL(sys_close,sys_close,compat_sys_close)
18SYSCALL(sys_restart_syscall,sys_restart_syscall,sys_restart_syscall) 18SYSCALL(sys_restart_syscall,sys_restart_syscall,sys_restart_syscall)
19SYSCALL(sys_creat,sys_creat,sys32_creat_wrapper) 19SYSCALL(sys_creat,sys_creat,compat_sys_creat)
20SYSCALL(sys_link,sys_link,sys32_link_wrapper) 20SYSCALL(sys_link,sys_link,compat_sys_link)
21SYSCALL(sys_unlink,sys_unlink,sys32_unlink_wrapper) /* 10 */ 21SYSCALL(sys_unlink,sys_unlink,compat_sys_unlink) /* 10 */
22SYSCALL(sys_execve,sys_execve,sys32_execve_wrapper) 22SYSCALL(sys_execve,sys_execve,sys32_execve_wrapper)
23SYSCALL(sys_chdir,sys_chdir,sys32_chdir_wrapper) 23SYSCALL(sys_chdir,sys_chdir,compat_sys_chdir)
24SYSCALL(sys_time,sys_ni_syscall,sys32_time_wrapper) /* old time syscall */ 24SYSCALL(sys_time,sys_ni_syscall,sys32_time_wrapper) /* old time syscall */
25SYSCALL(sys_mknod,sys_mknod,sys32_mknod_wrapper) 25SYSCALL(sys_mknod,sys_mknod,compat_sys_mknod)
26SYSCALL(sys_chmod,sys_chmod,sys32_chmod_wrapper) /* 15 */ 26SYSCALL(sys_chmod,sys_chmod,compat_sys_chmod) /* 15 */
27SYSCALL(sys_lchown16,sys_ni_syscall,compat_sys_s390_lchown16) /* old lchown16 syscall*/ 27SYSCALL(sys_lchown16,sys_ni_syscall,compat_sys_s390_lchown16) /* old lchown16 syscall*/
28NI_SYSCALL /* old break syscall holder */ 28NI_SYSCALL /* old break syscall holder */
29NI_SYSCALL /* old stat syscall holder */ 29NI_SYSCALL /* old stat syscall holder */
30SYSCALL(sys_lseek,sys_lseek,compat_sys_lseek) 30SYSCALL(sys_lseek,sys_lseek,compat_sys_lseek)
31SYSCALL(sys_getpid,sys_getpid,sys_getpid) /* 20 */ 31SYSCALL(sys_getpid,sys_getpid,sys_getpid) /* 20 */
32SYSCALL(sys_mount,sys_mount,sys32_mount_wrapper) 32SYSCALL(sys_mount,sys_mount,sys32_mount_wrapper)
33SYSCALL(sys_oldumount,sys_oldumount,sys32_oldumount_wrapper) 33SYSCALL(sys_oldumount,sys_oldumount,compat_sys_oldumount)
34SYSCALL(sys_setuid16,sys_ni_syscall,compat_sys_s390_setuid16) /* old setuid16 syscall*/ 34SYSCALL(sys_setuid16,sys_ni_syscall,compat_sys_s390_setuid16) /* old setuid16 syscall*/
35SYSCALL(sys_getuid16,sys_ni_syscall,compat_sys_s390_getuid16) /* old getuid16 syscall*/ 35SYSCALL(sys_getuid16,sys_ni_syscall,compat_sys_s390_getuid16) /* old getuid16 syscall*/
36SYSCALL(sys_stime,sys_ni_syscall,sys32_stime_wrapper) /* 25 old stime syscall */ 36SYSCALL(sys_stime,sys_ni_syscall,sys32_stime_wrapper) /* 25 old stime syscall */
37SYSCALL(sys_ptrace,sys_ptrace,sys32_ptrace_wrapper) 37SYSCALL(sys_ptrace,sys_ptrace,sys32_ptrace_wrapper)
38SYSCALL(sys_alarm,sys_alarm,sys32_alarm_wrapper) 38SYSCALL(sys_alarm,sys_alarm,compat_sys_alarm)
39NI_SYSCALL /* old fstat syscall */ 39NI_SYSCALL /* old fstat syscall */
40SYSCALL(sys_pause,sys_pause,sys_pause) 40SYSCALL(sys_pause,sys_pause,sys_pause)
41SYSCALL(sys_utime,sys_utime,compat_sys_utime_wrapper) /* 30 */ 41SYSCALL(sys_utime,sys_utime,compat_sys_utime_wrapper) /* 30 */
42NI_SYSCALL /* old stty syscall */ 42NI_SYSCALL /* old stty syscall */
43NI_SYSCALL /* old gtty syscall */ 43NI_SYSCALL /* old gtty syscall */
44SYSCALL(sys_access,sys_access,sys32_access_wrapper) 44SYSCALL(sys_access,sys_access,compat_sys_access)
45SYSCALL(sys_nice,sys_nice,sys32_nice_wrapper) 45SYSCALL(sys_nice,sys_nice,compat_sys_nice)
46NI_SYSCALL /* 35 old ftime syscall */ 46NI_SYSCALL /* 35 old ftime syscall */
47SYSCALL(sys_sync,sys_sync,sys_sync) 47SYSCALL(sys_sync,sys_sync,sys_sync)
48SYSCALL(sys_kill,sys_kill,sys32_kill_wrapper) 48SYSCALL(sys_kill,sys_kill,sys32_kill_wrapper)