kvm_para.h 4.6 KB

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