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