1*c9945492SAndroid Build Coastguard Worker#__clone(func, stack, flags, arg, ptid, tls, ctid) 2*c9945492SAndroid Build Coastguard Worker# a0, a1, a2, a3, a4, a5, a6 3*c9945492SAndroid Build Coastguard Worker# sys_clone(flags, stack, ptid, ctid, tls) 4*c9945492SAndroid Build Coastguard Worker# a0, a1, a2, a3, a4 5*c9945492SAndroid Build Coastguard Worker 6*c9945492SAndroid Build Coastguard Worker.global __clone 7*c9945492SAndroid Build Coastguard Worker.hidden __clone 8*c9945492SAndroid Build Coastguard Worker.type __clone,@function 9*c9945492SAndroid Build Coastguard Worker__clone: 10*c9945492SAndroid Build Coastguard Worker bstrins.d $a1, $zero, 3, 0 #stack to 16 align 11*c9945492SAndroid Build Coastguard Worker # Save function pointer and argument pointer on new thread stack 12*c9945492SAndroid Build Coastguard Worker addi.d $a1, $a1, -16 13*c9945492SAndroid Build Coastguard Worker st.d $a0, $a1, 0 # save function pointer 14*c9945492SAndroid Build Coastguard Worker st.d $a3, $a1, 8 # save argument pointer 15*c9945492SAndroid Build Coastguard Worker or $a0, $a2, $zero 16*c9945492SAndroid Build Coastguard Worker or $a2, $a4, $zero 17*c9945492SAndroid Build Coastguard Worker or $a3, $a6, $zero 18*c9945492SAndroid Build Coastguard Worker or $a4, $a5, $zero 19*c9945492SAndroid Build Coastguard Worker ori $a7, $zero, 220 20*c9945492SAndroid Build Coastguard Worker syscall 0 # call clone 21*c9945492SAndroid Build Coastguard Worker 22*c9945492SAndroid Build Coastguard Worker beqz $a0, 1f # whether child process 23*c9945492SAndroid Build Coastguard Worker jirl $zero, $ra, 0 # parent process return 24*c9945492SAndroid Build Coastguard Worker1: 25*c9945492SAndroid Build Coastguard Worker ld.d $t8, $sp, 0 # function pointer 26*c9945492SAndroid Build Coastguard Worker ld.d $a0, $sp, 8 # argument pointer 27*c9945492SAndroid Build Coastguard Worker jirl $ra, $t8, 0 # call the user's function 28*c9945492SAndroid Build Coastguard Worker ori $a7, $zero, 93 29*c9945492SAndroid Build Coastguard Worker syscall 0 # child process exit 30