summaryrefslogtreecommitdiff
path: root/src/syscall-s390.h
blob: b1738c7fe444c399ab7fdef15ea3c224bffb905a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#define __NR_io_setup		243
#define __NR_io_destroy		244
#define __NR_io_getevents	245
#define __NR_io_submit		246
#define __NR_io_cancel		247

#define _svc_clobber "2", "cc", "memory"

#ifdef __s390x__
#define __LR "lgr " /* 64 bit load register */
#else
#define __LR "lr	" /* 32 bit load register */
#endif

#define io_syscall0(type,name)					\
type name(void) {						\
	long __res;						\
	__asm__ __volatile__ (					\
		"    svc %b1\n"					\
		"    "__LR" %0,2"				\
		: "=d" (__res)					\
		: "i" (__NR_##name)				\
		: _svc_clobber );				\
	return (type) __res;					\
}

#define io_syscall1(type,name,type1,arg1)			\
type name(type1 arg1) {						\
	register type1 __arg1 asm("2") = arg1;			\
	long __res;						\
	__asm__ __volatile__ (					\
		"    svc %b1\n"					\
		"    "__LR" %0,2"				\
		: "=d" (__res)					\
		: "i" (__NR_##name),				\
		  "d" (__arg1)					\
		: _svc_clobber );				\
	return (type) __res;					\
}

#define io_syscall2(type,name,type1,arg1,type2,arg2)		\
type name(type1 arg1, type2 arg2) {				\
	register type1 __arg1 asm("2") = arg1;			\
	register type2 __arg2 asm("3") = arg2;			\
	long __res;						\
	__asm__ __volatile__ (					\
		"    svc %b1\n"					\
		"    "__LR" %0,2"				\
		: "=d" (__res)					\
		: "i" (__NR_##name),				\
		  "d" (__arg1),					\
		  "d" (__arg2)					\
		: _svc_clobber );				\
	return (type) __res;					\
}

#define io_syscall3(type,name,type1,arg1,type2,arg2,		\
		    type3,arg3)					\
type name(type1 arg1, type2 arg2, type3 arg3) {			\
	register type1 __arg1 asm("2") = arg1;			\
	register type2 __arg2 asm("3") = arg2;			\
	register type3 __arg3 asm("4") = arg3;			\
	long __res;						\
	__asm__ __volatile__ (					\
		"    svc %b1\n"					\
		"    "__LR" %0,2"				\
		: "=d" (__res)					\
		: "i" (__NR_##name),				\
		  "d" (__arg1),					\
		  "d" (__arg2),					\
		  "d" (__arg3)					\
		: _svc_clobber );				\
	return (type) __res;					\
}

#define io_syscall4(type,name,type1,arg1,type2,arg2,		\
		    type3,arg3,type4,arg4)			\
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {	\
	register type1 __arg1 asm("2") = arg1;			\
	register type2 __arg2 asm("3") = arg2;			\
	register type3 __arg3 asm("4") = arg3;			\
	register type4 __arg4 asm("5") = arg4;			\
	long __res;						\
	__asm__ __volatile__ (					\
		"    svc %b1\n"					\
		"    "__LR" %0,2"				\
		: "=d" (__res)					\
		: "i" (__NR_##name),				\
		  "d" (__arg1),					\
		  "d" (__arg2),					\
		  "d" (__arg3),					\
		  "d" (__arg4)					\
		: _svc_clobber );				\
	return (type) __res;					\
}

#define io_syscall5(type,name,type1,arg1,type2,arg2,		\
		    type3,arg3,type4,arg4,type5,arg5)		\
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4,	\
	  type5 arg5) {						\
	register type1 __arg1 asm("2") = arg1;			\
	register type2 __arg2 asm("3") = arg2;			\
	register type3 __arg3 asm("4") = arg3;			\
	register type4 __arg4 asm("5") = arg4;			\
	register type5 __arg5 asm("6") = arg5;			\
	long __res;						\
	__asm__ __volatile__ (					\
		"    svc %b1\n"					\
		"    "__LR" %0,2"				\
		: "=d" (__res)					\
		: "i" (__NR_##name),				\
		  "d" (__arg1),					\
		  "d" (__arg2),					\
		  "d" (__arg3),					\
		  "d" (__arg4),					\
		  "d" (__arg5)					\
		: _svc_clobber );				\
	return (type) __res;					\
}