diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-06 15:48:11 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-30 23:03:02 -0400 |
commit | 65f22a906e154e8086ed561904d09c3586de85f4 (patch) | |
tree | 8e4b6be4ce56e828e04311579379211358f23170 /arch/s390 | |
parent | 1f02ab4a237086095bd584f3446da307ac2d02e6 (diff) |
s390: fold execve_tail() into start_thread(), convert to generic sys_execve()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/include/asm/processor.h | 3 | ||||
-rw-r--r-- | arch/s390/include/asm/unistd.h | 1 | ||||
-rw-r--r-- | arch/s390/kernel/compat_linux.c | 26 | ||||
-rw-r--r-- | arch/s390/kernel/compat_linux.h | 2 | ||||
-rw-r--r-- | arch/s390/kernel/compat_wrapper.S | 2 | ||||
-rw-r--r-- | arch/s390/kernel/entry.S | 3 | ||||
-rw-r--r-- | arch/s390/kernel/entry.h | 3 | ||||
-rw-r--r-- | arch/s390/kernel/entry64.S | 1 | ||||
-rw-r--r-- | arch/s390/kernel/process.c | 25 |
9 files changed, 5 insertions, 61 deletions
diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h index 11e4e3236937..0bc77619c3a3 100644 --- a/arch/s390/include/asm/processor.h +++ b/arch/s390/include/asm/processor.h | |||
@@ -32,6 +32,7 @@ static inline void get_cpu_id(struct cpuid *ptr) | |||
32 | extern void s390_adjust_jiffies(void); | 32 | extern void s390_adjust_jiffies(void); |
33 | extern const struct seq_operations cpuinfo_op; | 33 | extern const struct seq_operations cpuinfo_op; |
34 | extern int sysctl_ieee_emulation_warnings; | 34 | extern int sysctl_ieee_emulation_warnings; |
35 | extern void execve_tail(void); | ||
35 | 36 | ||
36 | /* | 37 | /* |
37 | * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit. | 38 | * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit. |
@@ -114,6 +115,7 @@ struct stack_frame { | |||
114 | regs->psw.mask = psw_user_bits | PSW_MASK_EA | PSW_MASK_BA; \ | 115 | regs->psw.mask = psw_user_bits | PSW_MASK_EA | PSW_MASK_BA; \ |
115 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ | 116 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ |
116 | regs->gprs[15] = new_stackp; \ | 117 | regs->gprs[15] = new_stackp; \ |
118 | execve_tail(); \ | ||
117 | } while (0) | 119 | } while (0) |
118 | 120 | ||
119 | #define start_thread31(regs, new_psw, new_stackp) do { \ | 121 | #define start_thread31(regs, new_psw, new_stackp) do { \ |
@@ -123,6 +125,7 @@ struct stack_frame { | |||
123 | __tlb_flush_mm(current->mm); \ | 125 | __tlb_flush_mm(current->mm); \ |
124 | crst_table_downgrade(current->mm, 1UL << 31); \ | 126 | crst_table_downgrade(current->mm, 1UL << 31); \ |
125 | update_mm(current->mm, current); \ | 127 | update_mm(current->mm, current); \ |
128 | execve_tail(); \ | ||
126 | } while (0) | 129 | } while (0) |
127 | 130 | ||
128 | /* Forward declaration, a strange C thing */ | 131 | /* Forward declaration, a strange C thing */ |
diff --git a/arch/s390/include/asm/unistd.h b/arch/s390/include/asm/unistd.h index 6756e78f4808..9afacff38edc 100644 --- a/arch/s390/include/asm/unistd.h +++ b/arch/s390/include/asm/unistd.h | |||
@@ -415,6 +415,7 @@ | |||
415 | # define __ARCH_WANT_COMPAT_SYS_TIME | 415 | # define __ARCH_WANT_COMPAT_SYS_TIME |
416 | # define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND | 416 | # define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND |
417 | # endif | 417 | # endif |
418 | #define __ARCH_WANT_SYS_EXECVE | ||
418 | 419 | ||
419 | /* | 420 | /* |
420 | * "Conditional" syscalls | 421 | * "Conditional" syscalls |
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index f606d935f495..d03d733dadfe 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c | |||
@@ -420,32 +420,6 @@ sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo) | |||
420 | return ret; | 420 | return ret; |
421 | } | 421 | } |
422 | 422 | ||
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 | |||
449 | asmlinkage long sys32_pread64(unsigned int fd, char __user *ubuf, | 423 | asmlinkage long sys32_pread64(unsigned int fd, char __user *ubuf, |
450 | size_t count, u32 poshi, u32 poslo) | 424 | size_t count, u32 poshi, u32 poslo) |
451 | { | 425 | { |
diff --git a/arch/s390/kernel/compat_linux.h b/arch/s390/kernel/compat_linux.h index 9635d759c2b9..5daff1d34b8e 100644 --- a/arch/s390/kernel/compat_linux.h +++ b/arch/s390/kernel/compat_linux.h | |||
@@ -193,8 +193,6 @@ long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, | |||
193 | compat_sigset_t __user *oset, size_t sigsetsize); | 193 | compat_sigset_t __user *oset, size_t sigsetsize); |
194 | long sys32_rt_sigpending(compat_sigset_t __user *set, size_t sigsetsize); | 194 | long sys32_rt_sigpending(compat_sigset_t __user *set, size_t sigsetsize); |
195 | long sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo); | 195 | 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); | ||
198 | long sys32_init_module(void __user *umod, unsigned long len, | 196 | long sys32_init_module(void __user *umod, unsigned long len, |
199 | const char __user *uargs); | 197 | const char __user *uargs); |
200 | long sys32_delete_module(const char __user *name_user, unsigned int flags); | 198 | long sys32_delete_module(const char __user *name_user, unsigned int flags); |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 2d82cfcbce5b..cf1d60f46922 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
@@ -1576,7 +1576,7 @@ ENTRY(sys32_execve_wrapper) | |||
1576 | llgtr %r2,%r2 # char * | 1576 | llgtr %r2,%r2 # char * |
1577 | llgtr %r3,%r3 # compat_uptr_t * | 1577 | llgtr %r3,%r3 # compat_uptr_t * |
1578 | llgtr %r4,%r4 # compat_uptr_t * | 1578 | llgtr %r4,%r4 # compat_uptr_t * |
1579 | jg sys32_execve # branch to system call | 1579 | jg compat_sys_execve # branch to system call |
1580 | 1580 | ||
1581 | ENTRY(sys_fanotify_init_wrapper) | 1581 | ENTRY(sys_fanotify_init_wrapper) |
1582 | llgfr %r2,%r2 # unsigned int | 1582 | llgfr %r2,%r2 # unsigned int |
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 870bad6d56fc..6286985a1039 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
@@ -368,8 +368,6 @@ ENTRY(kernel_execve) | |||
368 | l %r12,__LC_THREAD_INFO | 368 | l %r12,__LC_THREAD_INFO |
369 | xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) | 369 | xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) |
370 | ssm __LC_SVC_NEW_PSW # reenable interrupts | 370 | ssm __LC_SVC_NEW_PSW # reenable interrupts |
371 | l %r1,BASED(.Lexecve_tail) | ||
372 | basr %r14,%r1 # call execve_tail | ||
373 | j sysc_return | 371 | j sysc_return |
374 | 372 | ||
375 | /* | 373 | /* |
@@ -932,7 +930,6 @@ cleanup_idle_wait: | |||
932 | .Ldo_notify_resume: .long do_notify_resume | 930 | .Ldo_notify_resume: .long do_notify_resume |
933 | .Ldo_per_trap: .long do_per_trap | 931 | .Ldo_per_trap: .long do_per_trap |
934 | .Ldo_execve: .long do_execve | 932 | .Ldo_execve: .long do_execve |
935 | .Lexecve_tail: .long execve_tail | ||
936 | .Ljump_table: .long pgm_check_table | 933 | .Ljump_table: .long pgm_check_table |
937 | .Lschedule: .long schedule | 934 | .Lschedule: .long schedule |
938 | #ifdef CONFIG_PREEMPT | 935 | #ifdef CONFIG_PREEMPT |
diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h index a5f4dc42a5db..d0d3f69a7346 100644 --- a/arch/s390/kernel/entry.h +++ b/arch/s390/kernel/entry.h | |||
@@ -58,9 +58,6 @@ long sys_fork(void); | |||
58 | long sys_clone(unsigned long newsp, unsigned long clone_flags, | 58 | long sys_clone(unsigned long newsp, unsigned long clone_flags, |
59 | int __user *parent_tidptr, int __user *child_tidptr); | 59 | int __user *parent_tidptr, int __user *child_tidptr); |
60 | long sys_vfork(void); | 60 | 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); | ||
64 | long sys_sigsuspend(int history0, int history1, old_sigset_t mask); | 61 | long sys_sigsuspend(int history0, int history1, old_sigset_t mask); |
65 | long sys_sigaction(int sig, const struct old_sigaction __user *act, | 62 | long sys_sigaction(int sig, const struct old_sigaction __user *act, |
66 | struct old_sigaction __user *oact); | 63 | struct old_sigaction __user *oact); |
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 349b7eeb348a..1f776f2edda5 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -386,7 +386,6 @@ ENTRY(kernel_execve) | |||
386 | lg %r12,__LC_THREAD_INFO | 386 | lg %r12,__LC_THREAD_INFO |
387 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) | 387 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
388 | ssm __LC_SVC_NEW_PSW # reenable interrupts | 388 | ssm __LC_SVC_NEW_PSW # reenable interrupts |
389 | brasl %r14,execve_tail | ||
390 | j sysc_return | 389 | j sysc_return |
391 | 390 | ||
392 | /* | 391 | /* |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 733175373a4c..e540251e1dd1 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -250,31 +250,6 @@ asmlinkage void execve_tail(void) | |||
250 | } | 250 | } |
251 | 251 | ||
252 | /* | 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 | |||
277 | /* | ||
278 | * fill in the FPU structure for a core dump. | 253 | * fill in the FPU structure for a core dump. |
279 | */ | 254 | */ |
280 | int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs) | 255 | int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs) |