Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[linux-2.6] / include / asm-s390 / kvm_para.h
1 /*
2  * asm-s390/kvm_para.h - 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 #ifndef __S390_KVM_PARA_H
14 #define __S390_KVM_PARA_H
15
16 /*
17  * Hypercalls for KVM on s390. The calling convention is similar to the
18  * s390 ABI, so we use R2-R6 for parameters 1-5. In addition we use R1
19  * as hypercall number and R7 as parameter 6. The return value is
20  * written to R2. We use the diagnose instruction as hypercall. To avoid
21  * conflicts with existing diagnoses for LPAR and z/VM, we do not use
22  * the instruction encoded number, but specify the number in R1 and
23  * use 0x500 as KVM hypercall
24  *
25  * Copyright IBM Corp. 2007,2008
26  * Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
27  *
28  * This work is licensed under the terms of the GNU GPL, version 2.
29  */
30
31 static inline long kvm_hypercall0(unsigned long nr)
32 {
33         register unsigned long __nr asm("1") = nr;
34         register long __rc asm("2");
35
36         asm volatile ("diag 2,4,0x500\n"
37                       : "=d" (__rc) : "d" (__nr): "memory", "cc");
38         return __rc;
39 }
40
41 static inline long kvm_hypercall1(unsigned long nr, unsigned long p1)
42 {
43         register unsigned long __nr asm("1") = nr;
44         register unsigned long __p1 asm("2") = p1;
45         register long __rc asm("2");
46
47         asm volatile ("diag 2,4,0x500\n"
48                       : "=d" (__rc) : "d" (__nr), "0" (__p1) : "memory", "cc");
49         return __rc;
50 }
51
52 static inline long kvm_hypercall2(unsigned long nr, unsigned long p1,
53                                unsigned long p2)
54 {
55         register unsigned long __nr asm("1") = nr;
56         register unsigned long __p1 asm("2") = p1;
57         register unsigned long __p2 asm("3") = p2;
58         register long __rc asm("2");
59
60         asm volatile ("diag 2,4,0x500\n"
61                       : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2)
62                       : "memory", "cc");
63         return __rc;
64 }
65
66 static inline long kvm_hypercall3(unsigned long nr, unsigned long p1,
67                                unsigned long p2, unsigned long p3)
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 unsigned long __p3 asm("4") = p3;
73         register long __rc asm("2");
74
75         asm volatile ("diag 2,4,0x500\n"
76                       : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
77                         "d" (__p3) : "memory", "cc");
78         return __rc;
79 }
80
81
82 static inline long kvm_hypercall4(unsigned long nr, unsigned long p1,
83                                unsigned long p2, unsigned long p3,
84                                unsigned long p4)
85 {
86         register unsigned long __nr asm("1") = nr;
87         register unsigned long __p1 asm("2") = p1;
88         register unsigned long __p2 asm("3") = p2;
89         register unsigned long __p3 asm("4") = p3;
90         register unsigned long __p4 asm("5") = p4;
91         register long __rc asm("2");
92
93         asm volatile ("diag 2,4,0x500\n"
94                       : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
95                         "d" (__p3), "d" (__p4) : "memory", "cc");
96         return __rc;
97 }
98
99 static inline long kvm_hypercall5(unsigned long nr, unsigned long p1,
100                                unsigned long p2, unsigned long p3,
101                                unsigned long p4, unsigned long p5)
102 {
103         register unsigned long __nr asm("1") = nr;
104         register unsigned long __p1 asm("2") = p1;
105         register unsigned long __p2 asm("3") = p2;
106         register unsigned long __p3 asm("4") = p3;
107         register unsigned long __p4 asm("5") = p4;
108         register unsigned long __p5 asm("6") = p5;
109         register long __rc asm("2");
110
111         asm volatile ("diag 2,4,0x500\n"
112                       : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
113                         "d" (__p3), "d" (__p4), "d" (__p5)  : "memory", "cc");
114         return __rc;
115 }
116
117 static inline long kvm_hypercall6(unsigned long nr, unsigned long p1,
118                                unsigned long p2, unsigned long p3,
119                                unsigned long p4, unsigned long p5,
120                                unsigned long p6)
121 {
122         register unsigned long __nr asm("1") = nr;
123         register unsigned long __p1 asm("2") = p1;
124         register unsigned long __p2 asm("3") = p2;
125         register unsigned long __p3 asm("4") = p3;
126         register unsigned long __p4 asm("5") = p4;
127         register unsigned long __p5 asm("6") = p5;
128         register unsigned long __p6 asm("7") = p6;
129         register long __rc asm("2");
130
131         asm volatile ("diag 2,4,0x500\n"
132                       : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
133                         "d" (__p3), "d" (__p4), "d" (__p5), "d" (__p6)
134                       : "memory", "cc");
135         return __rc;
136 }
137
138 /* kvm on s390 is always paravirtualization enabled */
139 static inline int kvm_para_available(void)
140 {
141         return 1;
142 }
143
144 /* No feature bits are currently assigned for kvm on s390 */
145 static inline unsigned int kvm_arch_para_features(void)
146 {
147         return 0;
148 }
149
150 #endif /* __S390_KVM_PARA_H */