sys_riscv64.s 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // SPDX-License-Identifier: Apache-2.0
  2. // SPDX-FileCopyrightText: 2026 The Ebitengine Authors
  3. //go:build linux
  4. #include "textflag.h"
  5. #include "go_asm.h"
  6. #include "funcdata.h"
  7. // Stack usage:
  8. // 0(SP) - 56(SP): stack args a9-a15 (7 * 8 bytes = 56)
  9. // 56(SP) - 64(SP): saved RA (x1)
  10. // 64(SP) - 72(SP): saved X9 (s1)
  11. // 72(SP) - 80(SP): saved X18 (s2)
  12. // 80(SP) - 88(SP): saved args pointer (original X10)
  13. // 88(SP) - 96(SP): padding
  14. #define STACK_SIZE 96
  15. #define SAVE_RA 56
  16. #define SAVE_X9 64
  17. #define SAVE_X18 72
  18. #define SAVE_ARGP 80
  19. GLOBL ·syscall15XABI0(SB), NOPTR|RODATA, $8
  20. DATA ·syscall15XABI0(SB)/8, $syscall15X(SB)
  21. TEXT syscall15X(SB), NOSPLIT, $0
  22. // Allocate stack frame (keeps 16-byte alignment)
  23. SUB $STACK_SIZE, SP
  24. // Save callee-saved regs we clobber + return address
  25. MOV X1, SAVE_RA(SP)
  26. MOV X9, SAVE_X9(SP)
  27. MOV X18, SAVE_X18(SP)
  28. // Save original args pointer (in a0/X10)
  29. MOV X10, SAVE_ARGP(SP)
  30. // X9 := args pointer (syscall15Args*)
  31. MOV X10, X9
  32. // Load float args into fa0-fa7 (F10-F17)
  33. MOVD syscall15Args_f1(X9), F10
  34. MOVD syscall15Args_f2(X9), F11
  35. MOVD syscall15Args_f3(X9), F12
  36. MOVD syscall15Args_f4(X9), F13
  37. MOVD syscall15Args_f5(X9), F14
  38. MOVD syscall15Args_f6(X9), F15
  39. MOVD syscall15Args_f7(X9), F16
  40. MOVD syscall15Args_f8(X9), F17
  41. // Load integer args into a0-a7 (X10-X17)
  42. MOV syscall15Args_a1(X9), X10
  43. MOV syscall15Args_a2(X9), X11
  44. MOV syscall15Args_a3(X9), X12
  45. MOV syscall15Args_a4(X9), X13
  46. MOV syscall15Args_a5(X9), X14
  47. MOV syscall15Args_a6(X9), X15
  48. MOV syscall15Args_a7(X9), X16
  49. MOV syscall15Args_a8(X9), X17
  50. // Spill a9-a15 onto the stack (C ABI)
  51. MOV syscall15Args_a9(X9), X18
  52. MOV X18, 0(SP)
  53. MOV syscall15Args_a10(X9), X18
  54. MOV X18, 8(SP)
  55. MOV syscall15Args_a11(X9), X18
  56. MOV X18, 16(SP)
  57. MOV syscall15Args_a12(X9), X18
  58. MOV X18, 24(SP)
  59. MOV syscall15Args_a13(X9), X18
  60. MOV X18, 32(SP)
  61. MOV syscall15Args_a14(X9), X18
  62. MOV X18, 40(SP)
  63. MOV syscall15Args_a15(X9), X18
  64. MOV X18, 48(SP)
  65. // Call fn
  66. // IMPORTANT: preserve RA across this call (we saved it above)
  67. MOV syscall15Args_fn(X9), X18
  68. CALL X18
  69. // Restore args pointer (syscall15Args*) for storing results
  70. MOV SAVE_ARGP(SP), X9
  71. // Store results back
  72. MOV X10, syscall15Args_a1(X9)
  73. MOV X11, syscall15Args_a2(X9)
  74. // Store back float return regs if used by your ABI contract
  75. MOVD F10, syscall15Args_f1(X9)
  76. MOVD F11, syscall15Args_f2(X9)
  77. MOVD F12, syscall15Args_f3(X9)
  78. MOVD F13, syscall15Args_f4(X9)
  79. // Restore callee-saved regs and return address
  80. MOV SAVE_X18(SP), X18
  81. MOV SAVE_X9(SP), X9
  82. MOV SAVE_RA(SP), X1
  83. ADD $STACK_SIZE, SP
  84. RET