diff options
author | Dan Albert <danalbert@google.com> | 2014-06-05 18:07:03 -0700 |
---|---|---|
committer | Dan Albert <danalbert@google.com> | 2014-06-10 21:38:52 -0700 |
commit | 210331d9762037afb9b5ed8413079c6f65872df9 (patch) | |
tree | 85e6c875bcd65741da38a7d2b6a47cc24440d8b4 /libc | |
parent | e2a54ca80e011db21665e9639af4608f58e32fbd (diff) | |
download | bionic-210331d9762037afb9b5ed8413079c6f65872df9.zip bionic-210331d9762037afb9b5ed8413079c6f65872df9.tar.gz bionic-210331d9762037afb9b5ed8413079c6f65872df9.tar.bz2 |
Replaces vfork() implementation with fork()
vfork() was removed from POSIX 2008, so this replaces its implementation
with a call to fork().
Bug: 13935372
Change-Id: I6d99ac9e52a2efc5ee9bda1cab908774b830cedc
Diffstat (limited to 'libc')
-rw-r--r-- | libc/Android.mk | 1 | ||||
-rw-r--r-- | libc/SYSCALLS.TXT | 1 | ||||
-rw-r--r-- | libc/arch-arm/syscalls/vfork.S | 14 | ||||
-rw-r--r-- | libc/arch-arm64/arm64.mk | 1 | ||||
-rw-r--r-- | libc/arch-arm64/bionic/vfork.S | 48 | ||||
-rw-r--r-- | libc/arch-mips/bionic/vfork.S | 58 | ||||
-rw-r--r-- | libc/arch-mips/mips.mk | 1 | ||||
-rw-r--r-- | libc/arch-mips64/bionic/vfork.S | 71 | ||||
-rw-r--r-- | libc/arch-mips64/mips64.mk | 1 | ||||
-rw-r--r-- | libc/arch-x86/bionic/vfork.S | 44 | ||||
-rw-r--r-- | libc/arch-x86/x86.mk | 1 | ||||
-rw-r--r-- | libc/arch-x86_64/x86_64.mk | 1 | ||||
-rw-r--r-- | libc/bionic/vfork.cpp (renamed from libc/arch-x86_64/bionic/vfork.S) | 24 |
13 files changed, 8 insertions, 258 deletions
diff --git a/libc/Android.mk b/libc/Android.mk index ee8981a..3512771 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -224,6 +224,7 @@ libc_bionic_src_files := \ bionic/umount.cpp \ bionic/unlink.cpp \ bionic/utimes.cpp \ + bionic/vfork.cpp \ bionic/wait.cpp \ bionic/wchar.cpp \ bionic/wctype.cpp \ diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT index 584c1ae..b496357 100644 --- a/libc/SYSCALLS.TXT +++ b/libc/SYSCALLS.TXT @@ -77,7 +77,6 @@ int prlimit64(pid_t, int, struct rlimit64*, const struct rlimit64*) arm,mips,x8 int setgroups:setgroups32(int, const gid_t*) arm,x86 int setgroups:setgroups(int, const gid_t*) arm64,mips,mips64,x86_64 int setpgid(pid_t, pid_t) all -pid_t vfork(void) arm int setregid:setregid32(gid_t, gid_t) arm,x86 int setregid:setregid(gid_t, gid_t) arm64,mips,mips64,x86_64 int chroot(const char*) all diff --git a/libc/arch-arm/syscalls/vfork.S b/libc/arch-arm/syscalls/vfork.S deleted file mode 100644 index e12fba5..0000000 --- a/libc/arch-arm/syscalls/vfork.S +++ /dev/null @@ -1,14 +0,0 @@ -/* Generated by gensyscalls.py. Do not edit. */ - -#include <private/bionic_asm.h> - -ENTRY(vfork) - mov ip, r7 - ldr r7, =__NR_vfork - swi #0 - mov r7, ip - cmn r0, #(MAX_ERRNO + 1) - bxls lr - neg r0, r0 - b __set_errno -END(vfork) diff --git a/libc/arch-arm64/arm64.mk b/libc/arch-arm64/arm64.mk index 223bc74..2c90cd6 100644 --- a/libc/arch-arm64/arm64.mk +++ b/libc/arch-arm64/arm64.mk @@ -41,7 +41,6 @@ libc_bionic_src_files_arm64 := \ arch-arm64/bionic/__set_tls.c \ arch-arm64/bionic/sigsetjmp.S \ arch-arm64/bionic/syscall.S \ - arch-arm64/bionic/vfork.S \ libc_crt_target_cflags_arm64 := \ diff --git a/libc/arch-arm64/bionic/vfork.S b/libc/arch-arm64/bionic/vfork.S deleted file mode 100644 index c700623..0000000 --- a/libc/arch-arm64/bionic/vfork.S +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <private/bionic_asm.h> -#include <asm/signal.h> -#include <linux/sched.h> - -ENTRY(vfork) - mov x0, #(CLONE_VM | CLONE_VFORK | SIGCHLD) - mov x1, xzr - mov x2, xzr - mov x3, xzr - mov x4, xzr - - mov x8, __NR_clone - svc #0 - - cmn x0, #(MAX_ERRNO + 1) - cneg x0, x0, hi - b.hi __set_errno - - ret -END(vfork) diff --git a/libc/arch-mips/bionic/vfork.S b/libc/arch-mips/bionic/vfork.S deleted file mode 100644 index 96de69e..0000000 --- a/libc/arch-mips/bionic/vfork.S +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <private/bionic_asm.h> -#include <linux/sched.h> - -// TODO: mips' uapi signal.h is missing #ifndef __ASSEMBLY__. -// #include <asm/signal.h> -#define SIGCHLD 18 - -ENTRY(vfork) - .set noreorder - .cpload t9 - - li a0, (CLONE_VM | CLONE_VFORK | SIGCHLD) - li a1, 0 - li a2, 0 - li a3, 0 - subu sp, 8 - sw $0, 16(sp) - li v0, __NR_clone - syscall - addu sp, 8 - bnez a3, 1f - move a0, v0 - - j ra - nop -1: - la t9, __set_errno - j t9 - nop -END(vfork) diff --git a/libc/arch-mips/mips.mk b/libc/arch-mips/mips.mk index 0244712..64b0fb2 100644 --- a/libc/arch-mips/mips.mk +++ b/libc/arch-mips/mips.mk @@ -65,7 +65,6 @@ libc_bionic_src_files_mips += \ arch-mips/bionic/setjmp.S \ arch-mips/bionic/sigsetjmp.S \ arch-mips/bionic/syscall.S \ - arch-mips/bionic/vfork.S \ arch-mips/string/memcpy.S \ arch-mips/string/memset.S \ arch-mips/string/mips_strlen.c \ diff --git a/libc/arch-mips64/bionic/vfork.S b/libc/arch-mips64/bionic/vfork.S deleted file mode 100644 index 911a264..0000000 --- a/libc/arch-mips64/bionic/vfork.S +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <private/bionic_asm.h> -#include <linux/sched.h> - -// TODO: mips' uapi signal.h is missing #ifndef __ASSEMBLY__. -// #include <asm/signal.h> -#define SIGCHLD 18 - - .text - -#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32) -FRAMESZ = MKFSIZ(5,0) -#else -FRAMESZ = MKFSIZ(0,0) -#endif - -LEAF(vfork,FRAMESZ) -#if FRAMESZ!=0 - PTR_SUBU sp, FRAMESZ -#endif - SETUP_GP64(a5, vfork) - LI a0, (CLONE_VM | CLONE_VFORK | SIGCHLD) - move a1, $0 - move a2, $0 - move a3, $0 -#if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32) - REG_S $0, 4*REGSZ(sp) -#else - move a4, $0 -#endif - LI v0, __NR_clone - syscall -#if FRAMESZ!=0 - PTR_ADDU sp,FRAMESZ -#endif - move a0, v0 - bnez a3, 1f - RESTORE_GP64 - j ra -1: - LA t9,__set_errno - RESTORE_GP64 - j t9 - END(vfork) diff --git a/libc/arch-mips64/mips64.mk b/libc/arch-mips64/mips64.mk index 2b18042..799eb6d 100644 --- a/libc/arch-mips64/mips64.mk +++ b/libc/arch-mips64/mips64.mk @@ -48,7 +48,6 @@ libc_bionic_src_files_mips64 := \ arch-mips64/bionic/setjmp.S \ arch-mips64/bionic/sigsetjmp.S \ arch-mips64/bionic/syscall.S \ - arch-mips64/bionic/vfork.S \ # FIXME TODO ## libc_bionic_src_files_mips64 += arch-mips64/string/memcpy.S diff --git a/libc/arch-x86/bionic/vfork.S b/libc/arch-x86/bionic/vfork.S deleted file mode 100644 index ffa6b16..0000000 --- a/libc/arch-x86/bionic/vfork.S +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <private/bionic_asm.h> - -// This custom code preserves the return address across the system call. - -ENTRY(vfork) - popl %ecx // Grab the return address. - movl $__NR_vfork, %eax - int $0x80 - cmpl $-MAX_ERRNO, %eax - jb 1f - negl %eax - pushl %eax - call __set_errno -1: - jmp *%ecx // Jump to the stored return address. -END(vfork) diff --git a/libc/arch-x86/x86.mk b/libc/arch-x86/x86.mk index d13a934..0f22169 100644 --- a/libc/arch-x86/x86.mk +++ b/libc/arch-x86/x86.mk @@ -30,7 +30,6 @@ libc_bionic_src_files_x86 += \ arch-x86/bionic/__set_tls.c \ arch-x86/bionic/sigsetjmp.S \ arch-x86/bionic/syscall.S \ - arch-x86/bionic/vfork.S \ ## ARCH variant specific source files arch_variant_mk := $(LOCAL_PATH)/arch-x86/$(TARGET_ARCH_VARIANT)/$(TARGET_ARCH_VARIANT).mk diff --git a/libc/arch-x86_64/x86_64.mk b/libc/arch-x86_64/x86_64.mk index bd5e9c1..ee91d0f 100644 --- a/libc/arch-x86_64/x86_64.mk +++ b/libc/arch-x86_64/x86_64.mk @@ -37,7 +37,6 @@ libc_bionic_src_files_x86_64 := \ arch-x86_64/bionic/__set_tls.c \ arch-x86_64/bionic/sigsetjmp.S \ arch-x86_64/bionic/syscall.S \ - arch-x86_64/bionic/vfork.S \ bionic/__memcmp16.cpp \ libc_bionic_src_files_x86_64 += \ diff --git a/libc/arch-x86_64/bionic/vfork.S b/libc/bionic/vfork.cpp index 7c14cc0..b706a7f 100644 --- a/libc/arch-x86_64/bionic/vfork.S +++ b/libc/bionic/vfork.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,20 +26,10 @@ * SUCH DAMAGE. */ -#include <private/bionic_asm.h> +#include <unistd.h> -// This custom code preserves the return address across the system call. - -ENTRY(vfork) - popq %rdi // Grab the return address. - movl $__NR_vfork, %eax - syscall - pushq %rdi // Restore the return address. - cmpq $-MAX_ERRNO, %rax - jb 1f - negl %eax - movl %eax, %edi - call __set_errno -1: - ret -END(vfork) +// vfork(2) was removed from POSIX 2008, but it's common enough that we can't +// actually remove it entirely. +extern "C" pid_t vfork(void) { + return fork(); +} |