__bionic_clone.S revision 851e68a2402fa414544e66650e09dfdaac813e51
1851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/bionic_asm.h> 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 370b24b1cc2a1a4436b1fea3f8b76616fdcb27224Elliott Hughes// pid_t __bionic_clone(int flags, void* child_stack, pid_t* parent_tid, void* tls, pid_t* child_tid, int (*fn)(void*), void* arg); 4bdff26df2749d8d66e5d4eb5a2ecf4a9ff50fad2Elliott HughesENTRY(__bionic_clone) 522d366cc09383956dc264ed4641572e609392eeeJin Wei pushl %ebx 622d366cc09383956dc264ed4641572e609392eeeJin Wei pushl %esi 722d366cc09383956dc264ed4641572e609392eeeJin Wei pushl %edi 822d366cc09383956dc264ed4641572e609392eeeJin Wei 999c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes # Align child stack. 1022d366cc09383956dc264ed4641572e609392eeeJin Wei movl 20(%esp), %ecx 1122d366cc09383956dc264ed4641572e609392eeeJin Wei andl $~15, %ecx 1222d366cc09383956dc264ed4641572e609392eeeJin Wei 1399c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes # Copy 'fn' and 'arg' onto the child stack 1499c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes movl 36(%esp), %eax # Read 'fn'. 1599c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes movl %eax, -16(%ecx) # Write 'fn'. 1699c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes movl 40(%esp), %eax # Read 'arg'. 1799c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes movl %eax, -12(%ecx) # Write 'arg'. 1822d366cc09383956dc264ed4641572e609392eeeJin Wei subl $16, %ecx 19b6032515a058fb02c8c4152c9f055bb3bd462ae2Elliott Hughes 2099c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes # Make the system call. 2122d366cc09383956dc264ed4641572e609392eeeJin Wei movl $__NR_clone, %eax 2299c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes movl 16(%esp), %ebx # flags 2399c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes #movl %ecx, %ecx # child stack (already there) 2499c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes movl 24(%esp), %edx # parent_tid 2599c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes movl 28(%esp), %esi # tls 2699c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes movl 32(%esp), %edi # child_tid 2722d366cc09383956dc264ed4641572e609392eeeJin Wei int $0x80 28b6032515a058fb02c8c4152c9f055bb3bd462ae2Elliott Hughes 2999c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes # Check result. 30b6032515a058fb02c8c4152c9f055bb3bd462ae2Elliott Hughes cmpl $0, %eax 31b6032515a058fb02c8c4152c9f055bb3bd462ae2Elliott Hughes je bc_child 32b6032515a058fb02c8c4152c9f055bb3bd462ae2Elliott Hughes jg bc_parent 3322d366cc09383956dc264ed4641572e609392eeeJin Wei 3499c393dff33e0a5d3838c16dc7878f32ac3da971Elliott Hughes # An error occurred, so set errno and return -1. 3522d366cc09383956dc264ed4641572e609392eeeJin Wei negl %eax 36b6032515a058fb02c8c4152c9f055bb3bd462ae2Elliott Hughes pushl %eax 3722d366cc09383956dc264ed4641572e609392eeeJin Wei call __set_errno 38b6032515a058fb02c8c4152c9f055bb3bd462ae2Elliott Hughes addl $4, %esp 3922d366cc09383956dc264ed4641572e609392eeeJin Wei orl $-1, %eax 40b6032515a058fb02c8c4152c9f055bb3bd462ae2Elliott Hughes jmp bc_return 4122d366cc09383956dc264ed4641572e609392eeeJin Wei 42b6032515a058fb02c8c4152c9f055bb3bd462ae2Elliott Hughesbc_child: 4322d366cc09383956dc264ed4641572e609392eeeJin Wei call __bionic_clone_entry 4422d366cc09383956dc264ed4641572e609392eeeJin Wei hlt 4522d366cc09383956dc264ed4641572e609392eeeJin Wei 46b6032515a058fb02c8c4152c9f055bb3bd462ae2Elliott Hughesbc_parent: 47b6032515a058fb02c8c4152c9f055bb3bd462ae2Elliott Hughes # we're the parent; nothing to do. 48b6032515a058fb02c8c4152c9f055bb3bd462ae2Elliott Hughesbc_return: 4922d366cc09383956dc264ed4641572e609392eeeJin Wei popl %edi 5022d366cc09383956dc264ed4641572e609392eeeJin Wei popl %esi 5122d366cc09383956dc264ed4641572e609392eeeJin Wei popl %ebx 5222d366cc09383956dc264ed4641572e609392eeeJin Wei ret 53bdff26df2749d8d66e5d4eb5a2ecf4a9ff50fad2Elliott HughesEND(__bionic_clone) 54