forked from Minki/linux
s390: fold execve_tail() into start_thread(), convert to generic sys_execve()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
1f02ab4a23
commit
65f22a906e
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -368,8 +368,6 @@ ENTRY(kernel_execve)
|
||||
l %r12,__LC_THREAD_INFO
|
||||
xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
|
||||
ssm __LC_SVC_NEW_PSW # reenable interrupts
|
||||
l %r1,BASED(.Lexecve_tail)
|
||||
basr %r14,%r1 # call execve_tail
|
||||
j sysc_return
|
||||
|
||||
/*
|
||||
@ -932,7 +930,6 @@ cleanup_idle_wait:
|
||||
.Ldo_notify_resume: .long do_notify_resume
|
||||
.Ldo_per_trap: .long do_per_trap
|
||||
.Ldo_execve: .long do_execve
|
||||
.Lexecve_tail: .long execve_tail
|
||||
.Ljump_table: .long pgm_check_table
|
||||
.Lschedule: .long schedule
|
||||
#ifdef CONFIG_PREEMPT
|
||||
|
@ -58,9 +58,6 @@ long sys_fork(void);
|
||||
long sys_clone(unsigned long newsp, unsigned long clone_flags,
|
||||
int __user *parent_tidptr, int __user *child_tidptr);
|
||||
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_sigaction(int sig, const struct old_sigaction __user *act,
|
||||
struct old_sigaction __user *oact);
|
||||
|
@ -386,7 +386,6 @@ ENTRY(kernel_execve)
|
||||
lg %r12,__LC_THREAD_INFO
|
||||
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
|
||||
ssm __LC_SVC_NEW_PSW # reenable interrupts
|
||||
brasl %r14,execve_tail
|
||||
j sysc_return
|
||||
|
||||
/*
|
||||
|
@ -249,31 +249,6 @@ asmlinkage void execve_tail(void)
|
||||
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.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user