arch: handle arches who do not yet define clone3
This cleanly handles arches who do not yet define clone3.
clone3() was initially placed under __ARCH_WANT_SYS_CLONE under the
assumption that this would cleanly handle all architectures. It does
not.
Architectures such as nios2 or h8300 simply take the asm-generic syscall
definitions and generate their syscall table from it. Since they don't
define __ARCH_WANT_SYS_CLONE the build would fail complaining about
sys_clone3 missing. The reason this doesn't happen for legacy clone is
that nios2 and h8300 provide assembly stubs for sys_clone. This seems to
be done for architectural reasons.
The build failures for nios2 and h8300 were caught int -next luckily.
The solution is to define __ARCH_WANT_SYS_CLONE3 that architectures can
add. Additionally, we need a cond_syscall(clone3) for architectures such
as nios2 or h8300 that generate their syscall table in the way I
explained above.
Fixes: 8f3220a806
("arch: wire-up clone3() syscall")
Signed-off-by: Christian Brauner <christian@brauner.io>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Kees Cook <keescook@chromium.org>
Cc: David Howells <dhowells@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Adrian Reber <adrian@lisas.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Florian Weimer <fweimer@redhat.com>
Cc: linux-api@vger.kernel.org
Cc: linux-arch@vger.kernel.org
Cc: x86@kernel.org
This commit is contained in:
parent
8f3220a806
commit
d68dbb0c9a
|
@ -40,6 +40,7 @@
|
||||||
#define __ARCH_WANT_SYS_FORK
|
#define __ARCH_WANT_SYS_FORK
|
||||||
#define __ARCH_WANT_SYS_VFORK
|
#define __ARCH_WANT_SYS_VFORK
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
|
#define __ARCH_WANT_SYS_CLONE3
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unimplemented (or alternatively implemented) syscalls
|
* Unimplemented (or alternatively implemented) syscalls
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
|
#define __ARCH_WANT_SYS_CLONE3
|
||||||
|
|
||||||
#ifndef __COMPAT_SYSCALL_NR
|
#ifndef __COMPAT_SYSCALL_NR
|
||||||
#include <uapi/asm/unistd.h>
|
#include <uapi/asm/unistd.h>
|
||||||
|
|
|
@ -54,5 +54,6 @@
|
||||||
# define __ARCH_WANT_SYS_FORK
|
# define __ARCH_WANT_SYS_FORK
|
||||||
# define __ARCH_WANT_SYS_VFORK
|
# define __ARCH_WANT_SYS_VFORK
|
||||||
# define __ARCH_WANT_SYS_CLONE
|
# define __ARCH_WANT_SYS_CLONE
|
||||||
|
# define __ARCH_WANT_SYS_CLONE3
|
||||||
|
|
||||||
#endif /* _ASM_X86_UNISTD_H */
|
#endif /* _ASM_X86_UNISTD_H */
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#define _XTENSA_UNISTD_H
|
#define _XTENSA_UNISTD_H
|
||||||
|
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
|
#define __ARCH_WANT_SYS_CLONE3
|
||||||
#include <uapi/asm/unistd.h>
|
#include <uapi/asm/unistd.h>
|
||||||
|
|
||||||
#define __ARCH_WANT_NEW_STAT
|
#define __ARCH_WANT_NEW_STAT
|
||||||
|
|
|
@ -2490,7 +2490,9 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
|
||||||
|
|
||||||
return _do_fork(&args);
|
return _do_fork(&args);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __ARCH_WANT_SYS_CLONE3
|
||||||
noinline static int copy_clone_args_from_user(struct kernel_clone_args *kargs,
|
noinline static int copy_clone_args_from_user(struct kernel_clone_args *kargs,
|
||||||
struct clone_args __user *uargs,
|
struct clone_args __user *uargs,
|
||||||
size_t size)
|
size_t size)
|
||||||
|
|
|
@ -137,6 +137,8 @@ COND_SYSCALL(capset);
|
||||||
/* kernel/exit.c */
|
/* kernel/exit.c */
|
||||||
|
|
||||||
/* kernel/fork.c */
|
/* kernel/fork.c */
|
||||||
|
/* __ARCH_WANT_SYS_CLONE3 */
|
||||||
|
COND_SYSCALL(clone3);
|
||||||
|
|
||||||
/* kernel/futex.c */
|
/* kernel/futex.c */
|
||||||
COND_SYSCALL(futex);
|
COND_SYSCALL(futex);
|
||||||
|
|
Loading…
Reference in New Issue