clone.s 648 B

12345678910111213141516171819202122232425262728293031323334
  1. /* int clone(fn, stack, flags, arg, ptid, tls, ctid)
  2. * r3 r4 r5 r6 sp+0 sp+4 sp+8
  3. * sys_clone(flags, stack, ptid, ctid, tls)
  4. */
  5. .global __clone
  6. .hidden __clone
  7. .type __clone,@function
  8. __clone:
  9. l.xori r11, r0, -4
  10. l.and r4, r4, r11
  11. l.addi r4, r4, -8
  12. l.sw 0(r4), r3
  13. l.sw 4(r4), r6
  14. /* (fn, st, fl, ar, pt, tl, ct) => (fl, st, pt, ct, tl) */
  15. l.ori r3, r5, 0
  16. l.lwz r5, 0(r1)
  17. l.lwz r6, 8(r1)
  18. l.lwz r7, 4(r1)
  19. l.ori r11, r0, 220 /* __NR_clone */
  20. l.sys 1
  21. l.sfeqi r11, 0
  22. l.bf 1f
  23. l.nop
  24. l.jr r9
  25. l.nop
  26. 1: l.ori r2, r0, 0
  27. l.lwz r11, 0(r1)
  28. l.jalr r11
  29. l.lwz r3, 4(r1)
  30. l.ori r11, r0, 93 /* __NR_exit */
  31. l.sys 1