clone.s raw

   1  .text
   2  .global __clone
   3  .hidden __clone
   4  .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
  21  	trapa #31
  22  
  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  
  36  1:	! we are the child, call fn(arg)
  37  	mov.l  1f, r0
  38  	mov    r1, r5
  39  	bsrf   r0
  40  	 mov    r2, r4
  41  
  42  2:	mov   #1, r3   ! __NR_exit
  43  	mov   r0, r4
  44  	trapa #31
  45  
  46  	or   r0, r0
  47  	or   r0, r0
  48  	or   r0, r0
  49  	or   r0, r0
  50  	or   r0, r0
  51  
  52  .align 2
  53  .hidden __shcall
  54  1:	.long __shcall@PCREL+(.-2b)
  55