kvm_para.h 4.5 KB

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