sys_riscv64.s raw

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