asm_freebsd_amd64.s 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. // TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP)
  5. // so that go vet can check that they are correct.
  6. #include "textflag.h"
  7. //
  8. // System call support for AMD64, FreeBSD
  9. //
  10. // The SYSCALL variant for invoking system calls is broken in FreeBSD.
  11. // See comment at top of ../runtime/sys_freebsd_amd64.c and
  12. // golang.org/issue/6372.
  13. #define SYSCALL MOVQ R10, CX; INT $0x80
  14. // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
  15. // func Syscall6(trap int64, a1, a2, a3, a4, a5, a6 int64) (r1, r2, err int64);
  16. // func Syscall9(trap int64, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int64)
  17. // Trap # in AX, args in DI SI DX, return in AX DX
  18. TEXT ·Syscall(SB),NOSPLIT,$0-56
  19. CALL runtime·entersyscall(SB)
  20. MOVQ 16(SP), DI
  21. MOVQ 24(SP), SI
  22. MOVQ 32(SP), DX
  23. MOVQ $0, R10
  24. MOVQ $0, R8
  25. MOVQ $0, R9
  26. MOVQ 8(SP), AX // syscall entry
  27. SYSCALL
  28. JCC ok
  29. MOVQ $-1, 40(SP) // r1
  30. MOVQ $0, 48(SP) // r2
  31. MOVQ AX, 56(SP) // errno
  32. CALL runtime·exitsyscall(SB)
  33. RET
  34. ok:
  35. MOVQ AX, 40(SP) // r1
  36. MOVQ DX, 48(SP) // r2
  37. MOVQ $0, 56(SP) // errno
  38. CALL runtime·exitsyscall(SB)
  39. RET
  40. TEXT ·Syscall6(SB),NOSPLIT,$0-80
  41. CALL runtime·entersyscall(SB)
  42. MOVQ 16(SP), DI
  43. MOVQ 24(SP), SI
  44. MOVQ 32(SP), DX
  45. MOVQ 40(SP), R10
  46. MOVQ 48(SP), R8
  47. MOVQ 56(SP), R9
  48. MOVQ 8(SP), AX // syscall entry
  49. SYSCALL
  50. JCC ok6
  51. MOVQ $-1, 64(SP) // r1
  52. MOVQ $0, 72(SP) // r2
  53. MOVQ AX, 80(SP) // errno
  54. CALL runtime·exitsyscall(SB)
  55. RET
  56. ok6:
  57. MOVQ AX, 64(SP) // r1
  58. MOVQ DX, 72(SP) // r2
  59. MOVQ $0, 80(SP) // errno
  60. CALL runtime·exitsyscall(SB)
  61. RET
  62. TEXT ·Syscall9(SB),NOSPLIT,$0-104
  63. CALL runtime·entersyscall(SB)
  64. MOVQ 8(SP), AX
  65. MOVQ 16(SP), DI
  66. MOVQ 24(SP), SI
  67. MOVQ 32(SP), DX
  68. MOVQ 40(SP), R10
  69. MOVQ 48(SP), R8
  70. MOVQ 56(SP), R9
  71. // shift around the last three arguments so they're at the
  72. // top of the stack when the syscall is called.
  73. MOVQ 64(SP), R11 // arg 7
  74. MOVQ R11, 8(SP)
  75. MOVQ 72(SP), R11 // arg 8
  76. MOVQ R11, 16(SP)
  77. MOVQ 80(SP), R11 // arg 9
  78. MOVQ R11, 24(SP)
  79. SYSCALL
  80. JCC ok9
  81. MOVQ $-1, 88(SP) // r1
  82. MOVQ $0, 96(SP) // r2
  83. MOVQ AX, 104(SP) // errno
  84. CALL runtime·exitsyscall(SB)
  85. RET
  86. ok9:
  87. MOVQ AX, 88(SP) // r1
  88. MOVQ DX, 96(SP) // r2
  89. MOVQ $0, 104(SP) // errno
  90. CALL runtime·exitsyscall(SB)
  91. RET
  92. TEXT ·RawSyscall(SB),NOSPLIT,$0-56
  93. MOVQ 16(SP), DI
  94. MOVQ 24(SP), SI
  95. MOVQ 32(SP), DX
  96. MOVQ $0, R10
  97. MOVQ $0, R8
  98. MOVQ $0, R9
  99. MOVQ 8(SP), AX // syscall entry
  100. SYSCALL
  101. JCC ok1
  102. MOVQ $-1, 40(SP) // r1
  103. MOVQ $0, 48(SP) // r2
  104. MOVQ AX, 56(SP) // errno
  105. RET
  106. ok1:
  107. MOVQ AX, 40(SP) // r1
  108. MOVQ DX, 48(SP) // r2
  109. MOVQ $0, 56(SP) // errno
  110. RET
  111. TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
  112. MOVQ 16(SP), DI
  113. MOVQ 24(SP), SI
  114. MOVQ 32(SP), DX
  115. MOVQ 40(SP), R10
  116. MOVQ 48(SP), R8
  117. MOVQ 56(SP), R9
  118. MOVQ 8(SP), AX // syscall entry
  119. SYSCALL
  120. JCC ok2
  121. MOVQ $-1, 64(SP) // r1
  122. MOVQ $0, 72(SP) // r2
  123. MOVQ AX, 80(SP) // errno
  124. RET
  125. ok2:
  126. MOVQ AX, 64(SP) // r1
  127. MOVQ DX, 72(SP) // r2
  128. MOVQ $0, 80(SP) // errno
  129. RET