kvm_para.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * definition for paravirtual devices on s390
  4. *
  5. * Copyright IBM Corp. 2008
  6. *
  7. * Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
  8. */
  9. /*
  10. * Hypercalls for KVM on s390. The calling convention is similar to the
  11. * s390 ABI, so we use R2-R6 for parameters 1-5. In addition we use R1
  12. * as hypercall number and R7 as parameter 6. The return value is
  13. * written to R2. We use the diagnose instruction as hypercall. To avoid
  14. * conflicts with existing diagnoses for LPAR and z/VM, we do not use
  15. * the instruction encoded number, but specify the number in R1 and
  16. * use 0x500 as KVM hypercall
  17. *
  18. * Copyright IBM Corp. 2007,2008
  19. * Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
  20. */
  21. #ifndef __S390_KVM_PARA_H
  22. #define __S390_KVM_PARA_H
  23. #include <uapi/asm/kvm_para.h>
  24. #include <asm/diag.h>
  25. static inline long __kvm_hypercall0(unsigned long nr)
  26. {
  27. register unsigned long __nr asm("1") = nr;
  28. register long __rc asm("2");
  29. asm volatile ("diag 2,4,0x500\n"
  30. : "=d" (__rc) : "d" (__nr): "memory", "cc");
  31. return __rc;
  32. }
  33. static inline long kvm_hypercall0(unsigned long nr)
  34. {
  35. diag_stat_inc(DIAG_STAT_X500);
  36. return __kvm_hypercall0(nr);
  37. }
  38. static inline long __kvm_hypercall1(unsigned long nr, unsigned long p1)
  39. {
  40. register unsigned long __nr asm("1") = nr;
  41. register unsigned long __p1 asm("2") = p1;
  42. register long __rc asm("2");
  43. asm volatile ("diag 2,4,0x500\n"
  44. : "=d" (__rc) : "d" (__nr), "0" (__p1) : "memory", "cc");
  45. return __rc;
  46. }
  47. static inline long kvm_hypercall1(unsigned long nr, unsigned long p1)
  48. {
  49. diag_stat_inc(DIAG_STAT_X500);
  50. return __kvm_hypercall1(nr, p1);
  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. asm volatile ("diag 2,4,0x500\n"
  60. : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2)
  61. : "memory", "cc");
  62. return __rc;
  63. }
  64. static inline long kvm_hypercall2(unsigned long nr, unsigned long p1,
  65. unsigned long p2)
  66. {
  67. diag_stat_inc(DIAG_STAT_X500);
  68. return __kvm_hypercall2(nr, p1, p2);
  69. }
  70. static inline long __kvm_hypercall3(unsigned long nr, unsigned long p1,
  71. unsigned long p2, unsigned long p3)
  72. {
  73. register unsigned long __nr asm("1") = nr;
  74. register unsigned long __p1 asm("2") = p1;
  75. register unsigned long __p2 asm("3") = p2;
  76. register unsigned long __p3 asm("4") = p3;
  77. register long __rc asm("2");
  78. asm volatile ("diag 2,4,0x500\n"
  79. : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
  80. "d" (__p3) : "memory", "cc");
  81. return __rc;
  82. }
  83. static inline long kvm_hypercall3(unsigned long nr, unsigned long p1,
  84. unsigned long p2, unsigned long p3)
  85. {
  86. diag_stat_inc(DIAG_STAT_X500);
  87. return __kvm_hypercall3(nr, p1, p2, p3);
  88. }
  89. static inline long __kvm_hypercall4(unsigned long nr, unsigned long p1,
  90. unsigned long p2, unsigned long p3,
  91. unsigned long p4)
  92. {
  93. register unsigned long __nr asm("1") = nr;
  94. register unsigned long __p1 asm("2") = p1;
  95. register unsigned long __p2 asm("3") = p2;
  96. register unsigned long __p3 asm("4") = p3;
  97. register unsigned long __p4 asm("5") = p4;
  98. register long __rc asm("2");
  99. asm volatile ("diag 2,4,0x500\n"
  100. : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
  101. "d" (__p3), "d" (__p4) : "memory", "cc");
  102. return __rc;
  103. }
  104. static inline long kvm_hypercall4(unsigned long nr, unsigned long p1,
  105. unsigned long p2, unsigned long p3,
  106. unsigned long p4)
  107. {
  108. diag_stat_inc(DIAG_STAT_X500);
  109. return __kvm_hypercall4(nr, p1, p2, p3, p4);
  110. }
  111. static inline long __kvm_hypercall5(unsigned long nr, unsigned long p1,
  112. unsigned long p2, unsigned long p3,
  113. unsigned long p4, unsigned long p5)
  114. {
  115. register unsigned long __nr asm("1") = nr;
  116. register unsigned long __p1 asm("2") = p1;
  117. register unsigned long __p2 asm("3") = p2;
  118. register unsigned long __p3 asm("4") = p3;
  119. register unsigned long __p4 asm("5") = p4;
  120. register unsigned long __p5 asm("6") = p5;
  121. register long __rc asm("2");
  122. asm volatile ("diag 2,4,0x500\n"
  123. : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
  124. "d" (__p3), "d" (__p4), "d" (__p5) : "memory", "cc");
  125. return __rc;
  126. }
  127. static inline long kvm_hypercall5(unsigned long nr, unsigned long p1,
  128. unsigned long p2, unsigned long p3,
  129. unsigned long p4, unsigned long p5)
  130. {
  131. diag_stat_inc(DIAG_STAT_X500);
  132. return __kvm_hypercall5(nr, p1, p2, p3, p4, p5);
  133. }
  134. static inline long __kvm_hypercall6(unsigned long nr, unsigned long p1,
  135. unsigned long p2, unsigned long p3,
  136. unsigned long p4, unsigned long p5,
  137. unsigned long p6)
  138. {
  139. register unsigned long __nr asm("1") = nr;
  140. register unsigned long __p1 asm("2") = p1;
  141. register unsigned long __p2 asm("3") = p2;
  142. register unsigned long __p3 asm("4") = p3;
  143. register unsigned long __p4 asm("5") = p4;
  144. register unsigned long __p5 asm("6") = p5;
  145. register unsigned long __p6 asm("7") = p6;
  146. register long __rc asm("2");
  147. asm volatile ("diag 2,4,0x500\n"
  148. : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
  149. "d" (__p3), "d" (__p4), "d" (__p5), "d" (__p6)
  150. : "memory", "cc");
  151. return __rc;
  152. }
  153. static inline long kvm_hypercall6(unsigned long nr, unsigned long p1,
  154. unsigned long p2, unsigned long p3,
  155. unsigned long p4, unsigned long p5,
  156. unsigned long p6)
  157. {
  158. diag_stat_inc(DIAG_STAT_X500);
  159. return __kvm_hypercall6(nr, p1, p2, p3, p4, p5, p6);
  160. }
  161. /* kvm on s390 is always paravirtualization enabled */
  162. static inline int kvm_para_available(void)
  163. {
  164. return 1;
  165. }
  166. /* No feature bits are currently assigned for kvm on s390 */
  167. static inline unsigned int kvm_arch_para_features(void)
  168. {
  169. return 0;
  170. }
  171. static inline unsigned int kvm_arch_para_hints(void)
  172. {
  173. return 0;
  174. }
  175. static inline bool kvm_check_and_clear_guest_paused(void)
  176. {
  177. return false;
  178. }
  179. #endif /* __S390_KVM_PARA_H */