blob: 9cfd8623c5d3cf1d5b9bc83d33a32a713f2e6d0a [file] [log] [blame]
Bobby Bingham3a3c8132013-10-05 05:13:18 -05001.text
2.global __clone
Rich Felkerf5f76732018-09-10 15:36:33 -04003.hidden __clone
Bobby Bingham3a3c8132013-10-05 05:13:18 -05004.type __clone, @function
5__clone:
6! incoming: fn stack flags arg ptid tls ctid
7! r4 r5 r6 r7 @r15 @(4,r15) @(8,r15)
8
9 mov #-16, r0
10 and r0, r5
11
12 mov r4, r1 ! r1 = fn
13 mov r7, r2 ! r2 = arg
14
15 mov #120, r3 ! r3 = __NR_clone
16 mov r6, r4 ! r4 = flags
17 !mov r5, r5 ! r5 = stack
18 mov.l @r15, r6 ! r6 = ptid
19 mov.l @(8,r15), r7 ! r7 = ctid
20 mov.l @(4,r15), r0 ! r0 = tls
Rich Felker10d02682015-06-16 15:25:02 +000021 trapa #31
Bobby Bingham3a3c8132013-10-05 05:13:18 -050022
23 or r0, r0
24 or r0, r0
25 or r0, r0
26 or r0, r0
27 or r0, r0
28
29 cmp/eq #0, r0
30 bt 1f
31
32 ! we are the parent, return
33 rts
34 nop
35
361: ! we are the child, call fn(arg)
Rich Felker234c5842015-09-12 02:55:28 +000037 mov.l 1f, r0
38 mov r1, r5
39 bsrf r0
40 mov r2, r4
Bobby Bingham3a3c8132013-10-05 05:13:18 -050041
Rich Felker234c5842015-09-12 02:55:28 +0000422: mov #1, r3 ! __NR_exit
Bobby Bingham3a3c8132013-10-05 05:13:18 -050043 mov r0, r4
Rich Felker10d02682015-06-16 15:25:02 +000044 trapa #31
Bobby Bingham3a3c8132013-10-05 05:13:18 -050045
46 or r0, r0
47 or r0, r0
48 or r0, r0
49 or r0, r0
50 or r0, r0
Rich Felker234c5842015-09-12 02:55:28 +000051
52.align 2
53.hidden __shcall
541: .long __shcall@PCREL+(.-2b)