1// Copyright 2022 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5#include "textflag.h"
6
7// func Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr)
8//
9// We need to convert to the syscall ABI.
10//
11// arg | ABIInternal | Syscall
12// ---------------------------
13// num | AX          | AX
14// a1  | BX          | DI
15// a2  | CX          | SI
16// a3  | DI          | DX
17// a4  | SI          | R10
18// a5  | R8          | R8
19// a6  | R9          | R9
20//
21// r1  | AX          | AX
22// r2  | BX          | DX
23// err | CX          | part of AX
24//
25// Note that this differs from "standard" ABI convention, which would pass 4th
26// arg in CX, not R10.
27TEXT ·Syscall6<ABIInternal>(SB),NOSPLIT,$0
28	// a6 already in R9.
29	// a5 already in R8.
30	MOVQ	SI, R10 // a4
31	MOVQ	DI, DX  // a3
32	MOVQ	CX, SI  // a2
33	MOVQ	BX, DI  // a1
34	// num already in AX.
35	SYSCALL
36	CMPQ	AX, $0xfffffffffffff001
37	JLS	ok
38	NEGQ	AX
39	MOVQ	AX, CX  // errno
40	MOVQ	$-1, AX // r1
41	MOVQ	$0, BX  // r2
42	RET
43ok:
44	// r1 already in AX.
45	MOVQ	DX, BX // r2
46	MOVQ	$0, CX // errno
47	RET
48