xref: /aosp_15_r20/external/musl/src/thread/powerpc/clone.s (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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