mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-15 15:15:47 +00:00
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: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
2f12af35a9
commit
eb48ffcf0e
6 changed files with 12 additions and 71 deletions
|
@ -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 @@
|
||||||
#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)
|
||||||
}
|
}
|
||||||
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,
|
||||||
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,
|
||||||
|
|
|
@ -1,23 +1,19 @@
|
||||||
/* 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:
|
||||||
/*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
|
||||||
|
|
Loading…
Reference in a new issue