1/*
2 * Copyright 2012, Alex Smith, alex@alex-smith.me.uk.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <asm_defs.h>
8
9
10// The kernel follows the AMD64 ABI for parameter passing (first 6 arguments in
11// registers and the remaining ones in on the stack), except that RCX (argument
12// 4) is overwritten by the SYSCALL instruction, so it is moved to R10. Syscall
13// number goes in RAX.
14
15
16#define _SYSCALL_NO_RCX(name, n)	\
17	.align 8;						\
18	FUNCTION(name):					\
19		movq	$n, %rax;			\
20		syscall;					\
21		ret;						\
22	FUNCTION_END(name)
23
24#define _SYSCALL_RCX(name, n)		\
25	.align 8;						\
26	FUNCTION(name):					\
27		movq	%rcx, %r10;			\
28		movq	$n, %rax;			\
29		syscall;					\
30		ret;						\
31	FUNCTION_END(name)
32
33
34#define SYSCALL0(name, n)	_SYSCALL_NO_RCX(name, n)
35#define SYSCALL1(name, n)	_SYSCALL_NO_RCX(name, n)
36#define SYSCALL2(name, n)	_SYSCALL_NO_RCX(name, n)
37#define SYSCALL3(name, n)	_SYSCALL_NO_RCX(name, n)
38#define SYSCALL4(name, n)	_SYSCALL_RCX(name, n)
39#define SYSCALL5(name, n)	_SYSCALL_RCX(name, n)
40#define SYSCALL6(name, n)	_SYSCALL_RCX(name, n)
41#define SYSCALL7(name, n)	_SYSCALL_RCX(name, n)
42#define SYSCALL8(name, n)	_SYSCALL_RCX(name, n)
43#define SYSCALL9(name, n)	_SYSCALL_RCX(name, n)
44#define SYSCALL10(name, n)	_SYSCALL_RCX(name, n)
45#define SYSCALL11(name, n)	_SYSCALL_RCX(name, n)
46#define SYSCALL12(name, n)	_SYSCALL_RCX(name, n)
47#define SYSCALL13(name, n)	_SYSCALL_RCX(name, n)
48#define SYSCALL14(name, n)	_SYSCALL_RCX(name, n)
49#define SYSCALL15(name, n)	_SYSCALL_RCX(name, n)
50#define SYSCALL16(name, n)	_SYSCALL_RCX(name, n)
51#define SYSCALL17(name, n)	_SYSCALL_RCX(name, n)
52#define SYSCALL18(name, n)	_SYSCALL_RCX(name, n)
53#define SYSCALL19(name, n)	_SYSCALL_RCX(name, n)
54#define SYSCALL20(name, n)	_SYSCALL_RCX(name, n)
55
56