kvm_para.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ASM_LOONGARCH_KVM_PARA_H
  3. #define _ASM_LOONGARCH_KVM_PARA_H
  4. #include <uapi/asm/kvm_para.h>
  5. /*
  6. * Hypercall code field
  7. */
  8. #define HYPERVISOR_KVM 1
  9. #define HYPERVISOR_VENDOR_SHIFT 8
  10. #define HYPERCALL_ENCODE(vendor, code) ((vendor << HYPERVISOR_VENDOR_SHIFT) + code)
  11. #define KVM_HCALL_CODE_SERVICE 0
  12. #define KVM_HCALL_CODE_SWDBG 1
  13. #define KVM_HCALL_CODE_USER_SERVICE 2
  14. #define KVM_HCALL_SERVICE HYPERCALL_ENCODE(HYPERVISOR_KVM, KVM_HCALL_CODE_SERVICE)
  15. #define KVM_HCALL_FUNC_IPI 1
  16. #define KVM_HCALL_FUNC_NOTIFY 2
  17. #define KVM_HCALL_SWDBG HYPERCALL_ENCODE(HYPERVISOR_KVM, KVM_HCALL_CODE_SWDBG)
  18. #define KVM_HCALL_USER_SERVICE HYPERCALL_ENCODE(HYPERVISOR_KVM, KVM_HCALL_CODE_USER_SERVICE)
  19. /*
  20. * LoongArch hypercall return code
  21. */
  22. #define KVM_HCALL_SUCCESS 0
  23. #define KVM_HCALL_INVALID_CODE -1UL
  24. #define KVM_HCALL_INVALID_PARAMETER -2UL
  25. #define KVM_STEAL_PHYS_VALID BIT_ULL(0)
  26. #define KVM_STEAL_PHYS_MASK GENMASK_ULL(63, 6)
  27. struct kvm_steal_time {
  28. __u64 steal;
  29. __u32 version;
  30. __u32 flags;
  31. __u8 preempted;
  32. __u8 pad[47];
  33. };
  34. #define KVM_VCPU_PREEMPTED (1 << 0)
  35. /*
  36. * Hypercall interface for KVM hypervisor
  37. *
  38. * a0: function identifier
  39. * a1-a5: args
  40. * Return value will be placed in a0.
  41. * Up to 5 arguments are passed in a1, a2, a3, a4, a5.
  42. */
  43. static __always_inline long kvm_hypercall0(u64 fid)
  44. {
  45. register long ret asm("a0");
  46. register unsigned long fun asm("a0") = fid;
  47. __asm__ __volatile__(
  48. "hvcl "__stringify(KVM_HCALL_SERVICE)
  49. : "=r" (ret)
  50. : "r" (fun)
  51. : "memory"
  52. );
  53. return ret;
  54. }
  55. static __always_inline long kvm_hypercall1(u64 fid, unsigned long arg0)
  56. {
  57. register long ret asm("a0");
  58. register unsigned long fun asm("a0") = fid;
  59. register unsigned long a1 asm("a1") = arg0;
  60. __asm__ __volatile__(
  61. "hvcl "__stringify(KVM_HCALL_SERVICE)
  62. : "=r" (ret)
  63. : "r" (fun), "r" (a1)
  64. : "memory"
  65. );
  66. return ret;
  67. }
  68. static __always_inline long kvm_hypercall2(u64 fid,
  69. unsigned long arg0, unsigned long arg1)
  70. {
  71. register long ret asm("a0");
  72. register unsigned long fun asm("a0") = fid;
  73. register unsigned long a1 asm("a1") = arg0;
  74. register unsigned long a2 asm("a2") = arg1;
  75. __asm__ __volatile__(
  76. "hvcl "__stringify(KVM_HCALL_SERVICE)
  77. : "=r" (ret)
  78. : "r" (fun), "r" (a1), "r" (a2)
  79. : "memory"
  80. );
  81. return ret;
  82. }
  83. static __always_inline long kvm_hypercall3(u64 fid,
  84. unsigned long arg0, unsigned long arg1, unsigned long arg2)
  85. {
  86. register long ret asm("a0");
  87. register unsigned long fun asm("a0") = fid;
  88. register unsigned long a1 asm("a1") = arg0;
  89. register unsigned long a2 asm("a2") = arg1;
  90. register unsigned long a3 asm("a3") = arg2;
  91. __asm__ __volatile__(
  92. "hvcl "__stringify(KVM_HCALL_SERVICE)
  93. : "=r" (ret)
  94. : "r" (fun), "r" (a1), "r" (a2), "r" (a3)
  95. : "memory"
  96. );
  97. return ret;
  98. }
  99. static __always_inline long kvm_hypercall4(u64 fid,
  100. unsigned long arg0, unsigned long arg1,
  101. unsigned long arg2, unsigned long arg3)
  102. {
  103. register long ret asm("a0");
  104. register unsigned long fun asm("a0") = fid;
  105. register unsigned long a1 asm("a1") = arg0;
  106. register unsigned long a2 asm("a2") = arg1;
  107. register unsigned long a3 asm("a3") = arg2;
  108. register unsigned long a4 asm("a4") = arg3;
  109. __asm__ __volatile__(
  110. "hvcl "__stringify(KVM_HCALL_SERVICE)
  111. : "=r" (ret)
  112. : "r"(fun), "r" (a1), "r" (a2), "r" (a3), "r" (a4)
  113. : "memory"
  114. );
  115. return ret;
  116. }
  117. static __always_inline long kvm_hypercall5(u64 fid,
  118. unsigned long arg0, unsigned long arg1,
  119. unsigned long arg2, unsigned long arg3, unsigned long arg4)
  120. {
  121. register long ret asm("a0");
  122. register unsigned long fun asm("a0") = fid;
  123. register unsigned long a1 asm("a1") = arg0;
  124. register unsigned long a2 asm("a2") = arg1;
  125. register unsigned long a3 asm("a3") = arg2;
  126. register unsigned long a4 asm("a4") = arg3;
  127. register unsigned long a5 asm("a5") = arg4;
  128. __asm__ __volatile__(
  129. "hvcl "__stringify(KVM_HCALL_SERVICE)
  130. : "=r" (ret)
  131. : "r"(fun), "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5)
  132. : "memory"
  133. );
  134. return ret;
  135. }
  136. #ifdef CONFIG_PARAVIRT
  137. bool kvm_para_available(void);
  138. unsigned int kvm_arch_para_features(void);
  139. #else
  140. static inline bool kvm_para_available(void)
  141. {
  142. return false;
  143. }
  144. static inline unsigned int kvm_arch_para_features(void)
  145. {
  146. return 0;
  147. }
  148. #endif
  149. static inline unsigned int kvm_arch_para_hints(void)
  150. {
  151. return 0;
  152. }
  153. static inline bool kvm_check_and_clear_guest_paused(void)
  154. {
  155. return false;
  156. }
  157. #endif /* _ASM_LOONGARCH_KVM_PARA_H */