xen.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright © 2019 Oracle and/or its affiliates. All rights reserved.
  4. * Copyright © 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
  5. *
  6. * KVM Xen emulation
  7. */
  8. #ifndef __ARCH_X86_KVM_XEN_H__
  9. #define __ARCH_X86_KVM_XEN_H__
  10. #include <asm/xen/hypervisor.h>
  11. #ifdef CONFIG_KVM_XEN
  12. #include <linux/jump_label_ratelimit.h>
  13. extern struct static_key_false_deferred kvm_xen_enabled;
  14. int __kvm_xen_has_interrupt(struct kvm_vcpu *vcpu);
  15. void kvm_xen_inject_pending_events(struct kvm_vcpu *vcpu);
  16. void kvm_xen_inject_vcpu_vector(struct kvm_vcpu *vcpu);
  17. int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data);
  18. int kvm_xen_vcpu_get_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data);
  19. int kvm_xen_hvm_set_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data);
  20. int kvm_xen_hvm_get_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data);
  21. int kvm_xen_hvm_evtchn_send(struct kvm *kvm, struct kvm_irq_routing_xen_evtchn *evt);
  22. int kvm_xen_write_hypercall_page(struct kvm_vcpu *vcpu, u64 data);
  23. int kvm_xen_hvm_config(struct kvm *kvm, struct kvm_xen_hvm_config *xhc);
  24. void kvm_xen_init_vm(struct kvm *kvm);
  25. void kvm_xen_destroy_vm(struct kvm *kvm);
  26. void kvm_xen_init_vcpu(struct kvm_vcpu *vcpu);
  27. void kvm_xen_destroy_vcpu(struct kvm_vcpu *vcpu);
  28. int kvm_xen_set_evtchn_fast(struct kvm_xen_evtchn *xe,
  29. struct kvm *kvm);
  30. int kvm_xen_setup_evtchn(struct kvm *kvm,
  31. struct kvm_kernel_irq_routing_entry *e,
  32. const struct kvm_irq_routing_entry *ue);
  33. void kvm_xen_update_tsc_info(struct kvm_vcpu *vcpu);
  34. static inline void kvm_xen_sw_enable_lapic(struct kvm_vcpu *vcpu)
  35. {
  36. /*
  37. * The local APIC is being enabled. If the per-vCPU upcall vector is
  38. * set and the vCPU's evtchn_upcall_pending flag is set, inject the
  39. * interrupt.
  40. */
  41. if (static_branch_unlikely(&kvm_xen_enabled.key) &&
  42. vcpu->arch.xen.vcpu_info_cache.active &&
  43. vcpu->arch.xen.upcall_vector && __kvm_xen_has_interrupt(vcpu))
  44. kvm_xen_inject_vcpu_vector(vcpu);
  45. }
  46. static inline bool kvm_xen_msr_enabled(struct kvm *kvm)
  47. {
  48. return static_branch_unlikely(&kvm_xen_enabled.key) &&
  49. kvm->arch.xen_hvm_config.msr;
  50. }
  51. static inline bool kvm_xen_hypercall_enabled(struct kvm *kvm)
  52. {
  53. return static_branch_unlikely(&kvm_xen_enabled.key) &&
  54. (kvm->arch.xen_hvm_config.flags &
  55. KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL);
  56. }
  57. static inline int kvm_xen_has_interrupt(struct kvm_vcpu *vcpu)
  58. {
  59. if (static_branch_unlikely(&kvm_xen_enabled.key) &&
  60. vcpu->arch.xen.vcpu_info_cache.active &&
  61. vcpu->kvm->arch.xen.upcall_vector)
  62. return __kvm_xen_has_interrupt(vcpu);
  63. return 0;
  64. }
  65. static inline bool kvm_xen_has_pending_events(struct kvm_vcpu *vcpu)
  66. {
  67. return static_branch_unlikely(&kvm_xen_enabled.key) &&
  68. vcpu->arch.xen.evtchn_pending_sel;
  69. }
  70. static inline bool kvm_xen_timer_enabled(struct kvm_vcpu *vcpu)
  71. {
  72. return !!vcpu->arch.xen.timer_virq;
  73. }
  74. static inline int kvm_xen_has_pending_timer(struct kvm_vcpu *vcpu)
  75. {
  76. if (kvm_xen_hypercall_enabled(vcpu->kvm) && kvm_xen_timer_enabled(vcpu))
  77. return atomic_read(&vcpu->arch.xen.timer_pending);
  78. return 0;
  79. }
  80. void kvm_xen_inject_timer_irqs(struct kvm_vcpu *vcpu);
  81. #else
  82. static inline int kvm_xen_write_hypercall_page(struct kvm_vcpu *vcpu, u64 data)
  83. {
  84. return 1;
  85. }
  86. static inline void kvm_xen_init_vm(struct kvm *kvm)
  87. {
  88. }
  89. static inline void kvm_xen_destroy_vm(struct kvm *kvm)
  90. {
  91. }
  92. static inline void kvm_xen_init_vcpu(struct kvm_vcpu *vcpu)
  93. {
  94. }
  95. static inline void kvm_xen_destroy_vcpu(struct kvm_vcpu *vcpu)
  96. {
  97. }
  98. static inline void kvm_xen_sw_enable_lapic(struct kvm_vcpu *vcpu)
  99. {
  100. }
  101. static inline bool kvm_xen_msr_enabled(struct kvm *kvm)
  102. {
  103. return false;
  104. }
  105. static inline bool kvm_xen_hypercall_enabled(struct kvm *kvm)
  106. {
  107. return false;
  108. }
  109. static inline int kvm_xen_has_interrupt(struct kvm_vcpu *vcpu)
  110. {
  111. return 0;
  112. }
  113. static inline void kvm_xen_inject_pending_events(struct kvm_vcpu *vcpu)
  114. {
  115. }
  116. static inline bool kvm_xen_has_pending_events(struct kvm_vcpu *vcpu)
  117. {
  118. return false;
  119. }
  120. static inline int kvm_xen_has_pending_timer(struct kvm_vcpu *vcpu)
  121. {
  122. return 0;
  123. }
  124. static inline void kvm_xen_inject_timer_irqs(struct kvm_vcpu *vcpu)
  125. {
  126. }
  127. static inline bool kvm_xen_timer_enabled(struct kvm_vcpu *vcpu)
  128. {
  129. return false;
  130. }
  131. static inline void kvm_xen_update_tsc_info(struct kvm_vcpu *vcpu)
  132. {
  133. }
  134. #endif
  135. int kvm_xen_hypercall(struct kvm_vcpu *vcpu);
  136. #include <asm/pvclock-abi.h>
  137. #include <asm/xen/interface.h>
  138. #include <xen/interface/vcpu.h>
  139. void kvm_xen_update_runstate(struct kvm_vcpu *vcpu, int state);
  140. static inline void kvm_xen_runstate_set_running(struct kvm_vcpu *vcpu)
  141. {
  142. kvm_xen_update_runstate(vcpu, RUNSTATE_running);
  143. }
  144. static inline void kvm_xen_runstate_set_preempted(struct kvm_vcpu *vcpu)
  145. {
  146. /*
  147. * If the vCPU wasn't preempted but took a normal exit for
  148. * some reason (hypercalls, I/O, etc.), that is accounted as
  149. * still RUNSTATE_running, as the VMM is still operating on
  150. * behalf of the vCPU. Only if the VMM does actually block
  151. * does it need to enter RUNSTATE_blocked.
  152. */
  153. if (WARN_ON_ONCE(!vcpu->preempted))
  154. return;
  155. kvm_xen_update_runstate(vcpu, RUNSTATE_runnable);
  156. }
  157. /* 32-bit compatibility definitions, also used natively in 32-bit build */
  158. struct compat_arch_vcpu_info {
  159. unsigned int cr2;
  160. unsigned int pad[5];
  161. };
  162. struct compat_vcpu_info {
  163. uint8_t evtchn_upcall_pending;
  164. uint8_t evtchn_upcall_mask;
  165. uint16_t pad;
  166. uint32_t evtchn_pending_sel;
  167. struct compat_arch_vcpu_info arch;
  168. struct pvclock_vcpu_time_info time;
  169. }; /* 64 bytes (x86) */
  170. struct compat_arch_shared_info {
  171. unsigned int max_pfn;
  172. unsigned int pfn_to_mfn_frame_list_list;
  173. unsigned int nmi_reason;
  174. unsigned int p2m_cr3;
  175. unsigned int p2m_vaddr;
  176. unsigned int p2m_generation;
  177. uint32_t wc_sec_hi;
  178. };
  179. struct compat_shared_info {
  180. struct compat_vcpu_info vcpu_info[MAX_VIRT_CPUS];
  181. uint32_t evtchn_pending[32];
  182. uint32_t evtchn_mask[32];
  183. struct pvclock_wall_clock wc;
  184. struct compat_arch_shared_info arch;
  185. };
  186. #define COMPAT_EVTCHN_2L_NR_CHANNELS (8 * \
  187. sizeof_field(struct compat_shared_info, \
  188. evtchn_pending))
  189. struct compat_vcpu_runstate_info {
  190. int state;
  191. uint64_t state_entry_time;
  192. uint64_t time[4];
  193. } __attribute__((packed));
  194. struct compat_sched_poll {
  195. /* This is actually a guest virtual address which points to ports. */
  196. uint32_t ports;
  197. unsigned int nr_ports;
  198. uint64_t timeout;
  199. };
  200. #endif /* __ARCH_X86_KVM_XEN_H__ */