summaryrefslogtreecommitdiffstats
path: root/libc/arch-x86/bionic/vfork.S
blob: 53910aba3714055c5ea3dbc920616d4072dcf3b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <sys/linux-syscalls.h>

#ifndef __NR_vfork
#define __NR_vfork  190
#endif


    .text
    .type vfork, @function
    .globl vfork
    .align 4

/* Get rid of the stack modifications (popl/ret) after vfork() success.
 * vfork is VERY sneaky. One has to be very careful about what can be done
 * between a successful vfork and a a subsequent execve()
 */

vfork:
    /* grab the return address */
    popl    %ecx
    movl    $__NR_vfork, %eax
    int     $0x80
    cmpl    $-129, %eax
    jb      1f
    negl    %eax
    pushl   %eax
    call    __set_errno
    orl     $-1, %eax
1:
    jmp     *%ecx