blob: 41393052ac57e1966ca735295be5f20f58ac3c55 [file] [log] [blame]
Heiko Carstensb0c632d2008-03-25 18:47:20 +01001/*
Heiko Carstensa53c8fa2012-07-20 11:15:04 +02002 * definition for paravirtual devices on s390
Heiko Carstensb0c632d2008-03-25 18:47:20 +01003 *
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 */
Heiko Carstensb0c632d2008-03-25 18:47:20 +010012/*
Christian Borntraegere976a2b2008-03-25 18:47:46 +010013 * 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.
Heiko Carstensb0c632d2008-03-25 18:47:20 +010025 */
David Howells9807f752012-10-09 09:47:31 +010026#ifndef __S390_KVM_PARA_H
27#define __S390_KVM_PARA_H
28
29#include <uapi/asm/kvm_para.h>
Martin Schwidefsky1ec27722015-08-20 17:28:44 +020030#include <asm/diag.h>
David Howells9807f752012-10-09 09:47:31 +010031
Martin Schwidefsky1ec27722015-08-20 17:28:44 +020032static inline long __kvm_hypercall0(unsigned long nr)
Heiko Carstensb0c632d2008-03-25 18:47:20 +010033{
Christian Borntraegere976a2b2008-03-25 18:47:46 +010034 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;
Heiko Carstensb0c632d2008-03-25 18:47:20 +010040}
41
Martin Schwidefsky1ec27722015-08-20 17:28:44 +020042static inline long kvm_hypercall0(unsigned long nr)
43{
44 diag_stat_inc(DIAG_STAT_X500);
45 return __kvm_hypercall0(nr);
46}
47
48static inline long __kvm_hypercall1(unsigned long nr, unsigned long p1)
Christian Borntraegere976a2b2008-03-25 18:47:46 +010049{
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
Martin Schwidefsky1ec27722015-08-20 17:28:44 +020059static 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
65static inline long __kvm_hypercall2(unsigned long nr, unsigned long p1,
Christian Borntraegere976a2b2008-03-25 18:47:46 +010066 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
Martin Schwidefsky1ec27722015-08-20 17:28:44 +020079static 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
86static inline long __kvm_hypercall3(unsigned long nr, unsigned long p1,
Christian Borntraegere976a2b2008-03-25 18:47:46 +010087 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
Martin Schwidefsky1ec27722015-08-20 17:28:44 +0200101static 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}
Christian Borntraegere976a2b2008-03-25 18:47:46 +0100107
Martin Schwidefsky1ec27722015-08-20 17:28:44 +0200108static inline long __kvm_hypercall4(unsigned long nr, unsigned long p1,
Christian Borntraegere976a2b2008-03-25 18:47:46 +0100109 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
Martin Schwidefsky1ec27722015-08-20 17:28:44 +0200125static 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
133static inline long __kvm_hypercall5(unsigned long nr, unsigned long p1,
Christian Borntraegere976a2b2008-03-25 18:47:46 +0100134 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
Martin Schwidefsky1ec27722015-08-20 17:28:44 +0200151static 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
159static inline long __kvm_hypercall6(unsigned long nr, unsigned long p1,
Christian Borntraegere976a2b2008-03-25 18:47:46 +0100160 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
Martin Schwidefsky1ec27722015-08-20 17:28:44 +0200180static 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
Christian Borntraegere976a2b2008-03-25 18:47:46 +0100189/* kvm on s390 is always paravirtualization enabled */
190static inline int kvm_para_available(void)
191{
192 return 1;
193}
194
195/* No feature bits are currently assigned for kvm on s390 */
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100196static inline unsigned int kvm_arch_para_features(void)
197{
198 return 0;
199}
200
Eric B Munson3b5d56b2012-03-10 14:37:26 -0500201static inline bool kvm_check_and_clear_guest_paused(void)
202{
203 return false;
204}
205
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100206#endif /* __S390_KVM_PARA_H */