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
|
# __clone(func, stack, flags, arg, ptid, tls, ctid)
# a0, a1, a2, a3, a4, a5, a6
# syscall(SYS_clone, flags, stack, ptid, tls, ctid)
# a7 a0, a1, a2, a3, a4
.global __clone
.type __clone, %function
__clone:
# Save func and arg to stack
addi a1, a1, -16
sd a0, 0(a1)
sd a3, 8(a1)
# Call SYS_clone
mv a0, a2
mv a2, a4
mv a3, a5
mv a4, a6
li a7, 220 # SYS_clone
ecall
beqz a0, 1f
# Parent
ret
# Child
1: ld a1, 0(sp)
ld a0, 8(sp)
jalr a1
# Exit
li a7, 93 # SYS_exit
ecall
|