xref: /openbmc/linux/include/linux/kvm_host.h (revision 8c82a0b3ba1a411b84af5d43a4cc5994efa897ec)
120c8ccb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2edf88417SAvi Kivity #ifndef __KVM_HOST_H
3edf88417SAvi Kivity #define __KVM_HOST_H
4edf88417SAvi Kivity 
5edf88417SAvi Kivity 
6edf88417SAvi Kivity #include <linux/types.h>
7edf88417SAvi Kivity #include <linux/hardirq.h>
8edf88417SAvi Kivity #include <linux/list.h>
9edf88417SAvi Kivity #include <linux/mutex.h>
10edf88417SAvi Kivity #include <linux/spinlock.h>
11edf88417SAvi Kivity #include <linux/signal.h>
12edf88417SAvi Kivity #include <linux/sched.h>
136bd5b743SWanpeng Li #include <linux/sched/stat.h>
14187f1882SPaul Gortmaker #include <linux/bug.h>
154a42d848SDavid Stevens #include <linux/minmax.h>
16edf88417SAvi Kivity #include <linux/mm.h>
17b297e672SEric B Munson #include <linux/mmu_notifier.h>
18edf88417SAvi Kivity #include <linux/preempt.h>
190937c48dSSheng Yang #include <linux/msi.h>
20d89f5effSJan Kiszka #include <linux/slab.h>
21d1e5b0e9SMarc Orr #include <linux/vmalloc.h>
22bd2b53b2SMichael S. Tsirkin #include <linux/rcupdate.h>
23bd80158aSJan Kiszka #include <linux/ratelimit.h>
2483f09228SXiao Guangrong #include <linux/err.h>
25c11f11fcSFrederic Weisbecker #include <linux/irqflags.h>
26521921baSFrederic Weisbecker #include <linux/context_tracking.h>
271a02b270SEric Auger #include <linux/irqbypass.h>
28da4ad88cSDavidlohr Bueso #include <linux/rcuwait.h>
29e3736c3eSElena Reshetova #include <linux/refcount.h>
301d487e9bSPaolo Bonzini #include <linux/nospec.h>
312fdef3a2SSergey Senozhatsky #include <linux/notifier.h>
32ef9989afSMark Rutland #include <linux/ftrace.h>
3326b8345aSMaciej S. Szmigiero #include <linux/hashtable.h>
34ef9989afSMark Rutland #include <linux/instrumentation.h>
35ed922739SMaciej S. Szmigiero #include <linux/interval_tree.h>
36a54d8066SMaciej S. Szmigiero #include <linux/rbtree.h>
37c5b07754SMarc Zyngier #include <linux/xarray.h>
38edf88417SAvi Kivity #include <asm/signal.h>
39edf88417SAvi Kivity 
40edf88417SAvi Kivity #include <linux/kvm.h>
41edf88417SAvi Kivity #include <linux/kvm_para.h>
42edf88417SAvi Kivity 
43edf88417SAvi Kivity #include <linux/kvm_types.h>
44edf88417SAvi Kivity 
45edf88417SAvi Kivity #include <asm/kvm_host.h>
46fb04a1edSPeter Xu #include <linux/kvm_dirty_ring.h>
47edf88417SAvi Kivity 
48a1c42ddeSJuergen Gross #ifndef KVM_MAX_VCPU_IDS
49a1c42ddeSJuergen Gross #define KVM_MAX_VCPU_IDS KVM_MAX_VCPUS
500b1b1dfdSGreg Kurz #endif
510b1b1dfdSGreg Kurz 
52edf88417SAvi Kivity /*
5367b29204SXiao Guangrong  * The bit 16 ~ bit 31 of kvm_memory_region::flags are internally used
5467b29204SXiao Guangrong  * in kvm, other bits are visible for userspace which are defined in
5567b29204SXiao Guangrong  * include/linux/kvm_h.
5667b29204SXiao Guangrong  */
5767b29204SXiao Guangrong #define KVM_MEMSLOT_INVALID	(1UL << 16)
5867b29204SXiao Guangrong 
59361209e0SSean Christopherson /*
60164bf7e5SSean Christopherson  * Bit 63 of the memslot generation number is an "update in-progress flag",
61361209e0SSean Christopherson  * e.g. is temporarily set for the duration of install_new_memslots().
62361209e0SSean Christopherson  * This flag effectively creates a unique generation number that is used to
63361209e0SSean Christopherson  * mark cached memslot data, e.g. MMIO accesses, as potentially being stale,
64361209e0SSean Christopherson  * i.e. may (or may not) have come from the previous memslots generation.
65361209e0SSean Christopherson  *
66361209e0SSean Christopherson  * This is necessary because the actual memslots update is not atomic with
67361209e0SSean Christopherson  * respect to the generation number update.  Updating the generation number
68361209e0SSean Christopherson  * first would allow a vCPU to cache a spte from the old memslots using the
69361209e0SSean Christopherson  * new generation number, and updating the generation number after switching
70361209e0SSean Christopherson  * to the new memslots would allow cache hits using the old generation number
71361209e0SSean Christopherson  * to reference the defunct memslots.
72361209e0SSean Christopherson  *
73361209e0SSean Christopherson  * This mechanism is used to prevent getting hits in KVM's caches while a
74361209e0SSean Christopherson  * memslot update is in-progress, and to prevent cache hits *after* updating
75361209e0SSean Christopherson  * the actual generation number against accesses that were inserted into the
76361209e0SSean Christopherson  * cache *before* the memslots were updated.
77361209e0SSean Christopherson  */
78164bf7e5SSean Christopherson #define KVM_MEMSLOT_GEN_UPDATE_IN_PROGRESS	BIT_ULL(63)
79361209e0SSean Christopherson 
8087da7e66SXiao Guangrong /* Two fragments for cross MMIO pages. */
8187da7e66SXiao Guangrong #define KVM_MAX_MMIO_FRAGMENTS	2
82f78146b0SAvi Kivity 
83f481b069SPaolo Bonzini #ifndef KVM_ADDRESS_SPACE_NUM
84f481b069SPaolo Bonzini #define KVM_ADDRESS_SPACE_NUM	1
85f481b069SPaolo Bonzini #endif
86f481b069SPaolo Bonzini 
87f78146b0SAvi Kivity /*
889c5b1172SXiao Guangrong  * For the normal pfn, the highest 12 bits should be zero,
8981c52c56SXiao Guangrong  * so we can mask bit 62 ~ bit 52  to indicate the error pfn,
9081c52c56SXiao Guangrong  * mask bit 63 to indicate the noslot pfn.
919c5b1172SXiao Guangrong  */
9281c52c56SXiao Guangrong #define KVM_PFN_ERR_MASK	(0x7ffULL << 52)
9381c52c56SXiao Guangrong #define KVM_PFN_ERR_NOSLOT_MASK	(0xfffULL << 52)
9481c52c56SXiao Guangrong #define KVM_PFN_NOSLOT		(0x1ULL << 63)
956c8ee57bSXiao Guangrong 
969c5b1172SXiao Guangrong #define KVM_PFN_ERR_FAULT	(KVM_PFN_ERR_MASK)
979c5b1172SXiao Guangrong #define KVM_PFN_ERR_HWPOISON	(KVM_PFN_ERR_MASK + 1)
9881c52c56SXiao Guangrong #define KVM_PFN_ERR_RO_FAULT	(KVM_PFN_ERR_MASK + 2)
99fe5ed56cSPeter Xu #define KVM_PFN_ERR_SIGPENDING	(KVM_PFN_ERR_MASK + 3)
1009c5b1172SXiao Guangrong 
10181c52c56SXiao Guangrong /*
10281c52c56SXiao Guangrong  * error pfns indicate that the gfn is in slot but faild to
10381c52c56SXiao Guangrong  * translate it to pfn on host.
10481c52c56SXiao Guangrong  */
105ba049e93SDan Williams static inline bool is_error_pfn(kvm_pfn_t pfn)
10683f09228SXiao Guangrong {
1079c5b1172SXiao Guangrong 	return !!(pfn & KVM_PFN_ERR_MASK);
10883f09228SXiao Guangrong }
10983f09228SXiao Guangrong 
11081c52c56SXiao Guangrong /*
111fe5ed56cSPeter Xu  * KVM_PFN_ERR_SIGPENDING indicates that fetching the PFN was interrupted
112fe5ed56cSPeter Xu  * by a pending signal.  Note, the signal may or may not be fatal.
113fe5ed56cSPeter Xu  */
114fe5ed56cSPeter Xu static inline bool is_sigpending_pfn(kvm_pfn_t pfn)
115fe5ed56cSPeter Xu {
116fe5ed56cSPeter Xu 	return pfn == KVM_PFN_ERR_SIGPENDING;
117fe5ed56cSPeter Xu }
118fe5ed56cSPeter Xu 
119fe5ed56cSPeter Xu /*
12081c52c56SXiao Guangrong  * error_noslot pfns indicate that the gfn can not be
12181c52c56SXiao Guangrong  * translated to pfn - it is not in slot or failed to
12281c52c56SXiao Guangrong  * translate it to pfn.
12381c52c56SXiao Guangrong  */
124ba049e93SDan Williams static inline bool is_error_noslot_pfn(kvm_pfn_t pfn)
12583f09228SXiao Guangrong {
12681c52c56SXiao Guangrong 	return !!(pfn & KVM_PFN_ERR_NOSLOT_MASK);
12783f09228SXiao Guangrong }
12883f09228SXiao Guangrong 
12981c52c56SXiao Guangrong /* noslot pfn indicates that the gfn is not in slot. */
130ba049e93SDan Williams static inline bool is_noslot_pfn(kvm_pfn_t pfn)
13183f09228SXiao Guangrong {
13281c52c56SXiao Guangrong 	return pfn == KVM_PFN_NOSLOT;
13383f09228SXiao Guangrong }
13483f09228SXiao Guangrong 
135bf640876SDominik Dingel /*
136bf640876SDominik Dingel  * architectures with KVM_HVA_ERR_BAD other than PAGE_OFFSET (e.g. s390)
137bf640876SDominik Dingel  * provide own defines and kvm_is_error_hva
138bf640876SDominik Dingel  */
139bf640876SDominik Dingel #ifndef KVM_HVA_ERR_BAD
140bf640876SDominik Dingel 
141ca3a490cSXiao Guangrong #define KVM_HVA_ERR_BAD		(PAGE_OFFSET)
1427068d097SXiao Guangrong #define KVM_HVA_ERR_RO_BAD	(PAGE_OFFSET + PAGE_SIZE)
143ca3a490cSXiao Guangrong 
144ca3a490cSXiao Guangrong static inline bool kvm_is_error_hva(unsigned long addr)
145ca3a490cSXiao Guangrong {
1467068d097SXiao Guangrong 	return addr >= PAGE_OFFSET;
147ca3a490cSXiao Guangrong }
148ca3a490cSXiao Guangrong 
149bf640876SDominik Dingel #endif
150bf640876SDominik Dingel 
1516cede2e6SXiao Guangrong #define KVM_ERR_PTR_BAD_PAGE	(ERR_PTR(-ENOENT))
1526cede2e6SXiao Guangrong 
1539c5b1172SXiao Guangrong static inline bool is_error_page(struct page *page)
1546cede2e6SXiao Guangrong {
1556cede2e6SXiao Guangrong 	return IS_ERR(page);
1566cede2e6SXiao Guangrong }
1576cede2e6SXiao Guangrong 
158930f7fd6SRadim Krčmář #define KVM_REQUEST_MASK           GENMASK(7,0)
159930f7fd6SRadim Krčmář #define KVM_REQUEST_NO_WAKEUP      BIT(8)
1607a97cec2SPaolo Bonzini #define KVM_REQUEST_WAIT           BIT(9)
161df06dae3SSean Christopherson #define KVM_REQUEST_NO_ACTION      BIT(10)
162edf88417SAvi Kivity /*
1632860c4b1SPaolo Bonzini  * Architecture-independent vcpu->requests bit members
164c59fb127SPaolo Bonzini  * Bits 3-7 are reserved for more arch-independent bits.
165edf88417SAvi Kivity  */
1667a97cec2SPaolo Bonzini #define KVM_REQ_TLB_FLUSH         (0 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
167e65a3b46SSean Christopherson #define KVM_REQ_VM_DEAD           (1 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
168084071d5SMarcelo Tosatti #define KVM_REQ_UNBLOCK           2
1692387149eSAndrew Jones #define KVM_REQUEST_ARCH_BASE     8
1702387149eSAndrew Jones 
171df06dae3SSean Christopherson /*
172df06dae3SSean Christopherson  * KVM_REQ_OUTSIDE_GUEST_MODE exists is purely as way to force the vCPU to
173df06dae3SSean Christopherson  * OUTSIDE_GUEST_MODE.  KVM_REQ_OUTSIDE_GUEST_MODE differs from a vCPU "kick"
174df06dae3SSean Christopherson  * in that it ensures the vCPU has reached OUTSIDE_GUEST_MODE before continuing
175df06dae3SSean Christopherson  * on.  A kick only guarantees that the vCPU is on its way out, e.g. a previous
176df06dae3SSean Christopherson  * kick may have set vcpu->mode to EXITING_GUEST_MODE, and so there's no
177df06dae3SSean Christopherson  * guarantee the vCPU received an IPI and has actually exited guest mode.
178df06dae3SSean Christopherson  */
179df06dae3SSean Christopherson #define KVM_REQ_OUTSIDE_GUEST_MODE	(KVM_REQUEST_NO_ACTION | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
180df06dae3SSean Christopherson 
1812387149eSAndrew Jones #define KVM_ARCH_REQ_FLAGS(nr, flags) ({ \
182c593642cSPankaj Bharadiya 	BUILD_BUG_ON((unsigned)(nr) >= (sizeof_field(struct kvm_vcpu, requests) * 8) - KVM_REQUEST_ARCH_BASE); \
1832387149eSAndrew Jones 	(unsigned)(((nr) + KVM_REQUEST_ARCH_BASE) | (flags)); \
1842387149eSAndrew Jones })
1852387149eSAndrew Jones #define KVM_ARCH_REQ(nr)           KVM_ARCH_REQ_FLAGS(nr, 0)
1860cd31043SPaolo Bonzini 
1877ee3e8c3SSean Christopherson bool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req,
188620b2438SVitaly Kuznetsov 				 unsigned long *vcpu_bitmap);
1897ee3e8c3SSean Christopherson bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req);
1907ee3e8c3SSean Christopherson bool kvm_make_all_cpus_request_except(struct kvm *kvm, unsigned int req,
1917ee3e8c3SSean Christopherson 				      struct kvm_vcpu *except);
1927ee3e8c3SSean Christopherson bool kvm_make_cpus_request_mask(struct kvm *kvm, unsigned int req,
1937ee3e8c3SSean Christopherson 				unsigned long *vcpu_bitmap);
1947ee3e8c3SSean Christopherson 
1955550af4dSSheng Yang #define KVM_USERSPACE_IRQ_SOURCE_ID		0
1967a84428aSAlex Williamson #define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID	1
1975550af4dSSheng Yang 
1980d9ce162SJunaid Shahid extern struct mutex kvm_lock;
199fc1b7492SGeoff Levand extern struct list_head vm_list;
200fc1b7492SGeoff Levand 
201743eeb0bSSasha Levin struct kvm_io_range {
202743eeb0bSSasha Levin 	gpa_t addr;
203743eeb0bSSasha Levin 	int len;
204743eeb0bSSasha Levin 	struct kvm_io_device *dev;
205743eeb0bSSasha Levin };
206743eeb0bSSasha Levin 
207786a9f88SAmos Kong #define NR_IOBUS_DEVS 1000
208a1300716SAmos Kong 
209edf88417SAvi Kivity struct kvm_io_bus {
210edf88417SAvi Kivity 	int dev_count;
2116ea34c9bSAmos Kong 	int ioeventfd_count;
212a1300716SAmos Kong 	struct kvm_io_range range[];
213edf88417SAvi Kivity };
214edf88417SAvi Kivity 
215e93f8a0fSMarcelo Tosatti enum kvm_bus {
216e93f8a0fSMarcelo Tosatti 	KVM_MMIO_BUS,
217e93f8a0fSMarcelo Tosatti 	KVM_PIO_BUS,
218060f0ce6SCornelia Huck 	KVM_VIRTIO_CCW_NOTIFY_BUS,
21968c3b4d1SMichael S. Tsirkin 	KVM_FAST_MMIO_BUS,
220e93f8a0fSMarcelo Tosatti 	KVM_NR_BUSES
221e93f8a0fSMarcelo Tosatti };
222e93f8a0fSMarcelo Tosatti 
223e32edf4fSNikolay Nikolaev int kvm_io_bus_write(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx, gpa_t addr,
224e93f8a0fSMarcelo Tosatti 		     int len, const void *val);
225e32edf4fSNikolay Nikolaev int kvm_io_bus_write_cookie(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx,
226e32edf4fSNikolay Nikolaev 			    gpa_t addr, int len, const void *val, long cookie);
227e32edf4fSNikolay Nikolaev int kvm_io_bus_read(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx, gpa_t addr,
228e32edf4fSNikolay Nikolaev 		    int len, void *val);
229743eeb0bSSasha Levin int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr,
230743eeb0bSSasha Levin 			    int len, struct kvm_io_device *dev);
2315d3c4c79SSean Christopherson int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,
232edf88417SAvi Kivity 			      struct kvm_io_device *dev);
2338a39d006SAndre Przywara struct kvm_io_device *kvm_io_bus_get_dev(struct kvm *kvm, enum kvm_bus bus_idx,
2348a39d006SAndre Przywara 					 gpa_t addr);
235edf88417SAvi Kivity 
236af585b92SGleb Natapov #ifdef CONFIG_KVM_ASYNC_PF
237af585b92SGleb Natapov struct kvm_async_pf {
238af585b92SGleb Natapov 	struct work_struct work;
239af585b92SGleb Natapov 	struct list_head link;
240af585b92SGleb Natapov 	struct list_head queue;
241af585b92SGleb Natapov 	struct kvm_vcpu *vcpu;
242af585b92SGleb Natapov 	struct mm_struct *mm;
243736c291cSSean Christopherson 	gpa_t cr2_or_gpa;
244af585b92SGleb Natapov 	unsigned long addr;
245af585b92SGleb Natapov 	struct kvm_arch_async_pf arch;
246f2e10669Schai wen 	bool   wakeup_all;
2472a18b7e7SVitaly Kuznetsov 	bool notpresent_injected;
248af585b92SGleb Natapov };
249af585b92SGleb Natapov 
250af585b92SGleb Natapov void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu);
251af585b92SGleb Natapov void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu);
252e8c22266SVitaly Kuznetsov bool kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa,
253736c291cSSean Christopherson 			unsigned long hva, struct kvm_arch_async_pf *arch);
254344d9588SGleb Natapov int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu);
255af585b92SGleb Natapov #endif
256af585b92SGleb Natapov 
2575f7c292bSSean Christopherson #ifdef KVM_ARCH_WANT_MMU_NOTIFIER
2583039bcc7SSean Christopherson struct kvm_gfn_range {
2593039bcc7SSean Christopherson 	struct kvm_memory_slot *slot;
2603039bcc7SSean Christopherson 	gfn_t start;
2613039bcc7SSean Christopherson 	gfn_t end;
2623039bcc7SSean Christopherson 	pte_t pte;
2633039bcc7SSean Christopherson 	bool may_block;
2643039bcc7SSean Christopherson };
2653039bcc7SSean Christopherson bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range);
2663039bcc7SSean Christopherson bool kvm_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range);
2673039bcc7SSean Christopherson bool kvm_test_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range);
2683039bcc7SSean Christopherson bool kvm_set_spte_gfn(struct kvm *kvm, struct kvm_gfn_range *range);
2695f7c292bSSean Christopherson #endif
2705f7c292bSSean Christopherson 
2716b7e2d09SXiao Guangrong enum {
2726b7e2d09SXiao Guangrong 	OUTSIDE_GUEST_MODE,
2736b7e2d09SXiao Guangrong 	IN_GUEST_MODE,
274c142786cSAvi Kivity 	EXITING_GUEST_MODE,
275c142786cSAvi Kivity 	READING_SHADOW_PAGE_TABLES,
2766b7e2d09SXiao Guangrong };
2776b7e2d09SXiao Guangrong 
278e45adf66SKarimAllah Ahmed #define KVM_UNMAPPED_PAGE	((void *) 0x500 + POISON_POINTER_DELTA)
279e45adf66SKarimAllah Ahmed 
280e45adf66SKarimAllah Ahmed struct kvm_host_map {
281e45adf66SKarimAllah Ahmed 	/*
282e45adf66SKarimAllah Ahmed 	 * Only valid if the 'pfn' is managed by the host kernel (i.e. There is
283e45adf66SKarimAllah Ahmed 	 * a 'struct page' for it. When using mem= kernel parameter some memory
284e45adf66SKarimAllah Ahmed 	 * can be used as guest memory but they are not managed by host
285e45adf66SKarimAllah Ahmed 	 * kernel).
286e45adf66SKarimAllah Ahmed 	 * If 'pfn' is not managed by the host kernel, this field is
287e45adf66SKarimAllah Ahmed 	 * initialized to KVM_UNMAPPED_PAGE.
288e45adf66SKarimAllah Ahmed 	 */
289e45adf66SKarimAllah Ahmed 	struct page *page;
290e45adf66SKarimAllah Ahmed 	void *hva;
291e45adf66SKarimAllah Ahmed 	kvm_pfn_t pfn;
292e45adf66SKarimAllah Ahmed 	kvm_pfn_t gfn;
293e45adf66SKarimAllah Ahmed };
294e45adf66SKarimAllah Ahmed 
295e45adf66SKarimAllah Ahmed /*
296e45adf66SKarimAllah Ahmed  * Used to check if the mapping is valid or not. Never use 'kvm_host_map'
297e45adf66SKarimAllah Ahmed  * directly to check for that.
298e45adf66SKarimAllah Ahmed  */
299e45adf66SKarimAllah Ahmed static inline bool kvm_vcpu_mapped(struct kvm_host_map *map)
300e45adf66SKarimAllah Ahmed {
301e45adf66SKarimAllah Ahmed 	return !!map->hva;
302e45adf66SKarimAllah Ahmed }
303e45adf66SKarimAllah Ahmed 
3046bd5b743SWanpeng Li static inline bool kvm_vcpu_can_poll(ktime_t cur, ktime_t stop)
3056bd5b743SWanpeng Li {
3066bd5b743SWanpeng Li 	return single_task_running() && !need_resched() && ktime_before(cur, stop);
3076bd5b743SWanpeng Li }
3086bd5b743SWanpeng Li 
309f78146b0SAvi Kivity /*
310f78146b0SAvi Kivity  * Sometimes a large or cross-page mmio needs to be broken up into separate
311f78146b0SAvi Kivity  * exits for userspace servicing.
312f78146b0SAvi Kivity  */
313f78146b0SAvi Kivity struct kvm_mmio_fragment {
314f78146b0SAvi Kivity 	gpa_t gpa;
315f78146b0SAvi Kivity 	void *data;
316f78146b0SAvi Kivity 	unsigned len;
317f78146b0SAvi Kivity };
318f78146b0SAvi Kivity 
319edf88417SAvi Kivity struct kvm_vcpu {
320edf88417SAvi Kivity 	struct kvm *kvm;
32131bb117eSHollis Blanchard #ifdef CONFIG_PREEMPT_NOTIFIERS
322edf88417SAvi Kivity 	struct preempt_notifier preempt_notifier;
32331bb117eSHollis Blanchard #endif
324edf88417SAvi Kivity 	int cpu;
3258750e72aSRadim Krčmář 	int vcpu_id; /* id given by userspace at creation */
3268750e72aSRadim Krčmář 	int vcpu_idx; /* index in kvm->vcpus array */
3272031f287SSean Christopherson 	int ____srcu_idx; /* Don't use this directly.  You've been warned. */
3282031f287SSean Christopherson #ifdef CONFIG_PROVE_RCU
3292031f287SSean Christopherson 	int srcu_depth;
3302031f287SSean Christopherson #endif
3316b7e2d09SXiao Guangrong 	int mode;
33286dafed5SKarimAllah Ahmed 	u64 requests;
333d0bfb940SJan Kiszka 	unsigned long guest_debug;
3346b7e2d09SXiao Guangrong 
3356b7e2d09SXiao Guangrong 	struct mutex mutex;
3366b7e2d09SXiao Guangrong 	struct kvm_run *run;
337f656ce01SMarcelo Tosatti 
338510958e9SSean Christopherson #ifndef __KVM_HAVE_ARCH_WQP
339da4ad88cSDavidlohr Bueso 	struct rcuwait wait;
340510958e9SSean Christopherson #endif
3410e4524a5SChristian Borntraeger 	struct pid __rcu *pid;
342edf88417SAvi Kivity 	int sigset_active;
343edf88417SAvi Kivity 	sigset_t sigset;
34419020f8aSWanpeng Li 	unsigned int halt_poll_ns;
3453491caf2SChristian Borntraeger 	bool valid_wakeup;
346edf88417SAvi Kivity 
347edf88417SAvi Kivity #ifdef CONFIG_HAS_IOMEM
348edf88417SAvi Kivity 	int mmio_needed;
349edf88417SAvi Kivity 	int mmio_read_completed;
350edf88417SAvi Kivity 	int mmio_is_write;
351f78146b0SAvi Kivity 	int mmio_cur_fragment;
352f78146b0SAvi Kivity 	int mmio_nr_fragments;
353f78146b0SAvi Kivity 	struct kvm_mmio_fragment mmio_fragments[KVM_MAX_MMIO_FRAGMENTS];
354edf88417SAvi Kivity #endif
355edf88417SAvi Kivity 
356af585b92SGleb Natapov #ifdef CONFIG_KVM_ASYNC_PF
357af585b92SGleb Natapov 	struct {
358af585b92SGleb Natapov 		u32 queued;
359af585b92SGleb Natapov 		struct list_head queue;
360af585b92SGleb Natapov 		struct list_head done;
361af585b92SGleb Natapov 		spinlock_t lock;
362af585b92SGleb Natapov 	} async_pf;
363af585b92SGleb Natapov #endif
364af585b92SGleb Natapov 
3654c088493SRaghavendra K T #ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT
3664c088493SRaghavendra K T 	/*
3674c088493SRaghavendra K T 	 * Cpu relax intercept or pause loop exit optimization
3684c088493SRaghavendra K T 	 * in_spin_loop: set when a vcpu does a pause loop exit
3694c088493SRaghavendra K T 	 *  or cpu relax intercepted.
3704c088493SRaghavendra K T 	 * dy_eligible: indicates whether vcpu is eligible for directed yield.
3714c088493SRaghavendra K T 	 */
3724c088493SRaghavendra K T 	struct {
3734c088493SRaghavendra K T 		bool in_spin_loop;
3744c088493SRaghavendra K T 		bool dy_eligible;
3754c088493SRaghavendra K T 	} spin_loop;
3764c088493SRaghavendra K T #endif
3773a08a8f9SRaghavendra K T 	bool preempted;
378d73eb57bSWanpeng Li 	bool ready;
379edf88417SAvi Kivity 	struct kvm_vcpu_arch arch;
380ce55c049SJing Zhang 	struct kvm_vcpu_stat stat;
381ce55c049SJing Zhang 	char stats_id[KVM_STATS_NAME_SIZE];
382fb04a1edSPeter Xu 	struct kvm_dirty_ring dirty_ring;
383fe22ed82SDavid Matlack 
384fe22ed82SDavid Matlack 	/*
385a54d8066SMaciej S. Szmigiero 	 * The most recently used memslot by this vCPU and the slots generation
386a54d8066SMaciej S. Szmigiero 	 * for which it is valid.
387a54d8066SMaciej S. Szmigiero 	 * No wraparound protection is needed since generations won't overflow in
388a54d8066SMaciej S. Szmigiero 	 * thousands of years, even assuming 1M memslot operations per second.
389fe22ed82SDavid Matlack 	 */
390a54d8066SMaciej S. Szmigiero 	struct kvm_memory_slot *last_used_slot;
391a54d8066SMaciej S. Szmigiero 	u64 last_used_slot_gen;
392edf88417SAvi Kivity };
393edf88417SAvi Kivity 
394ef9989afSMark Rutland /*
395ef9989afSMark Rutland  * Start accounting time towards a guest.
396ef9989afSMark Rutland  * Must be called before entering guest context.
397ef9989afSMark Rutland  */
398ef9989afSMark Rutland static __always_inline void guest_timing_enter_irqoff(void)
3991ca0016cSSean Christopherson {
4001ca0016cSSean Christopherson 	/*
4011ca0016cSSean Christopherson 	 * This is running in ioctl context so its safe to assume that it's the
4021ca0016cSSean Christopherson 	 * stime pending cputime to flush.
4031ca0016cSSean Christopherson 	 */
4041ca0016cSSean Christopherson 	instrumentation_begin();
4051ca0016cSSean Christopherson 	vtime_account_guest_enter();
4061ca0016cSSean Christopherson 	instrumentation_end();
407ef9989afSMark Rutland }
4081ca0016cSSean Christopherson 
4091ca0016cSSean Christopherson /*
410ef9989afSMark Rutland  * Enter guest context and enter an RCU extended quiescent state.
411ef9989afSMark Rutland  *
412ef9989afSMark Rutland  * Between guest_context_enter_irqoff() and guest_context_exit_irqoff() it is
413ef9989afSMark Rutland  * unsafe to use any code which may directly or indirectly use RCU, tracing
414ef9989afSMark Rutland  * (including IRQ flag tracing), or lockdep. All code in this period must be
415ef9989afSMark Rutland  * non-instrumentable.
416ef9989afSMark Rutland  */
417ef9989afSMark Rutland static __always_inline void guest_context_enter_irqoff(void)
418ef9989afSMark Rutland {
419ef9989afSMark Rutland 	/*
4201ca0016cSSean Christopherson 	 * KVM does not hold any references to rcu protected data when it
4211ca0016cSSean Christopherson 	 * switches CPU into a guest mode. In fact switching to a guest mode
4221ca0016cSSean Christopherson 	 * is very similar to exiting to userspace from rcu point of view. In
4231ca0016cSSean Christopherson 	 * addition CPU may stay in a guest mode for quite a long time (up to
4241ca0016cSSean Christopherson 	 * one time slice). Lets treat guest mode as quiescent state, just like
4251ca0016cSSean Christopherson 	 * we do with user-mode execution.
4261ca0016cSSean Christopherson 	 */
4271ca0016cSSean Christopherson 	if (!context_tracking_guest_enter()) {
4281ca0016cSSean Christopherson 		instrumentation_begin();
4291ca0016cSSean Christopherson 		rcu_virt_note_context_switch(smp_processor_id());
4301ca0016cSSean Christopherson 		instrumentation_end();
4311ca0016cSSean Christopherson 	}
4321ca0016cSSean Christopherson }
4331ca0016cSSean Christopherson 
434ef9989afSMark Rutland /*
435ef9989afSMark Rutland  * Deprecated. Architectures should move to guest_timing_enter_irqoff() and
436ef9989afSMark Rutland  * guest_state_enter_irqoff().
437ef9989afSMark Rutland  */
438ef9989afSMark Rutland static __always_inline void guest_enter_irqoff(void)
439ef9989afSMark Rutland {
440ef9989afSMark Rutland 	guest_timing_enter_irqoff();
441ef9989afSMark Rutland 	guest_context_enter_irqoff();
442ef9989afSMark Rutland }
443ef9989afSMark Rutland 
444ef9989afSMark Rutland /**
445ef9989afSMark Rutland  * guest_state_enter_irqoff - Fixup state when entering a guest
446ef9989afSMark Rutland  *
447ef9989afSMark Rutland  * Entry to a guest will enable interrupts, but the kernel state is interrupts
448ef9989afSMark Rutland  * disabled when this is invoked. Also tell RCU about it.
449ef9989afSMark Rutland  *
450ef9989afSMark Rutland  * 1) Trace interrupts on state
451ef9989afSMark Rutland  * 2) Invoke context tracking if enabled to adjust RCU state
452ef9989afSMark Rutland  * 3) Tell lockdep that interrupts are enabled
453ef9989afSMark Rutland  *
454ef9989afSMark Rutland  * Invoked from architecture specific code before entering a guest.
455ef9989afSMark Rutland  * Must be called with interrupts disabled and the caller must be
456ef9989afSMark Rutland  * non-instrumentable.
457ef9989afSMark Rutland  * The caller has to invoke guest_timing_enter_irqoff() before this.
458ef9989afSMark Rutland  *
459ef9989afSMark Rutland  * Note: this is analogous to exit_to_user_mode().
460ef9989afSMark Rutland  */
461ef9989afSMark Rutland static __always_inline void guest_state_enter_irqoff(void)
462ef9989afSMark Rutland {
463ef9989afSMark Rutland 	instrumentation_begin();
464ef9989afSMark Rutland 	trace_hardirqs_on_prepare();
4658b023accSNick Desaulniers 	lockdep_hardirqs_on_prepare();
466ef9989afSMark Rutland 	instrumentation_end();
467ef9989afSMark Rutland 
468ef9989afSMark Rutland 	guest_context_enter_irqoff();
469ef9989afSMark Rutland 	lockdep_hardirqs_on(CALLER_ADDR0);
470ef9989afSMark Rutland }
471ef9989afSMark Rutland 
472ef9989afSMark Rutland /*
473ef9989afSMark Rutland  * Exit guest context and exit an RCU extended quiescent state.
474ef9989afSMark Rutland  *
475ef9989afSMark Rutland  * Between guest_context_enter_irqoff() and guest_context_exit_irqoff() it is
476ef9989afSMark Rutland  * unsafe to use any code which may directly or indirectly use RCU, tracing
477ef9989afSMark Rutland  * (including IRQ flag tracing), or lockdep. All code in this period must be
478ef9989afSMark Rutland  * non-instrumentable.
479ef9989afSMark Rutland  */
480ef9989afSMark Rutland static __always_inline void guest_context_exit_irqoff(void)
4811ca0016cSSean Christopherson {
4821ca0016cSSean Christopherson 	context_tracking_guest_exit();
483ef9989afSMark Rutland }
4841ca0016cSSean Christopherson 
485ef9989afSMark Rutland /*
486ef9989afSMark Rutland  * Stop accounting time towards a guest.
487ef9989afSMark Rutland  * Must be called after exiting guest context.
488ef9989afSMark Rutland  */
489ef9989afSMark Rutland static __always_inline void guest_timing_exit_irqoff(void)
490ef9989afSMark Rutland {
4911ca0016cSSean Christopherson 	instrumentation_begin();
4921ca0016cSSean Christopherson 	/* Flush the guest cputime we spent on the guest */
4931ca0016cSSean Christopherson 	vtime_account_guest_exit();
4941ca0016cSSean Christopherson 	instrumentation_end();
4951ca0016cSSean Christopherson }
4961ca0016cSSean Christopherson 
497ef9989afSMark Rutland /*
498ef9989afSMark Rutland  * Deprecated. Architectures should move to guest_state_exit_irqoff() and
499ef9989afSMark Rutland  * guest_timing_exit_irqoff().
500ef9989afSMark Rutland  */
501ef9989afSMark Rutland static __always_inline void guest_exit_irqoff(void)
502ef9989afSMark Rutland {
503ef9989afSMark Rutland 	guest_context_exit_irqoff();
504ef9989afSMark Rutland 	guest_timing_exit_irqoff();
505ef9989afSMark Rutland }
506ef9989afSMark Rutland 
5071ca0016cSSean Christopherson static inline void guest_exit(void)
5081ca0016cSSean Christopherson {
5091ca0016cSSean Christopherson 	unsigned long flags;
5101ca0016cSSean Christopherson 
5111ca0016cSSean Christopherson 	local_irq_save(flags);
5121ca0016cSSean Christopherson 	guest_exit_irqoff();
5131ca0016cSSean Christopherson 	local_irq_restore(flags);
5141ca0016cSSean Christopherson }
5151ca0016cSSean Christopherson 
516ef9989afSMark Rutland /**
517ef9989afSMark Rutland  * guest_state_exit_irqoff - Establish state when returning from guest mode
518ef9989afSMark Rutland  *
519ef9989afSMark Rutland  * Entry from a guest disables interrupts, but guest mode is traced as
520ef9989afSMark Rutland  * interrupts enabled. Also with NO_HZ_FULL RCU might be idle.
521ef9989afSMark Rutland  *
522ef9989afSMark Rutland  * 1) Tell lockdep that interrupts are disabled
523ef9989afSMark Rutland  * 2) Invoke context tracking if enabled to reactivate RCU
524ef9989afSMark Rutland  * 3) Trace interrupts off state
525ef9989afSMark Rutland  *
526ef9989afSMark Rutland  * Invoked from architecture specific code after exiting a guest.
527ef9989afSMark Rutland  * Must be invoked with interrupts disabled and the caller must be
528ef9989afSMark Rutland  * non-instrumentable.
529ef9989afSMark Rutland  * The caller has to invoke guest_timing_exit_irqoff() after this.
530ef9989afSMark Rutland  *
531ef9989afSMark Rutland  * Note: this is analogous to enter_from_user_mode().
532ef9989afSMark Rutland  */
533ef9989afSMark Rutland static __always_inline void guest_state_exit_irqoff(void)
534ef9989afSMark Rutland {
535ef9989afSMark Rutland 	lockdep_hardirqs_off(CALLER_ADDR0);
536ef9989afSMark Rutland 	guest_context_exit_irqoff();
537ef9989afSMark Rutland 
538ef9989afSMark Rutland 	instrumentation_begin();
539ef9989afSMark Rutland 	trace_hardirqs_off_finish();
540ef9989afSMark Rutland 	instrumentation_end();
541ef9989afSMark Rutland }
542ef9989afSMark Rutland 
5436b7e2d09SXiao Guangrong static inline int kvm_vcpu_exiting_guest_mode(struct kvm_vcpu *vcpu)
5446b7e2d09SXiao Guangrong {
545cde9af6eSAndrew Jones 	/*
546cde9af6eSAndrew Jones 	 * The memory barrier ensures a previous write to vcpu->requests cannot
547cde9af6eSAndrew Jones 	 * be reordered with the read of vcpu->mode.  It pairs with the general
548cde9af6eSAndrew Jones 	 * memory barrier following the write of vcpu->mode in VCPU RUN.
549cde9af6eSAndrew Jones 	 */
550cde9af6eSAndrew Jones 	smp_mb__before_atomic();
5516b7e2d09SXiao Guangrong 	return cmpxchg(&vcpu->mode, IN_GUEST_MODE, EXITING_GUEST_MODE);
5526b7e2d09SXiao Guangrong }
5536b7e2d09SXiao Guangrong 
554660c22c4STakuya Yoshikawa /*
555660c22c4STakuya Yoshikawa  * Some of the bitops functions do not support too long bitmaps.
556660c22c4STakuya Yoshikawa  * This number must be determined not to exceed such limits.
557660c22c4STakuya Yoshikawa  */
558660c22c4STakuya Yoshikawa #define KVM_MEM_MAX_NR_PAGES ((1UL << 31) - 1)
559660c22c4STakuya Yoshikawa 
560a54d8066SMaciej S. Szmigiero /*
561a54d8066SMaciej S. Szmigiero  * Since at idle each memslot belongs to two memslot sets it has to contain
562a54d8066SMaciej S. Szmigiero  * two embedded nodes for each data structure that it forms a part of.
563a54d8066SMaciej S. Szmigiero  *
564a54d8066SMaciej S. Szmigiero  * Two memslot sets (one active and one inactive) are necessary so the VM
565a54d8066SMaciej S. Szmigiero  * continues to run on one memslot set while the other is being modified.
566a54d8066SMaciej S. Szmigiero  *
567a54d8066SMaciej S. Szmigiero  * These two memslot sets normally point to the same set of memslots.
568a54d8066SMaciej S. Szmigiero  * They can, however, be desynchronized when performing a memslot management
569a54d8066SMaciej S. Szmigiero  * operation by replacing the memslot to be modified by its copy.
570a54d8066SMaciej S. Szmigiero  * After the operation is complete, both memslot sets once again point to
571a54d8066SMaciej S. Szmigiero  * the same, common set of memslot data.
572a54d8066SMaciej S. Szmigiero  *
573a54d8066SMaciej S. Szmigiero  * The memslots themselves are independent of each other so they can be
574a54d8066SMaciej S. Szmigiero  * individually added or deleted.
575a54d8066SMaciej S. Szmigiero  */
576edf88417SAvi Kivity struct kvm_memory_slot {
577a54d8066SMaciej S. Szmigiero 	struct hlist_node id_node[2];
578a54d8066SMaciej S. Szmigiero 	struct interval_tree_node hva_node[2];
579a54d8066SMaciej S. Szmigiero 	struct rb_node gfn_node[2];
580edf88417SAvi Kivity 	gfn_t base_gfn;
581edf88417SAvi Kivity 	unsigned long npages;
582edf88417SAvi Kivity 	unsigned long *dirty_bitmap;
583db3fe4ebSTakuya Yoshikawa 	struct kvm_arch_memory_slot arch;
584edf88417SAvi Kivity 	unsigned long userspace_addr;
5856104f472SAlex Williamson 	u32 flags;
5861e702d9aSAlex Williamson 	short id;
5879e9eb226SPeter Xu 	u16 as_id;
588edf88417SAvi Kivity };
589edf88417SAvi Kivity 
5908283e36aSBen Gardon static inline bool kvm_slot_dirty_track_enabled(const struct kvm_memory_slot *slot)
591044c59c4SPeter Xu {
592044c59c4SPeter Xu 	return slot->flags & KVM_MEM_LOG_DIRTY_PAGES;
593044c59c4SPeter Xu }
594044c59c4SPeter Xu 
59587bf6e7dSTakuya Yoshikawa static inline unsigned long kvm_dirty_bitmap_bytes(struct kvm_memory_slot *memslot)
59687bf6e7dSTakuya Yoshikawa {
59787bf6e7dSTakuya Yoshikawa 	return ALIGN(memslot->npages, BITS_PER_LONG) / 8;
59887bf6e7dSTakuya Yoshikawa }
59987bf6e7dSTakuya Yoshikawa 
60003133347SClaudio Imbrenda static inline unsigned long *kvm_second_dirty_bitmap(struct kvm_memory_slot *memslot)
60103133347SClaudio Imbrenda {
60203133347SClaudio Imbrenda 	unsigned long len = kvm_dirty_bitmap_bytes(memslot);
60303133347SClaudio Imbrenda 
60403133347SClaudio Imbrenda 	return memslot->dirty_bitmap + len / sizeof(*memslot->dirty_bitmap);
60503133347SClaudio Imbrenda }
60603133347SClaudio Imbrenda 
6073c9bd400SJay Zhou #ifndef KVM_DIRTY_LOG_MANUAL_CAPS
6083c9bd400SJay Zhou #define KVM_DIRTY_LOG_MANUAL_CAPS KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE
6093c9bd400SJay Zhou #endif
6103c9bd400SJay Zhou 
61184223598SCornelia Huck struct kvm_s390_adapter_int {
61284223598SCornelia Huck 	u64 ind_addr;
61384223598SCornelia Huck 	u64 summary_addr;
61484223598SCornelia Huck 	u64 ind_offset;
61584223598SCornelia Huck 	u32 summary_offset;
61684223598SCornelia Huck 	u32 adapter_id;
61784223598SCornelia Huck };
61884223598SCornelia Huck 
6195c919412SAndrey Smetanin struct kvm_hv_sint {
6205c919412SAndrey Smetanin 	u32 vcpu;
6215c919412SAndrey Smetanin 	u32 sint;
6225c919412SAndrey Smetanin };
6235c919412SAndrey Smetanin 
62414243b38SDavid Woodhouse struct kvm_xen_evtchn {
62514243b38SDavid Woodhouse 	u32 port;
6268733068bSDavid Woodhouse 	u32 vcpu_id;
6278733068bSDavid Woodhouse 	int vcpu_idx;
62814243b38SDavid Woodhouse 	u32 priority;
62914243b38SDavid Woodhouse };
63014243b38SDavid Woodhouse 
631399ec807SAvi Kivity struct kvm_kernel_irq_routing_entry {
632399ec807SAvi Kivity 	u32 gsi;
6335116d8f6SMichael S. Tsirkin 	u32 type;
6344925663aSGleb Natapov 	int (*set)(struct kvm_kernel_irq_routing_entry *e,
635aa2fbe6dSYang Zhang 		   struct kvm *kvm, int irq_source_id, int level,
636aa2fbe6dSYang Zhang 		   bool line_status);
637399ec807SAvi Kivity 	union {
638399ec807SAvi Kivity 		struct {
639399ec807SAvi Kivity 			unsigned irqchip;
640399ec807SAvi Kivity 			unsigned pin;
641399ec807SAvi Kivity 		} irqchip;
6420455e72cSEric Auger 		struct {
6430455e72cSEric Auger 			u32 address_lo;
6440455e72cSEric Auger 			u32 address_hi;
6450455e72cSEric Auger 			u32 data;
6460455e72cSEric Auger 			u32 flags;
6470455e72cSEric Auger 			u32 devid;
6480455e72cSEric Auger 		} msi;
64984223598SCornelia Huck 		struct kvm_s390_adapter_int adapter;
6505c919412SAndrey Smetanin 		struct kvm_hv_sint hv_sint;
65114243b38SDavid Woodhouse 		struct kvm_xen_evtchn xen_evtchn;
652399ec807SAvi Kivity 	};
65346e624b9SGleb Natapov 	struct hlist_node link;
65446e624b9SGleb Natapov };
65546e624b9SGleb Natapov 
656b053b2aeSSteve Rutherford #ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
657b053b2aeSSteve Rutherford struct kvm_irq_routing_table {
658b053b2aeSSteve Rutherford 	int chip[KVM_NR_IRQCHIPS][KVM_IRQCHIP_NUM_PINS];
659b053b2aeSSteve Rutherford 	u32 nr_rt_entries;
660b053b2aeSSteve Rutherford 	/*
661b053b2aeSSteve Rutherford 	 * Array indexed by gsi. Each entry contains list of irq chips
662b053b2aeSSteve Rutherford 	 * the gsi is connected to.
663b053b2aeSSteve Rutherford 	 */
664764e515fSGustavo A. R. Silva 	struct hlist_head map[];
665b053b2aeSSteve Rutherford };
6663ca9d84eSPaolo Bonzini #endif
667d663b8a2SPaolo Bonzini 
668d663b8a2SPaolo Bonzini bool kvm_arch_irqchip_in_kernel(struct kvm *kvm);
669b053b2aeSSteve Rutherford 
670bdd1c37aSChao Peng #ifndef KVM_INTERNAL_MEM_SLOTS
671bdd1c37aSChao Peng #define KVM_INTERNAL_MEM_SLOTS 0
6720743247fSAlex Williamson #endif
6730743247fSAlex Williamson 
6744fc096a9SVitaly Kuznetsov #define KVM_MEM_SLOTS_NUM SHRT_MAX
675bdd1c37aSChao Peng #define KVM_USER_MEM_SLOTS (KVM_MEM_SLOTS_NUM - KVM_INTERNAL_MEM_SLOTS)
67693a5cef0SXiao Guangrong 
677f481b069SPaolo Bonzini #ifndef __KVM_VCPU_MULTIPLE_ADDRESS_SPACE
678f481b069SPaolo Bonzini static inline int kvm_arch_vcpu_memslots_id(struct kvm_vcpu *vcpu)
679f481b069SPaolo Bonzini {
680f481b069SPaolo Bonzini 	return 0;
681f481b069SPaolo Bonzini }
682f481b069SPaolo Bonzini #endif
683f481b069SPaolo Bonzini 
68446a26bf5SMarcelo Tosatti struct kvm_memslots {
68549c7754cSGleb Natapov 	u64 generation;
686a54d8066SMaciej S. Szmigiero 	atomic_long_t last_used_slot;
687ed922739SMaciej S. Szmigiero 	struct rb_root_cached hva_tree;
688a54d8066SMaciej S. Szmigiero 	struct rb_root gfn_tree;
68926b8345aSMaciej S. Szmigiero 	/*
690a54d8066SMaciej S. Szmigiero 	 * The mapping table from slot id to memslot.
69126b8345aSMaciej S. Szmigiero 	 *
69226b8345aSMaciej S. Szmigiero 	 * 7-bit bucket count matches the size of the old id to index array for
69326b8345aSMaciej S. Szmigiero 	 * 512 slots, while giving good performance with this slot count.
69426b8345aSMaciej S. Szmigiero 	 * Higher bucket counts bring only small performance improvements but
69526b8345aSMaciej S. Szmigiero 	 * always result in higher memory usage (even for lower memslot counts).
69626b8345aSMaciej S. Szmigiero 	 */
69726b8345aSMaciej S. Szmigiero 	DECLARE_HASHTABLE(id_hash, 7);
698a54d8066SMaciej S. Szmigiero 	int node_idx;
69946a26bf5SMarcelo Tosatti };
70046a26bf5SMarcelo Tosatti 
701edf88417SAvi Kivity struct kvm {
702531810caSBen Gardon #ifdef KVM_HAVE_MMU_RWLOCK
703531810caSBen Gardon 	rwlock_t mmu_lock;
704531810caSBen Gardon #else
705aaee2c94SMarcelo Tosatti 	spinlock_t mmu_lock;
706531810caSBen Gardon #endif /* KVM_HAVE_MMU_RWLOCK */
707531810caSBen Gardon 
70879fac95eSMarcelo Tosatti 	struct mutex slots_lock;
709b10a038eSBen Gardon 
710b10a038eSBen Gardon 	/*
711b10a038eSBen Gardon 	 * Protects the arch-specific fields of struct kvm_memory_slots in
712b10a038eSBen Gardon 	 * use by the VM. To be used under the slots_lock (above) or in a
713b10a038eSBen Gardon 	 * kvm->srcu critical section where acquiring the slots_lock would
714b10a038eSBen Gardon 	 * lead to deadlock with the synchronize_srcu in
715b10a038eSBen Gardon 	 * install_new_memslots.
716b10a038eSBen Gardon 	 */
717b10a038eSBen Gardon 	struct mutex slots_arch_lock;
718edf88417SAvi Kivity 	struct mm_struct *mm; /* userspace tied to this vm */
719afa319a5SSean Christopherson 	unsigned long nr_memslot_pages;
720a54d8066SMaciej S. Szmigiero 	/* The two memslot sets - active and inactive (per address space) */
721a54d8066SMaciej S. Szmigiero 	struct kvm_memslots __memslots[KVM_ADDRESS_SPACE_NUM][2];
722a54d8066SMaciej S. Szmigiero 	/* The current active memslot set for each address space */
723a80cf7b5SChristian Borntraeger 	struct kvm_memslots __rcu *memslots[KVM_ADDRESS_SPACE_NUM];
724c5b07754SMarc Zyngier 	struct xarray vcpu_array;
7256c7b2202SPaolo Bonzini 	/*
7266c7b2202SPaolo Bonzini 	 * Protected by slots_lock, but can be read outside if an
7276c7b2202SPaolo Bonzini 	 * incorrect answer is acceptable.
7286c7b2202SPaolo Bonzini 	 */
7296c7b2202SPaolo Bonzini 	atomic_t nr_memslots_dirty_logging;
7306c7caebcSPaolo Bonzini 
73152ac8b35SPaolo Bonzini 	/* Used to wait for completion of MMU notifiers.  */
73252ac8b35SPaolo Bonzini 	spinlock_t mn_invalidate_lock;
73352ac8b35SPaolo Bonzini 	unsigned long mn_active_invalidate_count;
73452ac8b35SPaolo Bonzini 	struct rcuwait mn_memslots_update_rcuwait;
73552ac8b35SPaolo Bonzini 
736982ed0deSDavid Woodhouse 	/* For management / invalidation of gfn_to_pfn_caches */
737982ed0deSDavid Woodhouse 	spinlock_t gpc_lock;
738982ed0deSDavid Woodhouse 	struct list_head gpc_list;
739982ed0deSDavid Woodhouse 
7406c7caebcSPaolo Bonzini 	/*
7416c7caebcSPaolo Bonzini 	 * created_vcpus is protected by kvm->lock, and is incremented
7426c7caebcSPaolo Bonzini 	 * at the beginning of KVM_CREATE_VCPU.  online_vcpus is only
7436c7caebcSPaolo Bonzini 	 * incremented after storing the kvm_vcpu pointer in vcpus,
7446c7caebcSPaolo Bonzini 	 * and is accessed atomically.
7456c7caebcSPaolo Bonzini 	 */
74673880c80SGleb Natapov 	atomic_t online_vcpus;
747f502cc56SSean Christopherson 	int max_vcpus;
7486c7caebcSPaolo Bonzini 	int created_vcpus;
749217ece61SRik van Riel 	int last_boosted_vcpu;
750edf88417SAvi Kivity 	struct list_head vm_list;
75160eead79SMarcelo Tosatti 	struct mutex lock;
7524a12f951SChristian Borntraeger 	struct kvm_io_bus __rcu *buses[KVM_NR_BUSES];
753721eecbfSGregory Haskins #ifdef CONFIG_HAVE_KVM_EVENTFD
754721eecbfSGregory Haskins 	struct {
755721eecbfSGregory Haskins 		spinlock_t        lock;
756721eecbfSGregory Haskins 		struct list_head  items;
7577a84428aSAlex Williamson 		struct list_head  resampler_list;
7587a84428aSAlex Williamson 		struct mutex      resampler_lock;
759721eecbfSGregory Haskins 	} irqfds;
760d34e6b17SGregory Haskins 	struct list_head ioeventfds;
761721eecbfSGregory Haskins #endif
762edf88417SAvi Kivity 	struct kvm_vm_stat stat;
763edf88417SAvi Kivity 	struct kvm_arch arch;
764e3736c3eSElena Reshetova 	refcount_t users_count;
7654b4357e0SPaolo Bonzini #ifdef CONFIG_KVM_MMIO
7665f94c174SLaurent Vivier 	struct kvm_coalesced_mmio_ring *coalesced_mmio_ring;
7672b3c246aSSasha Levin 	spinlock_t ring_lock;
7682b3c246aSSasha Levin 	struct list_head coalesced_zones;
7695f94c174SLaurent Vivier #endif
770e930bffeSAndrea Arcangeli 
77160eead79SMarcelo Tosatti 	struct mutex irq_lock;
77275858a84SAvi Kivity #ifdef CONFIG_HAVE_KVM_IRQCHIP
773bd2b53b2SMichael S. Tsirkin 	/*
7749957c86dSPaul Mackerras 	 * Update side is protected by irq_lock.
775bd2b53b2SMichael S. Tsirkin 	 */
7764b6a2872SArnd Bergmann 	struct kvm_irq_routing_table __rcu *irq_routing;
777c77dcacbSPaolo Bonzini #endif
778c77dcacbSPaolo Bonzini #ifdef CONFIG_HAVE_KVM_IRQFD
779136bdfeeSGleb Natapov 	struct hlist_head irq_ack_notifier_list;
78075858a84SAvi Kivity #endif
78175858a84SAvi Kivity 
78236c1ed82SMarc Zyngier #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
783e930bffeSAndrea Arcangeli 	struct mmu_notifier mmu_notifier;
78420ec3ebdSChao Peng 	unsigned long mmu_invalidate_seq;
78520ec3ebdSChao Peng 	long mmu_invalidate_in_progress;
78620ec3ebdSChao Peng 	unsigned long mmu_invalidate_range_start;
78720ec3ebdSChao Peng 	unsigned long mmu_invalidate_range_end;
788e930bffeSAndrea Arcangeli #endif
78907f0a7bdSScott Wood 	struct list_head devices;
7903c9bd400SJay Zhou 	u64 manual_dirty_log_protect;
791536a6f88SJanosch Frank 	struct dentry *debugfs_dentry;
792536a6f88SJanosch Frank 	struct kvm_stat_data **debugfs_stat_data;
7936ade8694SPaul E. McKenney 	struct srcu_struct srcu;
7946ade8694SPaul E. McKenney 	struct srcu_struct irq_srcu;
795fdeaf7e3SClaudio Imbrenda 	pid_t userspace_pid;
796acd05785SDavid Matlack 	unsigned int max_halt_poll_ns;
797fb04a1edSPeter Xu 	u32 dirty_ring_size;
7980b8f1173SSean Christopherson 	bool vm_bugged;
799f4d31653SPaolo Bonzini 	bool vm_dead;
8002fdef3a2SSergey Senozhatsky 
8012fdef3a2SSergey Senozhatsky #ifdef CONFIG_HAVE_KVM_PM_NOTIFIER
8022fdef3a2SSergey Senozhatsky 	struct notifier_block pm_notifier;
8032fdef3a2SSergey Senozhatsky #endif
804fcfe1baeSJing Zhang 	char stats_id[KVM_STATS_NAME_SIZE];
805edf88417SAvi Kivity };
806edf88417SAvi Kivity 
807a737f256SChristoffer Dall #define kvm_err(fmt, ...) \
808a737f256SChristoffer Dall 	pr_err("kvm [%i]: " fmt, task_pid_nr(current), ## __VA_ARGS__)
809a737f256SChristoffer Dall #define kvm_info(fmt, ...) \
810a737f256SChristoffer Dall 	pr_info("kvm [%i]: " fmt, task_pid_nr(current), ## __VA_ARGS__)
811a737f256SChristoffer Dall #define kvm_debug(fmt, ...) \
812a737f256SChristoffer Dall 	pr_debug("kvm [%i]: " fmt, task_pid_nr(current), ## __VA_ARGS__)
813ae0f5499SBandan Das #define kvm_debug_ratelimited(fmt, ...) \
814ae0f5499SBandan Das 	pr_debug_ratelimited("kvm [%i]: " fmt, task_pid_nr(current), \
815ae0f5499SBandan Das 			     ## __VA_ARGS__)
816a737f256SChristoffer Dall #define kvm_pr_unimpl(fmt, ...) \
817a737f256SChristoffer Dall 	pr_err_ratelimited("kvm [%i]: " fmt, \
818a737f256SChristoffer Dall 			   task_tgid_nr(current), ## __VA_ARGS__)
819edf88417SAvi Kivity 
820a737f256SChristoffer Dall /* The guest did something we don't support. */
821a737f256SChristoffer Dall #define vcpu_unimpl(vcpu, fmt, ...)					\
822671d9ab3SBorislav Petkov 	kvm_pr_unimpl("vcpu%i, guest rIP: 0x%lx " fmt,			\
823671d9ab3SBorislav Petkov 			(vcpu)->vcpu_id, kvm_rip_read(vcpu), ## __VA_ARGS__)
824edf88417SAvi Kivity 
825ee86dbc6SAndrey Smetanin #define vcpu_debug(vcpu, fmt, ...)					\
826ee86dbc6SAndrey Smetanin 	kvm_debug("vcpu%i " fmt, (vcpu)->vcpu_id, ## __VA_ARGS__)
827ae0f5499SBandan Das #define vcpu_debug_ratelimited(vcpu, fmt, ...)				\
828ae0f5499SBandan Das 	kvm_debug_ratelimited("vcpu%i " fmt, (vcpu)->vcpu_id,           \
829ae0f5499SBandan Das 			      ## __VA_ARGS__)
830765eaa0fSAndrey Smetanin #define vcpu_err(vcpu, fmt, ...)					\
831765eaa0fSAndrey Smetanin 	kvm_err("vcpu%i " fmt, (vcpu)->vcpu_id, ## __VA_ARGS__)
832ee86dbc6SAndrey Smetanin 
833f4d31653SPaolo Bonzini static inline void kvm_vm_dead(struct kvm *kvm)
834f4d31653SPaolo Bonzini {
835f4d31653SPaolo Bonzini 	kvm->vm_dead = true;
836f4d31653SPaolo Bonzini 	kvm_make_all_cpus_request(kvm, KVM_REQ_VM_DEAD);
837f4d31653SPaolo Bonzini }
838f4d31653SPaolo Bonzini 
8390b8f1173SSean Christopherson static inline void kvm_vm_bugged(struct kvm *kvm)
8400b8f1173SSean Christopherson {
8410b8f1173SSean Christopherson 	kvm->vm_bugged = true;
842f4d31653SPaolo Bonzini 	kvm_vm_dead(kvm);
8430b8f1173SSean Christopherson }
8440b8f1173SSean Christopherson 
845f4d31653SPaolo Bonzini 
8460b8f1173SSean Christopherson #define KVM_BUG(cond, kvm, fmt...)				\
8470b8f1173SSean Christopherson ({								\
8480b8f1173SSean Christopherson 	int __ret = (cond);					\
8490b8f1173SSean Christopherson 								\
8500b8f1173SSean Christopherson 	if (WARN_ONCE(__ret && !(kvm)->vm_bugged, fmt))		\
8510b8f1173SSean Christopherson 		kvm_vm_bugged(kvm);				\
8520b8f1173SSean Christopherson 	unlikely(__ret);					\
8530b8f1173SSean Christopherson })
8540b8f1173SSean Christopherson 
8550b8f1173SSean Christopherson #define KVM_BUG_ON(cond, kvm)					\
8560b8f1173SSean Christopherson ({								\
8570b8f1173SSean Christopherson 	int __ret = (cond);					\
8580b8f1173SSean Christopherson 								\
8590b8f1173SSean Christopherson 	if (WARN_ON_ONCE(__ret && !(kvm)->vm_bugged))		\
8600b8f1173SSean Christopherson 		kvm_vm_bugged(kvm);				\
8610b8f1173SSean Christopherson 	unlikely(__ret);					\
8620b8f1173SSean Christopherson })
8630b8f1173SSean Christopherson 
8642031f287SSean Christopherson static inline void kvm_vcpu_srcu_read_lock(struct kvm_vcpu *vcpu)
8652031f287SSean Christopherson {
8662031f287SSean Christopherson #ifdef CONFIG_PROVE_RCU
8672031f287SSean Christopherson 	WARN_ONCE(vcpu->srcu_depth++,
8682031f287SSean Christopherson 		  "KVM: Illegal vCPU srcu_idx LOCK, depth=%d", vcpu->srcu_depth - 1);
8692031f287SSean Christopherson #endif
8702031f287SSean Christopherson 	vcpu->____srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
8712031f287SSean Christopherson }
8722031f287SSean Christopherson 
8732031f287SSean Christopherson static inline void kvm_vcpu_srcu_read_unlock(struct kvm_vcpu *vcpu)
8742031f287SSean Christopherson {
8752031f287SSean Christopherson 	srcu_read_unlock(&vcpu->kvm->srcu, vcpu->____srcu_idx);
8762031f287SSean Christopherson 
8772031f287SSean Christopherson #ifdef CONFIG_PROVE_RCU
8782031f287SSean Christopherson 	WARN_ONCE(--vcpu->srcu_depth,
8792031f287SSean Christopherson 		  "KVM: Illegal vCPU srcu_idx UNLOCK, depth=%d", vcpu->srcu_depth);
8802031f287SSean Christopherson #endif
8812031f287SSean Christopherson }
8822031f287SSean Christopherson 
8833c9bd400SJay Zhou static inline bool kvm_dirty_log_manual_protect_and_init_set(struct kvm *kvm)
8843c9bd400SJay Zhou {
8853c9bd400SJay Zhou 	return !!(kvm->manual_dirty_log_protect & KVM_DIRTY_LOG_INITIALLY_SET);
8863c9bd400SJay Zhou }
8873c9bd400SJay Zhou 
8884a12f951SChristian Borntraeger static inline struct kvm_io_bus *kvm_get_bus(struct kvm *kvm, enum kvm_bus idx)
8894a12f951SChristian Borntraeger {
8904a12f951SChristian Borntraeger 	return srcu_dereference_check(kvm->buses[idx], &kvm->srcu,
8913898da94SPaolo Bonzini 				      lockdep_is_held(&kvm->slots_lock) ||
8923898da94SPaolo Bonzini 				      !refcount_read(&kvm->users_count));
8934a12f951SChristian Borntraeger }
8944a12f951SChristian Borntraeger 
895988a2caeSGleb Natapov static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i)
896988a2caeSGleb Natapov {
8971d487e9bSPaolo Bonzini 	int num_vcpus = atomic_read(&kvm->online_vcpus);
8981d487e9bSPaolo Bonzini 	i = array_index_nospec(i, num_vcpus);
8991d487e9bSPaolo Bonzini 
9001d487e9bSPaolo Bonzini 	/* Pairs with smp_wmb() in kvm_vm_ioctl_create_vcpu.  */
901988a2caeSGleb Natapov 	smp_rmb();
902c5b07754SMarc Zyngier 	return xa_load(&kvm->vcpu_array, i);
903988a2caeSGleb Natapov }
904988a2caeSGleb Natapov 
905988a2caeSGleb Natapov #define kvm_for_each_vcpu(idx, vcpup, kvm)		   \
906214bd3a6SMarc Zyngier 	xa_for_each_range(&kvm->vcpu_array, idx, vcpup, 0, \
907214bd3a6SMarc Zyngier 			  (atomic_read(&kvm->online_vcpus) - 1))
908988a2caeSGleb Natapov 
909db27a7a3SDavid Hildenbrand static inline struct kvm_vcpu *kvm_get_vcpu_by_id(struct kvm *kvm, int id)
910db27a7a3SDavid Hildenbrand {
9119b9e3fc4SGreg Kurz 	struct kvm_vcpu *vcpu = NULL;
91246808a4cSMarc Zyngier 	unsigned long i;
913db27a7a3SDavid Hildenbrand 
9149b9e3fc4SGreg Kurz 	if (id < 0)
915c896939fSDavid Hildenbrand 		return NULL;
9169b9e3fc4SGreg Kurz 	if (id < KVM_MAX_VCPUS)
917c896939fSDavid Hildenbrand 		vcpu = kvm_get_vcpu(kvm, id);
918c896939fSDavid Hildenbrand 	if (vcpu && vcpu->vcpu_id == id)
919c896939fSDavid Hildenbrand 		return vcpu;
920db27a7a3SDavid Hildenbrand 	kvm_for_each_vcpu(i, vcpu, kvm)
921db27a7a3SDavid Hildenbrand 		if (vcpu->vcpu_id == id)
922db27a7a3SDavid Hildenbrand 			return vcpu;
923db27a7a3SDavid Hildenbrand 	return NULL;
924db27a7a3SDavid Hildenbrand }
925db27a7a3SDavid Hildenbrand 
92627592ae8SMarc Zyngier void kvm_destroy_vcpus(struct kvm *kvm);
927edf88417SAvi Kivity 
928ec7660ccSChristoffer Dall void vcpu_load(struct kvm_vcpu *vcpu);
929edf88417SAvi Kivity void vcpu_put(struct kvm_vcpu *vcpu);
930edf88417SAvi Kivity 
9316ef768faSPaolo Bonzini #ifdef __KVM_HAVE_IOAPIC
932993225adSDavid Hildenbrand void kvm_arch_post_irq_ack_notifier_list_update(struct kvm *kvm);
933abdb080fSAndrey Smetanin void kvm_arch_post_irq_routing_update(struct kvm *kvm);
9346ef768faSPaolo Bonzini #else
935993225adSDavid Hildenbrand static inline void kvm_arch_post_irq_ack_notifier_list_update(struct kvm *kvm)
9366ef768faSPaolo Bonzini {
9376ef768faSPaolo Bonzini }
938abdb080fSAndrey Smetanin static inline void kvm_arch_post_irq_routing_update(struct kvm *kvm)
939b053b2aeSSteve Rutherford {
940b053b2aeSSteve Rutherford }
9416ef768faSPaolo Bonzini #endif
9426ef768faSPaolo Bonzini 
943297e2105SPaul Mackerras #ifdef CONFIG_HAVE_KVM_IRQFD
944a0f155e9SCornelia Huck int kvm_irqfd_init(void);
945a0f155e9SCornelia Huck void kvm_irqfd_exit(void);
946a0f155e9SCornelia Huck #else
947a0f155e9SCornelia Huck static inline int kvm_irqfd_init(void)
948a0f155e9SCornelia Huck {
949a0f155e9SCornelia Huck 	return 0;
950a0f155e9SCornelia Huck }
951a0f155e9SCornelia Huck 
952a0f155e9SCornelia Huck static inline void kvm_irqfd_exit(void)
953a0f155e9SCornelia Huck {
954a0f155e9SCornelia Huck }
955a0f155e9SCornelia Huck #endif
9560ee75beaSAvi Kivity int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
957edf88417SAvi Kivity 		  struct module *module);
958edf88417SAvi Kivity void kvm_exit(void);
959edf88417SAvi Kivity 
960d39f13b0SIzik Eidus void kvm_get_kvm(struct kvm *kvm);
961605c7130SPeter Xu bool kvm_get_kvm_safe(struct kvm *kvm);
962d39f13b0SIzik Eidus void kvm_put_kvm(struct kvm *kvm);
96354526d1fSNathan Tempelman bool file_is_kvm(struct file *file);
964149487bdSSean Christopherson void kvm_put_kvm_no_destroy(struct kvm *kvm);
965d39f13b0SIzik Eidus 
966f481b069SPaolo Bonzini static inline struct kvm_memslots *__kvm_memslots(struct kvm *kvm, int as_id)
96790d83dc3SLai Jiangshan {
9681d487e9bSPaolo Bonzini 	as_id = array_index_nospec(as_id, KVM_ADDRESS_SPACE_NUM);
9697e988b10SChristian Borntraeger 	return srcu_dereference_check(kvm->memslots[as_id], &kvm->srcu,
9703898da94SPaolo Bonzini 			lockdep_is_held(&kvm->slots_lock) ||
9713898da94SPaolo Bonzini 			!refcount_read(&kvm->users_count));
97290d83dc3SLai Jiangshan }
97390d83dc3SLai Jiangshan 
974f481b069SPaolo Bonzini static inline struct kvm_memslots *kvm_memslots(struct kvm *kvm)
975f481b069SPaolo Bonzini {
976f481b069SPaolo Bonzini 	return __kvm_memslots(kvm, 0);
977f481b069SPaolo Bonzini }
978f481b069SPaolo Bonzini 
9798e73485cSPaolo Bonzini static inline struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu)
9808e73485cSPaolo Bonzini {
981f481b069SPaolo Bonzini 	int as_id = kvm_arch_vcpu_memslots_id(vcpu);
982f481b069SPaolo Bonzini 
983f481b069SPaolo Bonzini 	return __kvm_memslots(vcpu->kvm, as_id);
9848e73485cSPaolo Bonzini }
9858e73485cSPaolo Bonzini 
986a54d8066SMaciej S. Szmigiero static inline bool kvm_memslots_empty(struct kvm_memslots *slots)
987a54d8066SMaciej S. Szmigiero {
988a54d8066SMaciej S. Szmigiero 	return RB_EMPTY_ROOT(&slots->gfn_tree);
989a54d8066SMaciej S. Szmigiero }
990a54d8066SMaciej S. Szmigiero 
991a54d8066SMaciej S. Szmigiero #define kvm_for_each_memslot(memslot, bkt, slots)			      \
992a54d8066SMaciej S. Szmigiero 	hash_for_each(slots->id_hash, bkt, memslot, id_node[slots->node_idx]) \
993a54d8066SMaciej S. Szmigiero 		if (WARN_ON_ONCE(!memslot->npages)) {			      \
994a54d8066SMaciej S. Szmigiero 		} else
995a54d8066SMaciej S. Szmigiero 
9960577d1abSSean Christopherson static inline
9970577d1abSSean Christopherson struct kvm_memory_slot *id_to_memslot(struct kvm_memslots *slots, int id)
99828a37544SXiao Guangrong {
999f85e2cb5SXiao Guangrong 	struct kvm_memory_slot *slot;
1000a54d8066SMaciej S. Szmigiero 	int idx = slots->node_idx;
1001bf3e05bcSXiao Guangrong 
1002a54d8066SMaciej S. Szmigiero 	hash_for_each_possible(slots->id_hash, slot, id_node[idx], id) {
100326b8345aSMaciej S. Szmigiero 		if (slot->id == id)
1004f85e2cb5SXiao Guangrong 			return slot;
100528a37544SXiao Guangrong 	}
100628a37544SXiao Guangrong 
100726b8345aSMaciej S. Szmigiero 	return NULL;
100826b8345aSMaciej S. Szmigiero }
100926b8345aSMaciej S. Szmigiero 
1010f4209439SMaciej S. Szmigiero /* Iterator used for walking memslots that overlap a gfn range. */
1011f4209439SMaciej S. Szmigiero struct kvm_memslot_iter {
1012f4209439SMaciej S. Szmigiero 	struct kvm_memslots *slots;
1013f4209439SMaciej S. Szmigiero 	struct rb_node *node;
1014f4209439SMaciej S. Szmigiero 	struct kvm_memory_slot *slot;
1015f4209439SMaciej S. Szmigiero };
1016f4209439SMaciej S. Szmigiero 
1017f4209439SMaciej S. Szmigiero static inline void kvm_memslot_iter_next(struct kvm_memslot_iter *iter)
1018f4209439SMaciej S. Szmigiero {
1019f4209439SMaciej S. Szmigiero 	iter->node = rb_next(iter->node);
1020f4209439SMaciej S. Szmigiero 	if (!iter->node)
1021f4209439SMaciej S. Szmigiero 		return;
1022f4209439SMaciej S. Szmigiero 
1023f4209439SMaciej S. Szmigiero 	iter->slot = container_of(iter->node, struct kvm_memory_slot, gfn_node[iter->slots->node_idx]);
1024f4209439SMaciej S. Szmigiero }
1025f4209439SMaciej S. Szmigiero 
1026f4209439SMaciej S. Szmigiero static inline void kvm_memslot_iter_start(struct kvm_memslot_iter *iter,
1027f4209439SMaciej S. Szmigiero 					  struct kvm_memslots *slots,
1028f4209439SMaciej S. Szmigiero 					  gfn_t start)
1029f4209439SMaciej S. Szmigiero {
1030f4209439SMaciej S. Szmigiero 	int idx = slots->node_idx;
1031f4209439SMaciej S. Szmigiero 	struct rb_node *tmp;
1032f4209439SMaciej S. Szmigiero 	struct kvm_memory_slot *slot;
1033f4209439SMaciej S. Szmigiero 
1034f4209439SMaciej S. Szmigiero 	iter->slots = slots;
1035f4209439SMaciej S. Szmigiero 
1036f4209439SMaciej S. Szmigiero 	/*
1037f4209439SMaciej S. Szmigiero 	 * Find the so called "upper bound" of a key - the first node that has
1038f4209439SMaciej S. Szmigiero 	 * its key strictly greater than the searched one (the start gfn in our case).
1039f4209439SMaciej S. Szmigiero 	 */
1040f4209439SMaciej S. Szmigiero 	iter->node = NULL;
1041f4209439SMaciej S. Szmigiero 	for (tmp = slots->gfn_tree.rb_node; tmp; ) {
1042f4209439SMaciej S. Szmigiero 		slot = container_of(tmp, struct kvm_memory_slot, gfn_node[idx]);
1043f4209439SMaciej S. Szmigiero 		if (start < slot->base_gfn) {
1044f4209439SMaciej S. Szmigiero 			iter->node = tmp;
1045f4209439SMaciej S. Szmigiero 			tmp = tmp->rb_left;
1046f4209439SMaciej S. Szmigiero 		} else {
1047f4209439SMaciej S. Szmigiero 			tmp = tmp->rb_right;
1048f4209439SMaciej S. Szmigiero 		}
1049f4209439SMaciej S. Szmigiero 	}
1050f4209439SMaciej S. Szmigiero 
1051f4209439SMaciej S. Szmigiero 	/*
1052f4209439SMaciej S. Szmigiero 	 * Find the slot with the lowest gfn that can possibly intersect with
1053f4209439SMaciej S. Szmigiero 	 * the range, so we'll ideally have slot start <= range start
1054f4209439SMaciej S. Szmigiero 	 */
1055f4209439SMaciej S. Szmigiero 	if (iter->node) {
1056f4209439SMaciej S. Szmigiero 		/*
1057f4209439SMaciej S. Szmigiero 		 * A NULL previous node means that the very first slot
1058f4209439SMaciej S. Szmigiero 		 * already has a higher start gfn.
1059f4209439SMaciej S. Szmigiero 		 * In this case slot start > range start.
1060f4209439SMaciej S. Szmigiero 		 */
1061f4209439SMaciej S. Szmigiero 		tmp = rb_prev(iter->node);
1062f4209439SMaciej S. Szmigiero 		if (tmp)
1063f4209439SMaciej S. Szmigiero 			iter->node = tmp;
1064f4209439SMaciej S. Szmigiero 	} else {
1065f4209439SMaciej S. Szmigiero 		/* a NULL node below means no slots */
1066f4209439SMaciej S. Szmigiero 		iter->node = rb_last(&slots->gfn_tree);
1067f4209439SMaciej S. Szmigiero 	}
1068f4209439SMaciej S. Szmigiero 
1069f4209439SMaciej S. Szmigiero 	if (iter->node) {
1070f4209439SMaciej S. Szmigiero 		iter->slot = container_of(iter->node, struct kvm_memory_slot, gfn_node[idx]);
1071f4209439SMaciej S. Szmigiero 
1072f4209439SMaciej S. Szmigiero 		/*
1073f4209439SMaciej S. Szmigiero 		 * It is possible in the slot start < range start case that the
1074f4209439SMaciej S. Szmigiero 		 * found slot ends before or at range start (slot end <= range start)
1075f4209439SMaciej S. Szmigiero 		 * and so it does not overlap the requested range.
1076f4209439SMaciej S. Szmigiero 		 *
1077f4209439SMaciej S. Szmigiero 		 * In such non-overlapping case the next slot (if it exists) will
1078f4209439SMaciej S. Szmigiero 		 * already have slot start > range start, otherwise the logic above
1079f4209439SMaciej S. Szmigiero 		 * would have found it instead of the current slot.
1080f4209439SMaciej S. Szmigiero 		 */
1081f4209439SMaciej S. Szmigiero 		if (iter->slot->base_gfn + iter->slot->npages <= start)
1082f4209439SMaciej S. Szmigiero 			kvm_memslot_iter_next(iter);
1083f4209439SMaciej S. Szmigiero 	}
1084f4209439SMaciej S. Szmigiero }
1085f4209439SMaciej S. Szmigiero 
1086f4209439SMaciej S. Szmigiero static inline bool kvm_memslot_iter_is_valid(struct kvm_memslot_iter *iter, gfn_t end)
1087f4209439SMaciej S. Szmigiero {
1088f4209439SMaciej S. Szmigiero 	if (!iter->node)
1089f4209439SMaciej S. Szmigiero 		return false;
1090f4209439SMaciej S. Szmigiero 
1091f4209439SMaciej S. Szmigiero 	/*
1092f4209439SMaciej S. Szmigiero 	 * If this slot starts beyond or at the end of the range so does
1093f4209439SMaciej S. Szmigiero 	 * every next one
1094f4209439SMaciej S. Szmigiero 	 */
1095f4209439SMaciej S. Szmigiero 	return iter->slot->base_gfn < end;
1096f4209439SMaciej S. Szmigiero }
1097f4209439SMaciej S. Szmigiero 
1098f4209439SMaciej S. Szmigiero /* Iterate over each memslot at least partially intersecting [start, end) range */
1099f4209439SMaciej S. Szmigiero #define kvm_for_each_memslot_in_gfn_range(iter, slots, start, end)	\
1100f4209439SMaciej S. Szmigiero 	for (kvm_memslot_iter_start(iter, slots, start);		\
1101f4209439SMaciej S. Szmigiero 	     kvm_memslot_iter_is_valid(iter, end);			\
1102f4209439SMaciej S. Szmigiero 	     kvm_memslot_iter_next(iter))
1103f4209439SMaciej S. Szmigiero 
110474d0727cSTakuya Yoshikawa /*
110574d0727cSTakuya Yoshikawa  * KVM_SET_USER_MEMORY_REGION ioctl allows the following operations:
110674d0727cSTakuya Yoshikawa  * - create a new memory slot
110774d0727cSTakuya Yoshikawa  * - delete an existing memory slot
110874d0727cSTakuya Yoshikawa  * - modify an existing memory slot
110974d0727cSTakuya Yoshikawa  *   -- move it in the guest physical memory space
111074d0727cSTakuya Yoshikawa  *   -- just change its flags
111174d0727cSTakuya Yoshikawa  *
111274d0727cSTakuya Yoshikawa  * Since flags can be changed by some of these operations, the following
111374d0727cSTakuya Yoshikawa  * differentiation is the best we can do for __kvm_set_memory_region():
111474d0727cSTakuya Yoshikawa  */
111574d0727cSTakuya Yoshikawa enum kvm_mr_change {
111674d0727cSTakuya Yoshikawa 	KVM_MR_CREATE,
111774d0727cSTakuya Yoshikawa 	KVM_MR_DELETE,
111874d0727cSTakuya Yoshikawa 	KVM_MR_MOVE,
111974d0727cSTakuya Yoshikawa 	KVM_MR_FLAGS_ONLY,
112074d0727cSTakuya Yoshikawa };
112174d0727cSTakuya Yoshikawa 
1122edf88417SAvi Kivity int kvm_set_memory_region(struct kvm *kvm,
112309170a49SPaolo Bonzini 			  const struct kvm_userspace_memory_region *mem);
1124edf88417SAvi Kivity int __kvm_set_memory_region(struct kvm *kvm,
112509170a49SPaolo Bonzini 			    const struct kvm_userspace_memory_region *mem);
1126e96c81eeSSean Christopherson void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *slot);
112715248258SSean Christopherson void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen);
1128f7784b8eSMarcelo Tosatti int kvm_arch_prepare_memory_region(struct kvm *kvm,
1129537a17b3SSean Christopherson 				const struct kvm_memory_slot *old,
1130537a17b3SSean Christopherson 				struct kvm_memory_slot *new,
11317b6195a9STakuya Yoshikawa 				enum kvm_mr_change change);
1132f7784b8eSMarcelo Tosatti void kvm_arch_commit_memory_region(struct kvm *kvm,
11339d4c197cSSean Christopherson 				struct kvm_memory_slot *old,
1134f36f3f28SPaolo Bonzini 				const struct kvm_memory_slot *new,
11358482644aSTakuya Yoshikawa 				enum kvm_mr_change change);
11362df72e9bSMarcelo Tosatti /* flush all memory translations */
11372df72e9bSMarcelo Tosatti void kvm_arch_flush_shadow_all(struct kvm *kvm);
11382df72e9bSMarcelo Tosatti /* flush memory translations pointing to 'slot' */
11392df72e9bSMarcelo Tosatti void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
11402df72e9bSMarcelo Tosatti 				   struct kvm_memory_slot *slot);
1141a983fb23SMarcelo Tosatti 
1142d9ef13c2SPaolo Bonzini int gfn_to_page_many_atomic(struct kvm_memory_slot *slot, gfn_t gfn,
1143d9ef13c2SPaolo Bonzini 			    struct page **pages, int nr_pages);
114448987781SXiao Guangrong 
1145edf88417SAvi Kivity struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn);
114605da4558SMarcelo Tosatti unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn);
1147ba6a3541SPaolo Bonzini unsigned long gfn_to_hva_prot(struct kvm *kvm, gfn_t gfn, bool *writable);
11484d8b81abSXiao Guangrong unsigned long gfn_to_hva_memslot(struct kvm_memory_slot *slot, gfn_t gfn);
114964d83126SChristoffer Dall unsigned long gfn_to_hva_memslot_prot(struct kvm_memory_slot *slot, gfn_t gfn,
115064d83126SChristoffer Dall 				      bool *writable);
1151edf88417SAvi Kivity void kvm_release_page_clean(struct page *page);
1152edf88417SAvi Kivity void kvm_release_page_dirty(struct page *page);
115335149e21SAnthony Liguori 
1154ba049e93SDan Williams kvm_pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn);
1155ba049e93SDan Williams kvm_pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault,
1156612819c3SMarcelo Tosatti 		      bool *writable);
11578283e36aSBen Gardon kvm_pfn_t gfn_to_pfn_memslot(const struct kvm_memory_slot *slot, gfn_t gfn);
11588283e36aSBen Gardon kvm_pfn_t gfn_to_pfn_memslot_atomic(const struct kvm_memory_slot *slot, gfn_t gfn);
11598283e36aSBen Gardon kvm_pfn_t __gfn_to_pfn_memslot(const struct kvm_memory_slot *slot, gfn_t gfn,
1160c8b88b33SPeter Xu 			       bool atomic, bool interruptible, bool *async,
1161c8b88b33SPeter Xu 			       bool write_fault, bool *writable, hva_t *hva);
1162037d92dcSXiao Guangrong 
1163ba049e93SDan Williams void kvm_release_pfn_clean(kvm_pfn_t pfn);
1164f7a6509fSDavid Hildenbrand void kvm_release_pfn_dirty(kvm_pfn_t pfn);
1165ba049e93SDan Williams void kvm_set_pfn_dirty(kvm_pfn_t pfn);
1166ba049e93SDan Williams void kvm_set_pfn_accessed(kvm_pfn_t pfn);
116735149e21SAnthony Liguori 
1168357a18adSDavid Woodhouse void kvm_release_pfn(kvm_pfn_t pfn, bool dirty);
1169edf88417SAvi Kivity int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset,
1170edf88417SAvi Kivity 			int len);
1171edf88417SAvi Kivity int kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len);
11724e335d9eSPaolo Bonzini int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
1173e03b644fSGleb Natapov 			   void *data, unsigned long len);
11740958f0ceSVitaly Kuznetsov int kvm_read_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
11750958f0ceSVitaly Kuznetsov 				 void *data, unsigned int offset,
11760958f0ceSVitaly Kuznetsov 				 unsigned long len);
1177edf88417SAvi Kivity int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data,
1178edf88417SAvi Kivity 			 int offset, int len);
1179edf88417SAvi Kivity int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data,
1180edf88417SAvi Kivity 		    unsigned long len);
11814e335d9eSPaolo Bonzini int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
118249c7754cSGleb Natapov 			   void *data, unsigned long len);
11834e335d9eSPaolo Bonzini int kvm_write_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
11847a86dab8SJim Mattson 				  void *data, unsigned int offset,
11857a86dab8SJim Mattson 				  unsigned long len);
11864e335d9eSPaolo Bonzini int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
11878f964525SAndrew Honig 			      gpa_t gpa, unsigned long len);
1188cac0f1b7SSteven Price 
118953f98558SAndrew Jones #define __kvm_get_guest(kvm, gfn, offset, v)				\
119053f98558SAndrew Jones ({									\
119153f98558SAndrew Jones 	unsigned long __addr = gfn_to_hva(kvm, gfn);			\
119253f98558SAndrew Jones 	typeof(v) __user *__uaddr = (typeof(__uaddr))(__addr + offset);	\
119353f98558SAndrew Jones 	int __ret = -EFAULT;						\
119453f98558SAndrew Jones 									\
119553f98558SAndrew Jones 	if (!kvm_is_error_hva(__addr))					\
119653f98558SAndrew Jones 		__ret = get_user(v, __uaddr);				\
119753f98558SAndrew Jones 	__ret;								\
119853f98558SAndrew Jones })
119953f98558SAndrew Jones 
120053f98558SAndrew Jones #define kvm_get_guest(kvm, gpa, v)					\
120153f98558SAndrew Jones ({									\
120253f98558SAndrew Jones 	gpa_t __gpa = gpa;						\
120353f98558SAndrew Jones 	struct kvm *__kvm = kvm;					\
120453f98558SAndrew Jones 									\
120553f98558SAndrew Jones 	__kvm_get_guest(__kvm, __gpa >> PAGE_SHIFT,			\
120653f98558SAndrew Jones 			offset_in_page(__gpa), v);			\
120753f98558SAndrew Jones })
120853f98558SAndrew Jones 
12094d2d4ce0SAndrew Jones #define __kvm_put_guest(kvm, gfn, offset, v)				\
1210cac0f1b7SSteven Price ({									\
1211cac0f1b7SSteven Price 	unsigned long __addr = gfn_to_hva(kvm, gfn);			\
12124d2d4ce0SAndrew Jones 	typeof(v) __user *__uaddr = (typeof(__uaddr))(__addr + offset);	\
1213cac0f1b7SSteven Price 	int __ret = -EFAULT;						\
1214cac0f1b7SSteven Price 									\
1215cac0f1b7SSteven Price 	if (!kvm_is_error_hva(__addr))					\
12164d2d4ce0SAndrew Jones 		__ret = put_user(v, __uaddr);				\
1217cac0f1b7SSteven Price 	if (!__ret)							\
1218cac0f1b7SSteven Price 		mark_page_dirty(kvm, gfn);				\
1219cac0f1b7SSteven Price 	__ret;								\
1220cac0f1b7SSteven Price })
1221cac0f1b7SSteven Price 
12224d2d4ce0SAndrew Jones #define kvm_put_guest(kvm, gpa, v)					\
1223cac0f1b7SSteven Price ({									\
1224cac0f1b7SSteven Price 	gpa_t __gpa = gpa;						\
1225cac0f1b7SSteven Price 	struct kvm *__kvm = kvm;					\
12264d2d4ce0SAndrew Jones 									\
1227cac0f1b7SSteven Price 	__kvm_put_guest(__kvm, __gpa >> PAGE_SHIFT,			\
12284d2d4ce0SAndrew Jones 			offset_in_page(__gpa), v);			\
1229cac0f1b7SSteven Price })
1230cac0f1b7SSteven Price 
1231edf88417SAvi Kivity int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len);
1232edf88417SAvi Kivity struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn);
123333e94154SYaowei Bai bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn);
1234995decb6SVitaly Kuznetsov bool kvm_vcpu_is_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn);
1235f9b84e19SSean Christopherson unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn);
12368283e36aSBen Gardon void mark_page_dirty_in_slot(struct kvm *kvm, const struct kvm_memory_slot *memslot, gfn_t gfn);
1237edf88417SAvi Kivity void mark_page_dirty(struct kvm *kvm, gfn_t gfn);
1238edf88417SAvi Kivity 
12398e73485cSPaolo Bonzini struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu);
12408e73485cSPaolo Bonzini struct kvm_memory_slot *kvm_vcpu_gfn_to_memslot(struct kvm_vcpu *vcpu, gfn_t gfn);
1241ba049e93SDan Williams kvm_pfn_t kvm_vcpu_gfn_to_pfn_atomic(struct kvm_vcpu *vcpu, gfn_t gfn);
1242ba049e93SDan Williams kvm_pfn_t kvm_vcpu_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn);
1243e45adf66SKarimAllah Ahmed int kvm_vcpu_map(struct kvm_vcpu *vcpu, gpa_t gpa, struct kvm_host_map *map);
1244e45adf66SKarimAllah Ahmed void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, bool dirty);
12458e73485cSPaolo Bonzini unsigned long kvm_vcpu_gfn_to_hva(struct kvm_vcpu *vcpu, gfn_t gfn);
12468e73485cSPaolo Bonzini unsigned long kvm_vcpu_gfn_to_hva_prot(struct kvm_vcpu *vcpu, gfn_t gfn, bool *writable);
12478e73485cSPaolo Bonzini int kvm_vcpu_read_guest_page(struct kvm_vcpu *vcpu, gfn_t gfn, void *data, int offset,
12488e73485cSPaolo Bonzini 			     int len);
12498e73485cSPaolo Bonzini int kvm_vcpu_read_guest_atomic(struct kvm_vcpu *vcpu, gpa_t gpa, void *data,
12508e73485cSPaolo Bonzini 			       unsigned long len);
12518e73485cSPaolo Bonzini int kvm_vcpu_read_guest(struct kvm_vcpu *vcpu, gpa_t gpa, void *data,
12528e73485cSPaolo Bonzini 			unsigned long len);
12538e73485cSPaolo Bonzini int kvm_vcpu_write_guest_page(struct kvm_vcpu *vcpu, gfn_t gfn, const void *data,
12548e73485cSPaolo Bonzini 			      int offset, int len);
12558e73485cSPaolo Bonzini int kvm_vcpu_write_guest(struct kvm_vcpu *vcpu, gpa_t gpa, const void *data,
12568e73485cSPaolo Bonzini 			 unsigned long len);
12578e73485cSPaolo Bonzini void kvm_vcpu_mark_page_dirty(struct kvm_vcpu *vcpu, gfn_t gfn);
12588e73485cSPaolo Bonzini 
1259982ed0deSDavid Woodhouse /**
126052491a38SMichal Luczaj  * kvm_gpc_init - initialize gfn_to_pfn_cache.
126152491a38SMichal Luczaj  *
126252491a38SMichal Luczaj  * @gpc:	   struct gfn_to_pfn_cache object.
1263982ed0deSDavid Woodhouse  * @kvm:	   pointer to kvm instance.
1264982ed0deSDavid Woodhouse  * @vcpu:	   vCPU to be used for marking pages dirty and to be woken on
1265982ed0deSDavid Woodhouse  *		   invalidation.
1266d0d96121SSean Christopherson  * @usage:	   indicates if the resulting host physical PFN is used while
1267d0d96121SSean Christopherson  *		   the @vcpu is IN_GUEST_MODE (in which case invalidation of
1268d0d96121SSean Christopherson  *		   the cache from MMU notifiers---but not for KVM memslot
1269d0d96121SSean Christopherson  *		   changes!---will also force @vcpu to exit the guest and
1270d0d96121SSean Christopherson  *		   refresh the cache); and/or if the PFN used directly
1271d0d96121SSean Christopherson  *		   by KVM (and thus needs a kernel virtual mapping).
1272*8c82a0b3SMichal Luczaj  *
1273*8c82a0b3SMichal Luczaj  * This sets up a gfn_to_pfn_cache by initializing locks and assigning the
1274*8c82a0b3SMichal Luczaj  * immutable attributes.  Note, the cache must be zero-allocated (or zeroed by
1275*8c82a0b3SMichal Luczaj  * the caller before init).
1276*8c82a0b3SMichal Luczaj  */
1277*8c82a0b3SMichal Luczaj void kvm_gpc_init(struct gfn_to_pfn_cache *gpc, struct kvm *kvm,
1278*8c82a0b3SMichal Luczaj 		  struct kvm_vcpu *vcpu, enum pfn_cache_usage usage);
1279*8c82a0b3SMichal Luczaj 
1280*8c82a0b3SMichal Luczaj /**
1281*8c82a0b3SMichal Luczaj  * kvm_gpc_activate - prepare a cached kernel mapping and HPA for a given guest
1282*8c82a0b3SMichal Luczaj  *                    physical address.
1283*8c82a0b3SMichal Luczaj  *
1284*8c82a0b3SMichal Luczaj  * @gpc:	   struct gfn_to_pfn_cache object.
1285982ed0deSDavid Woodhouse  * @gpa:	   guest physical address to map.
1286982ed0deSDavid Woodhouse  * @len:	   sanity check; the range being access must fit a single page.
1287982ed0deSDavid Woodhouse  *
1288982ed0deSDavid Woodhouse  * @return:	   0 for success.
1289982ed0deSDavid Woodhouse  *		   -EINVAL for a mapping which would cross a page boundary.
1290982ed0deSDavid Woodhouse  *		   -EFAULT for an untranslatable guest physical address.
1291982ed0deSDavid Woodhouse  *
1292*8c82a0b3SMichal Luczaj  * This primes a gfn_to_pfn_cache and links it into the @gpc->kvm's list for
1293aba3caefSMichal Luczaj  * invalidations to be processed.  Callers are required to use kvm_gpc_check()
1294aba3caefSMichal Luczaj  * to ensure that the cache is valid before accessing the target page.
1295982ed0deSDavid Woodhouse  */
1296*8c82a0b3SMichal Luczaj int kvm_gpc_activate(struct gfn_to_pfn_cache *gpc, gpa_t gpa, unsigned long len);
1297982ed0deSDavid Woodhouse 
1298982ed0deSDavid Woodhouse /**
1299aba3caefSMichal Luczaj  * kvm_gpc_check - check validity of a gfn_to_pfn_cache.
1300982ed0deSDavid Woodhouse  *
1301982ed0deSDavid Woodhouse  * @kvm:	   pointer to kvm instance.
1302982ed0deSDavid Woodhouse  * @gpc:	   struct gfn_to_pfn_cache object.
1303982ed0deSDavid Woodhouse  * @gpa:	   current guest physical address to map.
1304982ed0deSDavid Woodhouse  * @len:	   sanity check; the range being access must fit a single page.
1305982ed0deSDavid Woodhouse  *
1306982ed0deSDavid Woodhouse  * @return:	   %true if the cache is still valid and the address matches.
1307982ed0deSDavid Woodhouse  *		   %false if the cache is not valid.
1308982ed0deSDavid Woodhouse  *
1309982ed0deSDavid Woodhouse  * Callers outside IN_GUEST_MODE context should hold a read lock on @gpc->lock
1310982ed0deSDavid Woodhouse  * while calling this function, and then continue to hold the lock until the
1311982ed0deSDavid Woodhouse  * access is complete.
1312982ed0deSDavid Woodhouse  *
1313982ed0deSDavid Woodhouse  * Callers in IN_GUEST_MODE may do so without locking, although they should
1314982ed0deSDavid Woodhouse  * still hold a read lock on kvm->scru for the memslot checks.
1315982ed0deSDavid Woodhouse  */
1316aba3caefSMichal Luczaj bool kvm_gpc_check(struct kvm *kvm, struct gfn_to_pfn_cache *gpc, gpa_t gpa,
1317aba3caefSMichal Luczaj 		   unsigned long len);
1318982ed0deSDavid Woodhouse 
1319982ed0deSDavid Woodhouse /**
1320aba3caefSMichal Luczaj  * kvm_gpc_refresh - update a previously initialized cache.
1321982ed0deSDavid Woodhouse  *
1322982ed0deSDavid Woodhouse  * @kvm:	   pointer to kvm instance.
1323982ed0deSDavid Woodhouse  * @gpc:	   struct gfn_to_pfn_cache object.
1324982ed0deSDavid Woodhouse  * @gpa:	   updated guest physical address to map.
1325982ed0deSDavid Woodhouse  * @len:	   sanity check; the range being access must fit a single page.
1326982ed0deSDavid Woodhouse  *
1327982ed0deSDavid Woodhouse  * @return:	   0 for success.
1328982ed0deSDavid Woodhouse  *		   -EINVAL for a mapping which would cross a page boundary.
1329982ed0deSDavid Woodhouse  *                 -EFAULT for an untranslatable guest physical address.
1330982ed0deSDavid Woodhouse  *
1331982ed0deSDavid Woodhouse  * This will attempt to refresh a gfn_to_pfn_cache. Note that a successful
1332982ed0deSDavid Woodhouse  * returm from this function does not mean the page can be immediately
1333982ed0deSDavid Woodhouse  * accessed because it may have raced with an invalidation. Callers must
1334982ed0deSDavid Woodhouse  * still lock and check the cache status, as this function does not return
1335982ed0deSDavid Woodhouse  * with the lock still held to permit access.
1336982ed0deSDavid Woodhouse  */
1337aba3caefSMichal Luczaj int kvm_gpc_refresh(struct kvm *kvm, struct gfn_to_pfn_cache *gpc, gpa_t gpa,
1338aba3caefSMichal Luczaj 		    unsigned long len);
1339982ed0deSDavid Woodhouse 
1340982ed0deSDavid Woodhouse /**
1341aba3caefSMichal Luczaj  * kvm_gpc_unmap - temporarily unmap a gfn_to_pfn_cache.
1342982ed0deSDavid Woodhouse  *
1343982ed0deSDavid Woodhouse  * @kvm:	   pointer to kvm instance.
1344982ed0deSDavid Woodhouse  * @gpc:	   struct gfn_to_pfn_cache object.
1345982ed0deSDavid Woodhouse  *
1346cf1d88b3SDavid Woodhouse  * This unmaps the referenced page. The cache is left in the invalid state
1347cf1d88b3SDavid Woodhouse  * but at least the mapping from GPA to userspace HVA will remain cached
1348cf1d88b3SDavid Woodhouse  * and can be reused on a subsequent refresh.
1349982ed0deSDavid Woodhouse  */
1350aba3caefSMichal Luczaj void kvm_gpc_unmap(struct kvm *kvm, struct gfn_to_pfn_cache *gpc);
1351982ed0deSDavid Woodhouse 
1352982ed0deSDavid Woodhouse /**
135352491a38SMichal Luczaj  * kvm_gpc_deactivate - deactivate and unlink a gfn_to_pfn_cache.
1354982ed0deSDavid Woodhouse  *
1355982ed0deSDavid Woodhouse  * @gpc:	   struct gfn_to_pfn_cache object.
1356982ed0deSDavid Woodhouse  *
1357*8c82a0b3SMichal Luczaj  * This removes a cache from the VM's list to be processed on MMU notifier
1358982ed0deSDavid Woodhouse  * invocation.
1359982ed0deSDavid Woodhouse  */
1360*8c82a0b3SMichal Luczaj void kvm_gpc_deactivate(struct gfn_to_pfn_cache *gpc);
1361982ed0deSDavid Woodhouse 
136220b7035cSJan H. Schönherr void kvm_sigset_activate(struct kvm_vcpu *vcpu);
136320b7035cSJan H. Schönherr void kvm_sigset_deactivate(struct kvm_vcpu *vcpu);
136420b7035cSJan H. Schönherr 
136591b99ea7SSean Christopherson void kvm_vcpu_halt(struct kvm_vcpu *vcpu);
1366fac42688SSean Christopherson bool kvm_vcpu_block(struct kvm_vcpu *vcpu);
13673217f7c2SChristoffer Dall void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu);
13683217f7c2SChristoffer Dall void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu);
1369178f02ffSRadim Krčmář bool kvm_vcpu_wake_up(struct kvm_vcpu *vcpu);
1370b6d33834SChristoffer Dall void kvm_vcpu_kick(struct kvm_vcpu *vcpu);
1371fa93384fSDan Carpenter int kvm_vcpu_yield_to(struct kvm_vcpu *target);
1372199b5763SLongpeng(Mike) void kvm_vcpu_on_spin(struct kvm_vcpu *vcpu, bool usermode_vcpu_not_eligible);
1373a4ee1ca4SXiao Guangrong 
1374edf88417SAvi Kivity void kvm_flush_remote_tlbs(struct kvm *kvm);
13757053df4eSVitaly Kuznetsov 
13766926f95aSSean Christopherson #ifdef KVM_ARCH_NR_OBJS_PER_MEMORY_CACHE
13776926f95aSSean Christopherson int kvm_mmu_topup_memory_cache(struct kvm_mmu_memory_cache *mc, int min);
1378837f66c7SDavid Matlack int __kvm_mmu_topup_memory_cache(struct kvm_mmu_memory_cache *mc, int capacity, int min);
13796926f95aSSean Christopherson int kvm_mmu_memory_cache_nr_free_objects(struct kvm_mmu_memory_cache *mc);
13806926f95aSSean Christopherson void kvm_mmu_free_memory_cache(struct kvm_mmu_memory_cache *mc);
13816926f95aSSean Christopherson void *kvm_mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc);
13826926f95aSSean Christopherson #endif
13836926f95aSSean Christopherson 
138420ec3ebdSChao Peng void kvm_mmu_invalidate_begin(struct kvm *kvm, unsigned long start,
1385edb298c6SMaxim Levitsky 			      unsigned long end);
138620ec3ebdSChao Peng void kvm_mmu_invalidate_end(struct kvm *kvm, unsigned long start,
1387edb298c6SMaxim Levitsky 			    unsigned long end);
1388edb298c6SMaxim Levitsky 
1389edf88417SAvi Kivity long kvm_arch_dev_ioctl(struct file *filp,
1390edf88417SAvi Kivity 			unsigned int ioctl, unsigned long arg);
1391edf88417SAvi Kivity long kvm_arch_vcpu_ioctl(struct file *filp,
1392edf88417SAvi Kivity 			 unsigned int ioctl, unsigned long arg);
13931499fa80SSouptick Joarder vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf);
1394edf88417SAvi Kivity 
1395784aa3d7SAlexander Graf int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext);
1396edf88417SAvi Kivity 
13973b0f1d01SKai Huang void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm,
1398ba0513b5SMario Smarduch 					struct kvm_memory_slot *slot,
1399ba0513b5SMario Smarduch 					gfn_t gfn_offset,
1400ba0513b5SMario Smarduch 					unsigned long mask);
14010dff0846SSean Christopherson void kvm_arch_sync_dirty_log(struct kvm *kvm, struct kvm_memory_slot *memslot);
1402ba0513b5SMario Smarduch 
14030dff0846SSean Christopherson #ifdef CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT
14040dff0846SSean Christopherson void kvm_arch_flush_remote_tlbs_memslot(struct kvm *kvm,
14056c9dd6d2SPaolo Bonzini 					const struct kvm_memory_slot *memslot);
14060dff0846SSean Christopherson #else /* !CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT */
14070dff0846SSean Christopherson int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log);
14080dff0846SSean Christopherson int kvm_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log,
14092a49f61dSSean Christopherson 		      int *is_dirty, struct kvm_memory_slot **memslot);
14100dff0846SSean Christopherson #endif
1411edf88417SAvi Kivity 
1412aa2fbe6dSYang Zhang int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level,
1413aa2fbe6dSYang Zhang 			bool line_status);
1414e5d83c74SPaolo Bonzini int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
1415e5d83c74SPaolo Bonzini 			    struct kvm_enable_cap *cap);
1416edf88417SAvi Kivity long kvm_arch_vm_ioctl(struct file *filp,
1417edf88417SAvi Kivity 		       unsigned int ioctl, unsigned long arg);
1418ed51862fSAlexander Graf long kvm_arch_vm_compat_ioctl(struct file *filp, unsigned int ioctl,
1419ed51862fSAlexander Graf 			      unsigned long arg);
1420edf88417SAvi Kivity 
1421edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu);
1422edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu);
1423edf88417SAvi Kivity 
1424edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
1425edf88417SAvi Kivity 				    struct kvm_translation *tr);
1426edf88417SAvi Kivity 
1427edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
1428edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
1429edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
1430edf88417SAvi Kivity 				  struct kvm_sregs *sregs);
1431edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
1432edf88417SAvi Kivity 				  struct kvm_sregs *sregs);
143362d9f0dbSMarcelo Tosatti int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
143462d9f0dbSMarcelo Tosatti 				    struct kvm_mp_state *mp_state);
143562d9f0dbSMarcelo Tosatti int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
143662d9f0dbSMarcelo Tosatti 				    struct kvm_mp_state *mp_state);
1437d0bfb940SJan Kiszka int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
1438d0bfb940SJan Kiszka 					struct kvm_guest_debug *dbg);
14391b94f6f8STianjia Zhang int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu);
1440edf88417SAvi Kivity 
1441edf88417SAvi Kivity int kvm_arch_init(void *opaque);
1442edf88417SAvi Kivity void kvm_arch_exit(void);
1443edf88417SAvi Kivity 
1444e790d9efSRadim Krčmář void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu);
1445e790d9efSRadim Krčmář 
1446edf88417SAvi Kivity void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu);
1447edf88417SAvi Kivity void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu);
1448897cc38eSSean Christopherson int kvm_arch_vcpu_precreate(struct kvm *kvm, unsigned int id);
1449e529ef66SSean Christopherson int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu);
145031928aa5SDominik Dingel void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu);
1451edf88417SAvi Kivity void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu);
1452edf88417SAvi Kivity 
14532fdef3a2SSergey Senozhatsky #ifdef CONFIG_HAVE_KVM_PM_NOTIFIER
14542fdef3a2SSergey Senozhatsky int kvm_arch_pm_notifier(struct kvm *kvm, unsigned long state);
14552fdef3a2SSergey Senozhatsky #endif
14562fdef3a2SSergey Senozhatsky 
1457741cbbaeSPaolo Bonzini #ifdef __KVM_HAVE_ARCH_VCPU_DEBUGFS
1458d56f5136SPaolo Bonzini void kvm_arch_create_vcpu_debugfs(struct kvm_vcpu *vcpu, struct dentry *debugfs_dentry);
1459e36de87dSVineeth Pillai #else
1460e36de87dSVineeth Pillai static inline void kvm_create_vcpu_debugfs(struct kvm_vcpu *vcpu) {}
1461741cbbaeSPaolo Bonzini #endif
1462235539b4SLuiz Capitulino 
146313a34e06SRadim Krčmář int kvm_arch_hardware_enable(void);
146413a34e06SRadim Krčmář void kvm_arch_hardware_disable(void);
1465b9904085SSean Christopherson int kvm_arch_hardware_setup(void *opaque);
1466edf88417SAvi Kivity void kvm_arch_hardware_unsetup(void);
1467b9904085SSean Christopherson int kvm_arch_check_processor_compat(void *opaque);
1468edf88417SAvi Kivity int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu);
1469199b5763SLongpeng(Mike) bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu);
1470b6d33834SChristoffer Dall int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu);
147117e433b5SWanpeng Li bool kvm_arch_dy_runnable(struct kvm_vcpu *vcpu);
147252acd22fSWanpeng Li bool kvm_arch_dy_has_pending_interrupt(struct kvm_vcpu *vcpu);
1473d970a325SPaolo Bonzini int kvm_arch_post_init_vm(struct kvm *kvm);
1474d970a325SPaolo Bonzini void kvm_arch_pre_destroy_vm(struct kvm *kvm);
14753165af73SPeter Xu int kvm_arch_create_vm_debugfs(struct kvm *kvm);
1476edf88417SAvi Kivity 
1477d89f5effSJan Kiszka #ifndef __KVM_HAVE_ARCH_VM_ALLOC
1478d1e5b0e9SMarc Orr /*
1479d1e5b0e9SMarc Orr  * All architectures that want to use vzalloc currently also
1480d1e5b0e9SMarc Orr  * need their own kvm_arch_alloc_vm implementation.
1481d1e5b0e9SMarc Orr  */
1482d89f5effSJan Kiszka static inline struct kvm *kvm_arch_alloc_vm(void)
1483d89f5effSJan Kiszka {
1484d89f5effSJan Kiszka 	return kzalloc(sizeof(struct kvm), GFP_KERNEL);
1485d89f5effSJan Kiszka }
148678b497f2SJuergen Gross #endif
1487d89f5effSJan Kiszka 
148878b497f2SJuergen Gross static inline void __kvm_arch_free_vm(struct kvm *kvm)
148978b497f2SJuergen Gross {
149078b497f2SJuergen Gross 	kvfree(kvm);
149178b497f2SJuergen Gross }
149278b497f2SJuergen Gross 
149378b497f2SJuergen Gross #ifndef __KVM_HAVE_ARCH_VM_FREE
1494d89f5effSJan Kiszka static inline void kvm_arch_free_vm(struct kvm *kvm)
1495d89f5effSJan Kiszka {
149678b497f2SJuergen Gross 	__kvm_arch_free_vm(kvm);
1497d89f5effSJan Kiszka }
1498d89f5effSJan Kiszka #endif
1499d89f5effSJan Kiszka 
1500b08660e5STianyu Lan #ifndef __KVM_HAVE_ARCH_FLUSH_REMOTE_TLB
1501b08660e5STianyu Lan static inline int kvm_arch_flush_remote_tlb(struct kvm *kvm)
1502b08660e5STianyu Lan {
1503b08660e5STianyu Lan 	return -ENOTSUPP;
1504b08660e5STianyu Lan }
1505b08660e5STianyu Lan #endif
1506b08660e5STianyu Lan 
1507e0f0bbc5SAlex Williamson #ifdef __KVM_HAVE_ARCH_NONCOHERENT_DMA
1508e0f0bbc5SAlex Williamson void kvm_arch_register_noncoherent_dma(struct kvm *kvm);
1509e0f0bbc5SAlex Williamson void kvm_arch_unregister_noncoherent_dma(struct kvm *kvm);
1510e0f0bbc5SAlex Williamson bool kvm_arch_has_noncoherent_dma(struct kvm *kvm);
1511e0f0bbc5SAlex Williamson #else
1512e0f0bbc5SAlex Williamson static inline void kvm_arch_register_noncoherent_dma(struct kvm *kvm)
1513e0f0bbc5SAlex Williamson {
1514e0f0bbc5SAlex Williamson }
1515e0f0bbc5SAlex Williamson 
1516e0f0bbc5SAlex Williamson static inline void kvm_arch_unregister_noncoherent_dma(struct kvm *kvm)
1517e0f0bbc5SAlex Williamson {
1518e0f0bbc5SAlex Williamson }
1519e0f0bbc5SAlex Williamson 
1520e0f0bbc5SAlex Williamson static inline bool kvm_arch_has_noncoherent_dma(struct kvm *kvm)
1521e0f0bbc5SAlex Williamson {
1522e0f0bbc5SAlex Williamson 	return false;
1523e0f0bbc5SAlex Williamson }
1524e0f0bbc5SAlex Williamson #endif
15255544eb9bSPaolo Bonzini #ifdef __KVM_HAVE_ARCH_ASSIGNED_DEVICE
15265544eb9bSPaolo Bonzini void kvm_arch_start_assignment(struct kvm *kvm);
15275544eb9bSPaolo Bonzini void kvm_arch_end_assignment(struct kvm *kvm);
15285544eb9bSPaolo Bonzini bool kvm_arch_has_assigned_device(struct kvm *kvm);
15295544eb9bSPaolo Bonzini #else
15305544eb9bSPaolo Bonzini static inline void kvm_arch_start_assignment(struct kvm *kvm)
15315544eb9bSPaolo Bonzini {
15325544eb9bSPaolo Bonzini }
15335544eb9bSPaolo Bonzini 
15345544eb9bSPaolo Bonzini static inline void kvm_arch_end_assignment(struct kvm *kvm)
15355544eb9bSPaolo Bonzini {
15365544eb9bSPaolo Bonzini }
15375544eb9bSPaolo Bonzini 
1538742ab6dfSPeter Zijlstra static __always_inline bool kvm_arch_has_assigned_device(struct kvm *kvm)
15395544eb9bSPaolo Bonzini {
15405544eb9bSPaolo Bonzini 	return false;
15415544eb9bSPaolo Bonzini }
15425544eb9bSPaolo Bonzini #endif
1543e0f0bbc5SAlex Williamson 
1544da4ad88cSDavidlohr Bueso static inline struct rcuwait *kvm_arch_vcpu_get_wait(struct kvm_vcpu *vcpu)
1545b6d33834SChristoffer Dall {
15462246f8b5SAlexander Graf #ifdef __KVM_HAVE_ARCH_WQP
1547da4ad88cSDavidlohr Bueso 	return vcpu->arch.waitp;
15482246f8b5SAlexander Graf #else
1549da4ad88cSDavidlohr Bueso 	return &vcpu->wait;
1550b6d33834SChristoffer Dall #endif
15512246f8b5SAlexander Graf }
1552b6d33834SChristoffer Dall 
1553d92a5d1cSSean Christopherson /*
1554d92a5d1cSSean Christopherson  * Wake a vCPU if necessary, but don't do any stats/metadata updates.  Returns
1555d92a5d1cSSean Christopherson  * true if the vCPU was blocking and was awakened, false otherwise.
1556d92a5d1cSSean Christopherson  */
1557d92a5d1cSSean Christopherson static inline bool __kvm_vcpu_wake_up(struct kvm_vcpu *vcpu)
1558d92a5d1cSSean Christopherson {
1559d92a5d1cSSean Christopherson 	return !!rcuwait_wake_up(kvm_arch_vcpu_get_wait(vcpu));
1560d92a5d1cSSean Christopherson }
1561d92a5d1cSSean Christopherson 
1562d92a5d1cSSean Christopherson static inline bool kvm_vcpu_is_blocking(struct kvm_vcpu *vcpu)
1563d92a5d1cSSean Christopherson {
1564d92a5d1cSSean Christopherson 	return rcuwait_active(kvm_arch_vcpu_get_wait(vcpu));
1565d92a5d1cSSean Christopherson }
1566d92a5d1cSSean Christopherson 
156701c94e64SEric Auger #ifdef __KVM_HAVE_ARCH_INTC_INITIALIZED
156801c94e64SEric Auger /*
156901c94e64SEric Auger  * returns true if the virtual interrupt controller is initialized and
157001c94e64SEric Auger  * ready to accept virtual IRQ. On some architectures the virtual interrupt
157101c94e64SEric Auger  * controller is dynamically instantiated and this is not always true.
157201c94e64SEric Auger  */
157301c94e64SEric Auger bool kvm_arch_intc_initialized(struct kvm *kvm);
157401c94e64SEric Auger #else
157501c94e64SEric Auger static inline bool kvm_arch_intc_initialized(struct kvm *kvm)
157601c94e64SEric Auger {
157701c94e64SEric Auger 	return true;
157801c94e64SEric Auger }
157901c94e64SEric Auger #endif
158001c94e64SEric Auger 
1581e1bfc245SSean Christopherson #ifdef CONFIG_GUEST_PERF_EVENTS
1582e1bfc245SSean Christopherson unsigned long kvm_arch_vcpu_get_ip(struct kvm_vcpu *vcpu);
1583e1bfc245SSean Christopherson 
1584e1bfc245SSean Christopherson void kvm_register_perf_callbacks(unsigned int (*pt_intr_handler)(void));
1585e1bfc245SSean Christopherson void kvm_unregister_perf_callbacks(void);
1586e1bfc245SSean Christopherson #else
1587e1bfc245SSean Christopherson static inline void kvm_register_perf_callbacks(void *ign) {}
1588e1bfc245SSean Christopherson static inline void kvm_unregister_perf_callbacks(void) {}
1589e1bfc245SSean Christopherson #endif /* CONFIG_GUEST_PERF_EVENTS */
1590e1bfc245SSean Christopherson 
1591e08b9637SCarsten Otte int kvm_arch_init_vm(struct kvm *kvm, unsigned long type);
1592edf88417SAvi Kivity void kvm_arch_destroy_vm(struct kvm *kvm);
1593ad8ba2cdSSheng Yang void kvm_arch_sync_events(struct kvm *kvm);
1594edf88417SAvi Kivity 
15953d80840dSMarcelo Tosatti int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu);
1596edf88417SAvi Kivity 
1597b14b2690SSean Christopherson struct page *kvm_pfn_to_refcounted_page(kvm_pfn_t pfn);
1598284dc493SSean Christopherson bool kvm_is_zone_device_page(struct page *page);
1599c77fb9dcSXiantao Zhang 
160062c476c7SBen-Ami Yassour struct kvm_irq_ack_notifier {
160162c476c7SBen-Ami Yassour 	struct hlist_node link;
160262c476c7SBen-Ami Yassour 	unsigned gsi;
160362c476c7SBen-Ami Yassour 	void (*irq_acked)(struct kvm_irq_ack_notifier *kian);
160462c476c7SBen-Ami Yassour };
160562c476c7SBen-Ami Yassour 
16069957c86dSPaul Mackerras int kvm_irq_map_gsi(struct kvm *kvm,
16079957c86dSPaul Mackerras 		    struct kvm_kernel_irq_routing_entry *entries, int gsi);
16089957c86dSPaul Mackerras int kvm_irq_map_chip_pin(struct kvm *kvm, unsigned irqchip, unsigned pin);
16098ba918d4SPaul Mackerras 
1610aa2fbe6dSYang Zhang int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level,
1611aa2fbe6dSYang Zhang 		bool line_status);
1612bd2b53b2SMichael S. Tsirkin int kvm_set_msi(struct kvm_kernel_irq_routing_entry *irq_entry, struct kvm *kvm,
1613aa2fbe6dSYang Zhang 		int irq_source_id, int level, bool line_status);
1614b97e6de9SPaolo Bonzini int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e,
1615b97e6de9SPaolo Bonzini 			       struct kvm *kvm, int irq_source_id,
1616b97e6de9SPaolo Bonzini 			       int level, bool line_status);
1617c7c9c56cSYang Zhang bool kvm_irq_has_notifier(struct kvm *kvm, unsigned irqchip, unsigned pin);
1618ba1aefcdSAndrey Smetanin void kvm_notify_acked_gsi(struct kvm *kvm, int gsi);
161944882eedSMarcelo Tosatti void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin);
16203de42dc0SXiantao Zhang void kvm_register_irq_ack_notifier(struct kvm *kvm,
16213de42dc0SXiantao Zhang 				   struct kvm_irq_ack_notifier *kian);
1622fa40a821SMarcelo Tosatti void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
1623fa40a821SMarcelo Tosatti 				   struct kvm_irq_ack_notifier *kian);
16245550af4dSSheng Yang int kvm_request_irq_source_id(struct kvm *kvm);
16255550af4dSSheng Yang void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id);
1626cdc238ebSYi Wang bool kvm_arch_irqfd_allowed(struct kvm *kvm, struct kvm_irqfd *args);
162762c476c7SBen-Ami Yassour 
16289d4cba7fSPaul Mackerras /*
1629a54d8066SMaciej S. Szmigiero  * Returns a pointer to the memslot if it contains gfn.
16300f22af94SDavid Matlack  * Otherwise returns NULL.
16310f22af94SDavid Matlack  */
16320f22af94SDavid Matlack static inline struct kvm_memory_slot *
1633a54d8066SMaciej S. Szmigiero try_get_memslot(struct kvm_memory_slot *slot, gfn_t gfn)
16340f22af94SDavid Matlack {
1635a54d8066SMaciej S. Szmigiero 	if (!slot)
16360f22af94SDavid Matlack 		return NULL;
16370f22af94SDavid Matlack 
16380f22af94SDavid Matlack 	if (gfn >= slot->base_gfn && gfn < slot->base_gfn + slot->npages)
16390f22af94SDavid Matlack 		return slot;
16400f22af94SDavid Matlack 	else
16410f22af94SDavid Matlack 		return NULL;
16420f22af94SDavid Matlack }
16430f22af94SDavid Matlack 
16440f22af94SDavid Matlack /*
1645a54d8066SMaciej S. Szmigiero  * Returns a pointer to the memslot that contains gfn. Otherwise returns NULL.
16460577d1abSSean Christopherson  *
1647c928bfc2SMaciej S. Szmigiero  * With "approx" set returns the memslot also when the address falls
1648c928bfc2SMaciej S. Szmigiero  * in a hole. In that case one of the memslots bordering the hole is
1649c928bfc2SMaciej S. Szmigiero  * returned.
16509d4cba7fSPaul Mackerras  */
16519d4cba7fSPaul Mackerras static inline struct kvm_memory_slot *
1652a54d8066SMaciej S. Szmigiero search_memslots(struct kvm_memslots *slots, gfn_t gfn, bool approx)
16539d4cba7fSPaul Mackerras {
16540f22af94SDavid Matlack 	struct kvm_memory_slot *slot;
1655a54d8066SMaciej S. Szmigiero 	struct rb_node *node;
1656a54d8066SMaciej S. Szmigiero 	int idx = slots->node_idx;
16579d4cba7fSPaul Mackerras 
1658a54d8066SMaciej S. Szmigiero 	slot = NULL;
1659a54d8066SMaciej S. Szmigiero 	for (node = slots->gfn_tree.rb_node; node; ) {
1660a54d8066SMaciej S. Szmigiero 		slot = container_of(node, struct kvm_memory_slot, gfn_node[idx]);
1661a54d8066SMaciej S. Szmigiero 		if (gfn >= slot->base_gfn) {
1662a54d8066SMaciej S. Szmigiero 			if (gfn < slot->base_gfn + slot->npages)
16630f22af94SDavid Matlack 				return slot;
1664a54d8066SMaciej S. Szmigiero 			node = node->rb_right;
1665a54d8066SMaciej S. Szmigiero 		} else
1666a54d8066SMaciej S. Szmigiero 			node = node->rb_left;
1667c928bfc2SMaciej S. Szmigiero 	}
1668d4ae84a0SIgor Mammedov 
1669a54d8066SMaciej S. Szmigiero 	return approx ? slot : NULL;
16709d4cba7fSPaul Mackerras }
16719d4cba7fSPaul Mackerras 
16729d4cba7fSPaul Mackerras static inline struct kvm_memory_slot *
1673c928bfc2SMaciej S. Szmigiero ____gfn_to_memslot(struct kvm_memslots *slots, gfn_t gfn, bool approx)
16749d4cba7fSPaul Mackerras {
16750f22af94SDavid Matlack 	struct kvm_memory_slot *slot;
16760f22af94SDavid Matlack 
1677a54d8066SMaciej S. Szmigiero 	slot = (struct kvm_memory_slot *)atomic_long_read(&slots->last_used_slot);
1678a54d8066SMaciej S. Szmigiero 	slot = try_get_memslot(slot, gfn);
16790f22af94SDavid Matlack 	if (slot)
16800f22af94SDavid Matlack 		return slot;
16810f22af94SDavid Matlack 
1682a54d8066SMaciej S. Szmigiero 	slot = search_memslots(slots, gfn, approx);
16830f22af94SDavid Matlack 	if (slot) {
1684a54d8066SMaciej S. Szmigiero 		atomic_long_set(&slots->last_used_slot, (unsigned long)slot);
16850f22af94SDavid Matlack 		return slot;
16860f22af94SDavid Matlack 	}
16870f22af94SDavid Matlack 
16880f22af94SDavid Matlack 	return NULL;
16899d4cba7fSPaul Mackerras }
16909d4cba7fSPaul Mackerras 
1691c928bfc2SMaciej S. Szmigiero /*
1692c928bfc2SMaciej S. Szmigiero  * __gfn_to_memslot() and its descendants are here to allow arch code to inline
1693c928bfc2SMaciej S. Szmigiero  * the lookups in hot paths.  gfn_to_memslot() itself isn't here as an inline
1694c928bfc2SMaciej S. Szmigiero  * because that would bloat other code too much.
1695c928bfc2SMaciej S. Szmigiero  */
1696c928bfc2SMaciej S. Szmigiero static inline struct kvm_memory_slot *
1697c928bfc2SMaciej S. Szmigiero __gfn_to_memslot(struct kvm_memslots *slots, gfn_t gfn)
1698c928bfc2SMaciej S. Szmigiero {
1699c928bfc2SMaciej S. Szmigiero 	return ____gfn_to_memslot(slots, gfn, false);
1700c928bfc2SMaciej S. Szmigiero }
1701c928bfc2SMaciej S. Szmigiero 
170266a03505SGavin Shan static inline unsigned long
17038ca6f063SBen Gardon __gfn_to_hva_memslot(const struct kvm_memory_slot *slot, gfn_t gfn)
170466a03505SGavin Shan {
1705da27a83fSPaolo Bonzini 	/*
1706da27a83fSPaolo Bonzini 	 * The index was checked originally in search_memslots.  To avoid
1707da27a83fSPaolo Bonzini 	 * that a malicious guest builds a Spectre gadget out of e.g. page
1708da27a83fSPaolo Bonzini 	 * table walks, do not let the processor speculate loads outside
1709da27a83fSPaolo Bonzini 	 * the guest's registered memslots.
1710da27a83fSPaolo Bonzini 	 */
17114422829eSPaolo Bonzini 	unsigned long offset = gfn - slot->base_gfn;
17124422829eSPaolo Bonzini 	offset = array_index_nospec(offset, slot->npages);
1713da27a83fSPaolo Bonzini 	return slot->userspace_addr + offset * PAGE_SIZE;
171466a03505SGavin Shan }
171566a03505SGavin Shan 
17160ee8dcb8SXiao Guangrong static inline int memslot_id(struct kvm *kvm, gfn_t gfn)
17170ee8dcb8SXiao Guangrong {
17180ee8dcb8SXiao Guangrong 	return gfn_to_memslot(kvm, gfn)->id;
17190ee8dcb8SXiao Guangrong }
17200ee8dcb8SXiao Guangrong 
1721d19a748bSTakuya Yoshikawa static inline gfn_t
1722d19a748bSTakuya Yoshikawa hva_to_gfn_memslot(unsigned long hva, struct kvm_memory_slot *slot)
1723887c08acSXiao Guangrong {
1724d19a748bSTakuya Yoshikawa 	gfn_t gfn_offset = (hva - slot->userspace_addr) >> PAGE_SHIFT;
1725d19a748bSTakuya Yoshikawa 
1726d19a748bSTakuya Yoshikawa 	return slot->base_gfn + gfn_offset;
1727887c08acSXiao Guangrong }
1728887c08acSXiao Guangrong 
1729edf88417SAvi Kivity static inline gpa_t gfn_to_gpa(gfn_t gfn)
1730edf88417SAvi Kivity {
1731edf88417SAvi Kivity 	return (gpa_t)gfn << PAGE_SHIFT;
1732edf88417SAvi Kivity }
1733edf88417SAvi Kivity 
1734c30a358dSJoerg Roedel static inline gfn_t gpa_to_gfn(gpa_t gpa)
1735c30a358dSJoerg Roedel {
1736c30a358dSJoerg Roedel 	return (gfn_t)(gpa >> PAGE_SHIFT);
1737c30a358dSJoerg Roedel }
1738c30a358dSJoerg Roedel 
1739ba049e93SDan Williams static inline hpa_t pfn_to_hpa(kvm_pfn_t pfn)
174062c476c7SBen-Ami Yassour {
174162c476c7SBen-Ami Yassour 	return (hpa_t)pfn << PAGE_SHIFT;
174262c476c7SBen-Ami Yassour }
174362c476c7SBen-Ami Yassour 
1744dfeec843SHeiko Carstens static inline bool kvm_is_error_gpa(struct kvm *kvm, gpa_t gpa)
1745dfeec843SHeiko Carstens {
1746dfeec843SHeiko Carstens 	unsigned long hva = gfn_to_hva(kvm, gpa_to_gfn(gpa));
1747dfeec843SHeiko Carstens 
1748dfeec843SHeiko Carstens 	return kvm_is_error_hva(hva);
1749dfeec843SHeiko Carstens }
1750dfeec843SHeiko Carstens 
1751edf88417SAvi Kivity enum kvm_stat_kind {
1752edf88417SAvi Kivity 	KVM_STAT_VM,
1753edf88417SAvi Kivity 	KVM_STAT_VCPU,
1754edf88417SAvi Kivity };
1755edf88417SAvi Kivity 
1756536a6f88SJanosch Frank struct kvm_stat_data {
1757536a6f88SJanosch Frank 	struct kvm *kvm;
1758bc9e9e67SJing Zhang 	const struct _kvm_stats_desc *desc;
1759edf88417SAvi Kivity 	enum kvm_stat_kind kind;
1760edf88417SAvi Kivity };
176109cbcef6SMilan Pandurov 
1762cb082bfaSJing Zhang struct _kvm_stats_desc {
1763cb082bfaSJing Zhang 	struct kvm_stats_desc desc;
1764cb082bfaSJing Zhang 	char name[KVM_STATS_NAME_SIZE];
1765cb082bfaSJing Zhang };
1766cb082bfaSJing Zhang 
1767f95937ccSJing Zhang #define STATS_DESC_COMMON(type, unit, base, exp, sz, bsz)		       \
1768cb082bfaSJing Zhang 	.flags = type | unit | base |					       \
1769cb082bfaSJing Zhang 		 BUILD_BUG_ON_ZERO(type & ~KVM_STATS_TYPE_MASK) |	       \
1770cb082bfaSJing Zhang 		 BUILD_BUG_ON_ZERO(unit & ~KVM_STATS_UNIT_MASK) |	       \
1771cb082bfaSJing Zhang 		 BUILD_BUG_ON_ZERO(base & ~KVM_STATS_BASE_MASK),	       \
1772cb082bfaSJing Zhang 	.exponent = exp,						       \
1773f95937ccSJing Zhang 	.size = sz,							       \
1774f95937ccSJing Zhang 	.bucket_size = bsz
1775cb082bfaSJing Zhang 
1776f95937ccSJing Zhang #define VM_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz)	       \
1777cb082bfaSJing Zhang 	{								       \
1778cb082bfaSJing Zhang 		{							       \
1779f95937ccSJing Zhang 			STATS_DESC_COMMON(type, unit, base, exp, sz, bsz),     \
1780cb082bfaSJing Zhang 			.offset = offsetof(struct kvm_vm_stat, generic.stat)   \
1781cb082bfaSJing Zhang 		},							       \
1782cb082bfaSJing Zhang 		.name = #stat,						       \
1783cb082bfaSJing Zhang 	}
1784f95937ccSJing Zhang #define VCPU_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz)	       \
1785cb082bfaSJing Zhang 	{								       \
1786cb082bfaSJing Zhang 		{							       \
1787f95937ccSJing Zhang 			STATS_DESC_COMMON(type, unit, base, exp, sz, bsz),     \
1788cb082bfaSJing Zhang 			.offset = offsetof(struct kvm_vcpu_stat, generic.stat) \
1789cb082bfaSJing Zhang 		},							       \
1790cb082bfaSJing Zhang 		.name = #stat,						       \
1791cb082bfaSJing Zhang 	}
1792f95937ccSJing Zhang #define VM_STATS_DESC(stat, type, unit, base, exp, sz, bsz)		       \
1793cb082bfaSJing Zhang 	{								       \
1794cb082bfaSJing Zhang 		{							       \
1795f95937ccSJing Zhang 			STATS_DESC_COMMON(type, unit, base, exp, sz, bsz),     \
1796cb082bfaSJing Zhang 			.offset = offsetof(struct kvm_vm_stat, stat)	       \
1797cb082bfaSJing Zhang 		},							       \
1798cb082bfaSJing Zhang 		.name = #stat,						       \
1799cb082bfaSJing Zhang 	}
1800f95937ccSJing Zhang #define VCPU_STATS_DESC(stat, type, unit, base, exp, sz, bsz)		       \
1801cb082bfaSJing Zhang 	{								       \
1802cb082bfaSJing Zhang 		{							       \
1803f95937ccSJing Zhang 			STATS_DESC_COMMON(type, unit, base, exp, sz, bsz),     \
1804cb082bfaSJing Zhang 			.offset = offsetof(struct kvm_vcpu_stat, stat)	       \
1805cb082bfaSJing Zhang 		},							       \
1806cb082bfaSJing Zhang 		.name = #stat,						       \
1807cb082bfaSJing Zhang 	}
1808cb082bfaSJing Zhang /* SCOPE: VM, VM_GENERIC, VCPU, VCPU_GENERIC */
1809f95937ccSJing Zhang #define STATS_DESC(SCOPE, stat, type, unit, base, exp, sz, bsz)		       \
1810f95937ccSJing Zhang 	SCOPE##_STATS_DESC(stat, type, unit, base, exp, sz, bsz)
1811cb082bfaSJing Zhang 
1812cb082bfaSJing Zhang #define STATS_DESC_CUMULATIVE(SCOPE, name, unit, base, exponent)	       \
1813f95937ccSJing Zhang 	STATS_DESC(SCOPE, name, KVM_STATS_TYPE_CUMULATIVE,		       \
1814f95937ccSJing Zhang 		unit, base, exponent, 1, 0)
1815cb082bfaSJing Zhang #define STATS_DESC_INSTANT(SCOPE, name, unit, base, exponent)		       \
1816f95937ccSJing Zhang 	STATS_DESC(SCOPE, name, KVM_STATS_TYPE_INSTANT,			       \
1817f95937ccSJing Zhang 		unit, base, exponent, 1, 0)
1818cb082bfaSJing Zhang #define STATS_DESC_PEAK(SCOPE, name, unit, base, exponent)		       \
1819f95937ccSJing Zhang 	STATS_DESC(SCOPE, name, KVM_STATS_TYPE_PEAK,			       \
1820f95937ccSJing Zhang 		unit, base, exponent, 1, 0)
1821f95937ccSJing Zhang #define STATS_DESC_LINEAR_HIST(SCOPE, name, unit, base, exponent, sz, bsz)     \
1822f95937ccSJing Zhang 	STATS_DESC(SCOPE, name, KVM_STATS_TYPE_LINEAR_HIST,		       \
1823f95937ccSJing Zhang 		unit, base, exponent, sz, bsz)
1824f95937ccSJing Zhang #define STATS_DESC_LOG_HIST(SCOPE, name, unit, base, exponent, sz)	       \
1825f95937ccSJing Zhang 	STATS_DESC(SCOPE, name, KVM_STATS_TYPE_LOG_HIST,		       \
1826f95937ccSJing Zhang 		unit, base, exponent, sz, 0)
1827cb082bfaSJing Zhang 
1828cb082bfaSJing Zhang /* Cumulative counter, read/write */
1829cb082bfaSJing Zhang #define STATS_DESC_COUNTER(SCOPE, name)					       \
1830cb082bfaSJing Zhang 	STATS_DESC_CUMULATIVE(SCOPE, name, KVM_STATS_UNIT_NONE,		       \
1831cb082bfaSJing Zhang 		KVM_STATS_BASE_POW10, 0)
1832cb082bfaSJing Zhang /* Instantaneous counter, read only */
1833cb082bfaSJing Zhang #define STATS_DESC_ICOUNTER(SCOPE, name)				       \
1834cb082bfaSJing Zhang 	STATS_DESC_INSTANT(SCOPE, name, KVM_STATS_UNIT_NONE,		       \
1835cb082bfaSJing Zhang 		KVM_STATS_BASE_POW10, 0)
1836cb082bfaSJing Zhang /* Peak counter, read/write */
1837cb082bfaSJing Zhang #define STATS_DESC_PCOUNTER(SCOPE, name)				       \
1838cb082bfaSJing Zhang 	STATS_DESC_PEAK(SCOPE, name, KVM_STATS_UNIT_NONE,		       \
1839cb082bfaSJing Zhang 		KVM_STATS_BASE_POW10, 0)
1840cb082bfaSJing Zhang 
18411b870fa5SPaolo Bonzini /* Instantaneous boolean value, read only */
18421b870fa5SPaolo Bonzini #define STATS_DESC_IBOOLEAN(SCOPE, name)				       \
18431b870fa5SPaolo Bonzini 	STATS_DESC_INSTANT(SCOPE, name, KVM_STATS_UNIT_BOOLEAN,		       \
18441b870fa5SPaolo Bonzini 		KVM_STATS_BASE_POW10, 0)
18451b870fa5SPaolo Bonzini /* Peak (sticky) boolean value, read/write */
18461b870fa5SPaolo Bonzini #define STATS_DESC_PBOOLEAN(SCOPE, name)				       \
18471b870fa5SPaolo Bonzini 	STATS_DESC_PEAK(SCOPE, name, KVM_STATS_UNIT_BOOLEAN,		       \
18481b870fa5SPaolo Bonzini 		KVM_STATS_BASE_POW10, 0)
18491b870fa5SPaolo Bonzini 
1850cb082bfaSJing Zhang /* Cumulative time in nanosecond */
1851cb082bfaSJing Zhang #define STATS_DESC_TIME_NSEC(SCOPE, name)				       \
1852cb082bfaSJing Zhang 	STATS_DESC_CUMULATIVE(SCOPE, name, KVM_STATS_UNIT_SECONDS,	       \
1853cb082bfaSJing Zhang 		KVM_STATS_BASE_POW10, -9)
1854f95937ccSJing Zhang /* Linear histogram for time in nanosecond */
1855f95937ccSJing Zhang #define STATS_DESC_LINHIST_TIME_NSEC(SCOPE, name, sz, bsz)		       \
1856f95937ccSJing Zhang 	STATS_DESC_LINEAR_HIST(SCOPE, name, KVM_STATS_UNIT_SECONDS,	       \
1857f95937ccSJing Zhang 		KVM_STATS_BASE_POW10, -9, sz, bsz)
1858f95937ccSJing Zhang /* Logarithmic histogram for time in nanosecond */
1859f95937ccSJing Zhang #define STATS_DESC_LOGHIST_TIME_NSEC(SCOPE, name, sz)			       \
1860f95937ccSJing Zhang 	STATS_DESC_LOG_HIST(SCOPE, name, KVM_STATS_UNIT_SECONDS,	       \
1861f95937ccSJing Zhang 		KVM_STATS_BASE_POW10, -9, sz)
1862cb082bfaSJing Zhang 
1863fcfe1baeSJing Zhang #define KVM_GENERIC_VM_STATS()						       \
18643cc4e148SJing Zhang 	STATS_DESC_COUNTER(VM_GENERIC, remote_tlb_flush),		       \
18653cc4e148SJing Zhang 	STATS_DESC_COUNTER(VM_GENERIC, remote_tlb_flush_requests)
1866fcfe1baeSJing Zhang 
1867ce55c049SJing Zhang #define KVM_GENERIC_VCPU_STATS()					       \
1868ce55c049SJing Zhang 	STATS_DESC_COUNTER(VCPU_GENERIC, halt_successful_poll),		       \
1869ce55c049SJing Zhang 	STATS_DESC_COUNTER(VCPU_GENERIC, halt_attempted_poll),		       \
1870ce55c049SJing Zhang 	STATS_DESC_COUNTER(VCPU_GENERIC, halt_poll_invalid),		       \
1871ce55c049SJing Zhang 	STATS_DESC_COUNTER(VCPU_GENERIC, halt_wakeup),			       \
1872ce55c049SJing Zhang 	STATS_DESC_TIME_NSEC(VCPU_GENERIC, halt_poll_success_ns),	       \
187387bcc5faSJing Zhang 	STATS_DESC_TIME_NSEC(VCPU_GENERIC, halt_poll_fail_ns),		       \
18748ccba534SJing Zhang 	STATS_DESC_TIME_NSEC(VCPU_GENERIC, halt_wait_ns),		       \
18758ccba534SJing Zhang 	STATS_DESC_LOGHIST_TIME_NSEC(VCPU_GENERIC, halt_poll_success_hist,     \
18768ccba534SJing Zhang 			HALT_POLL_HIST_COUNT),				       \
18778ccba534SJing Zhang 	STATS_DESC_LOGHIST_TIME_NSEC(VCPU_GENERIC, halt_poll_fail_hist,	       \
18788ccba534SJing Zhang 			HALT_POLL_HIST_COUNT),				       \
18798ccba534SJing Zhang 	STATS_DESC_LOGHIST_TIME_NSEC(VCPU_GENERIC, halt_wait_hist,	       \
1880c3858335SJing Zhang 			HALT_POLL_HIST_COUNT),				       \
18811b870fa5SPaolo Bonzini 	STATS_DESC_IBOOLEAN(VCPU_GENERIC, blocking)
1882ce55c049SJing Zhang 
188376f7c879SHollis Blanchard extern struct dentry *kvm_debugfs_dir;
1884f95937ccSJing Zhang 
1885cb082bfaSJing Zhang ssize_t kvm_stats_read(char *id, const struct kvm_stats_header *header,
1886cb082bfaSJing Zhang 		       const struct _kvm_stats_desc *desc,
1887cb082bfaSJing Zhang 		       void *stats, size_t size_stats,
1888cb082bfaSJing Zhang 		       char __user *user_buffer, size_t size, loff_t *offset);
1889f95937ccSJing Zhang 
1890f95937ccSJing Zhang /**
1891f95937ccSJing Zhang  * kvm_stats_linear_hist_update() - Update bucket value for linear histogram
1892f95937ccSJing Zhang  * statistics data.
1893f95937ccSJing Zhang  *
1894f95937ccSJing Zhang  * @data: start address of the stats data
1895f95937ccSJing Zhang  * @size: the number of bucket of the stats data
1896f95937ccSJing Zhang  * @value: the new value used to update the linear histogram's bucket
1897f95937ccSJing Zhang  * @bucket_size: the size (width) of a bucket
1898f95937ccSJing Zhang  */
1899f95937ccSJing Zhang static inline void kvm_stats_linear_hist_update(u64 *data, size_t size,
1900f95937ccSJing Zhang 						u64 value, size_t bucket_size)
1901f95937ccSJing Zhang {
1902f95937ccSJing Zhang 	size_t index = div64_u64(value, bucket_size);
1903f95937ccSJing Zhang 
1904f95937ccSJing Zhang 	index = min(index, size - 1);
1905f95937ccSJing Zhang 	++data[index];
1906f95937ccSJing Zhang }
1907f95937ccSJing Zhang 
1908f95937ccSJing Zhang /**
1909f95937ccSJing Zhang  * kvm_stats_log_hist_update() - Update bucket value for logarithmic histogram
1910f95937ccSJing Zhang  * statistics data.
1911f95937ccSJing Zhang  *
1912f95937ccSJing Zhang  * @data: start address of the stats data
1913f95937ccSJing Zhang  * @size: the number of bucket of the stats data
1914f95937ccSJing Zhang  * @value: the new value used to update the logarithmic histogram's bucket
1915f95937ccSJing Zhang  */
1916f95937ccSJing Zhang static inline void kvm_stats_log_hist_update(u64 *data, size_t size, u64 value)
1917f95937ccSJing Zhang {
1918f95937ccSJing Zhang 	size_t index = fls64(value);
1919f95937ccSJing Zhang 
1920f95937ccSJing Zhang 	index = min(index, size - 1);
1921f95937ccSJing Zhang 	++data[index];
1922f95937ccSJing Zhang }
1923f95937ccSJing Zhang 
1924f95937ccSJing Zhang #define KVM_STATS_LINEAR_HIST_UPDATE(array, value, bsize)		       \
1925f95937ccSJing Zhang 	kvm_stats_linear_hist_update(array, ARRAY_SIZE(array), value, bsize)
1926f95937ccSJing Zhang #define KVM_STATS_LOG_HIST_UPDATE(array, value)				       \
1927f95937ccSJing Zhang 	kvm_stats_log_hist_update(array, ARRAY_SIZE(array), value)
1928f95937ccSJing Zhang 
1929f95937ccSJing Zhang 
1930fcfe1baeSJing Zhang extern const struct kvm_stats_header kvm_vm_stats_header;
1931fcfe1baeSJing Zhang extern const struct _kvm_stats_desc kvm_vm_stats_desc[];
1932ce55c049SJing Zhang extern const struct kvm_stats_header kvm_vcpu_stats_header;
1933ce55c049SJing Zhang extern const struct _kvm_stats_desc kvm_vcpu_stats_desc[];
1934d4c9ff2dSFeng(Eric) Liu 
193536c1ed82SMarc Zyngier #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
193620ec3ebdSChao Peng static inline int mmu_invalidate_retry(struct kvm *kvm, unsigned long mmu_seq)
1937e930bffeSAndrea Arcangeli {
193820ec3ebdSChao Peng 	if (unlikely(kvm->mmu_invalidate_in_progress))
1939e930bffeSAndrea Arcangeli 		return 1;
1940e930bffeSAndrea Arcangeli 	/*
194120ec3ebdSChao Peng 	 * Ensure the read of mmu_invalidate_in_progress happens before
194220ec3ebdSChao Peng 	 * the read of mmu_invalidate_seq.  This interacts with the
194320ec3ebdSChao Peng 	 * smp_wmb() in mmu_notifier_invalidate_range_end to make sure
194420ec3ebdSChao Peng 	 * that the caller either sees the old (non-zero) value of
194520ec3ebdSChao Peng 	 * mmu_invalidate_in_progress or the new (incremented) value of
194620ec3ebdSChao Peng 	 * mmu_invalidate_seq.
194720ec3ebdSChao Peng 	 *
194820ec3ebdSChao Peng 	 * PowerPC Book3s HV KVM calls this under a per-page lock rather
194920ec3ebdSChao Peng 	 * than under kvm->mmu_lock, for scalability, so can't rely on
195020ec3ebdSChao Peng 	 * kvm->mmu_lock to keep things ordered.
1951e930bffeSAndrea Arcangeli 	 */
1952a355aa54SPaul Mackerras 	smp_rmb();
195320ec3ebdSChao Peng 	if (kvm->mmu_invalidate_seq != mmu_seq)
1954e930bffeSAndrea Arcangeli 		return 1;
1955e930bffeSAndrea Arcangeli 	return 0;
1956e930bffeSAndrea Arcangeli }
19574a42d848SDavid Stevens 
195820ec3ebdSChao Peng static inline int mmu_invalidate_retry_hva(struct kvm *kvm,
19594a42d848SDavid Stevens 					   unsigned long mmu_seq,
19604a42d848SDavid Stevens 					   unsigned long hva)
19614a42d848SDavid Stevens {
19624a42d848SDavid Stevens 	lockdep_assert_held(&kvm->mmu_lock);
19634a42d848SDavid Stevens 	/*
196420ec3ebdSChao Peng 	 * If mmu_invalidate_in_progress is non-zero, then the range maintained
196520ec3ebdSChao Peng 	 * by kvm_mmu_notifier_invalidate_range_start contains all addresses
196620ec3ebdSChao Peng 	 * that might be being invalidated. Note that it may include some false
19674a42d848SDavid Stevens 	 * positives, due to shortcuts when handing concurrent invalidations.
19684a42d848SDavid Stevens 	 */
196920ec3ebdSChao Peng 	if (unlikely(kvm->mmu_invalidate_in_progress) &&
197020ec3ebdSChao Peng 	    hva >= kvm->mmu_invalidate_range_start &&
197120ec3ebdSChao Peng 	    hva < kvm->mmu_invalidate_range_end)
19724a42d848SDavid Stevens 		return 1;
197320ec3ebdSChao Peng 	if (kvm->mmu_invalidate_seq != mmu_seq)
19744a42d848SDavid Stevens 		return 1;
19754a42d848SDavid Stevens 	return 0;
19764a42d848SDavid Stevens }
1977e930bffeSAndrea Arcangeli #endif
1978e930bffeSAndrea Arcangeli 
1979a725d56aSAlexander Graf #ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
1980399ec807SAvi Kivity 
1981ddc9cfb7SWanpeng Li #define KVM_MAX_IRQ_ROUTES 4096 /* might need extension/rework in the future */
1982399ec807SAvi Kivity 
19835c0aea0eSDavid Hildenbrand bool kvm_arch_can_set_irq_routing(struct kvm *kvm);
1984399ec807SAvi Kivity int kvm_set_irq_routing(struct kvm *kvm,
1985399ec807SAvi Kivity 			const struct kvm_irq_routing_entry *entries,
1986399ec807SAvi Kivity 			unsigned nr,
1987399ec807SAvi Kivity 			unsigned flags);
1988c63cf538SRadim Krčmář int kvm_set_routing_entry(struct kvm *kvm,
1989c63cf538SRadim Krčmář 			  struct kvm_kernel_irq_routing_entry *e,
1990e8cde093SAlexander Graf 			  const struct kvm_irq_routing_entry *ue);
1991399ec807SAvi Kivity void kvm_free_irq_routing(struct kvm *kvm);
1992399ec807SAvi Kivity 
1993399ec807SAvi Kivity #else
1994399ec807SAvi Kivity 
1995399ec807SAvi Kivity static inline void kvm_free_irq_routing(struct kvm *kvm) {}
1996399ec807SAvi Kivity 
1997399ec807SAvi Kivity #endif
1998399ec807SAvi Kivity 
1999297e2105SPaul Mackerras int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi);
2000297e2105SPaul Mackerras 
2001721eecbfSGregory Haskins #ifdef CONFIG_HAVE_KVM_EVENTFD
2002721eecbfSGregory Haskins 
2003d34e6b17SGregory Haskins void kvm_eventfd_init(struct kvm *kvm);
2004914daba8SAlexander Graf int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args);
2005914daba8SAlexander Graf 
2006297e2105SPaul Mackerras #ifdef CONFIG_HAVE_KVM_IRQFD
2007d4db2935SAlex Williamson int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args);
2008721eecbfSGregory Haskins void kvm_irqfd_release(struct kvm *kvm);
20099957c86dSPaul Mackerras void kvm_irq_routing_update(struct kvm *);
2010914daba8SAlexander Graf #else
2011914daba8SAlexander Graf static inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args)
2012914daba8SAlexander Graf {
2013914daba8SAlexander Graf 	return -EINVAL;
2014914daba8SAlexander Graf }
2015914daba8SAlexander Graf 
2016914daba8SAlexander Graf static inline void kvm_irqfd_release(struct kvm *kvm) {}
2017914daba8SAlexander Graf #endif
2018721eecbfSGregory Haskins 
2019721eecbfSGregory Haskins #else
2020721eecbfSGregory Haskins 
2021d34e6b17SGregory Haskins static inline void kvm_eventfd_init(struct kvm *kvm) {}
2022bd2b53b2SMichael S. Tsirkin 
2023d4db2935SAlex Williamson static inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args)
2024721eecbfSGregory Haskins {
2025721eecbfSGregory Haskins 	return -EINVAL;
2026721eecbfSGregory Haskins }
2027721eecbfSGregory Haskins 
2028721eecbfSGregory Haskins static inline void kvm_irqfd_release(struct kvm *kvm) {}
2029bd2b53b2SMichael S. Tsirkin 
203027923eb1SAlexander Graf #ifdef CONFIG_HAVE_KVM_IRQCHIP
20319957c86dSPaul Mackerras static inline void kvm_irq_routing_update(struct kvm *kvm)
2032bd2b53b2SMichael S. Tsirkin {
2033bd2b53b2SMichael S. Tsirkin }
203427923eb1SAlexander Graf #endif
2035bd2b53b2SMichael S. Tsirkin 
2036d34e6b17SGregory Haskins static inline int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
2037d34e6b17SGregory Haskins {
2038d34e6b17SGregory Haskins 	return -ENOSYS;
2039d34e6b17SGregory Haskins }
2040721eecbfSGregory Haskins 
2041721eecbfSGregory Haskins #endif /* CONFIG_HAVE_KVM_EVENTFD */
2042721eecbfSGregory Haskins 
204307646749SSebastian Ott void kvm_arch_irq_routing_update(struct kvm *kvm);
204407646749SSebastian Ott 
2045df06dae3SSean Christopherson static inline void __kvm_make_request(int req, struct kvm_vcpu *vcpu)
2046a8eeb04aSAvi Kivity {
20472e4682baSPaolo Bonzini 	/*
20482e4682baSPaolo Bonzini 	 * Ensure the rest of the request is published to kvm_check_request's
20492e4682baSPaolo Bonzini 	 * caller.  Paired with the smp_mb__after_atomic in kvm_check_request.
20502e4682baSPaolo Bonzini 	 */
20512e4682baSPaolo Bonzini 	smp_wmb();
205286dafed5SKarimAllah Ahmed 	set_bit(req & KVM_REQUEST_MASK, (void *)&vcpu->requests);
2053a8eeb04aSAvi Kivity }
2054a8eeb04aSAvi Kivity 
2055df06dae3SSean Christopherson static __always_inline void kvm_make_request(int req, struct kvm_vcpu *vcpu)
2056df06dae3SSean Christopherson {
2057df06dae3SSean Christopherson 	/*
2058df06dae3SSean Christopherson 	 * Request that don't require vCPU action should never be logged in
2059df06dae3SSean Christopherson 	 * vcpu->requests.  The vCPU won't clear the request, so it will stay
2060df06dae3SSean Christopherson 	 * logged indefinitely and prevent the vCPU from entering the guest.
2061df06dae3SSean Christopherson 	 */
2062df06dae3SSean Christopherson 	BUILD_BUG_ON(!__builtin_constant_p(req) ||
2063df06dae3SSean Christopherson 		     (req & KVM_REQUEST_NO_ACTION));
2064df06dae3SSean Christopherson 
2065df06dae3SSean Christopherson 	__kvm_make_request(req, vcpu);
2066df06dae3SSean Christopherson }
2067df06dae3SSean Christopherson 
20682fa6e1e1SRadim Krčmář static inline bool kvm_request_pending(struct kvm_vcpu *vcpu)
20692fa6e1e1SRadim Krčmář {
20702fa6e1e1SRadim Krčmář 	return READ_ONCE(vcpu->requests);
20712fa6e1e1SRadim Krčmář }
20722fa6e1e1SRadim Krčmář 
207372875d8aSRadim Krčmář static inline bool kvm_test_request(int req, struct kvm_vcpu *vcpu)
207472875d8aSRadim Krčmář {
207586dafed5SKarimAllah Ahmed 	return test_bit(req & KVM_REQUEST_MASK, (void *)&vcpu->requests);
207672875d8aSRadim Krčmář }
207772875d8aSRadim Krčmář 
207872875d8aSRadim Krčmář static inline void kvm_clear_request(int req, struct kvm_vcpu *vcpu)
207972875d8aSRadim Krčmář {
208086dafed5SKarimAllah Ahmed 	clear_bit(req & KVM_REQUEST_MASK, (void *)&vcpu->requests);
208172875d8aSRadim Krčmář }
208272875d8aSRadim Krčmář 
2083a8eeb04aSAvi Kivity static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu)
2084a8eeb04aSAvi Kivity {
208572875d8aSRadim Krčmář 	if (kvm_test_request(req, vcpu)) {
208672875d8aSRadim Krčmář 		kvm_clear_request(req, vcpu);
20872e4682baSPaolo Bonzini 
20882e4682baSPaolo Bonzini 		/*
20892e4682baSPaolo Bonzini 		 * Ensure the rest of the request is visible to kvm_check_request's
20902e4682baSPaolo Bonzini 		 * caller.  Paired with the smp_wmb in kvm_make_request.
20912e4682baSPaolo Bonzini 		 */
20922e4682baSPaolo Bonzini 		smp_mb__after_atomic();
20930719837cSAvi Kivity 		return true;
20940719837cSAvi Kivity 	} else {
20950719837cSAvi Kivity 		return false;
20960719837cSAvi Kivity 	}
2097a8eeb04aSAvi Kivity }
2098a8eeb04aSAvi Kivity 
20998b415dcdSGeoff Levand extern bool kvm_rebooting;
21008b415dcdSGeoff Levand 
2101ec76d819SSuraj Jitindar Singh extern unsigned int halt_poll_ns;
2102ec76d819SSuraj Jitindar Singh extern unsigned int halt_poll_ns_grow;
210349113d36SNir Weiner extern unsigned int halt_poll_ns_grow_start;
2104ec76d819SSuraj Jitindar Singh extern unsigned int halt_poll_ns_shrink;
2105ec76d819SSuraj Jitindar Singh 
2106852b6d57SScott Wood struct kvm_device {
21078538cb22SSteven Price 	const struct kvm_device_ops *ops;
2108852b6d57SScott Wood 	struct kvm *kvm;
2109852b6d57SScott Wood 	void *private;
211007f0a7bdSScott Wood 	struct list_head vm_node;
2111852b6d57SScott Wood };
2112852b6d57SScott Wood 
2113852b6d57SScott Wood /* create, destroy, and name are mandatory */
2114852b6d57SScott Wood struct kvm_device_ops {
2115852b6d57SScott Wood 	const char *name;
2116a28ebea2SChristoffer Dall 
2117a28ebea2SChristoffer Dall 	/*
2118a28ebea2SChristoffer Dall 	 * create is called holding kvm->lock and any operations not suitable
2119a28ebea2SChristoffer Dall 	 * to do while holding the lock should be deferred to init (see
2120a28ebea2SChristoffer Dall 	 * below).
2121a28ebea2SChristoffer Dall 	 */
2122852b6d57SScott Wood 	int (*create)(struct kvm_device *dev, u32 type);
2123852b6d57SScott Wood 
2124852b6d57SScott Wood 	/*
2125023e9fddSChristoffer Dall 	 * init is called after create if create is successful and is called
2126023e9fddSChristoffer Dall 	 * outside of holding kvm->lock.
2127023e9fddSChristoffer Dall 	 */
2128023e9fddSChristoffer Dall 	void (*init)(struct kvm_device *dev);
2129023e9fddSChristoffer Dall 
2130023e9fddSChristoffer Dall 	/*
2131852b6d57SScott Wood 	 * Destroy is responsible for freeing dev.
2132852b6d57SScott Wood 	 *
2133852b6d57SScott Wood 	 * Destroy may be called before or after destructors are called
2134852b6d57SScott Wood 	 * on emulated I/O regions, depending on whether a reference is
2135852b6d57SScott Wood 	 * held by a vcpu or other kvm component that gets destroyed
2136852b6d57SScott Wood 	 * after the emulated I/O.
2137852b6d57SScott Wood 	 */
2138852b6d57SScott Wood 	void (*destroy)(struct kvm_device *dev);
2139852b6d57SScott Wood 
21402bde9b3eSCédric Le Goater 	/*
21412bde9b3eSCédric Le Goater 	 * Release is an alternative method to free the device. It is
21422bde9b3eSCédric Le Goater 	 * called when the device file descriptor is closed. Once
21432bde9b3eSCédric Le Goater 	 * release is called, the destroy method will not be called
21442bde9b3eSCédric Le Goater 	 * anymore as the device is removed from the device list of
21452bde9b3eSCédric Le Goater 	 * the VM. kvm->lock is held.
21462bde9b3eSCédric Le Goater 	 */
21472bde9b3eSCédric Le Goater 	void (*release)(struct kvm_device *dev);
21482bde9b3eSCédric Le Goater 
2149852b6d57SScott Wood 	int (*set_attr)(struct kvm_device *dev, struct kvm_device_attr *attr);
2150852b6d57SScott Wood 	int (*get_attr)(struct kvm_device *dev, struct kvm_device_attr *attr);
2151852b6d57SScott Wood 	int (*has_attr)(struct kvm_device *dev, struct kvm_device_attr *attr);
2152852b6d57SScott Wood 	long (*ioctl)(struct kvm_device *dev, unsigned int ioctl,
2153852b6d57SScott Wood 		      unsigned long arg);
2154a1cd3f08SCédric Le Goater 	int (*mmap)(struct kvm_device *dev, struct vm_area_struct *vma);
2155852b6d57SScott Wood };
2156852b6d57SScott Wood 
2157852b6d57SScott Wood void kvm_device_get(struct kvm_device *dev);
2158852b6d57SScott Wood void kvm_device_put(struct kvm_device *dev);
2159852b6d57SScott Wood struct kvm_device *kvm_device_from_filp(struct file *filp);
21608538cb22SSteven Price int kvm_register_device_ops(const struct kvm_device_ops *ops, u32 type);
2161571ee1b6SWanpeng Li void kvm_unregister_device_ops(u32 type);
2162852b6d57SScott Wood 
21635df554adSScott Wood extern struct kvm_device_ops kvm_mpic_ops;
2164ea2f83a7SAndre Przywara extern struct kvm_device_ops kvm_arm_vgic_v2_ops;
2165a0675c25SAndre Przywara extern struct kvm_device_ops kvm_arm_vgic_v3_ops;
21665df554adSScott Wood 
21674c088493SRaghavendra K T #ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT
21684c088493SRaghavendra K T 
21694c088493SRaghavendra K T static inline void kvm_vcpu_set_in_spin_loop(struct kvm_vcpu *vcpu, bool val)
21704c088493SRaghavendra K T {
21714c088493SRaghavendra K T 	vcpu->spin_loop.in_spin_loop = val;
21724c088493SRaghavendra K T }
21734c088493SRaghavendra K T static inline void kvm_vcpu_set_dy_eligible(struct kvm_vcpu *vcpu, bool val)
21744c088493SRaghavendra K T {
21754c088493SRaghavendra K T 	vcpu->spin_loop.dy_eligible = val;
21764c088493SRaghavendra K T }
21774c088493SRaghavendra K T 
21784c088493SRaghavendra K T #else /* !CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT */
21794c088493SRaghavendra K T 
21804c088493SRaghavendra K T static inline void kvm_vcpu_set_in_spin_loop(struct kvm_vcpu *vcpu, bool val)
21814c088493SRaghavendra K T {
21824c088493SRaghavendra K T }
21834c088493SRaghavendra K T 
21844c088493SRaghavendra K T static inline void kvm_vcpu_set_dy_eligible(struct kvm_vcpu *vcpu, bool val)
21854c088493SRaghavendra K T {
21864c088493SRaghavendra K T }
21874c088493SRaghavendra K T #endif /* CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT */
21881a02b270SEric Auger 
2189c36b7150SPaolo Bonzini static inline bool kvm_is_visible_memslot(struct kvm_memory_slot *memslot)
2190c36b7150SPaolo Bonzini {
2191c36b7150SPaolo Bonzini 	return (memslot && memslot->id < KVM_USER_MEM_SLOTS &&
2192c36b7150SPaolo Bonzini 		!(memslot->flags & KVM_MEMSLOT_INVALID));
2193c36b7150SPaolo Bonzini }
2194c36b7150SPaolo Bonzini 
21957495e22bSPaolo Bonzini struct kvm_vcpu *kvm_get_running_vcpu(void);
2196fcd07f9aSChristian Borntraeger struct kvm_vcpu * __percpu *kvm_get_running_vcpus(void);
21977495e22bSPaolo Bonzini 
21981a02b270SEric Auger #ifdef CONFIG_HAVE_KVM_IRQ_BYPASS
219914717e20SAlex Williamson bool kvm_arch_has_irq_bypass(void);
22001a02b270SEric Auger int kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *,
22011a02b270SEric Auger 			   struct irq_bypass_producer *);
22021a02b270SEric Auger void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *,
22031a02b270SEric Auger 			   struct irq_bypass_producer *);
22041a02b270SEric Auger void kvm_arch_irq_bypass_stop(struct irq_bypass_consumer *);
22051a02b270SEric Auger void kvm_arch_irq_bypass_start(struct irq_bypass_consumer *);
2206f70c20aaSFeng Wu int kvm_arch_update_irqfd_routing(struct kvm *kvm, unsigned int host_irq,
2207f70c20aaSFeng Wu 				  uint32_t guest_irq, bool set);
2208515a0c79SLongpeng(Mike) bool kvm_arch_irqfd_route_changed(struct kvm_kernel_irq_routing_entry *,
2209515a0c79SLongpeng(Mike) 				  struct kvm_kernel_irq_routing_entry *);
22101a02b270SEric Auger #endif /* CONFIG_HAVE_KVM_IRQ_BYPASS */
221135181e86SHaozhong Zhang 
22123491caf2SChristian Borntraeger #ifdef CONFIG_HAVE_KVM_INVALID_WAKEUPS
22133491caf2SChristian Borntraeger /* If we wakeup during the poll time, was it a sucessful poll? */
22143491caf2SChristian Borntraeger static inline bool vcpu_valid_wakeup(struct kvm_vcpu *vcpu)
22153491caf2SChristian Borntraeger {
22163491caf2SChristian Borntraeger 	return vcpu->valid_wakeup;
22173491caf2SChristian Borntraeger }
22183491caf2SChristian Borntraeger 
22193491caf2SChristian Borntraeger #else
22203491caf2SChristian Borntraeger static inline bool vcpu_valid_wakeup(struct kvm_vcpu *vcpu)
22213491caf2SChristian Borntraeger {
22223491caf2SChristian Borntraeger 	return true;
22233491caf2SChristian Borntraeger }
22243491caf2SChristian Borntraeger #endif /* CONFIG_HAVE_KVM_INVALID_WAKEUPS */
22253491caf2SChristian Borntraeger 
2226cdd6ad3aSChristian Borntraeger #ifdef CONFIG_HAVE_KVM_NO_POLL
2227cdd6ad3aSChristian Borntraeger /* Callback that tells if we must not poll */
2228cdd6ad3aSChristian Borntraeger bool kvm_arch_no_poll(struct kvm_vcpu *vcpu);
2229cdd6ad3aSChristian Borntraeger #else
2230cdd6ad3aSChristian Borntraeger static inline bool kvm_arch_no_poll(struct kvm_vcpu *vcpu)
2231cdd6ad3aSChristian Borntraeger {
2232cdd6ad3aSChristian Borntraeger 	return false;
2233cdd6ad3aSChristian Borntraeger }
2234cdd6ad3aSChristian Borntraeger #endif /* CONFIG_HAVE_KVM_NO_POLL */
2235cdd6ad3aSChristian Borntraeger 
22365cb0944cSPaolo Bonzini #ifdef CONFIG_HAVE_KVM_VCPU_ASYNC_IOCTL
22375cb0944cSPaolo Bonzini long kvm_arch_vcpu_async_ioctl(struct file *filp,
22385cb0944cSPaolo Bonzini 			       unsigned int ioctl, unsigned long arg);
22395cb0944cSPaolo Bonzini #else
22405cb0944cSPaolo Bonzini static inline long kvm_arch_vcpu_async_ioctl(struct file *filp,
22415cb0944cSPaolo Bonzini 					     unsigned int ioctl,
22425cb0944cSPaolo Bonzini 					     unsigned long arg)
22435cb0944cSPaolo Bonzini {
22445cb0944cSPaolo Bonzini 	return -ENOIOCTLCMD;
22455cb0944cSPaolo Bonzini }
22465cb0944cSPaolo Bonzini #endif /* CONFIG_HAVE_KVM_VCPU_ASYNC_IOCTL */
22475cb0944cSPaolo Bonzini 
2248e649b3f0SEiichi Tsukata void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
2249e649b3f0SEiichi Tsukata 					    unsigned long start, unsigned long end);
2250f75e4924SSebastian Ott 
2251683412ccSMingwei Zhang void kvm_arch_guest_memory_reclaimed(struct kvm *kvm);
2252683412ccSMingwei Zhang 
2253bd2a6394SChristoffer Dall #ifdef CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE
2254bd2a6394SChristoffer Dall int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu);
2255bd2a6394SChristoffer Dall #else
2256bd2a6394SChristoffer Dall static inline int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
2257bd2a6394SChristoffer Dall {
2258bd2a6394SChristoffer Dall 	return 0;
2259bd2a6394SChristoffer Dall }
2260bd2a6394SChristoffer Dall #endif /* CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE */
2261bd2a6394SChristoffer Dall 
2262c57c8046SJunaid Shahid typedef int (*kvm_vm_thread_fn_t)(struct kvm *kvm, uintptr_t data);
2263c57c8046SJunaid Shahid 
2264c57c8046SJunaid Shahid int kvm_vm_create_worker_thread(struct kvm *kvm, kvm_vm_thread_fn_t thread_fn,
2265c57c8046SJunaid Shahid 				uintptr_t data, const char *name,
2266c57c8046SJunaid Shahid 				struct task_struct **thread_ptr);
2267c57c8046SJunaid Shahid 
2268935ace2fSThomas Gleixner #ifdef CONFIG_KVM_XFER_TO_GUEST_WORK
2269935ace2fSThomas Gleixner static inline void kvm_handle_signal_exit(struct kvm_vcpu *vcpu)
2270935ace2fSThomas Gleixner {
2271935ace2fSThomas Gleixner 	vcpu->run->exit_reason = KVM_EXIT_INTR;
2272935ace2fSThomas Gleixner 	vcpu->stat.signal_exits++;
2273935ace2fSThomas Gleixner }
2274935ace2fSThomas Gleixner #endif /* CONFIG_KVM_XFER_TO_GUEST_WORK */
2275935ace2fSThomas Gleixner 
2276fb04a1edSPeter Xu /*
227743a063caSYosry Ahmed  * If more than one page is being (un)accounted, @virt must be the address of
227843a063caSYosry Ahmed  * the first page of a block of pages what were allocated together (i.e
227943a063caSYosry Ahmed  * accounted together).
228043a063caSYosry Ahmed  *
228143a063caSYosry Ahmed  * kvm_account_pgtable_pages() is thread-safe because mod_lruvec_page_state()
228243a063caSYosry Ahmed  * is thread-safe.
228343a063caSYosry Ahmed  */
228443a063caSYosry Ahmed static inline void kvm_account_pgtable_pages(void *virt, int nr)
228543a063caSYosry Ahmed {
228643a063caSYosry Ahmed 	mod_lruvec_page_state(virt_to_page(virt), NR_SECONDARY_PAGETABLE, nr);
228743a063caSYosry Ahmed }
228843a063caSYosry Ahmed 
228943a063caSYosry Ahmed /*
2290fb04a1edSPeter Xu  * This defines how many reserved entries we want to keep before we
2291fb04a1edSPeter Xu  * kick the vcpu to the userspace to avoid dirty ring full.  This
2292fb04a1edSPeter Xu  * value can be tuned to higher if e.g. PML is enabled on the host.
2293fb04a1edSPeter Xu  */
2294fb04a1edSPeter Xu #define  KVM_DIRTY_RING_RSVD_ENTRIES  64
2295fb04a1edSPeter Xu 
2296fb04a1edSPeter Xu /* Max number of entries allowed for each kvm dirty ring */
2297fb04a1edSPeter Xu #define  KVM_DIRTY_RING_MAX_ENTRIES  65536
2298fb04a1edSPeter Xu 
2299bfd99ff5SAvi Kivity #endif
2300