syscall_linux_arm64.S raw
1 // Syscall6 for Linux arm64.
2 //
3 // func Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr)
4 //
5 // LLVM calling convention ({i64,i64,i64} return in registers):
6 // Args: x0=num x1=a1 x2=a2 x3=a3 x4=a4 x5=a5 x6=a6 x7=ctx
7 // Returns: x0=r1 x1=r2 x2=errno
8 //
9 // Linux arm64 syscall convention:
10 // x8=num x0-x5=args
11 // Returns: x0 (x1 for dual-return syscalls)
12
13 .text
14 .globl "internal/runtime/syscall.Syscall6"
15 .type "internal/runtime/syscall.Syscall6", %function
16 "internal/runtime/syscall.Syscall6":
17 mov x8, x0 // num -> x8
18 mov x0, x1 // a1 -> x0
19 mov x1, x2 // a2 -> x1
20 mov x2, x3 // a3 -> x2
21 mov x3, x4 // a4 -> x3
22 mov x4, x5 // a5 -> x4
23 mov x5, x6 // a6 -> x5
24 svc #0
25 cmn x0, #4095
26 b.lo .Lok_arm64
27 neg x2, x0 // errno (positive)
28 mov x0, #-1 // r1 = -1
29 mov x1, xzr // r2 = 0
30 ret
31 .Lok_arm64:
32 mov x2, xzr // errno = 0
33 ret
34 .size "internal/runtime/syscall.Syscall6", . - "internal/runtime/syscall.Syscall6"
35
36 .section ".note.GNU-stack","",@progbits
37