kvm_para.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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. #include <uapi/asm/kvm_para.h>
  29. #include <asm/diag.h>
  30. static inline long __kvm_hypercall0(unsigned long nr)
  31. {
  32. register unsigned long __nr asm("1") = nr;
  33. register long __rc asm("2");
  34. asm volatile ("diag 2,4,0x500\n"
  35. : "=d" (__rc) : "d" (__nr): "memory", "cc");
  36. return __rc;
  37. }
  38. static inline long kvm_hypercall0(unsigned long nr)
  39. {
  40. diag_stat_inc(DIAG_STAT_X500);
  41. return __kvm_hypercall0(nr);
  42. }
  43. static inline long __kvm_hypercall1(unsigned long nr, unsigned long p1)
  44. {
  45. register unsigned long __nr asm("1") = nr;
  46. register unsigned long __p1 asm("2") = p1;
  47. register long __rc asm("2");
  48. asm volatile ("diag 2,4,0x500\n"
  49. : "=d" (__rc) : "d" (__nr), "0" (__p1) : "memory", "cc");
  50. return __rc;
  51. }
  52. static inline long kvm_hypercall1(unsigned long nr, unsigned long p1)
  53. {
  54. diag_stat_inc(DIAG_STAT_X500);
  55. return __kvm_hypercall1(nr, p1);
  56. }
  57. static inline long __kvm_hypercall2(unsigned long nr, unsigned long p1,
  58. unsigned long p2)
  59. {
  60. register unsigned long __nr asm("1") = nr;
  61. register unsigned long __p1 asm("2") = p1;
  62. register unsigned long __p2 asm("3") = p2;
  63. register long __rc asm("2");
  64. asm volatile ("diag 2,4,0x500\n"
  65. : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2)
  66. : "memory", "cc");
  67. return __rc;
  68. }
  69. static inline long kvm_hypercall2(unsigned long nr, unsigned long p1,
  70. unsigned long p2)
  71. {
  72. diag_stat_inc(DIAG_STAT_X500);
  73. return __kvm_hypercall2(nr, p1, p2);
  74. }
  75. static inline long __kvm_hypercall3(unsigned long nr, unsigned long p1,
  76. unsigned long p2, unsigned long p3)
  77. {
  78. register unsigned long __nr asm("1") = nr;
  79. register unsigned long __p1 asm("2") = p1;
  80. register unsigned long __p2 asm("3") = p2;
  81. register unsigned long __p3 asm("4") = p3;
  82. register long __rc asm("2");
  83. asm volatile ("diag 2,4,0x500\n"
  84. : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
  85. "d" (__p3) : "memory", "cc");
  86. return __rc;
  87. }
  88. static inline long kvm_hypercall3(unsigned long nr, unsigned long p1,
  89. unsigned long p2, unsigned long p3)
  90. {
  91. diag_stat_inc(DIAG_STAT_X500);
  92. return __kvm_hypercall3(nr, p1, p2, p3);
  93. }
  94. static inline long __kvm_hypercall4(unsigned long nr, unsigned long p1,
  95. unsigned long p2, unsigned long p3,
  96. unsigned long p4)
  97. {
  98. register unsigned long __nr asm("1") = nr;
  99. register unsigned long __p1 asm("2") = p1;
  100. register unsigned long __p2 asm("3") = p2;
  101. register unsigned long __p3 asm("4") = p3;
  102. register unsigned long __p4 asm("5") = p4;
  103. register long __rc asm("2");
  104. asm volatile ("diag 2,4,0x500\n"
  105. : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
  106. "d" (__p3), "d" (__p4) : "memory", "cc");
  107. return __rc;
  108. }
  109. static inline long kvm_hypercall4(unsigned long nr, unsigned long p1,
  110. unsigned long p2, unsigned long p3,
  111. unsigned long p4)
  112. {
  113. diag_stat_inc(DIAG_STAT_X500);
  114. return __kvm_hypercall4(nr, p1, p2, p3, p4);
  115. }
  116. static inline long __kvm_hypercall5(unsigned long nr, unsigned long p1,
  117. unsigned long p2, unsigned long p3,
  118. unsigned long p4, unsigned long p5)
  119. {
  120. register unsigned long __nr asm("1") = nr;
  121. register unsigned long __p1 asm("2") = p1;
  122. register unsigned long __p2 asm("3") = p2;
  123. register unsigned long __p3 asm("4") = p3;
  124. register unsigned long __p4 asm("5") = p4;
  125. register unsigned long __p5 asm("6") = p5;
  126. register long __rc asm("2");
  127. asm volatile ("diag 2,4,0x500\n"
  128. : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
  129. "d" (__p3), "d" (__p4), "d" (__p5) : "memory", "cc");
  130. return __rc;
  131. }
  132. static inline long kvm_hypercall5(unsigned long nr, unsigned long p1,
  133. unsigned long p2, unsigned long p3,
  134. unsigned long p4, unsigned long p5)
  135. {
  136. diag_stat_inc(DIAG_STAT_X500);
  137. return __kvm_hypercall5(nr, p1, p2, p3, p4, p5);
  138. }
  139. static inline long __kvm_hypercall6(unsigned long nr, unsigned long p1,
  140. unsigned long p2, unsigned long p3,
  141. unsigned long p4, unsigned long p5,
  142. unsigned long p6)
  143. {
  144. register unsigned long __nr asm("1") = nr;
  145. register unsigned long __p1 asm("2") = p1;
  146. register unsigned long __p2 asm("3") = p2;
  147. register unsigned long __p3 asm("4") = p3;
  148. register unsigned long __p4 asm("5") = p4;
  149. register unsigned long __p5 asm("6") = p5;
  150. register unsigned long __p6 asm("7") = p6;
  151. register long __rc asm("2");
  152. asm volatile ("diag 2,4,0x500\n"
  153. : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
  154. "d" (__p3), "d" (__p4), "d" (__p5), "d" (__p6)
  155. : "memory", "cc");
  156. return __rc;
  157. }
  158. static inline long kvm_hypercall6(unsigned long nr, unsigned long p1,
  159. unsigned long p2, unsigned long p3,
  160. unsigned long p4, unsigned long p5,
  161. unsigned long p6)
  162. {
  163. diag_stat_inc(DIAG_STAT_X500);
  164. return __kvm_hypercall6(nr, p1, p2, p3, p4, p5, p6);
  165. }
  166. /* kvm on s390 is always paravirtualization enabled */
  167. static inline int kvm_para_available(void)
  168. {
  169. return 1;
  170. }
  171. /* No feature bits are currently assigned for kvm on s390 */
  172. static inline unsigned int kvm_arch_para_features(void)
  173. {
  174. return 0;
  175. }
  176. static inline bool kvm_check_and_clear_guest_paused(void)
  177. {
  178. return false;
  179. }
  180. #endif /* __S390_KVM_PARA_H */