clone.s raw

   1  .set	noreorder
   2  .global	__clone
   3  .hidden __clone
   4  .type	__clone,@function
   5  __clone:
   6  	# Save function pointer and argument pointer on new thread stack
   7  	and	$5, $5, -16	# aligning stack to double word
   8  	subu	$5, $5, 16
   9  	sw	$4, 0($5)	# save function pointer
  10  	sw	$7, 4($5)	# save argument pointer
  11  
  12  	# Shuffle (fn,sp,fl,arg,ptid,tls,ctid) to (fl,sp,ptid,tls,ctid)
  13  	# sys_clone(u64 flags, u64 ustack_base, u64 parent_tidptr, u64 child_tidptr, u64 tls)
  14  	move	$4, $6
  15  	move	$6, $8
  16  	move	$7, $9
  17  	move	$8, $10
  18  	li	$2, 6055
  19  	syscall
  20  	beq	$7, $0, 1f
  21  	nop
  22  	jr	$ra
  23  	subu	$2, $0, $2
  24  1:	beq	$2, $0, 1f
  25  	nop
  26  	jr	$ra
  27  	nop
  28  1:	lw	$25, 0($sp)	# function pointer
  29  	lw	$4, 4($sp)	# argument pointer
  30  	jalr	$25		# call the user's function
  31  	nop
  32  	move 	$4, $2
  33  	li	$2, 6058
  34  	syscall
  35