Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b07edab2 authored by Heiko Carstens's avatar Heiko Carstens
Browse files

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: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
parent 5383d2c8
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -50,6 +50,7 @@ compat-obj-$(CONFIG_AUDIT) += compat_audit.o
obj-$(CONFIG_COMPAT)		+= compat_linux.o compat_signal.o \
obj-$(CONFIG_COMPAT)		+= compat_linux.o compat_signal.o \
					compat_wrapper.o compat_exec_domain.o \
					compat_wrapper.o compat_exec_domain.o \
					$(compat-obj-y)
					$(compat-obj-y)
obj-$(CONFIG_COMPAT)		+= compat_wrap.o


obj-$(CONFIG_STACKTRACE)	+= stacktrace.o
obj-$(CONFIG_STACKTRACE)	+= stacktrace.o
obj-$(CONFIG_KPROBES)		+= kprobes.o
obj-$(CONFIG_KPROBES)		+= kprobes.o
+35 −0
Original line number Original line Diff line number Diff line
#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);
+0 −56
Original line number Original line Diff line number Diff line
@@ -8,47 +8,10 @@


#include <linux/linkage.h>
#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)
ENTRY(sys32_time_wrapper)
	llgtr	%r2,%r2			# int *
	llgtr	%r2,%r2			# int *
	jg	compat_sys_time		# branch to system call
	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
#sys32_getpid_wrapper				# void


ENTRY(sys32_mount_wrapper)
ENTRY(sys32_mount_wrapper)
@@ -59,10 +22,6 @@ ENTRY(sys32_mount_wrapper)
	llgtr	%r6,%r6			# void *
	llgtr	%r6,%r6			# void *
	jg	compat_sys_mount	# branch to system call
	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)
ENTRY(sys32_ptrace_wrapper)
	lgfr	%r2,%r2			# long
	lgfr	%r2,%r2			# long
	lgfr	%r3,%r3			# long
	lgfr	%r3,%r3			# long
@@ -70,26 +29,11 @@ ENTRY(sys32_ptrace_wrapper)
	llgfr	%r5,%r5			# long
	llgfr	%r5,%r5			# long
	jg	compat_sys_ptrace	# branch to system call
	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)
ENTRY(compat_sys_utime_wrapper)
	llgtr	%r2,%r2			# char *
	llgtr	%r2,%r2			# char *
	llgtr	%r3,%r3			# struct compat_utimbuf *
	llgtr	%r3,%r3			# struct compat_utimbuf *
	jg	compat_sys_utime	# branch to system call
	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)
ENTRY(sys32_kill_wrapper)
	lgfr	%r2,%r2			# int
	lgfr	%r2,%r2			# int
	lgfr	%r3,%r3			# int
	lgfr	%r3,%r3			# int
+12 −12
Original line number Original line Diff line number Diff line
@@ -9,40 +9,40 @@
#define NI_SYSCALL SYSCALL(sys_ni_syscall,sys_ni_syscall,sys_ni_syscall)
#define NI_SYSCALL SYSCALL(sys_ni_syscall,sys_ni_syscall,sys_ni_syscall)


NI_SYSCALL							/* 0 */
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_fork,sys_fork,sys_fork)
SYSCALL(sys_read,sys_read,compat_sys_s390_read)
SYSCALL(sys_read,sys_read,compat_sys_s390_read)
SYSCALL(sys_write,sys_write,compat_sys_s390_write)
SYSCALL(sys_write,sys_write,compat_sys_s390_write)
SYSCALL(sys_open,sys_open,compat_sys_open)			/* 5 */
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_restart_syscall,sys_restart_syscall,sys_restart_syscall)
SYSCALL(sys_creat,sys_creat,sys32_creat_wrapper)
SYSCALL(sys_creat,sys_creat,compat_sys_creat)
SYSCALL(sys_link,sys_link,sys32_link_wrapper)
SYSCALL(sys_link,sys_link,compat_sys_link)
SYSCALL(sys_unlink,sys_unlink,sys32_unlink_wrapper)		/* 10 */
SYSCALL(sys_unlink,sys_unlink,compat_sys_unlink)		/* 10 */
SYSCALL(sys_execve,sys_execve,sys32_execve_wrapper)
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_time,sys_ni_syscall,sys32_time_wrapper)		/* old time syscall */
SYSCALL(sys_mknod,sys_mknod,sys32_mknod_wrapper)
SYSCALL(sys_mknod,sys_mknod,compat_sys_mknod)
SYSCALL(sys_chmod,sys_chmod,sys32_chmod_wrapper)		/* 15 */
SYSCALL(sys_chmod,sys_chmod,compat_sys_chmod)			/* 15 */
SYSCALL(sys_lchown16,sys_ni_syscall,compat_sys_s390_lchown16)	/* old lchown16 syscall*/
SYSCALL(sys_lchown16,sys_ni_syscall,compat_sys_s390_lchown16)	/* old lchown16 syscall*/
NI_SYSCALL							/* old break syscall holder */
NI_SYSCALL							/* old break syscall holder */
NI_SYSCALL							/* old stat syscall holder */
NI_SYSCALL							/* old stat syscall holder */
SYSCALL(sys_lseek,sys_lseek,compat_sys_lseek)
SYSCALL(sys_lseek,sys_lseek,compat_sys_lseek)
SYSCALL(sys_getpid,sys_getpid,sys_getpid)			/* 20 */
SYSCALL(sys_getpid,sys_getpid,sys_getpid)			/* 20 */
SYSCALL(sys_mount,sys_mount,sys32_mount_wrapper)
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_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_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_stime,sys_ni_syscall,sys32_stime_wrapper)		/* 25 old stime syscall */
SYSCALL(sys_ptrace,sys_ptrace,sys32_ptrace_wrapper)
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 */
NI_SYSCALL							/* old fstat syscall */
SYSCALL(sys_pause,sys_pause,sys_pause)
SYSCALL(sys_pause,sys_pause,sys_pause)
SYSCALL(sys_utime,sys_utime,compat_sys_utime_wrapper)		/* 30 */
SYSCALL(sys_utime,sys_utime,compat_sys_utime_wrapper)		/* 30 */
NI_SYSCALL							/* old stty syscall */
NI_SYSCALL							/* old stty syscall */
NI_SYSCALL							/* old gtty syscall */
NI_SYSCALL							/* old gtty syscall */
SYSCALL(sys_access,sys_access,sys32_access_wrapper)
SYSCALL(sys_access,sys_access,compat_sys_access)
SYSCALL(sys_nice,sys_nice,sys32_nice_wrapper)
SYSCALL(sys_nice,sys_nice,compat_sys_nice)
NI_SYSCALL							/* 35 old ftime syscall */
NI_SYSCALL							/* 35 old ftime syscall */
SYSCALL(sys_sync,sys_sync,sys_sync)
SYSCALL(sys_sync,sys_sync,sys_sync)
SYSCALL(sys_kill,sys_kill,sys32_kill_wrapper)
SYSCALL(sys_kill,sys_kill,sys32_kill_wrapper)