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

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
...@@ -32,6 +32,7 @@ static inline void get_cpu_id(struct cpuid *ptr) ...@@ -32,6 +32,7 @@ static inline void get_cpu_id(struct cpuid *ptr)
extern void s390_adjust_jiffies(void); extern void s390_adjust_jiffies(void);
extern const struct seq_operations cpuinfo_op; extern const struct seq_operations cpuinfo_op;
extern int sysctl_ieee_emulation_warnings; 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. * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit.
...@@ -114,6 +115,7 @@ struct stack_frame { ...@@ -114,6 +115,7 @@ struct stack_frame {
regs->psw.mask = psw_user_bits | PSW_MASK_EA | PSW_MASK_BA; \ regs->psw.mask = psw_user_bits | PSW_MASK_EA | PSW_MASK_BA; \
regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ regs->psw.addr = new_psw | PSW_ADDR_AMODE; \
regs->gprs[15] = new_stackp; \ regs->gprs[15] = new_stackp; \
execve_tail(); \
} while (0) } while (0)
#define start_thread31(regs, new_psw, new_stackp) do { \ #define start_thread31(regs, new_psw, new_stackp) do { \
...@@ -123,6 +125,7 @@ struct stack_frame { ...@@ -123,6 +125,7 @@ struct stack_frame {
__tlb_flush_mm(current->mm); \ __tlb_flush_mm(current->mm); \
crst_table_downgrade(current->mm, 1UL << 31); \ crst_table_downgrade(current->mm, 1UL << 31); \
update_mm(current->mm, current); \ update_mm(current->mm, current); \
execve_tail(); \
} while (0) } while (0)
/* Forward declaration, a strange C thing */ /* Forward declaration, a strange C thing */
......
...@@ -415,6 +415,7 @@ ...@@ -415,6 +415,7 @@
# define __ARCH_WANT_COMPAT_SYS_TIME # define __ARCH_WANT_COMPAT_SYS_TIME
# define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND # define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
# endif # endif
#define __ARCH_WANT_SYS_EXECVE
/* /*
* "Conditional" syscalls * "Conditional" syscalls
......
...@@ -420,32 +420,6 @@ sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo) ...@@ -420,32 +420,6 @@ sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
return ret; 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, asmlinkage long sys32_pread64(unsigned int fd, char __user *ubuf,
size_t count, u32 poshi, u32 poslo) size_t count, u32 poshi, u32 poslo)
{ {
......
...@@ -193,8 +193,6 @@ long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, ...@@ -193,8 +193,6 @@ long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
compat_sigset_t __user *oset, size_t sigsetsize); compat_sigset_t __user *oset, size_t sigsetsize);
long sys32_rt_sigpending(compat_sigset_t __user *set, 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_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, long sys32_init_module(void __user *umod, unsigned long len,
const char __user *uargs); const char __user *uargs);
long sys32_delete_module(const char __user *name_user, unsigned int flags); long sys32_delete_module(const char __user *name_user, unsigned int flags);
......
...@@ -1576,7 +1576,7 @@ ENTRY(sys32_execve_wrapper) ...@@ -1576,7 +1576,7 @@ ENTRY(sys32_execve_wrapper)
llgtr %r2,%r2 # char * llgtr %r2,%r2 # char *
llgtr %r3,%r3 # compat_uptr_t * llgtr %r3,%r3 # compat_uptr_t *
llgtr %r4,%r4 # 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) ENTRY(sys_fanotify_init_wrapper)
llgfr %r2,%r2 # unsigned int llgfr %r2,%r2 # unsigned int
......
...@@ -368,8 +368,6 @@ ENTRY(kernel_execve) ...@@ -368,8 +368,6 @@ ENTRY(kernel_execve)
l %r12,__LC_THREAD_INFO l %r12,__LC_THREAD_INFO
xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
ssm __LC_SVC_NEW_PSW # reenable interrupts ssm __LC_SVC_NEW_PSW # reenable interrupts
l %r1,BASED(.Lexecve_tail)
basr %r14,%r1 # call execve_tail
j sysc_return j sysc_return
/* /*
...@@ -932,7 +930,6 @@ cleanup_idle_wait: ...@@ -932,7 +930,6 @@ cleanup_idle_wait:
.Ldo_notify_resume: .long do_notify_resume .Ldo_notify_resume: .long do_notify_resume
.Ldo_per_trap: .long do_per_trap .Ldo_per_trap: .long do_per_trap
.Ldo_execve: .long do_execve .Ldo_execve: .long do_execve
.Lexecve_tail: .long execve_tail
.Ljump_table: .long pgm_check_table .Ljump_table: .long pgm_check_table
.Lschedule: .long schedule .Lschedule: .long schedule
#ifdef CONFIG_PREEMPT #ifdef CONFIG_PREEMPT
......
...@@ -58,9 +58,6 @@ long sys_fork(void); ...@@ -58,9 +58,6 @@ long sys_fork(void);
long sys_clone(unsigned long newsp, unsigned long clone_flags, long sys_clone(unsigned long newsp, unsigned long clone_flags,
int __user *parent_tidptr, int __user *child_tidptr); int __user *parent_tidptr, int __user *child_tidptr);
long sys_vfork(void); long sys_vfork(void);
void execve_tail(void);
long sys_execve(const char __user *name, const char __user *const __user *argv,
const char __user *const __user *envp);
long sys_sigsuspend(int history0, int history1, old_sigset_t mask); long sys_sigsuspend(int history0, int history1, old_sigset_t mask);
long sys_sigaction(int sig, const struct old_sigaction __user *act, long sys_sigaction(int sig, const struct old_sigaction __user *act,
struct old_sigaction __user *oact); struct old_sigaction __user *oact);
......
...@@ -386,7 +386,6 @@ ENTRY(kernel_execve) ...@@ -386,7 +386,6 @@ ENTRY(kernel_execve)
lg %r12,__LC_THREAD_INFO lg %r12,__LC_THREAD_INFO
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
ssm __LC_SVC_NEW_PSW # reenable interrupts ssm __LC_SVC_NEW_PSW # reenable interrupts
brasl %r14,execve_tail
j sysc_return j sysc_return
/* /*
......
...@@ -249,31 +249,6 @@ asmlinkage void execve_tail(void) ...@@ -249,31 +249,6 @@ asmlinkage void execve_tail(void)
asm volatile("sfpc %0,%0" : : "d" (0)); asm volatile("sfpc %0,%0" : : "d" (0));
} }
/*
* sys_execve() executes a new program.
*/
SYSCALL_DEFINE3(execve, const char __user *, name,
const char __user *const __user *, argv,
const char __user *const __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 = do_execve(filename, argv, envp, regs);
if (rc)
goto out;
execve_tail();
rc = regs->gprs[2];
out:
putname(filename);
return rc;
}
/* /*
* fill in the FPU structure for a core dump. * fill in the FPU structure for a core dump.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment