]> git.proxmox.com Git - wasi-libc.git/blob - libc-top-half/musl/src/thread/powerpc64/clone.s
WASI libc prototype implementation.
[wasi-libc.git] / libc-top-half / musl / src / thread / powerpc64 / clone.s
1 .text
2 .global __clone
3 .hidden __clone
4 .type __clone, %function
5 __clone:
6 # int clone(fn, stack, flags, arg, ptid, tls, ctid)
7 # a b c d e f g
8 # 3 4 5 6 7 8 9
9 # pseudo C code:
10 # tid = syscall(SYS_clone,c,b,e,f,g);
11 # if (!tid) syscall(SYS_exit, a(d));
12 # return tid;
13
14 # create initial stack frame for new thread
15 clrrdi 4, 4, 4
16 li 0, 0
17 stdu 0,-32(4)
18
19 # save fn and arg to child stack
20 std 3, 8(4)
21 std 6, 16(4)
22
23 # shuffle args into correct registers and call SYS_clone
24 mr 3, 5
25 #mr 4, 4
26 mr 5, 7
27 mr 6, 8
28 mr 7, 9
29 li 0, 120 # SYS_clone = 120
30 sc
31
32 # if error, negate return (errno)
33 bns+ 1f
34 neg 3, 3
35
36 1: # if we're the parent, return
37 cmpwi cr7, 3, 0
38 bnelr cr7
39
40 # we're the child. call fn(arg)
41 ld 3, 16(1)
42 ld 12, 8(1)
43 mtctr 12
44 bctrl
45
46 # call SYS_exit. exit code is already in r3 from fn return value
47 li 0, 1 # SYS_exit = 1
48 sc