xref: /third_party/musl/src/thread/sh/clone.s (revision 570af302)
1570af302Sopenharmony_ci.text
2570af302Sopenharmony_ci.global __clone
3570af302Sopenharmony_ci.hidden __clone
4570af302Sopenharmony_ci.type   __clone, @function
5570af302Sopenharmony_ci__clone:
6570af302Sopenharmony_ci! incoming: fn stack flags arg ptid tls      ctid
7570af302Sopenharmony_ci!           r4 r5    r6    r7  @r15 @(4,r15) @(8,r15)
8570af302Sopenharmony_ci
9570af302Sopenharmony_ci	mov   #-16, r0
10570af302Sopenharmony_ci	and   r0, r5
11570af302Sopenharmony_ci
12570af302Sopenharmony_ci	mov   r4, r1         ! r1 = fn
13570af302Sopenharmony_ci	mov   r7, r2         ! r2 = arg
14570af302Sopenharmony_ci
15570af302Sopenharmony_ci	mov   #120,     r3   ! r3 = __NR_clone
16570af302Sopenharmony_ci	mov   r6,       r4   ! r4 = flags
17570af302Sopenharmony_ci	!mov  r5,       r5   ! r5 = stack
18570af302Sopenharmony_ci	mov.l @r15,     r6   ! r6 = ptid
19570af302Sopenharmony_ci	mov.l @(8,r15), r7   ! r7 = ctid
20570af302Sopenharmony_ci	mov.l @(4,r15), r0   ! r0 = tls
21570af302Sopenharmony_ci	trapa #31
22570af302Sopenharmony_ci
23570af302Sopenharmony_ci	or r0, r0
24570af302Sopenharmony_ci	or r0, r0
25570af302Sopenharmony_ci	or r0, r0
26570af302Sopenharmony_ci	or r0, r0
27570af302Sopenharmony_ci	or r0, r0
28570af302Sopenharmony_ci
29570af302Sopenharmony_ci	cmp/eq #0, r0
30570af302Sopenharmony_ci	bt     1f
31570af302Sopenharmony_ci
32570af302Sopenharmony_ci	! we are the parent, return
33570af302Sopenharmony_ci	rts
34570af302Sopenharmony_ci	 nop
35570af302Sopenharmony_ci
36570af302Sopenharmony_ci1:	! we are the child, call fn(arg)
37570af302Sopenharmony_ci	mov.l  1f, r0
38570af302Sopenharmony_ci	mov    r1, r5
39570af302Sopenharmony_ci	bsrf   r0
40570af302Sopenharmony_ci	 mov    r2, r4
41570af302Sopenharmony_ci
42570af302Sopenharmony_ci2:	mov   #1, r3   ! __NR_exit
43570af302Sopenharmony_ci	mov   r0, r4
44570af302Sopenharmony_ci	trapa #31
45570af302Sopenharmony_ci
46570af302Sopenharmony_ci	or   r0, r0
47570af302Sopenharmony_ci	or   r0, r0
48570af302Sopenharmony_ci	or   r0, r0
49570af302Sopenharmony_ci	or   r0, r0
50570af302Sopenharmony_ci	or   r0, r0
51570af302Sopenharmony_ci
52570af302Sopenharmony_ci.align 2
53570af302Sopenharmony_ci.hidden __shcall
54570af302Sopenharmony_ci1:	.long __shcall@PCREL+(.-2b)
55