summaryrefslogtreecommitdiff
path: root/src/thread/i386/clone.s
blob: bebf01a3a16f03df03831e78bb7ff662cdcf8606 (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
.text
.global __clone
.weak clone
.type   __clone,@function
.type   clone,@function
__clone:
clone:
	push %ebp
	mov %esp,%ebp
	push %ebx
	push %esi
	push %edi

	xor %eax,%eax
	push $0x51
	mov %gs,%ax
	push $0xfffff
	shr $3,%eax
	push 28(%ebp)
	push %eax
	mov $120,%al

	mov 12(%ebp),%ecx
	mov 16(%ebp),%ebx
	and $-16,%ecx
	sub $16,%ecx
	mov 20(%ebp),%edi
	mov %edi,(%ecx)
	mov 24(%ebp),%edx
	mov %esp,%esi
	mov 32(%ebp),%edi
	mov 8(%ebp),%ebp
	int $128
	test %eax,%eax
	jnz 1f

	mov %ebp,%eax
	xor %ebp,%ebp
	call *%eax
	mov %eax,%ebx
	xor %eax,%eax
	inc %eax
	int $128
	hlt

1:	add $16,%esp
	pop %edi
	pop %esi
	pop %ebx
	pop %ebp
	ret