Skip to content

Commit

Permalink
sparc64: convert to generic execve
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Al Viro committed Oct 16, 2012
1 parent 2f12af3 commit eb48ffc
Show file tree
Hide file tree
Showing 6 changed files with 12 additions and 71 deletions.
2 changes: 2 additions & 0 deletions arch/sparc/include/asm/syscalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ extern asmlinkage long sparc_do_fork(unsigned long clone_flags,
struct pt_regs *regs,
unsigned long stack_size);

#ifndef __arch64__
extern asmlinkage int sparc_execve(struct pt_regs *regs);
#endif

#endif /* _SPARC64_SYSCALLS_H */
1 change: 1 addition & 0 deletions arch/sparc/include/asm/unistd.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
#define __ARCH_WANT_COMPAT_SYS_TIME
#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_COMPAT_SYS_SENDFILE
#define __ARCH_WANT_SYS_EXECVE
#endif

/*
Expand Down
29 changes: 0 additions & 29 deletions arch/sparc/kernel/process_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -667,35 +667,6 @@ int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs)
}
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 pc, fp, bias = 0;
Expand Down
29 changes: 0 additions & 29 deletions arch/sparc/kernel/sys_sparc32.c
Original file line number Diff line number Diff line change
Expand Up @@ -396,35 +396,6 @@ asmlinkage long compat_sys_rt_sigaction(int sig,
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

asmlinkage long sys32_init_module(void __user *umod, u32 len,
Expand Down
20 changes: 8 additions & 12 deletions arch/sparc/kernel/syscalls.S
Original file line number Diff line number Diff line change
@@ -1,23 +1,19 @@
/* SunOS's execv() call only specifies the argv argument, the
* environment settings are the same as the calling processes.
*/
sys_execve:
sethi %hi(sparc_execve), %g1
ba,pt %xcc, execve_merge
or %g1, %lo(sparc_execve), %g1
sys64_execve:
set sys_execve, %g1
jmpl %g1, %g0
flushw

#ifdef CONFIG_COMPAT
sunos_execv:
stx %g0, [%sp + PTREGS_OFF + PT_V9_I2]
mov %g0, %o2
sys32_execve:
sethi %hi(sparc32_execve), %g1
or %g1, %lo(sparc32_execve), %g1
#endif

execve_merge:
flushw
set compat_sys_execve, %g1
jmpl %g1, %g0
add %sp, PTREGS_OFF, %o0
flushw
#endif

.align 32
sys_sparc_pipe:
Expand Down
2 changes: 1 addition & 1 deletion arch/sparc/kernel/systbls_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ sys_call_table:
/*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
/*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
.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
Expand Down

0 comments on commit eb48ffc

Please sign in to comment.