Commit eb48ffcf authored by Al Viro's avatar Al Viro

sparc64: convert to generic execve

We still have wrappers, but nowhere near as scary as they used to be.
I'm not sure how necessary that flushw is now, TBH...
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 2f12af35
...@@ -8,6 +8,8 @@ extern asmlinkage long sparc_do_fork(unsigned long clone_flags, ...@@ -8,6 +8,8 @@ extern asmlinkage long sparc_do_fork(unsigned long clone_flags,
struct pt_regs *regs, struct pt_regs *regs,
unsigned long stack_size); unsigned long stack_size);
#ifndef __arch64__
extern asmlinkage int sparc_execve(struct pt_regs *regs); extern asmlinkage int sparc_execve(struct pt_regs *regs);
#endif
#endif /* _SPARC64_SYSCALLS_H */ #endif /* _SPARC64_SYSCALLS_H */
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,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
#define __ARCH_WANT_COMPAT_SYS_SENDFILE #define __ARCH_WANT_COMPAT_SYS_SENDFILE
#define __ARCH_WANT_SYS_EXECVE
#endif #endif
/* /*
......
...@@ -667,35 +667,6 @@ int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs) ...@@ -667,35 +667,6 @@ int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs)
} }
EXPORT_SYMBOL(dump_fpu); EXPORT_SYMBOL(dump_fpu);
/*
* sparc_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 int sparc_execve(struct pt_regs *regs)
{
int error, base = 0;
struct filename *filename;
/* User register window flush is done by entry.S */
/* Check for indirect call. */
if (regs->u_regs[UREG_G1] == 0)
base = 1;
filename = getname((char __user *)regs->u_regs[base + UREG_I0]);
error = PTR_ERR(filename);
if (IS_ERR(filename))
goto out;
error = do_execve(filename->name,
(const char __user *const __user *)
regs->u_regs[base + UREG_I1],
(const char __user *const __user *)
regs->u_regs[base + UREG_I2], regs);
putname(filename);
out:
return error;
}
unsigned long get_wchan(struct task_struct *task) unsigned long get_wchan(struct task_struct *task)
{ {
unsigned long pc, fp, bias = 0; unsigned long pc, fp, bias = 0;
......
...@@ -396,35 +396,6 @@ asmlinkage long compat_sys_rt_sigaction(int sig, ...@@ -396,35 +396,6 @@ asmlinkage long compat_sys_rt_sigaction(int sig,
return ret; return ret;
} }
/*
* sparc32_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 sparc32_execve(struct pt_regs *regs)
{
int error, base = 0;
struct filename *filename;
/* User register window flush is done by entry.S */
/* Check for indirect call. */
if ((u32)regs->u_regs[UREG_G1] == 0)
base = 1;
filename = getname(compat_ptr(regs->u_regs[base + UREG_I0]));
error = PTR_ERR(filename);
if (IS_ERR(filename))
goto out;
error = compat_do_execve(filename->name,
compat_ptr(regs->u_regs[base + UREG_I1]),
compat_ptr(regs->u_regs[base + UREG_I2]), regs);
putname(filename);
out:
return error;
}
#ifdef CONFIG_MODULES #ifdef CONFIG_MODULES
asmlinkage long sys32_init_module(void __user *umod, u32 len, asmlinkage long sys32_init_module(void __user *umod, u32 len,
......
/* SunOS's execv() call only specifies the argv argument, the /* SunOS's execv() call only specifies the argv argument, the
* environment settings are the same as the calling processes. * environment settings are the same as the calling processes.
*/ */
sys_execve: sys64_execve:
sethi %hi(sparc_execve), %g1 set sys_execve, %g1
ba,pt %xcc, execve_merge jmpl %g1, %g0
or %g1, %lo(sparc_execve), %g1 flushw
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
sunos_execv: sunos_execv:
stx %g0, [%sp + PTREGS_OFF + PT_V9_I2] mov %g0, %o2
sys32_execve: sys32_execve:
sethi %hi(sparc32_execve), %g1 set compat_sys_execve, %g1
or %g1, %lo(sparc32_execve), %g1
#endif
execve_merge:
flushw
jmpl %g1, %g0 jmpl %g1, %g0
add %sp, PTREGS_OFF, %o0 flushw
#endif
.align 32 .align 32
sys_sparc_pipe: sys_sparc_pipe:
......
...@@ -106,7 +106,7 @@ sys_call_table: ...@@ -106,7 +106,7 @@ sys_call_table:
/*40*/ .word sys_newlstat, sys_dup, sys_sparc_pipe, sys_times, sys_nis_syscall /*40*/ .word sys_newlstat, sys_dup, sys_sparc_pipe, sys_times, sys_nis_syscall
.word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid .word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid
/*50*/ .word sys_getegid, sys_acct, sys_memory_ordering, sys_nis_syscall, sys_ioctl /*50*/ .word sys_getegid, sys_acct, sys_memory_ordering, sys_nis_syscall, sys_ioctl
.word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve .word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys64_execve
/*60*/ .word sys_umask, sys_chroot, sys_newfstat, sys_fstat64, sys_getpagesize /*60*/ .word sys_umask, sys_chroot, sys_newfstat, sys_fstat64, sys_getpagesize
.word sys_msync, sys_vfork, sys_pread64, sys_pwrite64, sys_nis_syscall .word sys_msync, sys_vfork, sys_pread64, sys_pwrite64, sys_nis_syscall
/*70*/ .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys_64_munmap, sys_mprotect /*70*/ .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys_64_munmap, sys_mprotect
......
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