You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

asm_zos_s390x.s 8.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. // Copyright 2020 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. //go:build zos && s390x && gc
  5. #include "textflag.h"
  6. #define PSALAA 1208(R0)
  7. #define GTAB64(x) 80(x)
  8. #define LCA64(x) 88(x)
  9. #define CAA(x) 8(x)
  10. #define EDCHPXV(x) 1016(x) // in the CAA
  11. #define SAVSTACK_ASYNC(x) 336(x) // in the LCA
  12. // SS_*, where x=SAVSTACK_ASYNC
  13. #define SS_LE(x) 0(x)
  14. #define SS_GO(x) 8(x)
  15. #define SS_ERRNO(x) 16(x)
  16. #define SS_ERRNOJR(x) 20(x)
  17. #define LE_CALL BYTE $0x0D; BYTE $0x76; // BL R7, R6
  18. TEXT ·clearErrno(SB),NOSPLIT,$0-0
  19. BL addrerrno<>(SB)
  20. MOVD $0, 0(R3)
  21. RET
  22. // Returns the address of errno in R3.
  23. TEXT addrerrno<>(SB),NOSPLIT|NOFRAME,$0-0
  24. // Get library control area (LCA).
  25. MOVW PSALAA, R8
  26. MOVD LCA64(R8), R8
  27. // Get __errno FuncDesc.
  28. MOVD CAA(R8), R9
  29. MOVD EDCHPXV(R9), R9
  30. ADD $(0x156*16), R9
  31. LMG 0(R9), R5, R6
  32. // Switch to saved LE stack.
  33. MOVD SAVSTACK_ASYNC(R8), R9
  34. MOVD 0(R9), R4
  35. MOVD $0, 0(R9)
  36. // Call __errno function.
  37. LE_CALL
  38. NOPH
  39. // Switch back to Go stack.
  40. XOR R0, R0 // Restore R0 to $0.
  41. MOVD R4, 0(R9) // Save stack pointer.
  42. RET
  43. TEXT ·syscall_syscall(SB),NOSPLIT,$0-56
  44. BL runtime·entersyscall(SB)
  45. MOVD a1+8(FP), R1
  46. MOVD a2+16(FP), R2
  47. MOVD a3+24(FP), R3
  48. // Get library control area (LCA).
  49. MOVW PSALAA, R8
  50. MOVD LCA64(R8), R8
  51. // Get function.
  52. MOVD CAA(R8), R9
  53. MOVD EDCHPXV(R9), R9
  54. MOVD trap+0(FP), R5
  55. SLD $4, R5
  56. ADD R5, R9
  57. LMG 0(R9), R5, R6
  58. // Restore LE stack.
  59. MOVD SAVSTACK_ASYNC(R8), R9
  60. MOVD 0(R9), R4
  61. MOVD $0, 0(R9)
  62. // Call function.
  63. LE_CALL
  64. NOPH
  65. XOR R0, R0 // Restore R0 to $0.
  66. MOVD R4, 0(R9) // Save stack pointer.
  67. MOVD R3, r1+32(FP)
  68. MOVD R0, r2+40(FP)
  69. MOVD R0, err+48(FP)
  70. MOVW R3, R4
  71. CMP R4, $-1
  72. BNE done
  73. BL addrerrno<>(SB)
  74. MOVWZ 0(R3), R3
  75. MOVD R3, err+48(FP)
  76. done:
  77. BL runtime·exitsyscall(SB)
  78. RET
  79. TEXT ·syscall_rawsyscall(SB),NOSPLIT,$0-56
  80. MOVD a1+8(FP), R1
  81. MOVD a2+16(FP), R2
  82. MOVD a3+24(FP), R3
  83. // Get library control area (LCA).
  84. MOVW PSALAA, R8
  85. MOVD LCA64(R8), R8
  86. // Get function.
  87. MOVD CAA(R8), R9
  88. MOVD EDCHPXV(R9), R9
  89. MOVD trap+0(FP), R5
  90. SLD $4, R5
  91. ADD R5, R9
  92. LMG 0(R9), R5, R6
  93. // Restore LE stack.
  94. MOVD SAVSTACK_ASYNC(R8), R9
  95. MOVD 0(R9), R4
  96. MOVD $0, 0(R9)
  97. // Call function.
  98. LE_CALL
  99. NOPH
  100. XOR R0, R0 // Restore R0 to $0.
  101. MOVD R4, 0(R9) // Save stack pointer.
  102. MOVD R3, r1+32(FP)
  103. MOVD R0, r2+40(FP)
  104. MOVD R0, err+48(FP)
  105. MOVW R3, R4
  106. CMP R4, $-1
  107. BNE done
  108. BL addrerrno<>(SB)
  109. MOVWZ 0(R3), R3
  110. MOVD R3, err+48(FP)
  111. done:
  112. RET
  113. TEXT ·syscall_syscall6(SB),NOSPLIT,$0-80
  114. BL runtime·entersyscall(SB)
  115. MOVD a1+8(FP), R1
  116. MOVD a2+16(FP), R2
  117. MOVD a3+24(FP), R3
  118. // Get library control area (LCA).
  119. MOVW PSALAA, R8
  120. MOVD LCA64(R8), R8
  121. // Get function.
  122. MOVD CAA(R8), R9
  123. MOVD EDCHPXV(R9), R9
  124. MOVD trap+0(FP), R5
  125. SLD $4, R5
  126. ADD R5, R9
  127. LMG 0(R9), R5, R6
  128. // Restore LE stack.
  129. MOVD SAVSTACK_ASYNC(R8), R9
  130. MOVD 0(R9), R4
  131. MOVD $0, 0(R9)
  132. // Fill in parameter list.
  133. MOVD a4+32(FP), R12
  134. MOVD R12, (2176+24)(R4)
  135. MOVD a5+40(FP), R12
  136. MOVD R12, (2176+32)(R4)
  137. MOVD a6+48(FP), R12
  138. MOVD R12, (2176+40)(R4)
  139. // Call function.
  140. LE_CALL
  141. NOPH
  142. XOR R0, R0 // Restore R0 to $0.
  143. MOVD R4, 0(R9) // Save stack pointer.
  144. MOVD R3, r1+56(FP)
  145. MOVD R0, r2+64(FP)
  146. MOVD R0, err+72(FP)
  147. MOVW R3, R4
  148. CMP R4, $-1
  149. BNE done
  150. BL addrerrno<>(SB)
  151. MOVWZ 0(R3), R3
  152. MOVD R3, err+72(FP)
  153. done:
  154. BL runtime·exitsyscall(SB)
  155. RET
  156. TEXT ·syscall_rawsyscall6(SB),NOSPLIT,$0-80
  157. MOVD a1+8(FP), R1
  158. MOVD a2+16(FP), R2
  159. MOVD a3+24(FP), R3
  160. // Get library control area (LCA).
  161. MOVW PSALAA, R8
  162. MOVD LCA64(R8), R8
  163. // Get function.
  164. MOVD CAA(R8), R9
  165. MOVD EDCHPXV(R9), R9
  166. MOVD trap+0(FP), R5
  167. SLD $4, R5
  168. ADD R5, R9
  169. LMG 0(R9), R5, R6
  170. // Restore LE stack.
  171. MOVD SAVSTACK_ASYNC(R8), R9
  172. MOVD 0(R9), R4
  173. MOVD $0, 0(R9)
  174. // Fill in parameter list.
  175. MOVD a4+32(FP), R12
  176. MOVD R12, (2176+24)(R4)
  177. MOVD a5+40(FP), R12
  178. MOVD R12, (2176+32)(R4)
  179. MOVD a6+48(FP), R12
  180. MOVD R12, (2176+40)(R4)
  181. // Call function.
  182. LE_CALL
  183. NOPH
  184. XOR R0, R0 // Restore R0 to $0.
  185. MOVD R4, 0(R9) // Save stack pointer.
  186. MOVD R3, r1+56(FP)
  187. MOVD R0, r2+64(FP)
  188. MOVD R0, err+72(FP)
  189. MOVW R3, R4
  190. CMP R4, $-1
  191. BNE done
  192. BL ·rrno<>(SB)
  193. MOVWZ 0(R3), R3
  194. MOVD R3, err+72(FP)
  195. done:
  196. RET
  197. TEXT ·syscall_syscall9(SB),NOSPLIT,$0
  198. BL runtime·entersyscall(SB)
  199. MOVD a1+8(FP), R1
  200. MOVD a2+16(FP), R2
  201. MOVD a3+24(FP), R3
  202. // Get library control area (LCA).
  203. MOVW PSALAA, R8
  204. MOVD LCA64(R8), R8
  205. // Get function.
  206. MOVD CAA(R8), R9
  207. MOVD EDCHPXV(R9), R9
  208. MOVD trap+0(FP), R5
  209. SLD $4, R5
  210. ADD R5, R9
  211. LMG 0(R9), R5, R6
  212. // Restore LE stack.
  213. MOVD SAVSTACK_ASYNC(R8), R9
  214. MOVD 0(R9), R4
  215. MOVD $0, 0(R9)
  216. // Fill in parameter list.
  217. MOVD a4+32(FP), R12
  218. MOVD R12, (2176+24)(R4)
  219. MOVD a5+40(FP), R12
  220. MOVD R12, (2176+32)(R4)
  221. MOVD a6+48(FP), R12
  222. MOVD R12, (2176+40)(R4)
  223. MOVD a7+56(FP), R12
  224. MOVD R12, (2176+48)(R4)
  225. MOVD a8+64(FP), R12
  226. MOVD R12, (2176+56)(R4)
  227. MOVD a9+72(FP), R12
  228. MOVD R12, (2176+64)(R4)
  229. // Call function.
  230. LE_CALL
  231. NOPH
  232. XOR R0, R0 // Restore R0 to $0.
  233. MOVD R4, 0(R9) // Save stack pointer.
  234. MOVD R3, r1+80(FP)
  235. MOVD R0, r2+88(FP)
  236. MOVD R0, err+96(FP)
  237. MOVW R3, R4
  238. CMP R4, $-1
  239. BNE done
  240. BL addrerrno<>(SB)
  241. MOVWZ 0(R3), R3
  242. MOVD R3, err+96(FP)
  243. done:
  244. BL runtime·exitsyscall(SB)
  245. RET
  246. TEXT ·syscall_rawsyscall9(SB),NOSPLIT,$0
  247. MOVD a1+8(FP), R1
  248. MOVD a2+16(FP), R2
  249. MOVD a3+24(FP), R3
  250. // Get library control area (LCA).
  251. MOVW PSALAA, R8
  252. MOVD LCA64(R8), R8
  253. // Get function.
  254. MOVD CAA(R8), R9
  255. MOVD EDCHPXV(R9), R9
  256. MOVD trap+0(FP), R5
  257. SLD $4, R5
  258. ADD R5, R9
  259. LMG 0(R9), R5, R6
  260. // Restore LE stack.
  261. MOVD SAVSTACK_ASYNC(R8), R9
  262. MOVD 0(R9), R4
  263. MOVD $0, 0(R9)
  264. // Fill in parameter list.
  265. MOVD a4+32(FP), R12
  266. MOVD R12, (2176+24)(R4)
  267. MOVD a5+40(FP), R12
  268. MOVD R12, (2176+32)(R4)
  269. MOVD a6+48(FP), R12
  270. MOVD R12, (2176+40)(R4)
  271. MOVD a7+56(FP), R12
  272. MOVD R12, (2176+48)(R4)
  273. MOVD a8+64(FP), R12
  274. MOVD R12, (2176+56)(R4)
  275. MOVD a9+72(FP), R12
  276. MOVD R12, (2176+64)(R4)
  277. // Call function.
  278. LE_CALL
  279. NOPH
  280. XOR R0, R0 // Restore R0 to $0.
  281. MOVD R4, 0(R9) // Save stack pointer.
  282. MOVD R3, r1+80(FP)
  283. MOVD R0, r2+88(FP)
  284. MOVD R0, err+96(FP)
  285. MOVW R3, R4
  286. CMP R4, $-1
  287. BNE done
  288. BL addrerrno<>(SB)
  289. MOVWZ 0(R3), R3
  290. MOVD R3, err+96(FP)
  291. done:
  292. RET
  293. // func svcCall(fnptr unsafe.Pointer, argv *unsafe.Pointer, dsa *uint64)
  294. TEXT ·svcCall(SB),NOSPLIT,$0
  295. BL runtime·save_g(SB) // Save g and stack pointer
  296. MOVW PSALAA, R8
  297. MOVD LCA64(R8), R8
  298. MOVD SAVSTACK_ASYNC(R8), R9
  299. MOVD R15, 0(R9)
  300. MOVD argv+8(FP), R1 // Move function arguments into registers
  301. MOVD dsa+16(FP), g
  302. MOVD fnptr+0(FP), R15
  303. BYTE $0x0D // Branch to function
  304. BYTE $0xEF
  305. BL runtime·load_g(SB) // Restore g and stack pointer
  306. MOVW PSALAA, R8
  307. MOVD LCA64(R8), R8
  308. MOVD SAVSTACK_ASYNC(R8), R9
  309. MOVD 0(R9), R15
  310. RET
  311. // func svcLoad(name *byte) unsafe.Pointer
  312. TEXT ·svcLoad(SB),NOSPLIT,$0
  313. MOVD R15, R2 // Save go stack pointer
  314. MOVD name+0(FP), R0 // Move SVC args into registers
  315. MOVD $0x80000000, R1
  316. MOVD $0, R15
  317. BYTE $0x0A // SVC 08 LOAD
  318. BYTE $0x08
  319. MOVW R15, R3 // Save return code from SVC
  320. MOVD R2, R15 // Restore go stack pointer
  321. CMP R3, $0 // Check SVC return code
  322. BNE error
  323. MOVD $-2, R3 // Reset last bit of entry point to zero
  324. AND R0, R3
  325. MOVD R3, addr+8(FP) // Return entry point returned by SVC
  326. CMP R0, R3 // Check if last bit of entry point was set
  327. BNE done
  328. MOVD R15, R2 // Save go stack pointer
  329. MOVD $0, R15 // Move SVC args into registers (entry point still in r0 from SVC 08)
  330. BYTE $0x0A // SVC 09 DELETE
  331. BYTE $0x09
  332. MOVD R2, R15 // Restore go stack pointer
  333. error:
  334. MOVD $0, addr+8(FP) // Return 0 on failure
  335. done:
  336. XOR R0, R0 // Reset r0 to 0
  337. RET
  338. // func svcUnload(name *byte, fnptr unsafe.Pointer) int64
  339. TEXT ·svcUnload(SB),NOSPLIT,$0
  340. MOVD R15, R2 // Save go stack pointer
  341. MOVD name+0(FP), R0 // Move SVC args into registers
  342. MOVD addr+8(FP), R15
  343. BYTE $0x0A // SVC 09
  344. BYTE $0x09
  345. XOR R0, R0 // Reset r0 to 0
  346. MOVD R15, R1 // Save SVC return code
  347. MOVD R2, R15 // Restore go stack pointer
  348. MOVD R1, rc+0(FP) // Return SVC return code
  349. RET
  350. // func gettid() uint64
  351. TEXT ·gettid(SB), NOSPLIT, $0
  352. // Get library control area (LCA).
  353. MOVW PSALAA, R8
  354. MOVD LCA64(R8), R8
  355. // Get CEECAATHDID
  356. MOVD CAA(R8), R9
  357. MOVD 0x3D0(R9), R9
  358. MOVD R9, ret+0(FP)
  359. RET