asm_linux_amd64.s 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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"
  7. //
  8. // System calls for AMD64, Linux
  9. //
  10. // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
  11. // Trap # in AX, args in DI SI DX R10 R8 R9, return in AX DX
  12. // Note that this differs from "standard" ABI convention, which
  13. // would pass 4th arg in CX, not R10.
  14. TEXT ·Syscall(SB),NOSPLIT,$0-56
  15. CALL runtime·entersyscall(SB)
  16. MOVQ 16(SP), DI
  17. MOVQ 24(SP), SI
  18. MOVQ 32(SP), DX
  19. MOVQ $0, R10
  20. MOVQ $0, R8
  21. MOVQ $0, R9
  22. MOVQ 8(SP), AX // syscall entry
  23. SYSCALL
  24. CMPQ AX, $0xfffffffffffff001
  25. JLS ok
  26. MOVQ $-1, 40(SP) // r1
  27. MOVQ $0, 48(SP) // r2
  28. NEGQ AX
  29. MOVQ AX, 56(SP) // errno
  30. CALL runtime·exitsyscall(SB)
  31. RET
  32. ok:
  33. MOVQ AX, 40(SP) // r1
  34. MOVQ DX, 48(SP) // r2
  35. MOVQ $0, 56(SP) // errno
  36. CALL runtime·exitsyscall(SB)
  37. RET
  38. TEXT ·Syscall6(SB),NOSPLIT,$0-80
  39. CALL runtime·entersyscall(SB)
  40. MOVQ 16(SP), DI
  41. MOVQ 24(SP), SI
  42. MOVQ 32(SP), DX
  43. MOVQ 40(SP), R10
  44. MOVQ 48(SP), R8
  45. MOVQ 56(SP), R9
  46. MOVQ 8(SP), AX // syscall entry
  47. SYSCALL
  48. CMPQ AX, $0xfffffffffffff001
  49. JLS ok6
  50. MOVQ $-1, 64(SP) // r1
  51. MOVQ $0, 72(SP) // r2
  52. NEGQ AX
  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 ·RawSyscall(SB),NOSPLIT,$0-56
  63. MOVQ 16(SP), DI
  64. MOVQ 24(SP), SI
  65. MOVQ 32(SP), DX
  66. MOVQ $0, R10
  67. MOVQ $0, R8
  68. MOVQ $0, R9
  69. MOVQ 8(SP), AX // syscall entry
  70. SYSCALL
  71. CMPQ AX, $0xfffffffffffff001
  72. JLS ok1
  73. MOVQ $-1, 40(SP) // r1
  74. MOVQ $0, 48(SP) // r2
  75. NEGQ AX
  76. MOVQ AX, 56(SP) // errno
  77. RET
  78. ok1:
  79. MOVQ AX, 40(SP) // r1
  80. MOVQ DX, 48(SP) // r2
  81. MOVQ $0, 56(SP) // errno
  82. RET
  83. TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
  84. MOVQ 16(SP), DI
  85. MOVQ 24(SP), SI
  86. MOVQ 32(SP), DX
  87. MOVQ 40(SP), R10
  88. MOVQ 48(SP), R8
  89. MOVQ 56(SP), R9
  90. MOVQ 8(SP), AX // syscall entry
  91. SYSCALL
  92. CMPQ AX, $0xfffffffffffff001
  93. JLS ok2
  94. MOVQ $-1, 64(SP) // r1
  95. MOVQ $0, 72(SP) // r2
  96. NEGQ AX
  97. MOVQ AX, 80(SP) // errno
  98. RET
  99. ok2:
  100. MOVQ AX, 64(SP) // r1
  101. MOVQ DX, 72(SP) // r2
  102. MOVQ $0, 80(SP) // errno
  103. RET
  104. TEXT ·gettimeofday(SB),NOSPLIT,$0-16
  105. MOVQ 8(SP), DI
  106. MOVQ $0, SI
  107. MOVQ runtime·__vdso_gettimeofday_sym(SB), AX
  108. CALL AX
  109. CMPQ AX, $0xfffffffffffff001
  110. JLS ok7
  111. NEGQ AX
  112. MOVQ AX, 16(SP) // errno
  113. RET
  114. ok7:
  115. MOVQ $0, 16(SP) // errno
  116. RET