Skip to content

Commit 65f22a9

Browse files
author
Al Viro
committed
s390: fold execve_tail() into start_thread(), convert to generic sys_execve()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent 1f02ab4 commit 65f22a9

File tree

9 files changed

+5
-61
lines changed

9 files changed

+5
-61
lines changed

arch/s390/include/asm/processor.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ static inline void get_cpu_id(struct cpuid *ptr)
3232
extern void s390_adjust_jiffies(void);
3333
extern const struct seq_operations cpuinfo_op;
3434
extern int sysctl_ieee_emulation_warnings;
35+
extern void execve_tail(void);
3536

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

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

128131
/* Forward declaration, a strange C thing */

arch/s390/include/asm/unistd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,7 @@
415415
# define __ARCH_WANT_COMPAT_SYS_TIME
416416
# define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
417417
# endif
418+
#define __ARCH_WANT_SYS_EXECVE
418419

419420
/*
420421
* "Conditional" syscalls

arch/s390/kernel/compat_linux.c

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -420,32 +420,6 @@ sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
420420
return ret;
421421
}
422422

423-
/*
424-
* sys32_execve() executes a new program after the asm stub has set
425-
* things up for us. This should basically do what I want it to.
426-
*/
427-
asmlinkage long sys32_execve(const char __user *name, compat_uptr_t __user *argv,
428-
compat_uptr_t __user *envp)
429-
{
430-
struct pt_regs *regs = task_pt_regs(current);
431-
char *filename;
432-
long rc;
433-
434-
filename = getname(name);
435-
rc = PTR_ERR(filename);
436-
if (IS_ERR(filename))
437-
return rc;
438-
rc = compat_do_execve(filename, argv, envp, regs);
439-
if (rc)
440-
goto out;
441-
current->thread.fp_regs.fpc=0;
442-
asm volatile("sfpc %0,0" : : "d" (0));
443-
rc = regs->gprs[2];
444-
out:
445-
putname(filename);
446-
return rc;
447-
}
448-
449423
asmlinkage long sys32_pread64(unsigned int fd, char __user *ubuf,
450424
size_t count, u32 poshi, u32 poslo)
451425
{

arch/s390/kernel/compat_linux.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,6 @@ long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
193193
compat_sigset_t __user *oset, size_t sigsetsize);
194194
long sys32_rt_sigpending(compat_sigset_t __user *set, size_t sigsetsize);
195195
long sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo);
196-
long sys32_execve(const char __user *name, compat_uptr_t __user *argv,
197-
compat_uptr_t __user *envp);
198196
long sys32_init_module(void __user *umod, unsigned long len,
199197
const char __user *uargs);
200198
long sys32_delete_module(const char __user *name_user, unsigned int flags);

arch/s390/kernel/compat_wrapper.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1576,7 +1576,7 @@ ENTRY(sys32_execve_wrapper)
15761576
llgtr %r2,%r2 # char *
15771577
llgtr %r3,%r3 # compat_uptr_t *
15781578
llgtr %r4,%r4 # compat_uptr_t *
1579-
jg sys32_execve # branch to system call
1579+
jg compat_sys_execve # branch to system call
15801580

15811581
ENTRY(sys_fanotify_init_wrapper)
15821582
llgfr %r2,%r2 # unsigned int

arch/s390/kernel/entry.S

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,6 @@ ENTRY(kernel_execve)
368368
l %r12,__LC_THREAD_INFO
369369
xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
370370
ssm __LC_SVC_NEW_PSW # reenable interrupts
371-
l %r1,BASED(.Lexecve_tail)
372-
basr %r14,%r1 # call execve_tail
373371
j sysc_return
374372

375373
/*
@@ -932,7 +930,6 @@ cleanup_idle_wait:
932930
.Ldo_notify_resume: .long do_notify_resume
933931
.Ldo_per_trap: .long do_per_trap
934932
.Ldo_execve: .long do_execve
935-
.Lexecve_tail: .long execve_tail
936933
.Ljump_table: .long pgm_check_table
937934
.Lschedule: .long schedule
938935
#ifdef CONFIG_PREEMPT

arch/s390/kernel/entry.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,6 @@ long sys_fork(void);
5858
long sys_clone(unsigned long newsp, unsigned long clone_flags,
5959
int __user *parent_tidptr, int __user *child_tidptr);
6060
long sys_vfork(void);
61-
void execve_tail(void);
62-
long sys_execve(const char __user *name, const char __user *const __user *argv,
63-
const char __user *const __user *envp);
6461
long sys_sigsuspend(int history0, int history1, old_sigset_t mask);
6562
long sys_sigaction(int sig, const struct old_sigaction __user *act,
6663
struct old_sigaction __user *oact);

arch/s390/kernel/entry64.S

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,6 @@ ENTRY(kernel_execve)
386386
lg %r12,__LC_THREAD_INFO
387387
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
388388
ssm __LC_SVC_NEW_PSW # reenable interrupts
389-
brasl %r14,execve_tail
390389
j sysc_return
391390

392391
/*

arch/s390/kernel/process.c

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -249,31 +249,6 @@ asmlinkage void execve_tail(void)
249249
asm volatile("sfpc %0,%0" : : "d" (0));
250250
}
251251

252-
/*
253-
* sys_execve() executes a new program.
254-
*/
255-
SYSCALL_DEFINE3(execve, const char __user *, name,
256-
const char __user *const __user *, argv,
257-
const char __user *const __user *, envp)
258-
{
259-
struct pt_regs *regs = task_pt_regs(current);
260-
char *filename;
261-
long rc;
262-
263-
filename = getname(name);
264-
rc = PTR_ERR(filename);
265-
if (IS_ERR(filename))
266-
return rc;
267-
rc = do_execve(filename, argv, envp, regs);
268-
if (rc)
269-
goto out;
270-
execve_tail();
271-
rc = regs->gprs[2];
272-
out:
273-
putname(filename);
274-
return rc;
275-
}
276-
277252
/*
278253
* fill in the FPU structure for a core dump.
279254
*/

0 commit comments

Comments
 (0)