| // __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 | |
| .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 |