• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
361:	# 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
49