| 1 | # __clone(func, stack, flags, arg, ptid, tls, ctid) |
| 2 | # a0, a1, a2, a3, a4, a5, a6 |
| 3 | |
| 4 | # syscall(SYS_clone, flags, stack, ptid, tls, ctid) |
| 5 | # a7 a0, a1, a2, a3, a4 |
| 6 | |
| 7 | .global __clone |
| 8 | .type __clone, %function |
| 9 | __clone: |
| 10 | 	andi a1, a1, -16 |
| 11 | |
| 12 | 	# Save func and arg to stack |
| 13 | 	addi a1, a1, -16 |
| 14 | 	sw a0, 0(a1) |
| 15 | 	sw a3, 4(a1) |
| 16 | |
| 17 | 	# Call SYS_clone |
| 18 | 	mv a0, a2 |
| 19 | 	mv a2, a4 |
| 20 | 	mv a3, a5 |
| 21 | 	mv a4, a6 |
| 22 | 	li a7, 220 # SYS_clone |
| 23 | 	ecall |
| 24 | |
| 25 | 	beqz a0, 1f |
| 26 | 	# Parent |
| 27 | 	ret |
| 28 | |
| 29 | 	# Child |
| 30 | 1: lw a1, 0(sp) |
| 31 | 	lw a0, 4(sp) |
| 32 | 	jalr a1 |
| 33 | |
| 34 | 	# Exit |
| 35 | 	li a7, 93 # SYS_exit |
| 36 | 	ecall |