Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

generic sys_fork / sys_vfork / sys_clone

... and get rid of idiotic struct pt_regs * in asm-generic/syscalls.h
prototypes of the same, while we are at it. Eventually we want those
in linux/syscalls.h, of course, but that'll have to wait a bit.

Note that there are *three* variants of sys_clone() order of arguments.
Braindamage galore...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro d2125043 25906730

+60 -4
+14
arch/Kconfig
··· 341 341 Modules only use ELF REL relocations. Modules with ELF RELA 342 342 relocations will give an error. 343 343 344 + # 345 + # ABI hall of shame 346 + # 347 + config CLONE_BACKWARDS 348 + bool 349 + help 350 + Architecture has tls passed as the 4th argument of clone(2), 351 + not the 5th one. 352 + 353 + config CLONE_BACKWARDS2 354 + bool 355 + help 356 + Architecture has the first two arguments of clone(2) swapped. 357 + 344 358 source "kernel/gcov/Kconfig"
+3 -4
include/asm-generic/syscalls.h
··· 10 10 */ 11 11 #ifndef sys_clone 12 12 asmlinkage long sys_clone(unsigned long clone_flags, unsigned long newsp, 13 - void __user *parent_tid, void __user *child_tid, 14 - struct pt_regs *regs); 13 + void __user *parent_tid, void __user *child_tid); 15 14 #endif 16 15 17 16 #ifndef sys_fork 18 - asmlinkage long sys_fork(struct pt_regs *regs); 17 + asmlinkage long sys_fork(void); 19 18 #endif 20 19 21 20 #ifndef sys_vfork 22 - asmlinkage long sys_vfork(struct pt_regs *regs); 21 + asmlinkage long sys_vfork(void); 23 22 #endif 24 23 25 24 #ifndef sys_execve
+43
kernel/fork.c
··· 1645 1645 } 1646 1646 #endif 1647 1647 1648 + #ifdef __ARCH_WANT_SYS_FORK 1649 + SYSCALL_DEFINE0(fork) 1650 + { 1651 + #ifdef CONFIG_MMU 1652 + return do_fork(SIGCHLD, 0, current_pt_regs(), 0, NULL, NULL); 1653 + #else 1654 + /* can not support in nommu mode */ 1655 + return(-EINVAL); 1656 + #endif 1657 + } 1658 + #endif 1659 + 1660 + #ifdef __ARCH_WANT_SYS_VFORK 1661 + SYSCALL_DEFINE0(vfork) 1662 + { 1663 + return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0, current_pt_regs(), 1664 + 0, NULL, NULL); 1665 + } 1666 + #endif 1667 + 1668 + #ifdef __ARCH_WANT_SYS_CLONE 1669 + #ifdef CONFIG_CLONE_BACKWARDS 1670 + SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp, 1671 + int __user *, parent_tidptr, 1672 + int, tls_val, 1673 + int __user *, child_tidptr) 1674 + #elif defined(CONFIG_CLONE_BACKWARDS2) 1675 + SYSCALL_DEFINE5(clone, unsigned long, newsp, unsigned long, clone_flags, 1676 + int __user *, parent_tidptr, 1677 + int __user *, child_tidptr, 1678 + int, tls_val) 1679 + #else 1680 + SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp, 1681 + int __user *, parent_tidptr, 1682 + int __user *, child_tidptr, 1683 + int, tls_val) 1684 + #endif 1685 + { 1686 + return do_fork(clone_flags, newsp, current_pt_regs(), 0, 1687 + parent_tidptr, child_tidptr); 1688 + } 1689 + #endif 1690 + 1648 1691 #ifndef ARCH_MIN_MMSTRUCT_ALIGN 1649 1692 #define ARCH_MIN_MMSTRUCT_ALIGN 0 1650 1693 #endif