xref: /OK3568_Linux_fs/kernel/arch/s390/include/asm/kvm_para.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * definition for paravirtual devices on s390
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright IBM Corp. 2008
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  *    Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun /*
10*4882a593Smuzhiyun  * Hypercalls for KVM on s390. The calling convention is similar to the
11*4882a593Smuzhiyun  * s390 ABI, so we use R2-R6 for parameters 1-5. In addition we use R1
12*4882a593Smuzhiyun  * as hypercall number and R7 as parameter 6. The return value is
13*4882a593Smuzhiyun  * written to R2. We use the diagnose instruction as hypercall. To avoid
14*4882a593Smuzhiyun  * conflicts with existing diagnoses for LPAR and z/VM, we do not use
15*4882a593Smuzhiyun  * the instruction encoded number, but specify the number in R1 and
16*4882a593Smuzhiyun  * use 0x500 as KVM hypercall
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  * Copyright IBM Corp. 2007,2008
19*4882a593Smuzhiyun  * Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
20*4882a593Smuzhiyun  */
21*4882a593Smuzhiyun #ifndef __S390_KVM_PARA_H
22*4882a593Smuzhiyun #define __S390_KVM_PARA_H
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #include <uapi/asm/kvm_para.h>
25*4882a593Smuzhiyun #include <asm/diag.h>
26*4882a593Smuzhiyun 
__kvm_hypercall0(unsigned long nr)27*4882a593Smuzhiyun static inline long __kvm_hypercall0(unsigned long nr)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun 	register unsigned long __nr asm("1") = nr;
30*4882a593Smuzhiyun 	register long __rc asm("2");
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	asm volatile ("diag 2,4,0x500\n"
33*4882a593Smuzhiyun 		      : "=d" (__rc) : "d" (__nr): "memory", "cc");
34*4882a593Smuzhiyun 	return __rc;
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun 
kvm_hypercall0(unsigned long nr)37*4882a593Smuzhiyun static inline long kvm_hypercall0(unsigned long nr)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun 	diag_stat_inc(DIAG_STAT_X500);
40*4882a593Smuzhiyun 	return __kvm_hypercall0(nr);
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun 
__kvm_hypercall1(unsigned long nr,unsigned long p1)43*4882a593Smuzhiyun static inline long __kvm_hypercall1(unsigned long nr, unsigned long p1)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun 	register unsigned long __nr asm("1") = nr;
46*4882a593Smuzhiyun 	register unsigned long __p1 asm("2") = p1;
47*4882a593Smuzhiyun 	register long __rc asm("2");
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 	asm volatile ("diag 2,4,0x500\n"
50*4882a593Smuzhiyun 		      : "=d" (__rc) : "d" (__nr), "0" (__p1) : "memory", "cc");
51*4882a593Smuzhiyun 	return __rc;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun 
kvm_hypercall1(unsigned long nr,unsigned long p1)54*4882a593Smuzhiyun static inline long kvm_hypercall1(unsigned long nr, unsigned long p1)
55*4882a593Smuzhiyun {
56*4882a593Smuzhiyun 	diag_stat_inc(DIAG_STAT_X500);
57*4882a593Smuzhiyun 	return __kvm_hypercall1(nr, p1);
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun 
__kvm_hypercall2(unsigned long nr,unsigned long p1,unsigned long p2)60*4882a593Smuzhiyun static inline long __kvm_hypercall2(unsigned long nr, unsigned long p1,
61*4882a593Smuzhiyun 			       unsigned long p2)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun 	register unsigned long __nr asm("1") = nr;
64*4882a593Smuzhiyun 	register unsigned long __p1 asm("2") = p1;
65*4882a593Smuzhiyun 	register unsigned long __p2 asm("3") = p2;
66*4882a593Smuzhiyun 	register long __rc asm("2");
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	asm volatile ("diag 2,4,0x500\n"
69*4882a593Smuzhiyun 		      : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2)
70*4882a593Smuzhiyun 		      : "memory", "cc");
71*4882a593Smuzhiyun 	return __rc;
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun 
kvm_hypercall2(unsigned long nr,unsigned long p1,unsigned long p2)74*4882a593Smuzhiyun static inline long kvm_hypercall2(unsigned long nr, unsigned long p1,
75*4882a593Smuzhiyun 			       unsigned long p2)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun 	diag_stat_inc(DIAG_STAT_X500);
78*4882a593Smuzhiyun 	return __kvm_hypercall2(nr, p1, p2);
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun 
__kvm_hypercall3(unsigned long nr,unsigned long p1,unsigned long p2,unsigned long p3)81*4882a593Smuzhiyun static inline long __kvm_hypercall3(unsigned long nr, unsigned long p1,
82*4882a593Smuzhiyun 			       unsigned long p2, unsigned long p3)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	register unsigned long __nr asm("1") = nr;
85*4882a593Smuzhiyun 	register unsigned long __p1 asm("2") = p1;
86*4882a593Smuzhiyun 	register unsigned long __p2 asm("3") = p2;
87*4882a593Smuzhiyun 	register unsigned long __p3 asm("4") = p3;
88*4882a593Smuzhiyun 	register long __rc asm("2");
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	asm volatile ("diag 2,4,0x500\n"
91*4882a593Smuzhiyun 		      : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
92*4882a593Smuzhiyun 			"d" (__p3) : "memory", "cc");
93*4882a593Smuzhiyun 	return __rc;
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun 
kvm_hypercall3(unsigned long nr,unsigned long p1,unsigned long p2,unsigned long p3)96*4882a593Smuzhiyun static inline long kvm_hypercall3(unsigned long nr, unsigned long p1,
97*4882a593Smuzhiyun 			       unsigned long p2, unsigned long p3)
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun 	diag_stat_inc(DIAG_STAT_X500);
100*4882a593Smuzhiyun 	return __kvm_hypercall3(nr, p1, p2, p3);
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun 
__kvm_hypercall4(unsigned long nr,unsigned long p1,unsigned long p2,unsigned long p3,unsigned long p4)103*4882a593Smuzhiyun static inline long __kvm_hypercall4(unsigned long nr, unsigned long p1,
104*4882a593Smuzhiyun 			       unsigned long p2, unsigned long p3,
105*4882a593Smuzhiyun 			       unsigned long p4)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun 	register unsigned long __nr asm("1") = nr;
108*4882a593Smuzhiyun 	register unsigned long __p1 asm("2") = p1;
109*4882a593Smuzhiyun 	register unsigned long __p2 asm("3") = p2;
110*4882a593Smuzhiyun 	register unsigned long __p3 asm("4") = p3;
111*4882a593Smuzhiyun 	register unsigned long __p4 asm("5") = p4;
112*4882a593Smuzhiyun 	register long __rc asm("2");
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	asm volatile ("diag 2,4,0x500\n"
115*4882a593Smuzhiyun 		      : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
116*4882a593Smuzhiyun 			"d" (__p3), "d" (__p4) : "memory", "cc");
117*4882a593Smuzhiyun 	return __rc;
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun 
kvm_hypercall4(unsigned long nr,unsigned long p1,unsigned long p2,unsigned long p3,unsigned long p4)120*4882a593Smuzhiyun static inline long kvm_hypercall4(unsigned long nr, unsigned long p1,
121*4882a593Smuzhiyun 			       unsigned long p2, unsigned long p3,
122*4882a593Smuzhiyun 			       unsigned long p4)
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun 	diag_stat_inc(DIAG_STAT_X500);
125*4882a593Smuzhiyun 	return __kvm_hypercall4(nr, p1, p2, p3, p4);
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun 
__kvm_hypercall5(unsigned long nr,unsigned long p1,unsigned long p2,unsigned long p3,unsigned long p4,unsigned long p5)128*4882a593Smuzhiyun static inline long __kvm_hypercall5(unsigned long nr, unsigned long p1,
129*4882a593Smuzhiyun 			       unsigned long p2, unsigned long p3,
130*4882a593Smuzhiyun 			       unsigned long p4, unsigned long p5)
131*4882a593Smuzhiyun {
132*4882a593Smuzhiyun 	register unsigned long __nr asm("1") = nr;
133*4882a593Smuzhiyun 	register unsigned long __p1 asm("2") = p1;
134*4882a593Smuzhiyun 	register unsigned long __p2 asm("3") = p2;
135*4882a593Smuzhiyun 	register unsigned long __p3 asm("4") = p3;
136*4882a593Smuzhiyun 	register unsigned long __p4 asm("5") = p4;
137*4882a593Smuzhiyun 	register unsigned long __p5 asm("6") = p5;
138*4882a593Smuzhiyun 	register long __rc asm("2");
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	asm volatile ("diag 2,4,0x500\n"
141*4882a593Smuzhiyun 		      : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
142*4882a593Smuzhiyun 			"d" (__p3), "d" (__p4), "d" (__p5)  : "memory", "cc");
143*4882a593Smuzhiyun 	return __rc;
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun 
kvm_hypercall5(unsigned long nr,unsigned long p1,unsigned long p2,unsigned long p3,unsigned long p4,unsigned long p5)146*4882a593Smuzhiyun static inline long kvm_hypercall5(unsigned long nr, unsigned long p1,
147*4882a593Smuzhiyun 			       unsigned long p2, unsigned long p3,
148*4882a593Smuzhiyun 			       unsigned long p4, unsigned long p5)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun 	diag_stat_inc(DIAG_STAT_X500);
151*4882a593Smuzhiyun 	return __kvm_hypercall5(nr, p1, p2, p3, p4, p5);
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun 
__kvm_hypercall6(unsigned long nr,unsigned long p1,unsigned long p2,unsigned long p3,unsigned long p4,unsigned long p5,unsigned long p6)154*4882a593Smuzhiyun static inline long __kvm_hypercall6(unsigned long nr, unsigned long p1,
155*4882a593Smuzhiyun 			       unsigned long p2, unsigned long p3,
156*4882a593Smuzhiyun 			       unsigned long p4, unsigned long p5,
157*4882a593Smuzhiyun 			       unsigned long p6)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun 	register unsigned long __nr asm("1") = nr;
160*4882a593Smuzhiyun 	register unsigned long __p1 asm("2") = p1;
161*4882a593Smuzhiyun 	register unsigned long __p2 asm("3") = p2;
162*4882a593Smuzhiyun 	register unsigned long __p3 asm("4") = p3;
163*4882a593Smuzhiyun 	register unsigned long __p4 asm("5") = p4;
164*4882a593Smuzhiyun 	register unsigned long __p5 asm("6") = p5;
165*4882a593Smuzhiyun 	register unsigned long __p6 asm("7") = p6;
166*4882a593Smuzhiyun 	register long __rc asm("2");
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	asm volatile ("diag 2,4,0x500\n"
169*4882a593Smuzhiyun 		      : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
170*4882a593Smuzhiyun 			"d" (__p3), "d" (__p4), "d" (__p5), "d" (__p6)
171*4882a593Smuzhiyun 		      : "memory", "cc");
172*4882a593Smuzhiyun 	return __rc;
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun 
kvm_hypercall6(unsigned long nr,unsigned long p1,unsigned long p2,unsigned long p3,unsigned long p4,unsigned long p5,unsigned long p6)175*4882a593Smuzhiyun static inline long kvm_hypercall6(unsigned long nr, unsigned long p1,
176*4882a593Smuzhiyun 			       unsigned long p2, unsigned long p3,
177*4882a593Smuzhiyun 			       unsigned long p4, unsigned long p5,
178*4882a593Smuzhiyun 			       unsigned long p6)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun 	diag_stat_inc(DIAG_STAT_X500);
181*4882a593Smuzhiyun 	return __kvm_hypercall6(nr, p1, p2, p3, p4, p5, p6);
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun /* kvm on s390 is always paravirtualization enabled */
kvm_para_available(void)185*4882a593Smuzhiyun static inline int kvm_para_available(void)
186*4882a593Smuzhiyun {
187*4882a593Smuzhiyun 	return 1;
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun /* No feature bits are currently assigned for kvm on s390 */
kvm_arch_para_features(void)191*4882a593Smuzhiyun static inline unsigned int kvm_arch_para_features(void)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun 	return 0;
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun 
kvm_arch_para_hints(void)196*4882a593Smuzhiyun static inline unsigned int kvm_arch_para_hints(void)
197*4882a593Smuzhiyun {
198*4882a593Smuzhiyun 	return 0;
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun 
kvm_check_and_clear_guest_paused(void)201*4882a593Smuzhiyun static inline bool kvm_check_and_clear_guest_paused(void)
202*4882a593Smuzhiyun {
203*4882a593Smuzhiyun 	return false;
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun #endif /* __S390_KVM_PARA_H */
207