asm_dragonfly_amd64.s 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright 2009 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. #include "textflag.h"
  5. //
  6. // System call support for AMD64, DragonFly
  7. //
  8. // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
  9. // func Syscall6(trap int64, a1, a2, a3, a4, a5, a6 int64) (r1, r2, err int64);
  10. // func Syscall9(trap int64, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int64)
  11. // Trap # in AX, args in DI SI DX, return in AX DX
  12. TEXT ·Syscall(SB),NOSPLIT,$0-64
  13. CALL runtime·entersyscall(SB)
  14. MOVQ 16(SP), DI
  15. MOVQ 24(SP), SI
  16. MOVQ 32(SP), DX
  17. MOVQ $0, R10
  18. MOVQ $0, R8
  19. MOVQ $0, R9
  20. MOVQ 8(SP), AX // syscall entry
  21. SYSCALL
  22. JCC ok
  23. MOVQ $-1, 40(SP) // r1
  24. MOVQ $0, 48(SP) // r2
  25. MOVQ AX, 56(SP) // errno
  26. CALL runtime·exitsyscall(SB)
  27. RET
  28. ok:
  29. MOVQ AX, 40(SP) // r1
  30. MOVQ DX, 48(SP) // r2
  31. MOVQ $0, 56(SP) // errno
  32. CALL runtime·exitsyscall(SB)
  33. RET
  34. TEXT ·Syscall6(SB),NOSPLIT,$0-88
  35. CALL runtime·entersyscall(SB)
  36. MOVQ 16(SP), DI
  37. MOVQ 24(SP), SI
  38. MOVQ 32(SP), DX
  39. MOVQ 40(SP), R10
  40. MOVQ 48(SP), R8
  41. MOVQ 56(SP), R9
  42. MOVQ 8(SP), AX // syscall entry
  43. SYSCALL
  44. JCC ok6
  45. MOVQ $-1, 64(SP) // r1
  46. MOVQ $0, 72(SP) // r2
  47. MOVQ AX, 80(SP) // errno
  48. CALL runtime·exitsyscall(SB)
  49. RET
  50. ok6:
  51. MOVQ AX, 64(SP) // r1
  52. MOVQ DX, 72(SP) // r2
  53. MOVQ $0, 80(SP) // errno
  54. CALL runtime·exitsyscall(SB)
  55. RET
  56. TEXT ·Syscall9(SB),NOSPLIT,$0-112
  57. CALL runtime·entersyscall(SB)
  58. MOVQ 8(SP), AX
  59. MOVQ 16(SP), DI
  60. MOVQ 24(SP), SI
  61. MOVQ 32(SP), DX
  62. MOVQ 40(SP), R10
  63. MOVQ 48(SP), R8
  64. MOVQ 56(SP), R9
  65. // shift around the last three arguments so they're at the
  66. // top of the stack when the syscall is called.
  67. MOVQ 64(SP), R11 // arg 7
  68. MOVQ R11, 8(SP)
  69. MOVQ 72(SP), R11 // arg 8
  70. MOVQ R11, 16(SP)
  71. MOVQ 80(SP), R11 // arg 9
  72. MOVQ R11, 24(SP)
  73. SYSCALL
  74. JCC ok9
  75. MOVQ $-1, 88(SP) // r1
  76. MOVQ $0, 96(SP) // r2
  77. MOVQ AX, 104(SP) // errno
  78. CALL runtime·exitsyscall(SB)
  79. RET
  80. ok9:
  81. MOVQ AX, 88(SP) // r1
  82. MOVQ DX, 96(SP) // r2
  83. MOVQ $0, 104(SP) // errno
  84. CALL runtime·exitsyscall(SB)
  85. RET
  86. TEXT ·RawSyscall(SB),NOSPLIT,$0-64
  87. MOVQ 16(SP), DI
  88. MOVQ 24(SP), SI
  89. MOVQ 32(SP), DX
  90. MOVQ $0, R10
  91. MOVQ $0, R8
  92. MOVQ $0, R9
  93. MOVQ 8(SP), AX // syscall entry
  94. SYSCALL
  95. JCC ok1
  96. MOVQ $-1, 40(SP) // r1
  97. MOVQ $0, 48(SP) // r2
  98. MOVQ AX, 56(SP) // errno
  99. RET
  100. ok1:
  101. MOVQ AX, 40(SP) // r1
  102. MOVQ DX, 48(SP) // r2
  103. MOVQ $0, 56(SP) // errno
  104. RET
  105. TEXT ·RawSyscall6(SB),NOSPLIT,$0-88
  106. MOVQ 16(SP), DI
  107. MOVQ 24(SP), SI
  108. MOVQ 32(SP), DX
  109. MOVQ 40(SP), R10
  110. MOVQ 48(SP), R8
  111. MOVQ 56(SP), R9
  112. MOVQ 8(SP), AX // syscall entry
  113. SYSCALL
  114. JCC ok2
  115. MOVQ $-1, 64(SP) // r1
  116. MOVQ $0, 72(SP) // r2
  117. MOVQ AX, 80(SP) // errno
  118. RET
  119. ok2:
  120. MOVQ AX, 64(SP) // r1
  121. MOVQ DX, 72(SP) // r2
  122. MOVQ $0, 80(SP) // errno
  123. RET