// __clone(func, stack, flags, arg, ptid, tls, ctid) | |
// x0, x1, w2, x3, x4, x5, x6 | |
// syscall(SYS_clone, flags, stack, ptid, tls, ctid) | |
// x8, x0, x1, x2, x3, x4 | |
.global __clone | |
.hidden __clone | |
.type __clone,%function | |
__clone: | |
// align stack and save func,arg | |
and x1,x1,#-16 | |
stp x0,x3,[x1,#-16]! | |
// syscall | |
uxtw x0,w2 | |
mov x2,x4 | |
mov x3,x5 | |
mov x4,x6 | |
mov x8,#220 // SYS_clone | |
svc #0 | |
cbz x0,1f | |
// parent | |
ret | |
// child | |
1: ldp x1,x0,[sp],#16 | |
blr x1 | |
mov x8,#93 // SYS_exit | |
svc #0 |