35 lines
550 B
ArmAsm
35 lines
550 B
ArmAsm
# __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
|