asm_linux_386.s 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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 386, Linux
  9. //
  10. // func Syscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
  11. // Trap # in AX, args in BX CX DX SI DI, return in AX
  12. TEXT ·Syscall(SB),NOSPLIT,$0-28
  13. CALL runtime·entersyscall(SB)
  14. MOVL 4(SP), AX // syscall entry
  15. MOVL 8(SP), BX
  16. MOVL 12(SP), CX
  17. MOVL 16(SP), DX
  18. MOVL $0, SI
  19. MOVL $0, DI
  20. CALL *runtime·_vdso(SB)
  21. CMPL AX, $0xfffff001
  22. JLS ok
  23. MOVL $-1, 20(SP) // r1
  24. MOVL $0, 24(SP) // r2
  25. NEGL AX
  26. MOVL AX, 28(SP) // errno
  27. CALL runtime·exitsyscall(SB)
  28. RET
  29. ok:
  30. MOVL AX, 20(SP) // r1
  31. MOVL DX, 24(SP) // r2
  32. MOVL $0, 28(SP) // errno
  33. CALL runtime·exitsyscall(SB)
  34. RET
  35. // func Syscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
  36. TEXT ·Syscall6(SB),NOSPLIT,$0-40
  37. CALL runtime·entersyscall(SB)
  38. MOVL 4(SP), AX // syscall entry
  39. MOVL 8(SP), BX
  40. MOVL 12(SP), CX
  41. MOVL 16(SP), DX
  42. MOVL 20(SP), SI
  43. MOVL 24(SP), DI
  44. MOVL 28(SP), BP
  45. CALL *runtime·_vdso(SB)
  46. CMPL AX, $0xfffff001
  47. JLS ok6
  48. MOVL $-1, 32(SP) // r1
  49. MOVL $0, 36(SP) // r2
  50. NEGL AX
  51. MOVL AX, 40(SP) // errno
  52. CALL runtime·exitsyscall(SB)
  53. RET
  54. ok6:
  55. MOVL AX, 32(SP) // r1
  56. MOVL DX, 36(SP) // r2
  57. MOVL $0, 40(SP) // errno
  58. CALL runtime·exitsyscall(SB)
  59. RET
  60. // func RawSyscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
  61. TEXT ·RawSyscall(SB),NOSPLIT,$0-28
  62. MOVL 4(SP), AX // syscall entry
  63. MOVL 8(SP), BX
  64. MOVL 12(SP), CX
  65. MOVL 16(SP), DX
  66. MOVL $0, SI
  67. MOVL $0, DI
  68. CALL *runtime·_vdso(SB)
  69. CMPL AX, $0xfffff001
  70. JLS ok1
  71. MOVL $-1, 20(SP) // r1
  72. MOVL $0, 24(SP) // r2
  73. NEGL AX
  74. MOVL AX, 28(SP) // errno
  75. RET
  76. ok1:
  77. MOVL AX, 20(SP) // r1
  78. MOVL DX, 24(SP) // r2
  79. MOVL $0, 28(SP) // errno
  80. RET
  81. // func RawSyscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
  82. TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
  83. MOVL 4(SP), AX // syscall entry
  84. MOVL 8(SP), BX
  85. MOVL 12(SP), CX
  86. MOVL 16(SP), DX
  87. MOVL 20(SP), SI
  88. MOVL 24(SP), DI
  89. MOVL 28(SP), BP
  90. CALL *runtime·_vdso(SB)
  91. CMPL AX, $0xfffff001
  92. JLS ok2
  93. MOVL $-1, 32(SP) // r1
  94. MOVL $0, 36(SP) // r2
  95. NEGL AX
  96. MOVL AX, 40(SP) // errno
  97. RET
  98. ok2:
  99. MOVL AX, 32(SP) // r1
  100. MOVL DX, 36(SP) // r2
  101. MOVL $0, 40(SP) // errno
  102. RET
  103. #define SYS_SOCKETCALL 102 /* from zsysnum_linux_386.go */
  104. // func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, errno int)
  105. // Kernel interface gets call sub-number and pointer to a0.
  106. TEXT ·socketcall(SB),NOSPLIT,$0-36
  107. CALL runtime·entersyscall(SB)
  108. MOVL $SYS_SOCKETCALL, AX // syscall entry
  109. MOVL 4(SP), BX // socket call number
  110. LEAL 8(SP), CX // pointer to call arguments
  111. MOVL $0, DX
  112. MOVL $0, SI
  113. MOVL $0, DI
  114. CALL *runtime·_vdso(SB)
  115. CMPL AX, $0xfffff001
  116. JLS oksock
  117. MOVL $-1, 32(SP) // n
  118. NEGL AX
  119. MOVL AX, 36(SP) // errno
  120. CALL runtime·exitsyscall(SB)
  121. RET
  122. oksock:
  123. MOVL AX, 32(SP) // n
  124. MOVL $0, 36(SP) // errno
  125. CALL runtime·exitsyscall(SB)
  126. RET
  127. // func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, errno int)
  128. // Kernel interface gets call sub-number and pointer to a0.
  129. TEXT ·rawsocketcall(SB),NOSPLIT,$0-36
  130. MOVL $SYS_SOCKETCALL, AX // syscall entry
  131. MOVL 4(SP), BX // socket call number
  132. LEAL 8(SP), CX // pointer to call arguments
  133. MOVL $0, DX
  134. MOVL $0, SI
  135. MOVL $0, DI
  136. CALL *runtime·_vdso(SB)
  137. CMPL AX, $0xfffff001
  138. JLS oksock1
  139. MOVL $-1, 32(SP) // n
  140. NEGL AX
  141. MOVL AX, 36(SP) // errno
  142. RET
  143. oksock1:
  144. MOVL AX, 32(SP) // n
  145. MOVL $0, 36(SP) // errno
  146. RET
  147. #define SYS__LLSEEK 140 /* from zsysnum_linux_386.go */
  148. // func Seek(fd int, offset int64, whence int) (newoffset int64, errno int)
  149. // Implemented in assembly to avoid allocation when
  150. // taking the address of the return value newoffset.
  151. // Underlying system call is
  152. // llseek(int fd, int offhi, int offlo, int64 *result, int whence)
  153. TEXT ·seek(SB),NOSPLIT,$0-28
  154. CALL runtime·entersyscall(SB)
  155. MOVL $SYS__LLSEEK, AX // syscall entry
  156. MOVL 4(SP), BX // fd
  157. MOVL 12(SP), CX // offset-high
  158. MOVL 8(SP), DX // offset-low
  159. LEAL 20(SP), SI // result pointer
  160. MOVL 16(SP), DI // whence
  161. CALL *runtime·_vdso(SB)
  162. CMPL AX, $0xfffff001
  163. JLS okseek
  164. MOVL $-1, 20(SP) // newoffset low
  165. MOVL $-1, 24(SP) // newoffset high
  166. NEGL AX
  167. MOVL AX, 28(SP) // errno
  168. CALL runtime·exitsyscall(SB)
  169. RET
  170. okseek:
  171. // system call filled in newoffset already
  172. MOVL $0, 28(SP) // errno
  173. CALL runtime·exitsyscall(SB)
  174. RET