asm_openbsd_amd64.s 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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 "../../cmd/ld/textflag.h" // TODO: how to refer to this?
  7. //
  8. // System call support for AMD64, OpenBSD
  9. //
  10. // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
  11. // func Syscall6(trap int64, a1, a2, a3, a4, a5, a6 int64) (r1, r2, err int64);
  12. // func Syscall9(trap int64, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int64);
  13. // Trap # in AX, args in DI SI DX, return in AX DX
  14. TEXT ·Syscall(SB),NOSPLIT,$0-56
  15. CALL runtime·entersyscall(SB)
  16. MOVQ 8(SP), AX // syscall entry
  17. MOVQ 16(SP), DI
  18. MOVQ 24(SP), SI
  19. MOVQ 32(SP), DX
  20. MOVQ $0, R10
  21. MOVQ $0, R8
  22. MOVQ $0, R9
  23. SYSCALL
  24. JCC ok
  25. MOVQ $-1, 40(SP) // r1
  26. MOVQ $0, 48(SP) // r2
  27. MOVQ AX, 56(SP) // errno
  28. CALL runtime·exitsyscall(SB)
  29. RET
  30. ok:
  31. MOVQ AX, 40(SP) // r1
  32. MOVQ DX, 48(SP) // r2
  33. MOVQ $0, 56(SP) // errno
  34. CALL runtime·exitsyscall(SB)
  35. RET
  36. TEXT ·Syscall6(SB),NOSPLIT,$0-80
  37. CALL runtime·entersyscall(SB)
  38. MOVQ 8(SP), AX // syscall entry
  39. MOVQ 16(SP), DI
  40. MOVQ 24(SP), SI
  41. MOVQ 32(SP), DX
  42. MOVQ 40(SP), R10
  43. MOVQ 48(SP), R8
  44. MOVQ 56(SP), R9
  45. SYSCALL
  46. JCC ok6
  47. MOVQ $-1, 64(SP) // r1
  48. MOVQ $0, 72(SP) // r2
  49. MOVQ AX, 80(SP) // errno
  50. CALL runtime·exitsyscall(SB)
  51. RET
  52. ok6:
  53. MOVQ AX, 64(SP) // r1
  54. MOVQ DX, 72(SP) // r2
  55. MOVQ $0, 80(SP) // errno
  56. CALL runtime·exitsyscall(SB)
  57. RET
  58. TEXT ·Syscall9(SB),NOSPLIT,$0-104
  59. CALL runtime·entersyscall(SB)
  60. MOVQ 8(SP), AX // syscall entry
  61. MOVQ 16(SP), DI
  62. MOVQ 24(SP), SI
  63. MOVQ 32(SP), DX
  64. MOVQ 40(SP), R10
  65. MOVQ 48(SP), R8
  66. MOVQ 56(SP), R9
  67. MOVQ 64(SP), R11
  68. MOVQ 72(SP), R12
  69. MOVQ 80(SP), R13
  70. SUBQ $32, SP
  71. MOVQ R11, 8(SP) // arg 7
  72. MOVQ R12, 16(SP) // arg 8
  73. MOVQ R13, 24(SP) // arg 9
  74. SYSCALL
  75. JCC ok9
  76. ADDQ $32, SP
  77. MOVQ $-1, 88(SP) // r1
  78. MOVQ $0, 96(SP) // r2
  79. MOVQ AX, 104(SP) // errno
  80. CALL runtime·exitsyscall(SB)
  81. RET
  82. ok9:
  83. ADDQ $32, SP
  84. MOVQ AX, 88(SP) // r1
  85. MOVQ DX, 96(SP) // r2
  86. MOVQ $0, 104(SP) // errno
  87. CALL runtime·exitsyscall(SB)
  88. RET
  89. TEXT ·RawSyscall(SB),NOSPLIT,$0-56
  90. MOVQ 16(SP), DI
  91. MOVQ 24(SP), SI
  92. MOVQ 32(SP), DX
  93. MOVQ $0, R10
  94. MOVQ $0, R8
  95. MOVQ $0, R9
  96. MOVQ 8(SP), AX // syscall entry
  97. SYSCALL
  98. JCC ok1
  99. MOVQ $-1, 40(SP) // r1
  100. MOVQ $0, 48(SP) // r2
  101. MOVQ AX, 56(SP) // errno
  102. RET
  103. ok1:
  104. MOVQ AX, 40(SP) // r1
  105. MOVQ DX, 48(SP) // r2
  106. MOVQ $0, 56(SP) // errno
  107. RET
  108. TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
  109. MOVQ 16(SP), DI
  110. MOVQ 24(SP), SI
  111. MOVQ 32(SP), DX
  112. MOVQ 40(SP), R10
  113. MOVQ 48(SP), R8
  114. MOVQ 56(SP), R9
  115. MOVQ 8(SP), AX // syscall entry
  116. SYSCALL
  117. JCC ok2
  118. MOVQ $-1, 64(SP) // r1
  119. MOVQ $0, 72(SP) // r2
  120. MOVQ AX, 80(SP) // errno
  121. RET
  122. ok2:
  123. MOVQ AX, 64(SP) // r1
  124. MOVQ DX, 72(SP) // r2
  125. MOVQ $0, 80(SP) // errno
  126. RET