use syscall_arg_t and __scc macro for arguments to __alt_socketcall
[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