1*c9945492SAndroid Build Coastguard Worker.text 2*c9945492SAndroid Build Coastguard Worker.global __clone 3*c9945492SAndroid Build Coastguard Worker.hidden __clone 4*c9945492SAndroid Build Coastguard Worker.type __clone, %function 5*c9945492SAndroid Build Coastguard Worker__clone: 6*c9945492SAndroid Build Coastguard Worker# int clone(fn, stack, flags, arg, ptid, tls, ctid) 7*c9945492SAndroid Build Coastguard Worker# a b c d e f g 8*c9945492SAndroid Build Coastguard Worker# 3 4 5 6 7 8 9 9*c9945492SAndroid Build Coastguard Worker# pseudo C code: 10*c9945492SAndroid Build Coastguard Worker# tid = syscall(SYS_clone,c,b,e,f,g); 11*c9945492SAndroid Build Coastguard Worker# if (!tid) syscall(SYS_exit, a(d)); 12*c9945492SAndroid Build Coastguard Worker# return tid; 13*c9945492SAndroid Build Coastguard Worker 14*c9945492SAndroid Build Coastguard Worker# SYS_clone = 120 15*c9945492SAndroid Build Coastguard Worker# SYS_exit = 1 16*c9945492SAndroid Build Coastguard Worker 17*c9945492SAndroid Build Coastguard Worker# store non-volatile regs r30, r31 on stack in order to put our 18*c9945492SAndroid Build Coastguard Worker# start func and its arg there 19*c9945492SAndroid Build Coastguard Workerstwu 30, -16(1) 20*c9945492SAndroid Build Coastguard Workerstw 31, 4(1) 21*c9945492SAndroid Build Coastguard Worker 22*c9945492SAndroid Build Coastguard Worker# save r3 (func) into r30, and r6(arg) into r31 23*c9945492SAndroid Build Coastguard Workermr 30, 3 24*c9945492SAndroid Build Coastguard Workermr 31, 6 25*c9945492SAndroid Build Coastguard Worker 26*c9945492SAndroid Build Coastguard Worker# create initial stack frame for new thread 27*c9945492SAndroid Build Coastguard Workerclrrwi 4, 4, 4 28*c9945492SAndroid Build Coastguard Workerli 0, 0 29*c9945492SAndroid Build Coastguard Workerstwu 0, -16(4) 30*c9945492SAndroid Build Coastguard Worker 31*c9945492SAndroid Build Coastguard Worker#move c into first arg 32*c9945492SAndroid Build Coastguard Workermr 3, 5 33*c9945492SAndroid Build Coastguard Worker#mr 4, 4 34*c9945492SAndroid Build Coastguard Workermr 5, 7 35*c9945492SAndroid Build Coastguard Workermr 6, 8 36*c9945492SAndroid Build Coastguard Workermr 7, 9 37*c9945492SAndroid Build Coastguard Worker 38*c9945492SAndroid Build Coastguard Worker# move syscall number into r0 39*c9945492SAndroid Build Coastguard Workerli 0, 120 40*c9945492SAndroid Build Coastguard Worker 41*c9945492SAndroid Build Coastguard Workersc 42*c9945492SAndroid Build Coastguard Worker 43*c9945492SAndroid Build Coastguard Worker# check for syscall error 44*c9945492SAndroid Build Coastguard Workerbns+ 1f # jump to label 1 if no summary overflow. 45*c9945492SAndroid Build Coastguard Worker#else 46*c9945492SAndroid Build Coastguard Workerneg 3, 3 #negate the result (errno) 47*c9945492SAndroid Build Coastguard Worker1: 48*c9945492SAndroid Build Coastguard Worker# compare sc result with 0 49*c9945492SAndroid Build Coastguard Workercmpwi cr7, 3, 0 50*c9945492SAndroid Build Coastguard Worker 51*c9945492SAndroid Build Coastguard Worker# if not 0, jump to end 52*c9945492SAndroid Build Coastguard Workerbne cr7, 2f 53*c9945492SAndroid Build Coastguard Worker 54*c9945492SAndroid Build Coastguard Worker#else: we're the child 55*c9945492SAndroid Build Coastguard Worker#call funcptr: move arg (d) into r3 56*c9945492SAndroid Build Coastguard Workermr 3, 31 57*c9945492SAndroid Build Coastguard Worker#move r30 (funcptr) into CTR reg 58*c9945492SAndroid Build Coastguard Workermtctr 30 59*c9945492SAndroid Build Coastguard Worker# call CTR reg 60*c9945492SAndroid Build Coastguard Workerbctrl 61*c9945492SAndroid Build Coastguard Worker# mov SYS_exit into r0 (the exit param is already in r3) 62*c9945492SAndroid Build Coastguard Workerli 0, 1 63*c9945492SAndroid Build Coastguard Workersc 64*c9945492SAndroid Build Coastguard Worker 65*c9945492SAndroid Build Coastguard Worker2: 66*c9945492SAndroid Build Coastguard Worker 67*c9945492SAndroid Build Coastguard Worker# restore stack 68*c9945492SAndroid Build Coastguard Workerlwz 30, 0(1) 69*c9945492SAndroid Build Coastguard Workerlwz 31, 4(1) 70*c9945492SAndroid Build Coastguard Workeraddi 1, 1, 16 71*c9945492SAndroid Build Coastguard Worker 72*c9945492SAndroid Build Coastguard Workerblr 73*c9945492SAndroid Build Coastguard Worker 74