asm_freebsd_arm.s 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // Copyright 2012 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. #include "../../cmd/ld/textflag.h"
  5. //
  6. // System call support for ARM, FreeBSD
  7. //
  8. // func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, errno uintptr);
  9. // func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr);
  10. // func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, errno uintptr)
  11. TEXT ·Syscall(SB),NOSPLIT,$0-28
  12. BL runtime·entersyscall(SB)
  13. MOVW 0(FP), R7 // syscall number
  14. MOVW 4(FP), R0 // a1
  15. MOVW 8(FP), R1 // a2
  16. MOVW 12(FP), R2 // a3
  17. SWI $0 // syscall
  18. MOVW $0, R2
  19. BCS error
  20. MOVW R0, 16(FP) // r1
  21. MOVW R1, 20(FP) // r2
  22. MOVW R2, 24(FP) // errno
  23. BL runtime·exitsyscall(SB)
  24. RET
  25. error:
  26. MOVW $-1, R3
  27. MOVW R3, 16(FP) // r1
  28. MOVW R2, 20(FP) // r2
  29. MOVW R0, 24(FP) // errno
  30. BL runtime·exitsyscall(SB)
  31. RET
  32. TEXT ·Syscall6(SB),NOSPLIT,$0-40
  33. BL runtime·entersyscall(SB)
  34. MOVW 0(FP), R7 // syscall number
  35. MOVW 4(FP), R0 // a1
  36. MOVW 8(FP), R1 // a2
  37. MOVW 12(FP), R2 // a3
  38. MOVW 16(FP), R3 // a4
  39. MOVW R13, R4
  40. MOVW $20(FP), R13 // a5 to a6 are passed on stack
  41. SWI $0 // syscall
  42. MOVW R4, R13
  43. MOVW $0, R2
  44. BCS error6
  45. MOVW R0, 28(FP) // r1
  46. MOVW R1, 32(FP) // r2
  47. MOVW R2, 36(FP) // errno
  48. BL runtime·exitsyscall(SB)
  49. RET
  50. error6:
  51. MOVW $-1, R3
  52. MOVW R3, 28(FP) // r1
  53. MOVW R2, 32(FP) // r2
  54. MOVW R0, 36(FP) // errno
  55. BL runtime·exitsyscall(SB)
  56. RET
  57. TEXT ·Syscall9(SB),NOSPLIT,$0-52
  58. BL runtime·entersyscall(SB)
  59. MOVW 0(FP), R7 // syscall number
  60. MOVW 4(FP), R0 // a1
  61. MOVW 8(FP), R1 // a2
  62. MOVW 12(FP), R2 // a3
  63. MOVW 16(FP), R3 // a4
  64. MOVW R13, R4
  65. MOVW $20(FP), R13 // a5 to a9 are passed on stack
  66. SWI $0 // syscall
  67. MOVW R4, R13
  68. MOVW $0, R2
  69. BCS error9
  70. MOVW R0, 40(FP) // r1
  71. MOVW R1, 44(FP) // r2
  72. MOVW R2, 48(FP) // errno
  73. BL runtime·exitsyscall(SB)
  74. RET
  75. error9:
  76. MOVW $-1, R3
  77. MOVW R3, 40(FP) // r1
  78. MOVW R2, 44(FP) // r2
  79. MOVW R0, 48(FP) // errno
  80. BL runtime·exitsyscall(SB)
  81. RET
  82. TEXT ·RawSyscall(SB),NOSPLIT,$0-28
  83. MOVW 0(FP), R7 // syscall number
  84. MOVW 4(FP), R0 // a1
  85. MOVW 8(FP), R1 // a2
  86. MOVW 12(FP), R2 // a3
  87. SWI $0 // syscall
  88. MOVW $0, R2
  89. BCS errorr
  90. MOVW R0, 16(FP) // r1
  91. MOVW R1, 20(FP) // r2
  92. MOVW R2, 24(FP) // errno
  93. RET
  94. errorr:
  95. MOVW $-1, R3
  96. MOVW R3, 16(FP) // r1
  97. MOVW R2, 20(FP) // r2
  98. MOVW R0, 24(FP) // errno
  99. RET
  100. TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
  101. MOVW 0(FP), R7 // syscall number
  102. MOVW 4(FP), R0 // a1
  103. MOVW 8(FP), R1 // a2
  104. MOVW 12(FP), R2 // a3
  105. MOVW 16(FP), R3 // a4
  106. MOVW R13, R4
  107. MOVW $20(FP), R13 // a5 to a6 are passed on stack
  108. SWI $0 // syscall
  109. MOVW R4, R13
  110. MOVW $0, R2
  111. BCS errorr6
  112. MOVW R0, 28(FP) // r1
  113. MOVW R1, 32(FP) // r2
  114. MOVW R2, 36(FP) // errno
  115. RET
  116. errorr6:
  117. MOVW $-1, R3
  118. MOVW R3, 28(FP) // r1
  119. MOVW R2, 32(FP) // r2
  120. MOVW R0, 36(FP) // errno
  121. RET