summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/lm32/vfork.S
blob: f651ba6f8607d12bfc36fa2fe94e4483ba653e65 (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
#include <features.h>

#define _ERRNO_H
#include <bits/errno.h>
#include <asm/unistd.h>
#define _SIGNAL_H
#include <bits/signum.h>

#define CLONE_VM        0x00000100     /* set if VM shared between processes */
#define CLONE_VFORK     0x00004000     /* set if the parent wants the child to */

.text
.global	__vfork
.hidden	__vfork
.type	__vfork,%function
.align 4

__vfork:
	mvi	r2, 0
	mvi	r3, CLONE_VFORK | CLONE_VM | SIGCHLD
	mvi	r8, __NR_clone
	scall

	mvi	r2, -4096
	bgeu	r2, r1, 1f

	addi	sp, sp, -8
	sw	(sp+4), ra
	sw	(sp+8), r1
	calli	__errno_location
	lw	r2, (sp+8)
	lw	ra, (sp+4)
	sub	r2, r0, r2
	sw	(r1+0), r2
	addi	sp, sp, 8
	mvi	r1, -1
1:
	ret

.size __vfork,.-__vfork
weak_alias(__vfork,vfork)
libc_hidden_weak(vfork)