summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/x86_64/clone.S
blob: 82c8c5baec5ab875066c940c16a2319eb10c8450 (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
62
63
64
#include "syscalls.h"
#include <errno.h>
#include "dietwarning.h"

.text
.type clone,@function
.weak clone
clone:
.type __clone,@function
.global __clone
__clone:
	movl	$-EINVAL,%eax
	testq	%rdi,%rdi	/* have non null thread_funcion */
	jz	.Lclone_error
	testq	%rsi,%rsi	/* have non null child_stack pointer */
	jz	.Lclone_error

	/* put the parameters on thread stack */
	subq	$16,%rsi
	movq	%rcx,8(%rsi)	/* thread parameter */
	movq	%rdi,0(%rsi)	/* thread function */

	/* syscall */
	movq	%rdx,%rdi
	movl	$__NR_clone,%eax
	syscall
	cmpl	$0,%eax
	jl	.Lclone_error
	jne	.Lreturn

.thread_start:
	/* call thread function */
	popq	%rax
	popq	%rdi
	call	*%rax
	/* exit a thread */
	movq	%rax,%rdi
#ifdef PIC
	jmp	_exit@PLT
#else
	jmp	_exit
#endif

.Lclone_error:
	/* set errno */
	negl	%eax
	pushq	%rax
#ifdef PIC
	call	__errno_location@PLT
#else
	call	__errno_location
#endif
	popq	%rcx
	movl	%ecx,(%rax)
	orq	$-1, %rax

.Lreturn:
	/* just return */
	ret

link_warning("clone", "warning: clone() not yet tested")
link_warning("__clone", "warning: clone() not yet tested")
//link_warning("clone", "warning: clone() not yet implemented")
//link_warning("__clone", "warning: clone() not yet implemented")