1570af302Sopenharmony_ci#__clone(func, stack, flags, arg, ptid, tls, ctid) 2570af302Sopenharmony_ci# a0, a1, a2, a3, a4, a5, a6 3570af302Sopenharmony_ci# sys_clone(flags, stack, ptid, ctid, tls) 4570af302Sopenharmony_ci# a0, a1, a2, a3, a4 5570af302Sopenharmony_ci 6570af302Sopenharmony_ci.global __clone 7570af302Sopenharmony_ci.hidden __clone 8570af302Sopenharmony_ci.type __clone,@function 9570af302Sopenharmony_ci__clone: 10570af302Sopenharmony_ci bstrins.d $a1, $zero, 3, 0 #stack to 16 align 11570af302Sopenharmony_ci # Save function pointer and argument pointer on new thread stack 12570af302Sopenharmony_ci addi.d $a1, $a1, -16 13570af302Sopenharmony_ci st.d $a0, $a1, 0 # save function pointer 14570af302Sopenharmony_ci st.d $a3, $a1, 8 # save argument pointer 15570af302Sopenharmony_ci or $a0, $a2, $zero 16570af302Sopenharmony_ci or $a2, $a4, $zero 17570af302Sopenharmony_ci or $a3, $a6, $zero 18570af302Sopenharmony_ci or $a4, $a5, $zero 19570af302Sopenharmony_ci ori $a7, $zero, 220 20570af302Sopenharmony_ci syscall 0 # call clone 21570af302Sopenharmony_ci 22570af302Sopenharmony_ci beqz $a0, 1f # whether child process 23570af302Sopenharmony_ci jirl $zero, $ra, 0 # parent process return 24570af302Sopenharmony_ci1: 25570af302Sopenharmony_ci ld.d $t8, $sp, 0 # function pointer 26570af302Sopenharmony_ci ld.d $a0, $sp, 8 # argument pointer 27570af302Sopenharmony_ci jirl $ra, $t8, 0 # call the user's function 28570af302Sopenharmony_ci ori $a7, $zero, 93 29570af302Sopenharmony_ci syscall 0 # child process exit 30