summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/i386/vfork.S
blob: e2d87053ba0a75492028bebf391946551d5196f8 (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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
 * June 27, 2001             Manuel Novoa III
 *
 * Modified to (hopefully) be PIC and REENTRANT safe.
 *
 */
	
.text
	.align 4
.globl vfork
	.type	 vfork,@function
vfork:
	popl %ecx
	movl $190,%eax
#ifdef __PIC__
	pushl %ebx
#endif
#APP
	int $0x80
#NO_APP
#ifdef __PIC__
	popl %ebx
#endif
	cmpl $-4095,%eax
	jae .Lerror
	jmp *%ecx
	.p2align 4,,7
.Lerror:
	pushl %ecx

#ifdef __PIC__
	pushl %ebx
	call .Lhere
.Lhere:
	popl %ebx
	addl $_GLOBAL_OFFSET_TABLE_+[.-.Lhere],%ebx
	negl %eax
	movl %eax,%ecx
#ifdef __UCLIBC_HAS_THREADS__
	call __errno_location@PLT
#else
	movl errno@GOT(%ebx),%eax
#endif /* __UCLIBC_HAS_THREADS__ */
	movl %ecx,(%eax)
	popl %ebx
#else
	negl %eax
#ifdef __UCLIBC_HAS_THREADS__
	movl %eax,%ecx
	call __errno_location
	movl %ecx,(%eax)
#else
	movl %eax,errno
#endif /* __UCLIBC_HAS_THREADS__ */

#endif /* __PIC__ */
	
	movl $-1,%eax
	ret
.Lsize:
	.size	 vfork,.Lsize-vfork