superh port
[musl] / src / thread / superh / clone.s
1 .text
2 .global __clone
3 .type   __clone, @function
4 __clone:
5 ! incoming: fn stack flags arg ptid tls      ctid
6 !           r4 r5    r6    r7  @r15 @(4,r15) @(8,r15)
7
8         mov   #-16, r0
9         and   r0, r5
10
11         mov   r4, r1         ! r1 = fn
12         mov   r7, r2         ! r2 = arg
13
14         mov   #120,     r3   ! r3 = __NR_clone
15         mov   r6,       r4   ! r4 = flags
16         !mov  r5,       r5   ! r5 = stack
17         mov.l @r15,     r6   ! r6 = ptid
18         mov.l @(8,r15), r7   ! r7 = ctid
19         mov.l @(4,r15), r0   ! r0 = tls
20         trapa #21
21
22         or r0, r0
23         or r0, r0
24         or r0, r0
25         or r0, r0
26         or r0, r0
27
28         cmp/eq #0, r0
29         bt     1f
30
31         ! we are the parent, return
32         rts
33          nop
34
35 1:      ! we are the child, call fn(arg)
36         jsr    @r1
37          mov   r2, r4
38
39         mov   #1, r3   ! __NR_exit
40         mov   r0, r4
41         trapa #17
42
43         or   r0, r0
44         or   r0, r0
45         or   r0, r0
46         or   r0, r0
47         or   r0, r0