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

Commit 65f22a90 authored by Al Viro's avatar Al Viro
Browse files

s390: fold execve_tail() into start_thread(), convert to generic sys_execve()



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 1f02ab4a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ static inline void get_cpu_id(struct cpuid *ptr)
extern void s390_adjust_jiffies(void);
extern const struct seq_operations cpuinfo_op;
extern int sysctl_ieee_emulation_warnings;
extern void execve_tail(void);

/*
 * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit.
@@ -114,6 +115,7 @@ struct stack_frame {
	regs->psw.mask	= psw_user_bits | PSW_MASK_EA | PSW_MASK_BA;	\
	regs->psw.addr	= new_psw | PSW_ADDR_AMODE;			\
	regs->gprs[15]	= new_stackp;					\
	execve_tail();							\
} while (0)

#define start_thread31(regs, new_psw, new_stackp) do {			\
@@ -123,6 +125,7 @@ struct stack_frame {
	__tlb_flush_mm(current->mm);					\
	crst_table_downgrade(current->mm, 1UL << 31);			\
	update_mm(current->mm, current);				\
	execve_tail();							\
} while (0)

/* Forward declaration, a strange C thing */
+1 −0
Original line number Diff line number Diff line
@@ -415,6 +415,7 @@
#   define __ARCH_WANT_COMPAT_SYS_TIME
#   define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
# endif
#define __ARCH_WANT_SYS_EXECVE

/*
 * "Conditional" syscalls
+0 −26
Original line number Diff line number Diff line
@@ -420,32 +420,6 @@ sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
	return ret;
}

/*
 * sys32_execve() executes a new program after the asm stub has set
 * things up for us.  This should basically do what I want it to.
 */
asmlinkage long sys32_execve(const char __user *name, compat_uptr_t __user *argv,
			     compat_uptr_t __user *envp)
{
	struct pt_regs *regs = task_pt_regs(current);
	char *filename;
	long rc;

	filename = getname(name);
	rc = PTR_ERR(filename);
	if (IS_ERR(filename))
		return rc;
	rc = compat_do_execve(filename, argv, envp, regs);
	if (rc)
		goto out;
	current->thread.fp_regs.fpc=0;
	asm volatile("sfpc %0,0" : : "d" (0));
	rc = regs->gprs[2];
out:
	putname(filename);
	return rc;
}

asmlinkage long sys32_pread64(unsigned int fd, char __user *ubuf,
				size_t count, u32 poshi, u32 poslo)
{
+0 −2
Original line number Diff line number Diff line
@@ -193,8 +193,6 @@ long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
			  compat_sigset_t __user *oset, size_t sigsetsize);
long sys32_rt_sigpending(compat_sigset_t __user *set, size_t sigsetsize);
long sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo);
long sys32_execve(const char __user *name, compat_uptr_t __user *argv,
		  compat_uptr_t __user *envp);
long sys32_init_module(void __user *umod, unsigned long len,
		       const char __user *uargs);
long sys32_delete_module(const char __user *name_user, unsigned int flags);
+1 −1
Original line number Diff line number Diff line
@@ -1576,7 +1576,7 @@ ENTRY(sys32_execve_wrapper)
	llgtr	%r2,%r2			# char *
	llgtr	%r3,%r3			# compat_uptr_t *
	llgtr	%r4,%r4			# compat_uptr_t *
	jg	sys32_execve		# branch to system call
	jg	compat_sys_execve	# branch to system call

ENTRY(sys_fanotify_init_wrapper)
	llgfr	%r2,%r2			# unsigned int
Loading