sys_arm64.s 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // SPDX-License-Identifier: Apache-2.0
  2. // SPDX-FileCopyrightText: 2022 The Ebitengine Authors
  3. //go:build darwin || freebsd || linux || windows
  4. #include "textflag.h"
  5. #include "go_asm.h"
  6. #include "funcdata.h"
  7. #define STACK_SIZE 64
  8. #define PTR_ADDRESS (STACK_SIZE - 8)
  9. // syscall15X calls a function in libc on behalf of the syscall package.
  10. // syscall15X takes a pointer to a struct like:
  11. // struct {
  12. // fn uintptr
  13. // a1 uintptr
  14. // a2 uintptr
  15. // a3 uintptr
  16. // a4 uintptr
  17. // a5 uintptr
  18. // a6 uintptr
  19. // a7 uintptr
  20. // a8 uintptr
  21. // a9 uintptr
  22. // a10 uintptr
  23. // a11 uintptr
  24. // a12 uintptr
  25. // a13 uintptr
  26. // a14 uintptr
  27. // a15 uintptr
  28. // r1 uintptr
  29. // r2 uintptr
  30. // err uintptr
  31. // }
  32. // syscall15X must be called on the g0 stack with the
  33. // C calling convention (use libcCall).
  34. GLOBL ·syscall15XABI0(SB), NOPTR|RODATA, $8
  35. DATA ·syscall15XABI0(SB)/8, $syscall15X(SB)
  36. TEXT syscall15X(SB), NOSPLIT, $0
  37. SUB $STACK_SIZE, RSP // push structure pointer
  38. MOVD R0, PTR_ADDRESS(RSP)
  39. MOVD R0, R9
  40. FMOVD syscall15Args_f1(R9), F0 // f1
  41. FMOVD syscall15Args_f2(R9), F1 // f2
  42. FMOVD syscall15Args_f3(R9), F2 // f3
  43. FMOVD syscall15Args_f4(R9), F3 // f4
  44. FMOVD syscall15Args_f5(R9), F4 // f5
  45. FMOVD syscall15Args_f6(R9), F5 // f6
  46. FMOVD syscall15Args_f7(R9), F6 // f7
  47. FMOVD syscall15Args_f8(R9), F7 // f8
  48. MOVD syscall15Args_a1(R9), R0 // a1
  49. MOVD syscall15Args_a2(R9), R1 // a2
  50. MOVD syscall15Args_a3(R9), R2 // a3
  51. MOVD syscall15Args_a4(R9), R3 // a4
  52. MOVD syscall15Args_a5(R9), R4 // a5
  53. MOVD syscall15Args_a6(R9), R5 // a6
  54. MOVD syscall15Args_a7(R9), R6 // a7
  55. MOVD syscall15Args_a8(R9), R7 // a8
  56. MOVD syscall15Args_arm64_r8(R9), R8 // r8
  57. MOVD syscall15Args_a9(R9), R10
  58. MOVD R10, 0(RSP) // push a9 onto stack
  59. MOVD syscall15Args_a10(R9), R10
  60. MOVD R10, 8(RSP) // push a10 onto stack
  61. MOVD syscall15Args_a11(R9), R10
  62. MOVD R10, 16(RSP) // push a11 onto stack
  63. MOVD syscall15Args_a12(R9), R10
  64. MOVD R10, 24(RSP) // push a12 onto stack
  65. MOVD syscall15Args_a13(R9), R10
  66. MOVD R10, 32(RSP) // push a13 onto stack
  67. MOVD syscall15Args_a14(R9), R10
  68. MOVD R10, 40(RSP) // push a14 onto stack
  69. MOVD syscall15Args_a15(R9), R10
  70. MOVD R10, 48(RSP) // push a15 onto stack
  71. MOVD syscall15Args_fn(R9), R10 // fn
  72. BL (R10)
  73. MOVD PTR_ADDRESS(RSP), R2 // pop structure pointer
  74. ADD $STACK_SIZE, RSP
  75. MOVD R0, syscall15Args_a1(R2) // save r1
  76. MOVD R1, syscall15Args_a2(R2) // save r3
  77. FMOVD F0, syscall15Args_f1(R2) // save f0
  78. FMOVD F1, syscall15Args_f2(R2) // save f1
  79. FMOVD F2, syscall15Args_f3(R2) // save f2
  80. FMOVD F3, syscall15Args_f4(R2) // save f3
  81. RET