clone.S revision 3460db9490d7aee834dc05f99356e44d7549c538
1/* 2 * Copyright (C) 2008-2010 The Android Open Source Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28#include <sys/linux-syscalls.h> 29#include <machine/asm.h> 30 31ENTRY(__pthread_clone) 32 @ insert the args onto the new stack 33 stmdb r1!, {r0, r3} 34 35 @ do the system call 36 @ get flags 37 38 mov r0, r2 39 40 @ new sp is already in r1 41 42#if __ARM_EABI__ 43 stmfd sp!, {r4, r7} 44 ldr r7, =__NR_clone 45 swi #0 46#else 47 swi #__NR_clone 48#endif 49 50 movs r0, r0 51#if __ARM_EABI__ 52 ldmnefd sp!, {r4, r7} 53#endif 54 blt __error 55 bxne lr 56 57 58 @ pick the function arg and call address off the stack and jump 59 @ to the C __thread_entry function which does some setup and then 60 @ calls the thread's start function 61 62 pop {r0, r1} 63 mov r2, sp @ __thread_entry needs the TLS pointer 64 b __thread_entry 65 66__error: 67 mov r0, #-1 68 bx lr 69END(__pthread_clone) 70 71 72 # 73 # This function is defined as: 74 # 75 # pid_t __bionic_clone( int flags, void *child_stack, 76 # pid_t *pid, void *tls, pid_t *ctid, 77 # int (*fn)(void *), void* arg ); 78 # 79 # NOTE: This is not the same signature than the GLibc 80 # __clone function here !! Placing 'fn' and 'arg' 81 # at the end of the parameter list makes the 82 # implementation much simpler. 83 # 84 85ENTRY(__bionic_clone) 86 mov ip, sp 87 .save {r4, r5, r6, r7} 88 89 # save registers to parent stack 90 stmfd sp!, {r4, r5, r6, r7} 91 92 # load extra parameters 93 ldmfd ip, {r4, r5, r6} 94 95 # store 'fn' and 'arg' to the child stack 96 str r5, [r1, #-4] 97 str r6, [r1, #-8] 98 99 # system call 100 ldr r7, =__NR_clone 101 swi #0 102 movs r0, r0 103 beq 1f 104 105 # in parent, reload saved registers 106 # then either exit or error 107 # 108 ldmfd sp!, {r4, r5, r6, r7} 109 bxne lr 110 b __set_syscall_errno 111 1121: # in the child - pick arguments 113 ldr r0, [sp, #-4] 114 ldr r1, [sp, #-8] 115 b __bionic_clone_entry 116END(__bionic_clone) 117