summaryrefslogtreecommitdiffstats
path: root/usr/klibc/arch/arm/vfork.S
blob: 7130b657c026e90fe832af8cd0ded34c8f8d0107 (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
/*
 * arch/arm/vfork.S
 *
 * vfork - nasty system call which must not use the stack.
 */

#include <klibc/asmmacros.h>
#include <asm/unistd.h>

	.type	vfork,#function
	.globl	vfork
#ifndef __thumb__

	.balign	4
vfork:
#ifdef	__ARM_EABI__
	mov	r3, r7
	mov	r7, # __NR_vfork
	swi	0
	mov	r7, r3
#else
	swi	# __NR_vfork
#endif
        cmn     r0, #4096
        rsbcs	r2, r0, #0
        ldrcs	r3, 1f
        mvncs	r0, #0
        strcs	r2, [r3]
	BX(lr)

	.balign 4
1:
	.word	errno

#else

	.thumb_func
	.balign	2
vfork:
	mov	r3, r7
	mov	r7, # __NR_vfork
	swi	0
	mov	r7, r3
	ldr	r1, 2f
	cmp	r0, r1
	bcc	1f
	ldr	r1, 3f
	neg	r2, r0
	mov	r0, #1
	str	r2, [r1]
	neg	r0, r0
1:
	BX(lr)

	.balign	4
2:
	.word	-4095
3:
	.word	errno

#endif