master
1// __clone(func, stack, flags, arg, ptid, tls, ctid)
2// r0, r1, r2, r3, r4, r5, stack
3
4// tid = syscall(SYS_clone, flags, stack, ptid, ctid, tls)
5// r6, r0, r1, r2, r3, r4
6// if (tid != 0) return
7// func(arg)
8// syscall(SYS_exit)
9
10.text
11.global __clone
12.type __clone,%function
13__clone:
14 allocframe(#8)
15 // Save pointers for later
16 { r11 = r0
17 r10 = r3 }
18
19 // Set up syscall args - The stack must be 8 byte aligned.
20 { r0 = r2
21 r1 = and(r1, ##0xfffffff8)
22 r2 = r4 }
23 {
24 r3 = memw(r30+#8)
25 r4 = r5 }
26 r6 = #220 // SYS_clone
27 trap0(#1)
28
29 p0 = cmp.eq(r0, #0)
30 if (!p0) dealloc_return
31
32 { r0 = r10
33 callr r11 }
34
35 r6 = #93 // SYS_exit
36 trap0(#1)
37.size __clone, .-__clone