Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9977d9b3 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull big execve/kernel_thread/fork unification series from Al Viro:
 "All architectures are converted to new model.  Quite a bit of that
  stuff is actually shared with architecture trees; in such cases it's
  literally shared branch pulled by both, not a cherry-pick.

  A lot of ugliness and black magic is gone (-3KLoC total in this one):

   - kernel_thread()/kernel_execve()/sys_execve() redesign.

     We don't do syscalls from kernel anymore for either kernel_thread()
     or kernel_execve():

     kernel_thread() is essentially clone(2) with callback run before we
     return to userland, the callbacks either never return or do
     successful do_execve() before returning.

     kernel_execve() is a wrapper for do_execve() - it doesn't need to
     do transition to user mode anymore.

     As a result kernel_thread() and kernel_execve() are
     arch-independent now - they live in kernel/fork.c and fs/exec.c
     resp.  sys_execve() is also in fs/exec.c and it's completely
     architecture-independent.

   - daemonize() is gone, along with its parts in fs/*.c

   - struct pt_regs * is no longer passed to do_fork/copy_process/
     copy_thread/do_execve/search_binary_handler/->load_binary/do_coredump.

   - sys_fork()/sys_vfork()/sys_clone() unified; some architectures
     still need wrappers (ones with callee-saved registers not saved in
     pt_regs on syscall entry), but the main part of those suckers is in
     kernel/fork.c now."

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal: (113 commits)
  do_coredump(): get rid of pt_regs argument
  print_fatal_signal(): get rid of pt_regs argument
  ptrace_signal(): get rid of unused arguments
  get rid of ptrace_signal_deliver() arguments
  new helper: signal_pt_regs()
  unify default ptrace_signal_deliver
  flagday: kill pt_regs argument of do_fork()
  death to idle_regs()
  don't pass regs to copy_process()
  flagday: don't pass regs to copy_thread()
  bfin: switch to generic vfork, get rid of pointless wrappers
  xtensa: switch to generic clone()
  openrisc: switch to use of generic fork and clone
  unicore32: switch to generic clone(2)
  score: switch to generic fork/vfork/clone
  c6x: sanitize copy_thread(), get rid of clone(2) wrapper, switch to generic clone()
  take sys_fork/sys_vfork/sys_clone prototypes to linux/syscalls.h
  mn10300: switch to generic fork/vfork/clone
  h8300: switch to generic fork/vfork/clone
  tile: switch to generic clone()
  ...

Conflicts:
	arch/microblaze/include/asm/Kbuild
parents cf4af012 541880d9
Loading
Loading
Loading
Loading
+14 −0
Original line number Original line Diff line number Diff line
@@ -342,4 +342,18 @@ config MODULES_USE_ELF_REL
	  Modules only use ELF REL relocations.  Modules with ELF RELA
	  Modules only use ELF REL relocations.  Modules with ELF RELA
	  relocations will give an error.
	  relocations will give an error.


#
# ABI hall of shame
#
config CLONE_BACKWARDS
	bool
	help
	  Architecture has tls passed as the 4th argument of clone(2),
	  not the 5th one.

config CLONE_BACKWARDS2
	bool
	help
	  Architecture has the first two arguments of clone(2) swapped.

source "kernel/gcov/Kconfig"
source "kernel/gcov/Kconfig"
+1 −0
Original line number Original line Diff line number Diff line
@@ -78,6 +78,7 @@ struct switch_stack {


#define current_pt_regs() \
#define current_pt_regs() \
  ((struct pt_regs *) ((char *)current_thread_info() + 2*PAGE_SIZE) - 1)
  ((struct pt_regs *) ((char *)current_thread_info() + 2*PAGE_SIZE) - 1)
#define signal_pt_regs current_pt_regs


#define force_successful_syscall_return() (current_pt_regs()->r0 = 0)
#define force_successful_syscall_return() (current_pt_regs()->r0 = 0)


+0 −3
Original line number Original line Diff line number Diff line
@@ -164,9 +164,6 @@ struct sigstack {


#ifdef __KERNEL__
#ifdef __KERNEL__
#include <asm/sigcontext.h>
#include <asm/sigcontext.h>

#define ptrace_signal_deliver(regs, cookie) do { } while (0)

#endif
#endif


#endif
#endif
+3 −0
Original line number Original line Diff line number Diff line
@@ -482,6 +482,9 @@
#define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_EXECVE
#define __ARCH_WANT_SYS_EXECVE
#define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE


/* "Conditional" syscalls.  What we want is
/* "Conditional" syscalls.  What we want is


+2 −2
Original line number Original line Diff line number Diff line
@@ -5,7 +5,7 @@
#include <linux/binfmts.h>
#include <linux/binfmts.h>
#include <linux/a.out.h>
#include <linux/a.out.h>


static int load_binary(struct linux_binprm *bprm, struct pt_regs *regs)
static int load_binary(struct linux_binprm *bprm)
{
{
	struct exec *eh = (struct exec *)bprm->buf;
	struct exec *eh = (struct exec *)bprm->buf;
	unsigned long loader;
	unsigned long loader;
@@ -37,7 +37,7 @@ static int load_binary(struct linux_binprm *bprm, struct pt_regs *regs)
	retval = prepare_binprm(bprm);
	retval = prepare_binprm(bprm);
	if (retval < 0)
	if (retval < 0)
		return retval;
		return retval;
	return search_binary_handler(bprm,regs);
	return search_binary_handler(bprm);
}
}


static struct linux_binfmt loader_format = {
static struct linux_binfmt loader_format = {
Loading