generic kernel_execve()
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 30 Sep 2012 17:20:09 +0000 (13:20 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 30 Sep 2012 17:36:39 +0000 (13:36 -0400)
commit282124d18626379a20b41d25e0c580f290cd09d4
tree48adb982843cbb133c8079f06abad2911e019f12
parenta3460a59747cfddfa7be4758e5ef08bf5d751d59
generic kernel_execve()

based mostly on arm and alpha versions.  Architectures can define
__ARCH_WANT_KERNEL_EXECVE and use it, provided that
* they have working current_pt_regs(), even for kernel threads.
* kernel_thread-spawned threads do have space for pt_regs
in the normal location.  Normally that's as simple as switching to
generic kernel_thread() and making sure that kernel threads do *not*
go through return from syscall path; call the payload from equivalent
of ret_from_fork if we are in a kernel thread (or just have separate
ret_from_kernel_thread and make copy_thread() use it instead of
ret_from_fork in kernel thread case).
* they have ret_from_kernel_execve(); it is called after
successful do_execve() done by kernel_execve() and gets normal
pt_regs location passed to it as argument.  It's essentially
a longjmp() analog - it should set sp, etc. to the situation
expected at the return for syscall and go there.  Eventually
the need for that sucker will disappear, but that'll take some
surgery on kernel_thread() payloads.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/exec.c
include/linux/binfmts.h