asm_openbsd_386.s 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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 386, OpenBSD
  9. //
  10. // func Syscall(trap int32, a1, a2, a3 int32) (r1, r2, err int32);
  11. // func Syscall6(trap int32, a1, a2, a3, a4, a5, a6 int32) (r1, r2, err int32);
  12. // Trap # in AX, args on stack above caller pc.
  13. TEXT ·Syscall(SB),NOSPLIT,$0-28
  14. CALL runtime·entersyscall(SB)
  15. MOVL 4(SP), AX // syscall entry
  16. // slide args down on top of system call number
  17. LEAL 8(SP), SI
  18. LEAL 4(SP), DI
  19. CLD
  20. MOVSL
  21. MOVSL
  22. MOVSL
  23. INT $0x80
  24. JAE ok
  25. MOVL $-1, 20(SP) // r1
  26. MOVL $-1, 24(SP) // r2
  27. MOVL AX, 28(SP) // errno
  28. CALL runtime·exitsyscall(SB)
  29. RET
  30. ok:
  31. MOVL AX, 20(SP) // r1
  32. MOVL DX, 24(SP) // r2
  33. MOVL $0, 28(SP) // errno
  34. CALL runtime·exitsyscall(SB)
  35. RET
  36. TEXT ·Syscall6(SB),NOSPLIT,$0-40
  37. CALL runtime·entersyscall(SB)
  38. MOVL 4(SP), AX // syscall entry
  39. // slide args down on top of system call number
  40. LEAL 8(SP), SI
  41. LEAL 4(SP), DI
  42. CLD
  43. MOVSL
  44. MOVSL
  45. MOVSL
  46. MOVSL
  47. MOVSL
  48. MOVSL
  49. INT $0x80
  50. JAE ok6
  51. MOVL $-1, 32(SP) // r1
  52. MOVL $-1, 36(SP) // r2
  53. MOVL AX, 40(SP) // errno
  54. CALL runtime·exitsyscall(SB)
  55. RET
  56. ok6:
  57. MOVL AX, 32(SP) // r1
  58. MOVL DX, 36(SP) // r2
  59. MOVL $0, 40(SP) // errno
  60. CALL runtime·exitsyscall(SB)
  61. RET
  62. TEXT ·Syscall9(SB),NOSPLIT,$0-52
  63. CALL runtime·entersyscall(SB)
  64. MOVL 4(SP), AX // syscall entry
  65. // slide args down on top of system call number
  66. LEAL 8(SP), SI
  67. LEAL 4(SP), DI
  68. CLD
  69. MOVSL
  70. MOVSL
  71. MOVSL
  72. MOVSL
  73. MOVSL
  74. MOVSL
  75. MOVSL
  76. MOVSL
  77. MOVSL
  78. INT $0x80
  79. JAE ok9
  80. MOVL $-1, 44(SP) // r1
  81. MOVL $-1, 48(SP) // r2
  82. MOVL AX, 52(SP) // errno
  83. CALL runtime·exitsyscall(SB)
  84. RET
  85. ok9:
  86. MOVL AX, 44(SP) // r1
  87. MOVL DX, 48(SP) // r2
  88. MOVL $0, 52(SP) // errno
  89. CALL runtime·exitsyscall(SB)
  90. RET
  91. TEXT ·RawSyscall(SB),NOSPLIT,$0-28
  92. MOVL 4(SP), AX // syscall entry
  93. // slide args down on top of system call number
  94. LEAL 8(SP), SI
  95. LEAL 4(SP), DI
  96. CLD
  97. MOVSL
  98. MOVSL
  99. MOVSL
  100. INT $0x80
  101. JAE ok1
  102. MOVL $-1, 20(SP) // r1
  103. MOVL $-1, 24(SP) // r2
  104. MOVL AX, 28(SP) // errno
  105. RET
  106. ok1:
  107. MOVL AX, 20(SP) // r1
  108. MOVL DX, 24(SP) // r2
  109. MOVL $0, 28(SP) // errno
  110. RET
  111. TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
  112. MOVL 4(SP), AX // syscall entry
  113. // slide args down on top of system call number
  114. LEAL 8(SP), SI
  115. LEAL 4(SP), DI
  116. CLD
  117. MOVSL
  118. MOVSL
  119. MOVSL
  120. MOVSL
  121. MOVSL
  122. MOVSL
  123. INT $0x80
  124. JAE ok2
  125. MOVL $-1, 32(SP) // r1
  126. MOVL $-1, 36(SP) // r2
  127. MOVL AX, 40(SP) // errno
  128. RET
  129. ok2:
  130. MOVL AX, 32(SP) // r1
  131. MOVL DX, 36(SP) // r2
  132. MOVL $0, 40(SP) // errno
  133. RET