blob: 2c623bf5c095aca0c261274402bb7b70264de8cf [file] [log] [blame]
Greg Kroah-Hartman0b732142017-11-24 15:00:38 +01001/* SPDX-License-Identifier: GPL-2.0 */
Heiko Carstensb0c632d2008-03-25 18:47:20 +01002/*
Heiko Carstensa53c8fa2012-07-20 11:15:04 +02003 * definition for paravirtual devices on s390
Heiko Carstensb0c632d2008-03-25 18:47:20 +01004 *
5 * Copyright IBM Corp. 2008
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License (version 2 only)
9 * as published by the Free Software Foundation.
10 *
11 * Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
12 */
Heiko Carstensb0c632d2008-03-25 18:47:20 +010013/*
Christian Borntraegere976a2b2008-03-25 18:47:46 +010014 * Hypercalls for KVM on s390. The calling convention is similar to the
15 * s390 ABI, so we use R2-R6 for parameters 1-5. In addition we use R1
16 * as hypercall number and R7 as parameter 6. The return value is
17 * written to R2. We use the diagnose instruction as hypercall. To avoid
18 * conflicts with existing diagnoses for LPAR and z/VM, we do not use
19 * the instruction encoded number, but specify the number in R1 and
20 * use 0x500 as KVM hypercall
21 *
22 * Copyright IBM Corp. 2007,2008
23 * Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
24 *
25 * This work is licensed under the terms of the GNU GPL, version 2.
Heiko Carstensb0c632d2008-03-25 18:47:20 +010026 */
David Howells9807f752012-10-09 09:47:31 +010027#ifndef __S390_KVM_PARA_H
28#define __S390_KVM_PARA_H
29
30#include <uapi/asm/kvm_para.h>
Martin Schwidefsky1ec27722015-08-20 17:28:44 +020031#include <asm/diag.h>
David Howells9807f752012-10-09 09:47:31 +010032
Martin Schwidefsky1ec27722015-08-20 17:28:44 +020033static inline long __kvm_hypercall0(unsigned long nr)
Heiko Carstensb0c632d2008-03-25 18:47:20 +010034{
Christian Borntraegere976a2b2008-03-25 18:47:46 +010035 register unsigned long __nr asm("1") = nr;
36 register long __rc asm("2");
37
38 asm volatile ("diag 2,4,0x500\n"
39 : "=d" (__rc) : "d" (__nr): "memory", "cc");
40 return __rc;
Heiko Carstensb0c632d2008-03-25 18:47:20 +010041}
42
Martin Schwidefsky1ec27722015-08-20 17:28:44 +020043static inline long kvm_hypercall0(unsigned long nr)
44{
45 diag_stat_inc(DIAG_STAT_X500);
46 return __kvm_hypercall0(nr);
47}
48
49static inline long __kvm_hypercall1(unsigned long nr, unsigned long p1)
Christian Borntraegere976a2b2008-03-25 18:47:46 +010050{
51 register unsigned long __nr asm("1") = nr;
52 register unsigned long __p1 asm("2") = p1;
53 register long __rc asm("2");
54
55 asm volatile ("diag 2,4,0x500\n"
56 : "=d" (__rc) : "d" (__nr), "0" (__p1) : "memory", "cc");
57 return __rc;
58}
59
Martin Schwidefsky1ec27722015-08-20 17:28:44 +020060static inline long kvm_hypercall1(unsigned long nr, unsigned long p1)
61{
62 diag_stat_inc(DIAG_STAT_X500);
63 return __kvm_hypercall1(nr, p1);
64}
65
66static inline long __kvm_hypercall2(unsigned long nr, unsigned long p1,
Christian Borntraegere976a2b2008-03-25 18:47:46 +010067 unsigned long p2)
68{
69 register unsigned long __nr asm("1") = nr;
70 register unsigned long __p1 asm("2") = p1;
71 register unsigned long __p2 asm("3") = p2;
72 register long __rc asm("2");
73
74 asm volatile ("diag 2,4,0x500\n"
75 : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2)
76 : "memory", "cc");
77 return __rc;
78}
79
Martin Schwidefsky1ec27722015-08-20 17:28:44 +020080static inline long kvm_hypercall2(unsigned long nr, unsigned long p1,
81 unsigned long p2)
82{
83 diag_stat_inc(DIAG_STAT_X500);
84 return __kvm_hypercall2(nr, p1, p2);
85}
86
87static inline long __kvm_hypercall3(unsigned long nr, unsigned long p1,
Christian Borntraegere976a2b2008-03-25 18:47:46 +010088 unsigned long p2, unsigned long p3)
89{
90 register unsigned long __nr asm("1") = nr;
91 register unsigned long __p1 asm("2") = p1;
92 register unsigned long __p2 asm("3") = p2;
93 register unsigned long __p3 asm("4") = p3;
94 register long __rc asm("2");
95
96 asm volatile ("diag 2,4,0x500\n"
97 : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
98 "d" (__p3) : "memory", "cc");
99 return __rc;
100}
101
Martin Schwidefsky1ec27722015-08-20 17:28:44 +0200102static inline long kvm_hypercall3(unsigned long nr, unsigned long p1,
103 unsigned long p2, unsigned long p3)
104{
105 diag_stat_inc(DIAG_STAT_X500);
106 return __kvm_hypercall3(nr, p1, p2, p3);
107}
Christian Borntraegere976a2b2008-03-25 18:47:46 +0100108
Martin Schwidefsky1ec27722015-08-20 17:28:44 +0200109static inline long __kvm_hypercall4(unsigned long nr, unsigned long p1,
Christian Borntraegere976a2b2008-03-25 18:47:46 +0100110 unsigned long p2, unsigned long p3,
111 unsigned long p4)
112{
113 register unsigned long __nr asm("1") = nr;
114 register unsigned long __p1 asm("2") = p1;
115 register unsigned long __p2 asm("3") = p2;
116 register unsigned long __p3 asm("4") = p3;
117 register unsigned long __p4 asm("5") = p4;
118 register long __rc asm("2");
119
120 asm volatile ("diag 2,4,0x500\n"
121 : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
122 "d" (__p3), "d" (__p4) : "memory", "cc");
123 return __rc;
124}
125
Martin Schwidefsky1ec27722015-08-20 17:28:44 +0200126static inline long kvm_hypercall4(unsigned long nr, unsigned long p1,
127 unsigned long p2, unsigned long p3,
128 unsigned long p4)
129{
130 diag_stat_inc(DIAG_STAT_X500);
131 return __kvm_hypercall4(nr, p1, p2, p3, p4);
132}
133
134static inline long __kvm_hypercall5(unsigned long nr, unsigned long p1,
Christian Borntraegere976a2b2008-03-25 18:47:46 +0100135 unsigned long p2, unsigned long p3,
136 unsigned long p4, unsigned long p5)
137{
138 register unsigned long __nr asm("1") = nr;
139 register unsigned long __p1 asm("2") = p1;
140 register unsigned long __p2 asm("3") = p2;
141 register unsigned long __p3 asm("4") = p3;
142 register unsigned long __p4 asm("5") = p4;
143 register unsigned long __p5 asm("6") = p5;
144 register long __rc asm("2");
145
146 asm volatile ("diag 2,4,0x500\n"
147 : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
148 "d" (__p3), "d" (__p4), "d" (__p5) : "memory", "cc");
149 return __rc;
150}
151
Martin Schwidefsky1ec27722015-08-20 17:28:44 +0200152static inline long kvm_hypercall5(unsigned long nr, unsigned long p1,
153 unsigned long p2, unsigned long p3,
154 unsigned long p4, unsigned long p5)
155{
156 diag_stat_inc(DIAG_STAT_X500);
157 return __kvm_hypercall5(nr, p1, p2, p3, p4, p5);
158}
159
160static inline long __kvm_hypercall6(unsigned long nr, unsigned long p1,
Christian Borntraegere976a2b2008-03-25 18:47:46 +0100161 unsigned long p2, unsigned long p3,
162 unsigned long p4, unsigned long p5,
163 unsigned long p6)
164{
165 register unsigned long __nr asm("1") = nr;
166 register unsigned long __p1 asm("2") = p1;
167 register unsigned long __p2 asm("3") = p2;
168 register unsigned long __p3 asm("4") = p3;
169 register unsigned long __p4 asm("5") = p4;
170 register unsigned long __p5 asm("6") = p5;
171 register unsigned long __p6 asm("7") = p6;
172 register long __rc asm("2");
173
174 asm volatile ("diag 2,4,0x500\n"
175 : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
176 "d" (__p3), "d" (__p4), "d" (__p5), "d" (__p6)
177 : "memory", "cc");
178 return __rc;
179}
180
Martin Schwidefsky1ec27722015-08-20 17:28:44 +0200181static inline long kvm_hypercall6(unsigned long nr, unsigned long p1,
182 unsigned long p2, unsigned long p3,
183 unsigned long p4, unsigned long p5,
184 unsigned long p6)
185{
186 diag_stat_inc(DIAG_STAT_X500);
187 return __kvm_hypercall6(nr, p1, p2, p3, p4, p5, p6);
188}
189
Christian Borntraegere976a2b2008-03-25 18:47:46 +0100190/* kvm on s390 is always paravirtualization enabled */
191static inline int kvm_para_available(void)
192{
193 return 1;
194}
195
196/* No feature bits are currently assigned for kvm on s390 */
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100197static inline unsigned int kvm_arch_para_features(void)
198{
199 return 0;
200}
201
Eric B Munson3b5d56b2012-03-10 14:37:26 -0500202static inline bool kvm_check_and_clear_guest_paused(void)
203{
204 return false;
205}
206
Heiko Carstensb0c632d2008-03-25 18:47:20 +0100207#endif /* __S390_KVM_PARA_H */