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