syscall_cp.s 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. .set noreorder
  2. .global __cp_begin
  3. .hidden __cp_begin
  4. .type __cp_begin,@function
  5. .global __cp_end
  6. .hidden __cp_end
  7. .type __cp_end,@function
  8. .global __cp_cancel
  9. .hidden __cp_cancel
  10. .type __cp_cancel,@function
  11. .global __cp_cancel_data
  12. .hidden __cp_cancel_data
  13. .type __cp_cancel_data,@function
  14. .hidden __cancel
  15. .global __syscall_cp_asm
  16. .hidden __syscall_cp_asm
  17. .type __syscall_cp_asm,@function
  18. __syscall_cp_asm:
  19. subu $sp, $sp, 32
  20. __cp_begin:
  21. lw $4, 0($4)
  22. bne $4, $0, __cp_cancel
  23. move $2, $5
  24. move $4, $6
  25. move $5, $7
  26. lw $6, 48($sp)
  27. lw $7, 52($sp)
  28. lw $8, 56($sp)
  29. lw $9, 60($sp)
  30. lw $10,64($sp)
  31. sw $8, 16($sp)
  32. sw $9, 20($sp)
  33. sw $10,24($sp)
  34. sw $2, 28($sp)
  35. lw $2, 28($sp)
  36. syscall
  37. __cp_end:
  38. beq $7, $0, 1f
  39. addu $sp, $sp, 32
  40. subu $2, $0, $2
  41. 1: jr $ra
  42. nop
  43. __cp_cancel:
  44. move $2, $ra
  45. bal 1f
  46. addu $sp, $sp, 32
  47. __cp_cancel_data:
  48. .gpword __cp_cancel_data
  49. .gpword __cancel
  50. 1: lw $3, ($ra)
  51. subu $3, $ra, $3
  52. lw $25, 4($ra)
  53. addu $25, $25, $3
  54. jr $25
  55. move $ra, $2