1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2022 The Ebitengine Authors
3
4#include "textflag.h"
5#include "go_asm.h"
6
7// syscall9X calls a function in libc on behalf of the syscall package.
8// syscall9X takes a pointer to a struct like:
9// struct {
10// fn uintptr
11// a1 uintptr
12// a2 uintptr
13// a3 uintptr
14// a4 uintptr
15// a5 uintptr
16// a6 uintptr
17// a7 uintptr
18// a8 uintptr
19// a9 uintptr
20// r1 uintptr
21// r2 uintptr
22// err uintptr
23// }
24// syscall9X must be called on the g0 stack with the
25// C calling convention (use libcCall).
26GLOBL ·syscall9XABI0(SB), NOPTR|RODATA, $8
27DATA ·syscall9XABI0(SB)/8, $syscall9X(SB)
28TEXT syscall9X(SB), NOSPLIT, $0
29 PUSHQ BP
30 MOVQ SP, BP
31 SUBQ $32, SP
32 MOVQ DI, 24(BP) // save the pointer
33
34 MOVQ syscall9Args_f1(DI), X0 // f1
35 MOVQ syscall9Args_f2(DI), X1 // f2
36 MOVQ syscall9Args_f3(DI), X2 // f3
37 MOVQ syscall9Args_f4(DI), X3 // f4
38 MOVQ syscall9Args_f5(DI), X4 // f5
39 MOVQ syscall9Args_f6(DI), X5 // f6
40 MOVQ syscall9Args_f7(DI), X6 // f7
41 MOVQ syscall9Args_f8(DI), X7 // f8
42
43 MOVQ syscall9Args_fn(DI), R10 // fn
44 MOVQ syscall9Args_a2(DI), SI // a2
45 MOVQ syscall9Args_a3(DI), DX // a3
46 MOVQ syscall9Args_a4(DI), CX // a4
47 MOVQ syscall9Args_a5(DI), R8 // a5
48 MOVQ syscall9Args_a6(DI), R9 // a6
49 MOVQ syscall9Args_a7(DI), R11 // a7
50 MOVQ syscall9Args_a8(DI), R12 // a8
51 MOVQ syscall9Args_a9(DI), R13 // a9
52 MOVQ syscall9Args_a1(DI), DI // a1
53
54 // push the remaining paramters onto the stack
55 MOVQ R11, 0(SP) // push a7
56 MOVQ R12, 8(SP) // push a8
57 MOVQ R13, 16(SP) // push a9
58 XORL AX, AX // vararg: say "no float args"
59
60 CALL R10
61
62 MOVQ 24(BP), DI // get the pointer back
63 MOVQ AX, syscall9Args_r1(DI) // r1
64 MOVQ DX, syscall9Args_r2(DI) // r2
65
66 XORL AX, AX // no error (it's ignored anyway)
67 ADDQ $32, SP
68 MOVQ BP, SP
69 POPQ BP
70 RET