mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
5383d2c8b3
commit
b07edab23c
|
@ -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
|
||||
|
|
|
@ -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);
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue