clone.s raw
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 # Save func and arg to stack
11 addi a1, a1, -16
12 sd a0, 0(a1)
13 sd a3, 8(a1)
14
15 # Call SYS_clone
16 mv a0, a2
17 mv a2, a4
18 mv a3, a5
19 mv a4, a6
20 li a7, 220 # SYS_clone
21 ecall
22
23 beqz a0, 1f
24 # Parent
25 ret
26
27 # Child
28 1: ld a1, 0(sp)
29 ld a0, 8(sp)
30 jalr a1
31
32 # Exit
33 li a7, 93 # SYS_exit
34 ecall
35