kvm_para.h 4.2 KB

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