syscall_cp.s 614 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. .text
  2. .global __cp_begin
  3. .hidden __cp_begin
  4. .global __cp_end
  5. .hidden __cp_end
  6. .global __cp_cancel
  7. .hidden __cp_cancel
  8. .hidden __cancel
  9. .global __syscall_cp_asm
  10. .hidden __syscall_cp_asm
  11. .type __syscall_cp_asm, @function
  12. __syscall_cp_asm:
  13. __cp_begin:
  14. mov.l @r4, r4
  15. tst r4, r4
  16. bt 2f
  17. mov.l L1, r0
  18. braf r0
  19. nop
  20. 1:
  21. .align 2
  22. L1: .long __cancel@PLT-(1b-.)
  23. 2: mov r5, r3
  24. mov r6, r4
  25. mov r7, r5
  26. mov.l @r15, r6
  27. mov.l @(4,r15), r7
  28. mov.l @(8,r15), r0
  29. mov.l @(12,r15), r1
  30. trapa #22
  31. __cp_end:
  32. ! work around hardware bug
  33. or r0, r0
  34. or r0, r0
  35. or r0, r0
  36. or r0, r0
  37. or r0, r0
  38. rts
  39. nop