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
|
// __clone(func, stack, flags, arg, ptid, tls, ctid)
// r0, r1, r2, r3, r4, r5, stack
// tid = syscall(SYS_clone, flags, stack, ptid, ctid, tls)
// r6, r0, r1, r2, r3, r4
// if (tid != 0) return
// func(arg)
// syscall(SYS_exit)
.text
.global __clone
.type __clone,%function
__clone:
allocframe(#8)
// Save pointers for later
{ r11 = r0
r10 = r3 }
// Set up syscall args - The stack must be 8 byte aligned.
{ r0 = r2
r1 = and(r1, ##0xfffffff8)
r2 = r4 }
{
r3 = memw(r30+#8)
r4 = r5 }
r6 = #220 // SYS_clone
trap0(#1)
p0 = cmp.eq(r0, #0)
if (!p0) dealloc_return
{ r0 = r10
callr r11 }
r6 = #93 // SYS_exit
trap0(#1)
.size __clone, .-__clone
|