| 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 | 	{ r30 = #0 |
| 33 | 	 r31 = #0 } |
| 34 | |
| 35 | 	{ r0 = r10 |
| 36 | 	 callr r11 } |
| 37 | |
| 38 | 	r6 = #93			// SYS_exit |
| 39 | 	trap0(#1) |
| 40 | .size __clone, .-__clone |