18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci#ifndef __KVM_HOST_H
38c2ecf20Sopenharmony_ci#define __KVM_HOST_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/types.h>
78c2ecf20Sopenharmony_ci#include <linux/hardirq.h>
88c2ecf20Sopenharmony_ci#include <linux/list.h>
98c2ecf20Sopenharmony_ci#include <linux/mutex.h>
108c2ecf20Sopenharmony_ci#include <linux/spinlock.h>
118c2ecf20Sopenharmony_ci#include <linux/signal.h>
128c2ecf20Sopenharmony_ci#include <linux/sched.h>
138c2ecf20Sopenharmony_ci#include <linux/bug.h>
148c2ecf20Sopenharmony_ci#include <linux/mm.h>
158c2ecf20Sopenharmony_ci#include <linux/mmu_notifier.h>
168c2ecf20Sopenharmony_ci#include <linux/preempt.h>
178c2ecf20Sopenharmony_ci#include <linux/msi.h>
188c2ecf20Sopenharmony_ci#include <linux/slab.h>
198c2ecf20Sopenharmony_ci#include <linux/vmalloc.h>
208c2ecf20Sopenharmony_ci#include <linux/rcupdate.h>
218c2ecf20Sopenharmony_ci#include <linux/ratelimit.h>
228c2ecf20Sopenharmony_ci#include <linux/err.h>
238c2ecf20Sopenharmony_ci#include <linux/irqflags.h>
248c2ecf20Sopenharmony_ci#include <linux/context_tracking.h>
258c2ecf20Sopenharmony_ci#include <linux/irqbypass.h>
268c2ecf20Sopenharmony_ci#include <linux/rcuwait.h>
278c2ecf20Sopenharmony_ci#include <linux/refcount.h>
288c2ecf20Sopenharmony_ci#include <linux/nospec.h>
298c2ecf20Sopenharmony_ci#include <asm/signal.h>
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci#include <linux/kvm.h>
328c2ecf20Sopenharmony_ci#include <linux/kvm_para.h>
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci#include <linux/kvm_types.h>
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#include <asm/kvm_host.h>
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci#ifndef KVM_MAX_VCPU_ID
398c2ecf20Sopenharmony_ci#define KVM_MAX_VCPU_ID KVM_MAX_VCPUS
408c2ecf20Sopenharmony_ci#endif
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci/*
438c2ecf20Sopenharmony_ci * The bit 16 ~ bit 31 of kvm_memory_region::flags are internally used
448c2ecf20Sopenharmony_ci * in kvm, other bits are visible for userspace which are defined in
458c2ecf20Sopenharmony_ci * include/linux/kvm_h.
468c2ecf20Sopenharmony_ci */
478c2ecf20Sopenharmony_ci#define KVM_MEMSLOT_INVALID	(1UL << 16)
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci/*
508c2ecf20Sopenharmony_ci * Bit 63 of the memslot generation number is an "update in-progress flag",
518c2ecf20Sopenharmony_ci * e.g. is temporarily set for the duration of install_new_memslots().
528c2ecf20Sopenharmony_ci * This flag effectively creates a unique generation number that is used to
538c2ecf20Sopenharmony_ci * mark cached memslot data, e.g. MMIO accesses, as potentially being stale,
548c2ecf20Sopenharmony_ci * i.e. may (or may not) have come from the previous memslots generation.
558c2ecf20Sopenharmony_ci *
568c2ecf20Sopenharmony_ci * This is necessary because the actual memslots update is not atomic with
578c2ecf20Sopenharmony_ci * respect to the generation number update.  Updating the generation number
588c2ecf20Sopenharmony_ci * first would allow a vCPU to cache a spte from the old memslots using the
598c2ecf20Sopenharmony_ci * new generation number, and updating the generation number after switching
608c2ecf20Sopenharmony_ci * to the new memslots would allow cache hits using the old generation number
618c2ecf20Sopenharmony_ci * to reference the defunct memslots.
628c2ecf20Sopenharmony_ci *
638c2ecf20Sopenharmony_ci * This mechanism is used to prevent getting hits in KVM's caches while a
648c2ecf20Sopenharmony_ci * memslot update is in-progress, and to prevent cache hits *after* updating
658c2ecf20Sopenharmony_ci * the actual generation number against accesses that were inserted into the
668c2ecf20Sopenharmony_ci * cache *before* the memslots were updated.
678c2ecf20Sopenharmony_ci */
688c2ecf20Sopenharmony_ci#define KVM_MEMSLOT_GEN_UPDATE_IN_PROGRESS	BIT_ULL(63)
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci/* Two fragments for cross MMIO pages. */
718c2ecf20Sopenharmony_ci#define KVM_MAX_MMIO_FRAGMENTS	2
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci#ifndef KVM_ADDRESS_SPACE_NUM
748c2ecf20Sopenharmony_ci#define KVM_ADDRESS_SPACE_NUM	1
758c2ecf20Sopenharmony_ci#endif
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci/*
788c2ecf20Sopenharmony_ci * For the normal pfn, the highest 12 bits should be zero,
798c2ecf20Sopenharmony_ci * so we can mask bit 62 ~ bit 52  to indicate the error pfn,
808c2ecf20Sopenharmony_ci * mask bit 63 to indicate the noslot pfn.
818c2ecf20Sopenharmony_ci */
828c2ecf20Sopenharmony_ci#define KVM_PFN_ERR_MASK	(0x7ffULL << 52)
838c2ecf20Sopenharmony_ci#define KVM_PFN_ERR_NOSLOT_MASK	(0xfffULL << 52)
848c2ecf20Sopenharmony_ci#define KVM_PFN_NOSLOT		(0x1ULL << 63)
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci#define KVM_PFN_ERR_FAULT	(KVM_PFN_ERR_MASK)
878c2ecf20Sopenharmony_ci#define KVM_PFN_ERR_HWPOISON	(KVM_PFN_ERR_MASK + 1)
888c2ecf20Sopenharmony_ci#define KVM_PFN_ERR_RO_FAULT	(KVM_PFN_ERR_MASK + 2)
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci/*
918c2ecf20Sopenharmony_ci * error pfns indicate that the gfn is in slot but faild to
928c2ecf20Sopenharmony_ci * translate it to pfn on host.
938c2ecf20Sopenharmony_ci */
948c2ecf20Sopenharmony_cistatic inline bool is_error_pfn(kvm_pfn_t pfn)
958c2ecf20Sopenharmony_ci{
968c2ecf20Sopenharmony_ci	return !!(pfn & KVM_PFN_ERR_MASK);
978c2ecf20Sopenharmony_ci}
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci/*
1008c2ecf20Sopenharmony_ci * error_noslot pfns indicate that the gfn can not be
1018c2ecf20Sopenharmony_ci * translated to pfn - it is not in slot or failed to
1028c2ecf20Sopenharmony_ci * translate it to pfn.
1038c2ecf20Sopenharmony_ci */
1048c2ecf20Sopenharmony_cistatic inline bool is_error_noslot_pfn(kvm_pfn_t pfn)
1058c2ecf20Sopenharmony_ci{
1068c2ecf20Sopenharmony_ci	return !!(pfn & KVM_PFN_ERR_NOSLOT_MASK);
1078c2ecf20Sopenharmony_ci}
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci/* noslot pfn indicates that the gfn is not in slot. */
1108c2ecf20Sopenharmony_cistatic inline bool is_noslot_pfn(kvm_pfn_t pfn)
1118c2ecf20Sopenharmony_ci{
1128c2ecf20Sopenharmony_ci	return pfn == KVM_PFN_NOSLOT;
1138c2ecf20Sopenharmony_ci}
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci/*
1168c2ecf20Sopenharmony_ci * architectures with KVM_HVA_ERR_BAD other than PAGE_OFFSET (e.g. s390)
1178c2ecf20Sopenharmony_ci * provide own defines and kvm_is_error_hva
1188c2ecf20Sopenharmony_ci */
1198c2ecf20Sopenharmony_ci#ifndef KVM_HVA_ERR_BAD
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci#define KVM_HVA_ERR_BAD		(PAGE_OFFSET)
1228c2ecf20Sopenharmony_ci#define KVM_HVA_ERR_RO_BAD	(PAGE_OFFSET + PAGE_SIZE)
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_cistatic inline bool kvm_is_error_hva(unsigned long addr)
1258c2ecf20Sopenharmony_ci{
1268c2ecf20Sopenharmony_ci	return addr >= PAGE_OFFSET;
1278c2ecf20Sopenharmony_ci}
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci#endif
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci#define KVM_ERR_PTR_BAD_PAGE	(ERR_PTR(-ENOENT))
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_cistatic inline bool is_error_page(struct page *page)
1348c2ecf20Sopenharmony_ci{
1358c2ecf20Sopenharmony_ci	return IS_ERR(page);
1368c2ecf20Sopenharmony_ci}
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ci#define KVM_REQUEST_MASK           GENMASK(7,0)
1398c2ecf20Sopenharmony_ci#define KVM_REQUEST_NO_WAKEUP      BIT(8)
1408c2ecf20Sopenharmony_ci#define KVM_REQUEST_WAIT           BIT(9)
1418c2ecf20Sopenharmony_ci/*
1428c2ecf20Sopenharmony_ci * Architecture-independent vcpu->requests bit members
1438c2ecf20Sopenharmony_ci * Bits 4-7 are reserved for more arch-independent bits.
1448c2ecf20Sopenharmony_ci */
1458c2ecf20Sopenharmony_ci#define KVM_REQ_TLB_FLUSH         (0 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
1468c2ecf20Sopenharmony_ci#define KVM_REQ_MMU_RELOAD        (1 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
1478c2ecf20Sopenharmony_ci#define KVM_REQ_PENDING_TIMER     2
1488c2ecf20Sopenharmony_ci#define KVM_REQ_UNHALT            3
1498c2ecf20Sopenharmony_ci#define KVM_REQ_VM_BUGGED         (4 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
1508c2ecf20Sopenharmony_ci#define KVM_REQUEST_ARCH_BASE     8
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci#define KVM_ARCH_REQ_FLAGS(nr, flags) ({ \
1538c2ecf20Sopenharmony_ci	BUILD_BUG_ON((unsigned)(nr) >= (sizeof_field(struct kvm_vcpu, requests) * 8) - KVM_REQUEST_ARCH_BASE); \
1548c2ecf20Sopenharmony_ci	(unsigned)(((nr) + KVM_REQUEST_ARCH_BASE) | (flags)); \
1558c2ecf20Sopenharmony_ci})
1568c2ecf20Sopenharmony_ci#define KVM_ARCH_REQ(nr)           KVM_ARCH_REQ_FLAGS(nr, 0)
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ci#define KVM_USERSPACE_IRQ_SOURCE_ID		0
1598c2ecf20Sopenharmony_ci#define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID	1
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ciextern struct mutex kvm_lock;
1628c2ecf20Sopenharmony_ciextern struct list_head vm_list;
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_cistruct kvm_io_range {
1658c2ecf20Sopenharmony_ci	gpa_t addr;
1668c2ecf20Sopenharmony_ci	int len;
1678c2ecf20Sopenharmony_ci	struct kvm_io_device *dev;
1688c2ecf20Sopenharmony_ci};
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ci#define NR_IOBUS_DEVS 1000
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_cistruct kvm_io_bus {
1738c2ecf20Sopenharmony_ci	int dev_count;
1748c2ecf20Sopenharmony_ci	int ioeventfd_count;
1758c2ecf20Sopenharmony_ci	struct kvm_io_range range[];
1768c2ecf20Sopenharmony_ci};
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_cienum kvm_bus {
1798c2ecf20Sopenharmony_ci	KVM_MMIO_BUS,
1808c2ecf20Sopenharmony_ci	KVM_PIO_BUS,
1818c2ecf20Sopenharmony_ci	KVM_VIRTIO_CCW_NOTIFY_BUS,
1828c2ecf20Sopenharmony_ci	KVM_FAST_MMIO_BUS,
1838c2ecf20Sopenharmony_ci	KVM_NR_BUSES
1848c2ecf20Sopenharmony_ci};
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ciint kvm_io_bus_write(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx, gpa_t addr,
1878c2ecf20Sopenharmony_ci		     int len, const void *val);
1888c2ecf20Sopenharmony_ciint kvm_io_bus_write_cookie(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx,
1898c2ecf20Sopenharmony_ci			    gpa_t addr, int len, const void *val, long cookie);
1908c2ecf20Sopenharmony_ciint kvm_io_bus_read(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx, gpa_t addr,
1918c2ecf20Sopenharmony_ci		    int len, void *val);
1928c2ecf20Sopenharmony_ciint kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr,
1938c2ecf20Sopenharmony_ci			    int len, struct kvm_io_device *dev);
1948c2ecf20Sopenharmony_ciint kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,
1958c2ecf20Sopenharmony_ci			      struct kvm_io_device *dev);
1968c2ecf20Sopenharmony_cistruct kvm_io_device *kvm_io_bus_get_dev(struct kvm *kvm, enum kvm_bus bus_idx,
1978c2ecf20Sopenharmony_ci					 gpa_t addr);
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ci#ifdef CONFIG_KVM_ASYNC_PF
2008c2ecf20Sopenharmony_cistruct kvm_async_pf {
2018c2ecf20Sopenharmony_ci	struct work_struct work;
2028c2ecf20Sopenharmony_ci	struct list_head link;
2038c2ecf20Sopenharmony_ci	struct list_head queue;
2048c2ecf20Sopenharmony_ci	struct kvm_vcpu *vcpu;
2058c2ecf20Sopenharmony_ci	struct mm_struct *mm;
2068c2ecf20Sopenharmony_ci	gpa_t cr2_or_gpa;
2078c2ecf20Sopenharmony_ci	unsigned long addr;
2088c2ecf20Sopenharmony_ci	struct kvm_arch_async_pf arch;
2098c2ecf20Sopenharmony_ci	bool   wakeup_all;
2108c2ecf20Sopenharmony_ci	bool notpresent_injected;
2118c2ecf20Sopenharmony_ci};
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_civoid kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu);
2148c2ecf20Sopenharmony_civoid kvm_check_async_pf_completion(struct kvm_vcpu *vcpu);
2158c2ecf20Sopenharmony_cibool kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa,
2168c2ecf20Sopenharmony_ci			unsigned long hva, struct kvm_arch_async_pf *arch);
2178c2ecf20Sopenharmony_ciint kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu);
2188c2ecf20Sopenharmony_ci#endif
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_cienum {
2218c2ecf20Sopenharmony_ci	OUTSIDE_GUEST_MODE,
2228c2ecf20Sopenharmony_ci	IN_GUEST_MODE,
2238c2ecf20Sopenharmony_ci	EXITING_GUEST_MODE,
2248c2ecf20Sopenharmony_ci	READING_SHADOW_PAGE_TABLES,
2258c2ecf20Sopenharmony_ci};
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_ci#define KVM_UNMAPPED_PAGE	((void *) 0x500 + POISON_POINTER_DELTA)
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_cistruct kvm_host_map {
2308c2ecf20Sopenharmony_ci	/*
2318c2ecf20Sopenharmony_ci	 * Only valid if the 'pfn' is managed by the host kernel (i.e. There is
2328c2ecf20Sopenharmony_ci	 * a 'struct page' for it. When using mem= kernel parameter some memory
2338c2ecf20Sopenharmony_ci	 * can be used as guest memory but they are not managed by host
2348c2ecf20Sopenharmony_ci	 * kernel).
2358c2ecf20Sopenharmony_ci	 * If 'pfn' is not managed by the host kernel, this field is
2368c2ecf20Sopenharmony_ci	 * initialized to KVM_UNMAPPED_PAGE.
2378c2ecf20Sopenharmony_ci	 */
2388c2ecf20Sopenharmony_ci	struct page *page;
2398c2ecf20Sopenharmony_ci	void *hva;
2408c2ecf20Sopenharmony_ci	kvm_pfn_t pfn;
2418c2ecf20Sopenharmony_ci	kvm_pfn_t gfn;
2428c2ecf20Sopenharmony_ci};
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ci/*
2458c2ecf20Sopenharmony_ci * Used to check if the mapping is valid or not. Never use 'kvm_host_map'
2468c2ecf20Sopenharmony_ci * directly to check for that.
2478c2ecf20Sopenharmony_ci */
2488c2ecf20Sopenharmony_cistatic inline bool kvm_vcpu_mapped(struct kvm_host_map *map)
2498c2ecf20Sopenharmony_ci{
2508c2ecf20Sopenharmony_ci	return !!map->hva;
2518c2ecf20Sopenharmony_ci}
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci/*
2548c2ecf20Sopenharmony_ci * Sometimes a large or cross-page mmio needs to be broken up into separate
2558c2ecf20Sopenharmony_ci * exits for userspace servicing.
2568c2ecf20Sopenharmony_ci */
2578c2ecf20Sopenharmony_cistruct kvm_mmio_fragment {
2588c2ecf20Sopenharmony_ci	gpa_t gpa;
2598c2ecf20Sopenharmony_ci	void *data;
2608c2ecf20Sopenharmony_ci	unsigned len;
2618c2ecf20Sopenharmony_ci};
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_cistruct kvm_vcpu {
2648c2ecf20Sopenharmony_ci	struct kvm *kvm;
2658c2ecf20Sopenharmony_ci#ifdef CONFIG_PREEMPT_NOTIFIERS
2668c2ecf20Sopenharmony_ci	struct preempt_notifier preempt_notifier;
2678c2ecf20Sopenharmony_ci#endif
2688c2ecf20Sopenharmony_ci	int cpu;
2698c2ecf20Sopenharmony_ci	int vcpu_id; /* id given by userspace at creation */
2708c2ecf20Sopenharmony_ci	int vcpu_idx; /* index in kvm->vcpus array */
2718c2ecf20Sopenharmony_ci	int srcu_idx;
2728c2ecf20Sopenharmony_ci	int mode;
2738c2ecf20Sopenharmony_ci	u64 requests;
2748c2ecf20Sopenharmony_ci	unsigned long guest_debug;
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci	int pre_pcpu;
2778c2ecf20Sopenharmony_ci	struct list_head blocked_vcpu_list;
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_ci	struct mutex mutex;
2808c2ecf20Sopenharmony_ci	struct kvm_run *run;
2818c2ecf20Sopenharmony_ci
2828c2ecf20Sopenharmony_ci	struct rcuwait wait;
2838c2ecf20Sopenharmony_ci	struct pid __rcu *pid;
2848c2ecf20Sopenharmony_ci	int sigset_active;
2858c2ecf20Sopenharmony_ci	sigset_t sigset;
2868c2ecf20Sopenharmony_ci	struct kvm_vcpu_stat stat;
2878c2ecf20Sopenharmony_ci	unsigned int halt_poll_ns;
2888c2ecf20Sopenharmony_ci	bool valid_wakeup;
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_ci#ifdef CONFIG_HAS_IOMEM
2918c2ecf20Sopenharmony_ci	int mmio_needed;
2928c2ecf20Sopenharmony_ci	int mmio_read_completed;
2938c2ecf20Sopenharmony_ci	int mmio_is_write;
2948c2ecf20Sopenharmony_ci	int mmio_cur_fragment;
2958c2ecf20Sopenharmony_ci	int mmio_nr_fragments;
2968c2ecf20Sopenharmony_ci	struct kvm_mmio_fragment mmio_fragments[KVM_MAX_MMIO_FRAGMENTS];
2978c2ecf20Sopenharmony_ci#endif
2988c2ecf20Sopenharmony_ci
2998c2ecf20Sopenharmony_ci#ifdef CONFIG_KVM_ASYNC_PF
3008c2ecf20Sopenharmony_ci	struct {
3018c2ecf20Sopenharmony_ci		u32 queued;
3028c2ecf20Sopenharmony_ci		struct list_head queue;
3038c2ecf20Sopenharmony_ci		struct list_head done;
3048c2ecf20Sopenharmony_ci		spinlock_t lock;
3058c2ecf20Sopenharmony_ci	} async_pf;
3068c2ecf20Sopenharmony_ci#endif
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT
3098c2ecf20Sopenharmony_ci	/*
3108c2ecf20Sopenharmony_ci	 * Cpu relax intercept or pause loop exit optimization
3118c2ecf20Sopenharmony_ci	 * in_spin_loop: set when a vcpu does a pause loop exit
3128c2ecf20Sopenharmony_ci	 *  or cpu relax intercepted.
3138c2ecf20Sopenharmony_ci	 * dy_eligible: indicates whether vcpu is eligible for directed yield.
3148c2ecf20Sopenharmony_ci	 */
3158c2ecf20Sopenharmony_ci	struct {
3168c2ecf20Sopenharmony_ci		bool in_spin_loop;
3178c2ecf20Sopenharmony_ci		bool dy_eligible;
3188c2ecf20Sopenharmony_ci	} spin_loop;
3198c2ecf20Sopenharmony_ci#endif
3208c2ecf20Sopenharmony_ci	bool preempted;
3218c2ecf20Sopenharmony_ci	bool ready;
3228c2ecf20Sopenharmony_ci	struct kvm_vcpu_arch arch;
3238c2ecf20Sopenharmony_ci};
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_cistatic inline int kvm_vcpu_exiting_guest_mode(struct kvm_vcpu *vcpu)
3268c2ecf20Sopenharmony_ci{
3278c2ecf20Sopenharmony_ci	/*
3288c2ecf20Sopenharmony_ci	 * The memory barrier ensures a previous write to vcpu->requests cannot
3298c2ecf20Sopenharmony_ci	 * be reordered with the read of vcpu->mode.  It pairs with the general
3308c2ecf20Sopenharmony_ci	 * memory barrier following the write of vcpu->mode in VCPU RUN.
3318c2ecf20Sopenharmony_ci	 */
3328c2ecf20Sopenharmony_ci	smp_mb__before_atomic();
3338c2ecf20Sopenharmony_ci	return cmpxchg(&vcpu->mode, IN_GUEST_MODE, EXITING_GUEST_MODE);
3348c2ecf20Sopenharmony_ci}
3358c2ecf20Sopenharmony_ci
3368c2ecf20Sopenharmony_ci/*
3378c2ecf20Sopenharmony_ci * Some of the bitops functions do not support too long bitmaps.
3388c2ecf20Sopenharmony_ci * This number must be determined not to exceed such limits.
3398c2ecf20Sopenharmony_ci */
3408c2ecf20Sopenharmony_ci#define KVM_MEM_MAX_NR_PAGES ((1UL << 31) - 1)
3418c2ecf20Sopenharmony_ci
3428c2ecf20Sopenharmony_cistruct kvm_memory_slot {
3438c2ecf20Sopenharmony_ci	gfn_t base_gfn;
3448c2ecf20Sopenharmony_ci	unsigned long npages;
3458c2ecf20Sopenharmony_ci	unsigned long *dirty_bitmap;
3468c2ecf20Sopenharmony_ci	struct kvm_arch_memory_slot arch;
3478c2ecf20Sopenharmony_ci	unsigned long userspace_addr;
3488c2ecf20Sopenharmony_ci	u32 flags;
3498c2ecf20Sopenharmony_ci	short id;
3508c2ecf20Sopenharmony_ci	u16 as_id;
3518c2ecf20Sopenharmony_ci};
3528c2ecf20Sopenharmony_ci
3538c2ecf20Sopenharmony_cistatic inline unsigned long kvm_dirty_bitmap_bytes(struct kvm_memory_slot *memslot)
3548c2ecf20Sopenharmony_ci{
3558c2ecf20Sopenharmony_ci	return ALIGN(memslot->npages, BITS_PER_LONG) / 8;
3568c2ecf20Sopenharmony_ci}
3578c2ecf20Sopenharmony_ci
3588c2ecf20Sopenharmony_cistatic inline unsigned long *kvm_second_dirty_bitmap(struct kvm_memory_slot *memslot)
3598c2ecf20Sopenharmony_ci{
3608c2ecf20Sopenharmony_ci	unsigned long len = kvm_dirty_bitmap_bytes(memslot);
3618c2ecf20Sopenharmony_ci
3628c2ecf20Sopenharmony_ci	return memslot->dirty_bitmap + len / sizeof(*memslot->dirty_bitmap);
3638c2ecf20Sopenharmony_ci}
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_ci#ifndef KVM_DIRTY_LOG_MANUAL_CAPS
3668c2ecf20Sopenharmony_ci#define KVM_DIRTY_LOG_MANUAL_CAPS KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE
3678c2ecf20Sopenharmony_ci#endif
3688c2ecf20Sopenharmony_ci
3698c2ecf20Sopenharmony_cistruct kvm_s390_adapter_int {
3708c2ecf20Sopenharmony_ci	u64 ind_addr;
3718c2ecf20Sopenharmony_ci	u64 summary_addr;
3728c2ecf20Sopenharmony_ci	u64 ind_offset;
3738c2ecf20Sopenharmony_ci	u32 summary_offset;
3748c2ecf20Sopenharmony_ci	u32 adapter_id;
3758c2ecf20Sopenharmony_ci};
3768c2ecf20Sopenharmony_ci
3778c2ecf20Sopenharmony_cistruct kvm_hv_sint {
3788c2ecf20Sopenharmony_ci	u32 vcpu;
3798c2ecf20Sopenharmony_ci	u32 sint;
3808c2ecf20Sopenharmony_ci};
3818c2ecf20Sopenharmony_ci
3828c2ecf20Sopenharmony_cistruct kvm_kernel_irq_routing_entry {
3838c2ecf20Sopenharmony_ci	u32 gsi;
3848c2ecf20Sopenharmony_ci	u32 type;
3858c2ecf20Sopenharmony_ci	int (*set)(struct kvm_kernel_irq_routing_entry *e,
3868c2ecf20Sopenharmony_ci		   struct kvm *kvm, int irq_source_id, int level,
3878c2ecf20Sopenharmony_ci		   bool line_status);
3888c2ecf20Sopenharmony_ci	union {
3898c2ecf20Sopenharmony_ci		struct {
3908c2ecf20Sopenharmony_ci			unsigned irqchip;
3918c2ecf20Sopenharmony_ci			unsigned pin;
3928c2ecf20Sopenharmony_ci		} irqchip;
3938c2ecf20Sopenharmony_ci		struct {
3948c2ecf20Sopenharmony_ci			u32 address_lo;
3958c2ecf20Sopenharmony_ci			u32 address_hi;
3968c2ecf20Sopenharmony_ci			u32 data;
3978c2ecf20Sopenharmony_ci			u32 flags;
3988c2ecf20Sopenharmony_ci			u32 devid;
3998c2ecf20Sopenharmony_ci		} msi;
4008c2ecf20Sopenharmony_ci		struct kvm_s390_adapter_int adapter;
4018c2ecf20Sopenharmony_ci		struct kvm_hv_sint hv_sint;
4028c2ecf20Sopenharmony_ci	};
4038c2ecf20Sopenharmony_ci	struct hlist_node link;
4048c2ecf20Sopenharmony_ci};
4058c2ecf20Sopenharmony_ci
4068c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
4078c2ecf20Sopenharmony_cistruct kvm_irq_routing_table {
4088c2ecf20Sopenharmony_ci	int chip[KVM_NR_IRQCHIPS][KVM_IRQCHIP_NUM_PINS];
4098c2ecf20Sopenharmony_ci	u32 nr_rt_entries;
4108c2ecf20Sopenharmony_ci	/*
4118c2ecf20Sopenharmony_ci	 * Array indexed by gsi. Each entry contains list of irq chips
4128c2ecf20Sopenharmony_ci	 * the gsi is connected to.
4138c2ecf20Sopenharmony_ci	 */
4148c2ecf20Sopenharmony_ci	struct hlist_head map[];
4158c2ecf20Sopenharmony_ci};
4168c2ecf20Sopenharmony_ci#endif
4178c2ecf20Sopenharmony_ci
4188c2ecf20Sopenharmony_ci#ifndef KVM_PRIVATE_MEM_SLOTS
4198c2ecf20Sopenharmony_ci#define KVM_PRIVATE_MEM_SLOTS 0
4208c2ecf20Sopenharmony_ci#endif
4218c2ecf20Sopenharmony_ci
4228c2ecf20Sopenharmony_ci#ifndef KVM_MEM_SLOTS_NUM
4238c2ecf20Sopenharmony_ci#define KVM_MEM_SLOTS_NUM (KVM_USER_MEM_SLOTS + KVM_PRIVATE_MEM_SLOTS)
4248c2ecf20Sopenharmony_ci#endif
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ci#ifndef __KVM_VCPU_MULTIPLE_ADDRESS_SPACE
4278c2ecf20Sopenharmony_cistatic inline int kvm_arch_vcpu_memslots_id(struct kvm_vcpu *vcpu)
4288c2ecf20Sopenharmony_ci{
4298c2ecf20Sopenharmony_ci	return 0;
4308c2ecf20Sopenharmony_ci}
4318c2ecf20Sopenharmony_ci#endif
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_ci/*
4348c2ecf20Sopenharmony_ci * Note:
4358c2ecf20Sopenharmony_ci * memslots are not sorted by id anymore, please use id_to_memslot()
4368c2ecf20Sopenharmony_ci * to get the memslot by its id.
4378c2ecf20Sopenharmony_ci */
4388c2ecf20Sopenharmony_cistruct kvm_memslots {
4398c2ecf20Sopenharmony_ci	u64 generation;
4408c2ecf20Sopenharmony_ci	/* The mapping table from slot id to the index in memslots[]. */
4418c2ecf20Sopenharmony_ci	short id_to_index[KVM_MEM_SLOTS_NUM];
4428c2ecf20Sopenharmony_ci	atomic_t lru_slot;
4438c2ecf20Sopenharmony_ci	int used_slots;
4448c2ecf20Sopenharmony_ci	struct kvm_memory_slot memslots[];
4458c2ecf20Sopenharmony_ci};
4468c2ecf20Sopenharmony_ci
4478c2ecf20Sopenharmony_cistruct kvm {
4488c2ecf20Sopenharmony_ci	spinlock_t mmu_lock;
4498c2ecf20Sopenharmony_ci	struct mutex slots_lock;
4508c2ecf20Sopenharmony_ci	struct mm_struct *mm; /* userspace tied to this vm */
4518c2ecf20Sopenharmony_ci	struct kvm_memslots __rcu *memslots[KVM_ADDRESS_SPACE_NUM];
4528c2ecf20Sopenharmony_ci	struct kvm_vcpu *vcpus[KVM_MAX_VCPUS];
4538c2ecf20Sopenharmony_ci
4548c2ecf20Sopenharmony_ci	/*
4558c2ecf20Sopenharmony_ci	 * created_vcpus is protected by kvm->lock, and is incremented
4568c2ecf20Sopenharmony_ci	 * at the beginning of KVM_CREATE_VCPU.  online_vcpus is only
4578c2ecf20Sopenharmony_ci	 * incremented after storing the kvm_vcpu pointer in vcpus,
4588c2ecf20Sopenharmony_ci	 * and is accessed atomically.
4598c2ecf20Sopenharmony_ci	 */
4608c2ecf20Sopenharmony_ci	atomic_t online_vcpus;
4618c2ecf20Sopenharmony_ci	int created_vcpus;
4628c2ecf20Sopenharmony_ci	int last_boosted_vcpu;
4638c2ecf20Sopenharmony_ci	struct list_head vm_list;
4648c2ecf20Sopenharmony_ci	struct mutex lock;
4658c2ecf20Sopenharmony_ci	struct kvm_io_bus __rcu *buses[KVM_NR_BUSES];
4668c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_EVENTFD
4678c2ecf20Sopenharmony_ci	struct {
4688c2ecf20Sopenharmony_ci		spinlock_t        lock;
4698c2ecf20Sopenharmony_ci		struct list_head  items;
4708c2ecf20Sopenharmony_ci		struct list_head  resampler_list;
4718c2ecf20Sopenharmony_ci		struct mutex      resampler_lock;
4728c2ecf20Sopenharmony_ci	} irqfds;
4738c2ecf20Sopenharmony_ci	struct list_head ioeventfds;
4748c2ecf20Sopenharmony_ci#endif
4758c2ecf20Sopenharmony_ci	struct kvm_vm_stat stat;
4768c2ecf20Sopenharmony_ci	struct kvm_arch arch;
4778c2ecf20Sopenharmony_ci	refcount_t users_count;
4788c2ecf20Sopenharmony_ci#ifdef CONFIG_KVM_MMIO
4798c2ecf20Sopenharmony_ci	struct kvm_coalesced_mmio_ring *coalesced_mmio_ring;
4808c2ecf20Sopenharmony_ci	spinlock_t ring_lock;
4818c2ecf20Sopenharmony_ci	struct list_head coalesced_zones;
4828c2ecf20Sopenharmony_ci#endif
4838c2ecf20Sopenharmony_ci
4848c2ecf20Sopenharmony_ci	struct mutex irq_lock;
4858c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_IRQCHIP
4868c2ecf20Sopenharmony_ci	/*
4878c2ecf20Sopenharmony_ci	 * Update side is protected by irq_lock.
4888c2ecf20Sopenharmony_ci	 */
4898c2ecf20Sopenharmony_ci	struct kvm_irq_routing_table __rcu *irq_routing;
4908c2ecf20Sopenharmony_ci#endif
4918c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_IRQFD
4928c2ecf20Sopenharmony_ci	struct hlist_head irq_ack_notifier_list;
4938c2ecf20Sopenharmony_ci#endif
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_ci#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
4968c2ecf20Sopenharmony_ci	struct mmu_notifier mmu_notifier;
4978c2ecf20Sopenharmony_ci	unsigned long mmu_notifier_seq;
4988c2ecf20Sopenharmony_ci	long mmu_notifier_count;
4998c2ecf20Sopenharmony_ci#endif
5008c2ecf20Sopenharmony_ci	long tlbs_dirty;
5018c2ecf20Sopenharmony_ci	struct list_head devices;
5028c2ecf20Sopenharmony_ci	u64 manual_dirty_log_protect;
5038c2ecf20Sopenharmony_ci	struct dentry *debugfs_dentry;
5048c2ecf20Sopenharmony_ci	struct kvm_stat_data **debugfs_stat_data;
5058c2ecf20Sopenharmony_ci	struct srcu_struct srcu;
5068c2ecf20Sopenharmony_ci	struct srcu_struct irq_srcu;
5078c2ecf20Sopenharmony_ci	pid_t userspace_pid;
5088c2ecf20Sopenharmony_ci	unsigned int max_halt_poll_ns;
5098c2ecf20Sopenharmony_ci	bool vm_bugged;
5108c2ecf20Sopenharmony_ci};
5118c2ecf20Sopenharmony_ci
5128c2ecf20Sopenharmony_ci#define kvm_err(fmt, ...) \
5138c2ecf20Sopenharmony_ci	pr_err("kvm [%i]: " fmt, task_pid_nr(current), ## __VA_ARGS__)
5148c2ecf20Sopenharmony_ci#define kvm_info(fmt, ...) \
5158c2ecf20Sopenharmony_ci	pr_info("kvm [%i]: " fmt, task_pid_nr(current), ## __VA_ARGS__)
5168c2ecf20Sopenharmony_ci#define kvm_debug(fmt, ...) \
5178c2ecf20Sopenharmony_ci	pr_debug("kvm [%i]: " fmt, task_pid_nr(current), ## __VA_ARGS__)
5188c2ecf20Sopenharmony_ci#define kvm_debug_ratelimited(fmt, ...) \
5198c2ecf20Sopenharmony_ci	pr_debug_ratelimited("kvm [%i]: " fmt, task_pid_nr(current), \
5208c2ecf20Sopenharmony_ci			     ## __VA_ARGS__)
5218c2ecf20Sopenharmony_ci#define kvm_pr_unimpl(fmt, ...) \
5228c2ecf20Sopenharmony_ci	pr_err_ratelimited("kvm [%i]: " fmt, \
5238c2ecf20Sopenharmony_ci			   task_tgid_nr(current), ## __VA_ARGS__)
5248c2ecf20Sopenharmony_ci
5258c2ecf20Sopenharmony_ci/* The guest did something we don't support. */
5268c2ecf20Sopenharmony_ci#define vcpu_unimpl(vcpu, fmt, ...)					\
5278c2ecf20Sopenharmony_ci	kvm_pr_unimpl("vcpu%i, guest rIP: 0x%lx " fmt,			\
5288c2ecf20Sopenharmony_ci			(vcpu)->vcpu_id, kvm_rip_read(vcpu), ## __VA_ARGS__)
5298c2ecf20Sopenharmony_ci
5308c2ecf20Sopenharmony_ci#define vcpu_debug(vcpu, fmt, ...)					\
5318c2ecf20Sopenharmony_ci	kvm_debug("vcpu%i " fmt, (vcpu)->vcpu_id, ## __VA_ARGS__)
5328c2ecf20Sopenharmony_ci#define vcpu_debug_ratelimited(vcpu, fmt, ...)				\
5338c2ecf20Sopenharmony_ci	kvm_debug_ratelimited("vcpu%i " fmt, (vcpu)->vcpu_id,           \
5348c2ecf20Sopenharmony_ci			      ## __VA_ARGS__)
5358c2ecf20Sopenharmony_ci#define vcpu_err(vcpu, fmt, ...)					\
5368c2ecf20Sopenharmony_ci	kvm_err("vcpu%i " fmt, (vcpu)->vcpu_id, ## __VA_ARGS__)
5378c2ecf20Sopenharmony_ci
5388c2ecf20Sopenharmony_cibool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req);
5398c2ecf20Sopenharmony_cistatic inline void kvm_vm_bugged(struct kvm *kvm)
5408c2ecf20Sopenharmony_ci{
5418c2ecf20Sopenharmony_ci	kvm->vm_bugged = true;
5428c2ecf20Sopenharmony_ci	kvm_make_all_cpus_request(kvm, KVM_REQ_VM_BUGGED);
5438c2ecf20Sopenharmony_ci}
5448c2ecf20Sopenharmony_ci
5458c2ecf20Sopenharmony_ci#define KVM_BUG(cond, kvm, fmt...)				\
5468c2ecf20Sopenharmony_ci({								\
5478c2ecf20Sopenharmony_ci	int __ret = (cond);					\
5488c2ecf20Sopenharmony_ci								\
5498c2ecf20Sopenharmony_ci	if (WARN_ONCE(__ret && !(kvm)->vm_bugged, fmt))		\
5508c2ecf20Sopenharmony_ci		kvm_vm_bugged(kvm);				\
5518c2ecf20Sopenharmony_ci	unlikely(__ret);					\
5528c2ecf20Sopenharmony_ci})
5538c2ecf20Sopenharmony_ci
5548c2ecf20Sopenharmony_ci#define KVM_BUG_ON(cond, kvm)					\
5558c2ecf20Sopenharmony_ci({								\
5568c2ecf20Sopenharmony_ci	int __ret = (cond);					\
5578c2ecf20Sopenharmony_ci								\
5588c2ecf20Sopenharmony_ci	if (WARN_ON_ONCE(__ret && !(kvm)->vm_bugged))		\
5598c2ecf20Sopenharmony_ci		kvm_vm_bugged(kvm);				\
5608c2ecf20Sopenharmony_ci	unlikely(__ret);					\
5618c2ecf20Sopenharmony_ci})
5628c2ecf20Sopenharmony_ci
5638c2ecf20Sopenharmony_cistatic inline bool kvm_dirty_log_manual_protect_and_init_set(struct kvm *kvm)
5648c2ecf20Sopenharmony_ci{
5658c2ecf20Sopenharmony_ci	return !!(kvm->manual_dirty_log_protect & KVM_DIRTY_LOG_INITIALLY_SET);
5668c2ecf20Sopenharmony_ci}
5678c2ecf20Sopenharmony_ci
5688c2ecf20Sopenharmony_cistatic inline struct kvm_io_bus *kvm_get_bus(struct kvm *kvm, enum kvm_bus idx)
5698c2ecf20Sopenharmony_ci{
5708c2ecf20Sopenharmony_ci	return srcu_dereference_check(kvm->buses[idx], &kvm->srcu,
5718c2ecf20Sopenharmony_ci				      lockdep_is_held(&kvm->slots_lock) ||
5728c2ecf20Sopenharmony_ci				      !refcount_read(&kvm->users_count));
5738c2ecf20Sopenharmony_ci}
5748c2ecf20Sopenharmony_ci
5758c2ecf20Sopenharmony_cistatic inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i)
5768c2ecf20Sopenharmony_ci{
5778c2ecf20Sopenharmony_ci	int num_vcpus = atomic_read(&kvm->online_vcpus);
5788c2ecf20Sopenharmony_ci	i = array_index_nospec(i, num_vcpus);
5798c2ecf20Sopenharmony_ci
5808c2ecf20Sopenharmony_ci	/* Pairs with smp_wmb() in kvm_vm_ioctl_create_vcpu.  */
5818c2ecf20Sopenharmony_ci	smp_rmb();
5828c2ecf20Sopenharmony_ci	return kvm->vcpus[i];
5838c2ecf20Sopenharmony_ci}
5848c2ecf20Sopenharmony_ci
5858c2ecf20Sopenharmony_ci#define kvm_for_each_vcpu(idx, vcpup, kvm) \
5868c2ecf20Sopenharmony_ci	for (idx = 0; \
5878c2ecf20Sopenharmony_ci	     idx < atomic_read(&kvm->online_vcpus) && \
5888c2ecf20Sopenharmony_ci	     (vcpup = kvm_get_vcpu(kvm, idx)) != NULL; \
5898c2ecf20Sopenharmony_ci	     idx++)
5908c2ecf20Sopenharmony_ci
5918c2ecf20Sopenharmony_cistatic inline struct kvm_vcpu *kvm_get_vcpu_by_id(struct kvm *kvm, int id)
5928c2ecf20Sopenharmony_ci{
5938c2ecf20Sopenharmony_ci	struct kvm_vcpu *vcpu = NULL;
5948c2ecf20Sopenharmony_ci	int i;
5958c2ecf20Sopenharmony_ci
5968c2ecf20Sopenharmony_ci	if (id < 0)
5978c2ecf20Sopenharmony_ci		return NULL;
5988c2ecf20Sopenharmony_ci	if (id < KVM_MAX_VCPUS)
5998c2ecf20Sopenharmony_ci		vcpu = kvm_get_vcpu(kvm, id);
6008c2ecf20Sopenharmony_ci	if (vcpu && vcpu->vcpu_id == id)
6018c2ecf20Sopenharmony_ci		return vcpu;
6028c2ecf20Sopenharmony_ci	kvm_for_each_vcpu(i, vcpu, kvm)
6038c2ecf20Sopenharmony_ci		if (vcpu->vcpu_id == id)
6048c2ecf20Sopenharmony_ci			return vcpu;
6058c2ecf20Sopenharmony_ci	return NULL;
6068c2ecf20Sopenharmony_ci}
6078c2ecf20Sopenharmony_ci
6088c2ecf20Sopenharmony_cistatic inline int kvm_vcpu_get_idx(struct kvm_vcpu *vcpu)
6098c2ecf20Sopenharmony_ci{
6108c2ecf20Sopenharmony_ci	return vcpu->vcpu_idx;
6118c2ecf20Sopenharmony_ci}
6128c2ecf20Sopenharmony_ci
6138c2ecf20Sopenharmony_ci#define kvm_for_each_memslot(memslot, slots)				\
6148c2ecf20Sopenharmony_ci	for (memslot = &slots->memslots[0];				\
6158c2ecf20Sopenharmony_ci	     memslot < slots->memslots + slots->used_slots; memslot++)	\
6168c2ecf20Sopenharmony_ci		if (WARN_ON_ONCE(!memslot->npages)) {			\
6178c2ecf20Sopenharmony_ci		} else
6188c2ecf20Sopenharmony_ci
6198c2ecf20Sopenharmony_civoid kvm_vcpu_destroy(struct kvm_vcpu *vcpu);
6208c2ecf20Sopenharmony_ci
6218c2ecf20Sopenharmony_civoid vcpu_load(struct kvm_vcpu *vcpu);
6228c2ecf20Sopenharmony_civoid vcpu_put(struct kvm_vcpu *vcpu);
6238c2ecf20Sopenharmony_ci
6248c2ecf20Sopenharmony_ci#ifdef __KVM_HAVE_IOAPIC
6258c2ecf20Sopenharmony_civoid kvm_arch_post_irq_ack_notifier_list_update(struct kvm *kvm);
6268c2ecf20Sopenharmony_civoid kvm_arch_post_irq_routing_update(struct kvm *kvm);
6278c2ecf20Sopenharmony_ci#else
6288c2ecf20Sopenharmony_cistatic inline void kvm_arch_post_irq_ack_notifier_list_update(struct kvm *kvm)
6298c2ecf20Sopenharmony_ci{
6308c2ecf20Sopenharmony_ci}
6318c2ecf20Sopenharmony_cistatic inline void kvm_arch_post_irq_routing_update(struct kvm *kvm)
6328c2ecf20Sopenharmony_ci{
6338c2ecf20Sopenharmony_ci}
6348c2ecf20Sopenharmony_ci#endif
6358c2ecf20Sopenharmony_ci
6368c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_IRQFD
6378c2ecf20Sopenharmony_ciint kvm_irqfd_init(void);
6388c2ecf20Sopenharmony_civoid kvm_irqfd_exit(void);
6398c2ecf20Sopenharmony_ci#else
6408c2ecf20Sopenharmony_cistatic inline int kvm_irqfd_init(void)
6418c2ecf20Sopenharmony_ci{
6428c2ecf20Sopenharmony_ci	return 0;
6438c2ecf20Sopenharmony_ci}
6448c2ecf20Sopenharmony_ci
6458c2ecf20Sopenharmony_cistatic inline void kvm_irqfd_exit(void)
6468c2ecf20Sopenharmony_ci{
6478c2ecf20Sopenharmony_ci}
6488c2ecf20Sopenharmony_ci#endif
6498c2ecf20Sopenharmony_ciint kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
6508c2ecf20Sopenharmony_ci		  struct module *module);
6518c2ecf20Sopenharmony_civoid kvm_exit(void);
6528c2ecf20Sopenharmony_ci
6538c2ecf20Sopenharmony_civoid kvm_get_kvm(struct kvm *kvm);
6548c2ecf20Sopenharmony_civoid kvm_put_kvm(struct kvm *kvm);
6558c2ecf20Sopenharmony_civoid kvm_put_kvm_no_destroy(struct kvm *kvm);
6568c2ecf20Sopenharmony_ci
6578c2ecf20Sopenharmony_cistatic inline struct kvm_memslots *__kvm_memslots(struct kvm *kvm, int as_id)
6588c2ecf20Sopenharmony_ci{
6598c2ecf20Sopenharmony_ci	as_id = array_index_nospec(as_id, KVM_ADDRESS_SPACE_NUM);
6608c2ecf20Sopenharmony_ci	return srcu_dereference_check(kvm->memslots[as_id], &kvm->srcu,
6618c2ecf20Sopenharmony_ci			lockdep_is_held(&kvm->slots_lock) ||
6628c2ecf20Sopenharmony_ci			!refcount_read(&kvm->users_count));
6638c2ecf20Sopenharmony_ci}
6648c2ecf20Sopenharmony_ci
6658c2ecf20Sopenharmony_cistatic inline struct kvm_memslots *kvm_memslots(struct kvm *kvm)
6668c2ecf20Sopenharmony_ci{
6678c2ecf20Sopenharmony_ci	return __kvm_memslots(kvm, 0);
6688c2ecf20Sopenharmony_ci}
6698c2ecf20Sopenharmony_ci
6708c2ecf20Sopenharmony_cistatic inline struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu)
6718c2ecf20Sopenharmony_ci{
6728c2ecf20Sopenharmony_ci	int as_id = kvm_arch_vcpu_memslots_id(vcpu);
6738c2ecf20Sopenharmony_ci
6748c2ecf20Sopenharmony_ci	return __kvm_memslots(vcpu->kvm, as_id);
6758c2ecf20Sopenharmony_ci}
6768c2ecf20Sopenharmony_ci
6778c2ecf20Sopenharmony_cistatic inline
6788c2ecf20Sopenharmony_cistruct kvm_memory_slot *id_to_memslot(struct kvm_memslots *slots, int id)
6798c2ecf20Sopenharmony_ci{
6808c2ecf20Sopenharmony_ci	int index = slots->id_to_index[id];
6818c2ecf20Sopenharmony_ci	struct kvm_memory_slot *slot;
6828c2ecf20Sopenharmony_ci
6838c2ecf20Sopenharmony_ci	if (index < 0)
6848c2ecf20Sopenharmony_ci		return NULL;
6858c2ecf20Sopenharmony_ci
6868c2ecf20Sopenharmony_ci	slot = &slots->memslots[index];
6878c2ecf20Sopenharmony_ci
6888c2ecf20Sopenharmony_ci	WARN_ON(slot->id != id);
6898c2ecf20Sopenharmony_ci	return slot;
6908c2ecf20Sopenharmony_ci}
6918c2ecf20Sopenharmony_ci
6928c2ecf20Sopenharmony_ci/*
6938c2ecf20Sopenharmony_ci * KVM_SET_USER_MEMORY_REGION ioctl allows the following operations:
6948c2ecf20Sopenharmony_ci * - create a new memory slot
6958c2ecf20Sopenharmony_ci * - delete an existing memory slot
6968c2ecf20Sopenharmony_ci * - modify an existing memory slot
6978c2ecf20Sopenharmony_ci *   -- move it in the guest physical memory space
6988c2ecf20Sopenharmony_ci *   -- just change its flags
6998c2ecf20Sopenharmony_ci *
7008c2ecf20Sopenharmony_ci * Since flags can be changed by some of these operations, the following
7018c2ecf20Sopenharmony_ci * differentiation is the best we can do for __kvm_set_memory_region():
7028c2ecf20Sopenharmony_ci */
7038c2ecf20Sopenharmony_cienum kvm_mr_change {
7048c2ecf20Sopenharmony_ci	KVM_MR_CREATE,
7058c2ecf20Sopenharmony_ci	KVM_MR_DELETE,
7068c2ecf20Sopenharmony_ci	KVM_MR_MOVE,
7078c2ecf20Sopenharmony_ci	KVM_MR_FLAGS_ONLY,
7088c2ecf20Sopenharmony_ci};
7098c2ecf20Sopenharmony_ci
7108c2ecf20Sopenharmony_ciint kvm_set_memory_region(struct kvm *kvm,
7118c2ecf20Sopenharmony_ci			  const struct kvm_userspace_memory_region *mem);
7128c2ecf20Sopenharmony_ciint __kvm_set_memory_region(struct kvm *kvm,
7138c2ecf20Sopenharmony_ci			    const struct kvm_userspace_memory_region *mem);
7148c2ecf20Sopenharmony_civoid kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *slot);
7158c2ecf20Sopenharmony_civoid kvm_arch_memslots_updated(struct kvm *kvm, u64 gen);
7168c2ecf20Sopenharmony_ciint kvm_arch_prepare_memory_region(struct kvm *kvm,
7178c2ecf20Sopenharmony_ci				struct kvm_memory_slot *memslot,
7188c2ecf20Sopenharmony_ci				const struct kvm_userspace_memory_region *mem,
7198c2ecf20Sopenharmony_ci				enum kvm_mr_change change);
7208c2ecf20Sopenharmony_civoid kvm_arch_commit_memory_region(struct kvm *kvm,
7218c2ecf20Sopenharmony_ci				const struct kvm_userspace_memory_region *mem,
7228c2ecf20Sopenharmony_ci				struct kvm_memory_slot *old,
7238c2ecf20Sopenharmony_ci				const struct kvm_memory_slot *new,
7248c2ecf20Sopenharmony_ci				enum kvm_mr_change change);
7258c2ecf20Sopenharmony_ci/* flush all memory translations */
7268c2ecf20Sopenharmony_civoid kvm_arch_flush_shadow_all(struct kvm *kvm);
7278c2ecf20Sopenharmony_ci/* flush memory translations pointing to 'slot' */
7288c2ecf20Sopenharmony_civoid kvm_arch_flush_shadow_memslot(struct kvm *kvm,
7298c2ecf20Sopenharmony_ci				   struct kvm_memory_slot *slot);
7308c2ecf20Sopenharmony_ci
7318c2ecf20Sopenharmony_ciint gfn_to_page_many_atomic(struct kvm_memory_slot *slot, gfn_t gfn,
7328c2ecf20Sopenharmony_ci			    struct page **pages, int nr_pages);
7338c2ecf20Sopenharmony_ci
7348c2ecf20Sopenharmony_cistruct page *gfn_to_page(struct kvm *kvm, gfn_t gfn);
7358c2ecf20Sopenharmony_ciunsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn);
7368c2ecf20Sopenharmony_ciunsigned long gfn_to_hva_prot(struct kvm *kvm, gfn_t gfn, bool *writable);
7378c2ecf20Sopenharmony_ciunsigned long gfn_to_hva_memslot(struct kvm_memory_slot *slot, gfn_t gfn);
7388c2ecf20Sopenharmony_ciunsigned long gfn_to_hva_memslot_prot(struct kvm_memory_slot *slot, gfn_t gfn,
7398c2ecf20Sopenharmony_ci				      bool *writable);
7408c2ecf20Sopenharmony_civoid kvm_release_page_clean(struct page *page);
7418c2ecf20Sopenharmony_civoid kvm_release_page_dirty(struct page *page);
7428c2ecf20Sopenharmony_civoid kvm_set_page_accessed(struct page *page);
7438c2ecf20Sopenharmony_ci
7448c2ecf20Sopenharmony_cikvm_pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn);
7458c2ecf20Sopenharmony_cikvm_pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault,
7468c2ecf20Sopenharmony_ci		      bool *writable);
7478c2ecf20Sopenharmony_cikvm_pfn_t gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn);
7488c2ecf20Sopenharmony_cikvm_pfn_t gfn_to_pfn_memslot_atomic(struct kvm_memory_slot *slot, gfn_t gfn);
7498c2ecf20Sopenharmony_cikvm_pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn,
7508c2ecf20Sopenharmony_ci			       bool atomic, bool *async, bool write_fault,
7518c2ecf20Sopenharmony_ci			       bool *writable);
7528c2ecf20Sopenharmony_ci
7538c2ecf20Sopenharmony_civoid kvm_release_pfn_clean(kvm_pfn_t pfn);
7548c2ecf20Sopenharmony_civoid kvm_release_pfn_dirty(kvm_pfn_t pfn);
7558c2ecf20Sopenharmony_civoid kvm_set_pfn_dirty(kvm_pfn_t pfn);
7568c2ecf20Sopenharmony_civoid kvm_set_pfn_accessed(kvm_pfn_t pfn);
7578c2ecf20Sopenharmony_civoid kvm_get_pfn(kvm_pfn_t pfn);
7588c2ecf20Sopenharmony_ci
7598c2ecf20Sopenharmony_civoid kvm_release_pfn(kvm_pfn_t pfn, bool dirty, struct gfn_to_pfn_cache *cache);
7608c2ecf20Sopenharmony_ciint kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset,
7618c2ecf20Sopenharmony_ci			int len);
7628c2ecf20Sopenharmony_ciint kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len);
7638c2ecf20Sopenharmony_ciint kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
7648c2ecf20Sopenharmony_ci			   void *data, unsigned long len);
7658c2ecf20Sopenharmony_ciint kvm_read_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
7668c2ecf20Sopenharmony_ci				 void *data, unsigned int offset,
7678c2ecf20Sopenharmony_ci				 unsigned long len);
7688c2ecf20Sopenharmony_ciint kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data,
7698c2ecf20Sopenharmony_ci			 int offset, int len);
7708c2ecf20Sopenharmony_ciint kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data,
7718c2ecf20Sopenharmony_ci		    unsigned long len);
7728c2ecf20Sopenharmony_ciint kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
7738c2ecf20Sopenharmony_ci			   void *data, unsigned long len);
7748c2ecf20Sopenharmony_ciint kvm_write_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
7758c2ecf20Sopenharmony_ci				  void *data, unsigned int offset,
7768c2ecf20Sopenharmony_ci				  unsigned long len);
7778c2ecf20Sopenharmony_ciint kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
7788c2ecf20Sopenharmony_ci			      gpa_t gpa, unsigned long len);
7798c2ecf20Sopenharmony_ci
7808c2ecf20Sopenharmony_ci#define __kvm_get_guest(kvm, gfn, offset, v)				\
7818c2ecf20Sopenharmony_ci({									\
7828c2ecf20Sopenharmony_ci	unsigned long __addr = gfn_to_hva(kvm, gfn);			\
7838c2ecf20Sopenharmony_ci	typeof(v) __user *__uaddr = (typeof(__uaddr))(__addr + offset);	\
7848c2ecf20Sopenharmony_ci	int __ret = -EFAULT;						\
7858c2ecf20Sopenharmony_ci									\
7868c2ecf20Sopenharmony_ci	if (!kvm_is_error_hva(__addr))					\
7878c2ecf20Sopenharmony_ci		__ret = get_user(v, __uaddr);				\
7888c2ecf20Sopenharmony_ci	__ret;								\
7898c2ecf20Sopenharmony_ci})
7908c2ecf20Sopenharmony_ci
7918c2ecf20Sopenharmony_ci#define kvm_get_guest(kvm, gpa, v)					\
7928c2ecf20Sopenharmony_ci({									\
7938c2ecf20Sopenharmony_ci	gpa_t __gpa = gpa;						\
7948c2ecf20Sopenharmony_ci	struct kvm *__kvm = kvm;					\
7958c2ecf20Sopenharmony_ci									\
7968c2ecf20Sopenharmony_ci	__kvm_get_guest(__kvm, __gpa >> PAGE_SHIFT,			\
7978c2ecf20Sopenharmony_ci			offset_in_page(__gpa), v);			\
7988c2ecf20Sopenharmony_ci})
7998c2ecf20Sopenharmony_ci
8008c2ecf20Sopenharmony_ci#define __kvm_put_guest(kvm, gfn, offset, v)				\
8018c2ecf20Sopenharmony_ci({									\
8028c2ecf20Sopenharmony_ci	unsigned long __addr = gfn_to_hva(kvm, gfn);			\
8038c2ecf20Sopenharmony_ci	typeof(v) __user *__uaddr = (typeof(__uaddr))(__addr + offset);	\
8048c2ecf20Sopenharmony_ci	int __ret = -EFAULT;						\
8058c2ecf20Sopenharmony_ci									\
8068c2ecf20Sopenharmony_ci	if (!kvm_is_error_hva(__addr))					\
8078c2ecf20Sopenharmony_ci		__ret = put_user(v, __uaddr);				\
8088c2ecf20Sopenharmony_ci	if (!__ret)							\
8098c2ecf20Sopenharmony_ci		mark_page_dirty(kvm, gfn);				\
8108c2ecf20Sopenharmony_ci	__ret;								\
8118c2ecf20Sopenharmony_ci})
8128c2ecf20Sopenharmony_ci
8138c2ecf20Sopenharmony_ci#define kvm_put_guest(kvm, gpa, v)					\
8148c2ecf20Sopenharmony_ci({									\
8158c2ecf20Sopenharmony_ci	gpa_t __gpa = gpa;						\
8168c2ecf20Sopenharmony_ci	struct kvm *__kvm = kvm;					\
8178c2ecf20Sopenharmony_ci									\
8188c2ecf20Sopenharmony_ci	__kvm_put_guest(__kvm, __gpa >> PAGE_SHIFT,			\
8198c2ecf20Sopenharmony_ci			offset_in_page(__gpa), v);			\
8208c2ecf20Sopenharmony_ci})
8218c2ecf20Sopenharmony_ci
8228c2ecf20Sopenharmony_ciint kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len);
8238c2ecf20Sopenharmony_ciint kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len);
8248c2ecf20Sopenharmony_cistruct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn);
8258c2ecf20Sopenharmony_cibool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn);
8268c2ecf20Sopenharmony_cibool kvm_vcpu_is_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn);
8278c2ecf20Sopenharmony_ciunsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn);
8288c2ecf20Sopenharmony_civoid mark_page_dirty_in_slot(struct kvm_memory_slot *memslot, gfn_t gfn);
8298c2ecf20Sopenharmony_civoid mark_page_dirty(struct kvm *kvm, gfn_t gfn);
8308c2ecf20Sopenharmony_ci
8318c2ecf20Sopenharmony_cistruct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu);
8328c2ecf20Sopenharmony_cistruct kvm_memory_slot *kvm_vcpu_gfn_to_memslot(struct kvm_vcpu *vcpu, gfn_t gfn);
8338c2ecf20Sopenharmony_cikvm_pfn_t kvm_vcpu_gfn_to_pfn_atomic(struct kvm_vcpu *vcpu, gfn_t gfn);
8348c2ecf20Sopenharmony_cikvm_pfn_t kvm_vcpu_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn);
8358c2ecf20Sopenharmony_ciint kvm_vcpu_map(struct kvm_vcpu *vcpu, gpa_t gpa, struct kvm_host_map *map);
8368c2ecf20Sopenharmony_ciint kvm_map_gfn(struct kvm_vcpu *vcpu, gfn_t gfn, struct kvm_host_map *map,
8378c2ecf20Sopenharmony_ci		struct gfn_to_pfn_cache *cache, bool atomic);
8388c2ecf20Sopenharmony_cistruct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn);
8398c2ecf20Sopenharmony_civoid kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, bool dirty);
8408c2ecf20Sopenharmony_ciint kvm_unmap_gfn(struct kvm_vcpu *vcpu, struct kvm_host_map *map,
8418c2ecf20Sopenharmony_ci		  struct gfn_to_pfn_cache *cache, bool dirty, bool atomic);
8428c2ecf20Sopenharmony_ciunsigned long kvm_vcpu_gfn_to_hva(struct kvm_vcpu *vcpu, gfn_t gfn);
8438c2ecf20Sopenharmony_ciunsigned long kvm_vcpu_gfn_to_hva_prot(struct kvm_vcpu *vcpu, gfn_t gfn, bool *writable);
8448c2ecf20Sopenharmony_ciint kvm_vcpu_read_guest_page(struct kvm_vcpu *vcpu, gfn_t gfn, void *data, int offset,
8458c2ecf20Sopenharmony_ci			     int len);
8468c2ecf20Sopenharmony_ciint kvm_vcpu_read_guest_atomic(struct kvm_vcpu *vcpu, gpa_t gpa, void *data,
8478c2ecf20Sopenharmony_ci			       unsigned long len);
8488c2ecf20Sopenharmony_ciint kvm_vcpu_read_guest(struct kvm_vcpu *vcpu, gpa_t gpa, void *data,
8498c2ecf20Sopenharmony_ci			unsigned long len);
8508c2ecf20Sopenharmony_ciint kvm_vcpu_write_guest_page(struct kvm_vcpu *vcpu, gfn_t gfn, const void *data,
8518c2ecf20Sopenharmony_ci			      int offset, int len);
8528c2ecf20Sopenharmony_ciint kvm_vcpu_write_guest(struct kvm_vcpu *vcpu, gpa_t gpa, const void *data,
8538c2ecf20Sopenharmony_ci			 unsigned long len);
8548c2ecf20Sopenharmony_civoid kvm_vcpu_mark_page_dirty(struct kvm_vcpu *vcpu, gfn_t gfn);
8558c2ecf20Sopenharmony_ci
8568c2ecf20Sopenharmony_civoid kvm_sigset_activate(struct kvm_vcpu *vcpu);
8578c2ecf20Sopenharmony_civoid kvm_sigset_deactivate(struct kvm_vcpu *vcpu);
8588c2ecf20Sopenharmony_ci
8598c2ecf20Sopenharmony_civoid kvm_vcpu_block(struct kvm_vcpu *vcpu);
8608c2ecf20Sopenharmony_civoid kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu);
8618c2ecf20Sopenharmony_civoid kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu);
8628c2ecf20Sopenharmony_cibool kvm_vcpu_wake_up(struct kvm_vcpu *vcpu);
8638c2ecf20Sopenharmony_civoid kvm_vcpu_kick(struct kvm_vcpu *vcpu);
8648c2ecf20Sopenharmony_ciint kvm_vcpu_yield_to(struct kvm_vcpu *target);
8658c2ecf20Sopenharmony_civoid kvm_vcpu_on_spin(struct kvm_vcpu *vcpu, bool usermode_vcpu_not_eligible);
8668c2ecf20Sopenharmony_ci
8678c2ecf20Sopenharmony_civoid kvm_flush_remote_tlbs(struct kvm *kvm);
8688c2ecf20Sopenharmony_civoid kvm_reload_remote_mmus(struct kvm *kvm);
8698c2ecf20Sopenharmony_ci
8708c2ecf20Sopenharmony_ci#ifdef KVM_ARCH_NR_OBJS_PER_MEMORY_CACHE
8718c2ecf20Sopenharmony_ciint kvm_mmu_topup_memory_cache(struct kvm_mmu_memory_cache *mc, int min);
8728c2ecf20Sopenharmony_ciint kvm_mmu_memory_cache_nr_free_objects(struct kvm_mmu_memory_cache *mc);
8738c2ecf20Sopenharmony_civoid kvm_mmu_free_memory_cache(struct kvm_mmu_memory_cache *mc);
8748c2ecf20Sopenharmony_civoid *kvm_mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc);
8758c2ecf20Sopenharmony_ci#endif
8768c2ecf20Sopenharmony_ci
8778c2ecf20Sopenharmony_cibool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req,
8788c2ecf20Sopenharmony_ci				 struct kvm_vcpu *except,
8798c2ecf20Sopenharmony_ci				 unsigned long *vcpu_bitmap, cpumask_var_t tmp);
8808c2ecf20Sopenharmony_cibool kvm_make_all_cpus_request_except(struct kvm *kvm, unsigned int req,
8818c2ecf20Sopenharmony_ci				      struct kvm_vcpu *except);
8828c2ecf20Sopenharmony_cibool kvm_make_cpus_request_mask(struct kvm *kvm, unsigned int req,
8838c2ecf20Sopenharmony_ci				unsigned long *vcpu_bitmap);
8848c2ecf20Sopenharmony_ci
8858c2ecf20Sopenharmony_cilong kvm_arch_dev_ioctl(struct file *filp,
8868c2ecf20Sopenharmony_ci			unsigned int ioctl, unsigned long arg);
8878c2ecf20Sopenharmony_cilong kvm_arch_vcpu_ioctl(struct file *filp,
8888c2ecf20Sopenharmony_ci			 unsigned int ioctl, unsigned long arg);
8898c2ecf20Sopenharmony_civm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf);
8908c2ecf20Sopenharmony_ci
8918c2ecf20Sopenharmony_ciint kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext);
8928c2ecf20Sopenharmony_ci
8938c2ecf20Sopenharmony_civoid kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm,
8948c2ecf20Sopenharmony_ci					struct kvm_memory_slot *slot,
8958c2ecf20Sopenharmony_ci					gfn_t gfn_offset,
8968c2ecf20Sopenharmony_ci					unsigned long mask);
8978c2ecf20Sopenharmony_civoid kvm_arch_sync_dirty_log(struct kvm *kvm, struct kvm_memory_slot *memslot);
8988c2ecf20Sopenharmony_ci
8998c2ecf20Sopenharmony_ci#ifdef CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT
9008c2ecf20Sopenharmony_civoid kvm_arch_flush_remote_tlbs_memslot(struct kvm *kvm,
9018c2ecf20Sopenharmony_ci					struct kvm_memory_slot *memslot);
9028c2ecf20Sopenharmony_ci#else /* !CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT */
9038c2ecf20Sopenharmony_ciint kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log);
9048c2ecf20Sopenharmony_ciint kvm_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log,
9058c2ecf20Sopenharmony_ci		      int *is_dirty, struct kvm_memory_slot **memslot);
9068c2ecf20Sopenharmony_ci#endif
9078c2ecf20Sopenharmony_ci
9088c2ecf20Sopenharmony_ciint kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level,
9098c2ecf20Sopenharmony_ci			bool line_status);
9108c2ecf20Sopenharmony_ciint kvm_vm_ioctl_enable_cap(struct kvm *kvm,
9118c2ecf20Sopenharmony_ci			    struct kvm_enable_cap *cap);
9128c2ecf20Sopenharmony_cilong kvm_arch_vm_ioctl(struct file *filp,
9138c2ecf20Sopenharmony_ci		       unsigned int ioctl, unsigned long arg);
9148c2ecf20Sopenharmony_cilong kvm_arch_vm_compat_ioctl(struct file *filp, unsigned int ioctl,
9158c2ecf20Sopenharmony_ci			      unsigned long arg);
9168c2ecf20Sopenharmony_ci
9178c2ecf20Sopenharmony_ciint kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu);
9188c2ecf20Sopenharmony_ciint kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu);
9198c2ecf20Sopenharmony_ci
9208c2ecf20Sopenharmony_ciint kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
9218c2ecf20Sopenharmony_ci				    struct kvm_translation *tr);
9228c2ecf20Sopenharmony_ci
9238c2ecf20Sopenharmony_ciint kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
9248c2ecf20Sopenharmony_ciint kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
9258c2ecf20Sopenharmony_ciint kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
9268c2ecf20Sopenharmony_ci				  struct kvm_sregs *sregs);
9278c2ecf20Sopenharmony_ciint kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
9288c2ecf20Sopenharmony_ci				  struct kvm_sregs *sregs);
9298c2ecf20Sopenharmony_ciint kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
9308c2ecf20Sopenharmony_ci				    struct kvm_mp_state *mp_state);
9318c2ecf20Sopenharmony_ciint kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
9328c2ecf20Sopenharmony_ci				    struct kvm_mp_state *mp_state);
9338c2ecf20Sopenharmony_ciint kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
9348c2ecf20Sopenharmony_ci					struct kvm_guest_debug *dbg);
9358c2ecf20Sopenharmony_ciint kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu);
9368c2ecf20Sopenharmony_ci
9378c2ecf20Sopenharmony_ciint kvm_arch_init(void *opaque);
9388c2ecf20Sopenharmony_civoid kvm_arch_exit(void);
9398c2ecf20Sopenharmony_ci
9408c2ecf20Sopenharmony_civoid kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu);
9418c2ecf20Sopenharmony_ci
9428c2ecf20Sopenharmony_civoid kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu);
9438c2ecf20Sopenharmony_civoid kvm_arch_vcpu_put(struct kvm_vcpu *vcpu);
9448c2ecf20Sopenharmony_ciint kvm_arch_vcpu_precreate(struct kvm *kvm, unsigned int id);
9458c2ecf20Sopenharmony_ciint kvm_arch_vcpu_create(struct kvm_vcpu *vcpu);
9468c2ecf20Sopenharmony_civoid kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu);
9478c2ecf20Sopenharmony_civoid kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu);
9488c2ecf20Sopenharmony_ci
9498c2ecf20Sopenharmony_ci#ifdef __KVM_HAVE_ARCH_VCPU_DEBUGFS
9508c2ecf20Sopenharmony_civoid kvm_arch_create_vcpu_debugfs(struct kvm_vcpu *vcpu, struct dentry *debugfs_dentry);
9518c2ecf20Sopenharmony_ci#endif
9528c2ecf20Sopenharmony_ci
9538c2ecf20Sopenharmony_ciint kvm_arch_hardware_enable(void);
9548c2ecf20Sopenharmony_civoid kvm_arch_hardware_disable(void);
9558c2ecf20Sopenharmony_ciint kvm_arch_hardware_setup(void *opaque);
9568c2ecf20Sopenharmony_civoid kvm_arch_hardware_unsetup(void);
9578c2ecf20Sopenharmony_ciint kvm_arch_check_processor_compat(void *opaque);
9588c2ecf20Sopenharmony_ciint kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu);
9598c2ecf20Sopenharmony_cibool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu);
9608c2ecf20Sopenharmony_ciint kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu);
9618c2ecf20Sopenharmony_cibool kvm_arch_dy_runnable(struct kvm_vcpu *vcpu);
9628c2ecf20Sopenharmony_ciint kvm_arch_post_init_vm(struct kvm *kvm);
9638c2ecf20Sopenharmony_civoid kvm_arch_pre_destroy_vm(struct kvm *kvm);
9648c2ecf20Sopenharmony_ci
9658c2ecf20Sopenharmony_ci#ifndef __KVM_HAVE_ARCH_VM_ALLOC
9668c2ecf20Sopenharmony_ci/*
9678c2ecf20Sopenharmony_ci * All architectures that want to use vzalloc currently also
9688c2ecf20Sopenharmony_ci * need their own kvm_arch_alloc_vm implementation.
9698c2ecf20Sopenharmony_ci */
9708c2ecf20Sopenharmony_cistatic inline struct kvm *kvm_arch_alloc_vm(void)
9718c2ecf20Sopenharmony_ci{
9728c2ecf20Sopenharmony_ci	return kzalloc(sizeof(struct kvm), GFP_KERNEL);
9738c2ecf20Sopenharmony_ci}
9748c2ecf20Sopenharmony_ci
9758c2ecf20Sopenharmony_cistatic inline void kvm_arch_free_vm(struct kvm *kvm)
9768c2ecf20Sopenharmony_ci{
9778c2ecf20Sopenharmony_ci	kfree(kvm);
9788c2ecf20Sopenharmony_ci}
9798c2ecf20Sopenharmony_ci#endif
9808c2ecf20Sopenharmony_ci
9818c2ecf20Sopenharmony_ci#ifndef __KVM_HAVE_ARCH_FLUSH_REMOTE_TLB
9828c2ecf20Sopenharmony_cistatic inline int kvm_arch_flush_remote_tlb(struct kvm *kvm)
9838c2ecf20Sopenharmony_ci{
9848c2ecf20Sopenharmony_ci	return -ENOTSUPP;
9858c2ecf20Sopenharmony_ci}
9868c2ecf20Sopenharmony_ci#endif
9878c2ecf20Sopenharmony_ci
9888c2ecf20Sopenharmony_ci#ifdef __KVM_HAVE_ARCH_NONCOHERENT_DMA
9898c2ecf20Sopenharmony_civoid kvm_arch_register_noncoherent_dma(struct kvm *kvm);
9908c2ecf20Sopenharmony_civoid kvm_arch_unregister_noncoherent_dma(struct kvm *kvm);
9918c2ecf20Sopenharmony_cibool kvm_arch_has_noncoherent_dma(struct kvm *kvm);
9928c2ecf20Sopenharmony_ci#else
9938c2ecf20Sopenharmony_cistatic inline void kvm_arch_register_noncoherent_dma(struct kvm *kvm)
9948c2ecf20Sopenharmony_ci{
9958c2ecf20Sopenharmony_ci}
9968c2ecf20Sopenharmony_ci
9978c2ecf20Sopenharmony_cistatic inline void kvm_arch_unregister_noncoherent_dma(struct kvm *kvm)
9988c2ecf20Sopenharmony_ci{
9998c2ecf20Sopenharmony_ci}
10008c2ecf20Sopenharmony_ci
10018c2ecf20Sopenharmony_cistatic inline bool kvm_arch_has_noncoherent_dma(struct kvm *kvm)
10028c2ecf20Sopenharmony_ci{
10038c2ecf20Sopenharmony_ci	return false;
10048c2ecf20Sopenharmony_ci}
10058c2ecf20Sopenharmony_ci#endif
10068c2ecf20Sopenharmony_ci#ifdef __KVM_HAVE_ARCH_ASSIGNED_DEVICE
10078c2ecf20Sopenharmony_civoid kvm_arch_start_assignment(struct kvm *kvm);
10088c2ecf20Sopenharmony_civoid kvm_arch_end_assignment(struct kvm *kvm);
10098c2ecf20Sopenharmony_cibool kvm_arch_has_assigned_device(struct kvm *kvm);
10108c2ecf20Sopenharmony_ci#else
10118c2ecf20Sopenharmony_cistatic inline void kvm_arch_start_assignment(struct kvm *kvm)
10128c2ecf20Sopenharmony_ci{
10138c2ecf20Sopenharmony_ci}
10148c2ecf20Sopenharmony_ci
10158c2ecf20Sopenharmony_cistatic inline void kvm_arch_end_assignment(struct kvm *kvm)
10168c2ecf20Sopenharmony_ci{
10178c2ecf20Sopenharmony_ci}
10188c2ecf20Sopenharmony_ci
10198c2ecf20Sopenharmony_cistatic __always_inline bool kvm_arch_has_assigned_device(struct kvm *kvm)
10208c2ecf20Sopenharmony_ci{
10218c2ecf20Sopenharmony_ci	return false;
10228c2ecf20Sopenharmony_ci}
10238c2ecf20Sopenharmony_ci#endif
10248c2ecf20Sopenharmony_ci
10258c2ecf20Sopenharmony_cistatic inline struct rcuwait *kvm_arch_vcpu_get_wait(struct kvm_vcpu *vcpu)
10268c2ecf20Sopenharmony_ci{
10278c2ecf20Sopenharmony_ci#ifdef __KVM_HAVE_ARCH_WQP
10288c2ecf20Sopenharmony_ci	return vcpu->arch.waitp;
10298c2ecf20Sopenharmony_ci#else
10308c2ecf20Sopenharmony_ci	return &vcpu->wait;
10318c2ecf20Sopenharmony_ci#endif
10328c2ecf20Sopenharmony_ci}
10338c2ecf20Sopenharmony_ci
10348c2ecf20Sopenharmony_ci#ifdef __KVM_HAVE_ARCH_INTC_INITIALIZED
10358c2ecf20Sopenharmony_ci/*
10368c2ecf20Sopenharmony_ci * returns true if the virtual interrupt controller is initialized and
10378c2ecf20Sopenharmony_ci * ready to accept virtual IRQ. On some architectures the virtual interrupt
10388c2ecf20Sopenharmony_ci * controller is dynamically instantiated and this is not always true.
10398c2ecf20Sopenharmony_ci */
10408c2ecf20Sopenharmony_cibool kvm_arch_intc_initialized(struct kvm *kvm);
10418c2ecf20Sopenharmony_ci#else
10428c2ecf20Sopenharmony_cistatic inline bool kvm_arch_intc_initialized(struct kvm *kvm)
10438c2ecf20Sopenharmony_ci{
10448c2ecf20Sopenharmony_ci	return true;
10458c2ecf20Sopenharmony_ci}
10468c2ecf20Sopenharmony_ci#endif
10478c2ecf20Sopenharmony_ci
10488c2ecf20Sopenharmony_ciint kvm_arch_init_vm(struct kvm *kvm, unsigned long type);
10498c2ecf20Sopenharmony_civoid kvm_arch_destroy_vm(struct kvm *kvm);
10508c2ecf20Sopenharmony_civoid kvm_arch_sync_events(struct kvm *kvm);
10518c2ecf20Sopenharmony_ci
10528c2ecf20Sopenharmony_ciint kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu);
10538c2ecf20Sopenharmony_ci
10548c2ecf20Sopenharmony_cibool kvm_is_reserved_pfn(kvm_pfn_t pfn);
10558c2ecf20Sopenharmony_cibool kvm_is_zone_device_pfn(kvm_pfn_t pfn);
10568c2ecf20Sopenharmony_cibool kvm_is_transparent_hugepage(kvm_pfn_t pfn);
10578c2ecf20Sopenharmony_ci
10588c2ecf20Sopenharmony_cistruct kvm_irq_ack_notifier {
10598c2ecf20Sopenharmony_ci	struct hlist_node link;
10608c2ecf20Sopenharmony_ci	unsigned gsi;
10618c2ecf20Sopenharmony_ci	void (*irq_acked)(struct kvm_irq_ack_notifier *kian);
10628c2ecf20Sopenharmony_ci};
10638c2ecf20Sopenharmony_ci
10648c2ecf20Sopenharmony_ciint kvm_irq_map_gsi(struct kvm *kvm,
10658c2ecf20Sopenharmony_ci		    struct kvm_kernel_irq_routing_entry *entries, int gsi);
10668c2ecf20Sopenharmony_ciint kvm_irq_map_chip_pin(struct kvm *kvm, unsigned irqchip, unsigned pin);
10678c2ecf20Sopenharmony_ci
10688c2ecf20Sopenharmony_ciint kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level,
10698c2ecf20Sopenharmony_ci		bool line_status);
10708c2ecf20Sopenharmony_ciint kvm_set_msi(struct kvm_kernel_irq_routing_entry *irq_entry, struct kvm *kvm,
10718c2ecf20Sopenharmony_ci		int irq_source_id, int level, bool line_status);
10728c2ecf20Sopenharmony_ciint kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e,
10738c2ecf20Sopenharmony_ci			       struct kvm *kvm, int irq_source_id,
10748c2ecf20Sopenharmony_ci			       int level, bool line_status);
10758c2ecf20Sopenharmony_cibool kvm_irq_has_notifier(struct kvm *kvm, unsigned irqchip, unsigned pin);
10768c2ecf20Sopenharmony_civoid kvm_notify_acked_gsi(struct kvm *kvm, int gsi);
10778c2ecf20Sopenharmony_civoid kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin);
10788c2ecf20Sopenharmony_civoid kvm_register_irq_ack_notifier(struct kvm *kvm,
10798c2ecf20Sopenharmony_ci				   struct kvm_irq_ack_notifier *kian);
10808c2ecf20Sopenharmony_civoid kvm_unregister_irq_ack_notifier(struct kvm *kvm,
10818c2ecf20Sopenharmony_ci				   struct kvm_irq_ack_notifier *kian);
10828c2ecf20Sopenharmony_ciint kvm_request_irq_source_id(struct kvm *kvm);
10838c2ecf20Sopenharmony_civoid kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id);
10848c2ecf20Sopenharmony_cibool kvm_arch_irqfd_allowed(struct kvm *kvm, struct kvm_irqfd *args);
10858c2ecf20Sopenharmony_ci
10868c2ecf20Sopenharmony_ci/*
10878c2ecf20Sopenharmony_ci * search_memslots() and __gfn_to_memslot() are here because they are
10888c2ecf20Sopenharmony_ci * used in non-modular code in arch/powerpc/kvm/book3s_hv_rm_mmu.c.
10898c2ecf20Sopenharmony_ci * gfn_to_memslot() itself isn't here as an inline because that would
10908c2ecf20Sopenharmony_ci * bloat other code too much.
10918c2ecf20Sopenharmony_ci *
10928c2ecf20Sopenharmony_ci * IMPORTANT: Slots are sorted from highest GFN to lowest GFN!
10938c2ecf20Sopenharmony_ci */
10948c2ecf20Sopenharmony_cistatic inline struct kvm_memory_slot *
10958c2ecf20Sopenharmony_cisearch_memslots(struct kvm_memslots *slots, gfn_t gfn)
10968c2ecf20Sopenharmony_ci{
10978c2ecf20Sopenharmony_ci	int start = 0, end = slots->used_slots;
10988c2ecf20Sopenharmony_ci	int slot = atomic_read(&slots->lru_slot);
10998c2ecf20Sopenharmony_ci	struct kvm_memory_slot *memslots = slots->memslots;
11008c2ecf20Sopenharmony_ci
11018c2ecf20Sopenharmony_ci	if (unlikely(!slots->used_slots))
11028c2ecf20Sopenharmony_ci		return NULL;
11038c2ecf20Sopenharmony_ci
11048c2ecf20Sopenharmony_ci	if (gfn >= memslots[slot].base_gfn &&
11058c2ecf20Sopenharmony_ci	    gfn < memslots[slot].base_gfn + memslots[slot].npages)
11068c2ecf20Sopenharmony_ci		return &memslots[slot];
11078c2ecf20Sopenharmony_ci
11088c2ecf20Sopenharmony_ci	while (start < end) {
11098c2ecf20Sopenharmony_ci		slot = start + (end - start) / 2;
11108c2ecf20Sopenharmony_ci
11118c2ecf20Sopenharmony_ci		if (gfn >= memslots[slot].base_gfn)
11128c2ecf20Sopenharmony_ci			end = slot;
11138c2ecf20Sopenharmony_ci		else
11148c2ecf20Sopenharmony_ci			start = slot + 1;
11158c2ecf20Sopenharmony_ci	}
11168c2ecf20Sopenharmony_ci
11178c2ecf20Sopenharmony_ci	if (start < slots->used_slots && gfn >= memslots[start].base_gfn &&
11188c2ecf20Sopenharmony_ci	    gfn < memslots[start].base_gfn + memslots[start].npages) {
11198c2ecf20Sopenharmony_ci		atomic_set(&slots->lru_slot, start);
11208c2ecf20Sopenharmony_ci		return &memslots[start];
11218c2ecf20Sopenharmony_ci	}
11228c2ecf20Sopenharmony_ci
11238c2ecf20Sopenharmony_ci	return NULL;
11248c2ecf20Sopenharmony_ci}
11258c2ecf20Sopenharmony_ci
11268c2ecf20Sopenharmony_cistatic inline struct kvm_memory_slot *
11278c2ecf20Sopenharmony_ci__gfn_to_memslot(struct kvm_memslots *slots, gfn_t gfn)
11288c2ecf20Sopenharmony_ci{
11298c2ecf20Sopenharmony_ci	return search_memslots(slots, gfn);
11308c2ecf20Sopenharmony_ci}
11318c2ecf20Sopenharmony_ci
11328c2ecf20Sopenharmony_cistatic inline unsigned long
11338c2ecf20Sopenharmony_ci__gfn_to_hva_memslot(struct kvm_memory_slot *slot, gfn_t gfn)
11348c2ecf20Sopenharmony_ci{
11358c2ecf20Sopenharmony_ci	/*
11368c2ecf20Sopenharmony_ci	 * The index was checked originally in search_memslots.  To avoid
11378c2ecf20Sopenharmony_ci	 * that a malicious guest builds a Spectre gadget out of e.g. page
11388c2ecf20Sopenharmony_ci	 * table walks, do not let the processor speculate loads outside
11398c2ecf20Sopenharmony_ci	 * the guest's registered memslots.
11408c2ecf20Sopenharmony_ci	 */
11418c2ecf20Sopenharmony_ci	unsigned long offset = gfn - slot->base_gfn;
11428c2ecf20Sopenharmony_ci	offset = array_index_nospec(offset, slot->npages);
11438c2ecf20Sopenharmony_ci	return slot->userspace_addr + offset * PAGE_SIZE;
11448c2ecf20Sopenharmony_ci}
11458c2ecf20Sopenharmony_ci
11468c2ecf20Sopenharmony_cistatic inline int memslot_id(struct kvm *kvm, gfn_t gfn)
11478c2ecf20Sopenharmony_ci{
11488c2ecf20Sopenharmony_ci	return gfn_to_memslot(kvm, gfn)->id;
11498c2ecf20Sopenharmony_ci}
11508c2ecf20Sopenharmony_ci
11518c2ecf20Sopenharmony_cistatic inline gfn_t
11528c2ecf20Sopenharmony_cihva_to_gfn_memslot(unsigned long hva, struct kvm_memory_slot *slot)
11538c2ecf20Sopenharmony_ci{
11548c2ecf20Sopenharmony_ci	gfn_t gfn_offset = (hva - slot->userspace_addr) >> PAGE_SHIFT;
11558c2ecf20Sopenharmony_ci
11568c2ecf20Sopenharmony_ci	return slot->base_gfn + gfn_offset;
11578c2ecf20Sopenharmony_ci}
11588c2ecf20Sopenharmony_ci
11598c2ecf20Sopenharmony_cistatic inline gpa_t gfn_to_gpa(gfn_t gfn)
11608c2ecf20Sopenharmony_ci{
11618c2ecf20Sopenharmony_ci	return (gpa_t)gfn << PAGE_SHIFT;
11628c2ecf20Sopenharmony_ci}
11638c2ecf20Sopenharmony_ci
11648c2ecf20Sopenharmony_cistatic inline gfn_t gpa_to_gfn(gpa_t gpa)
11658c2ecf20Sopenharmony_ci{
11668c2ecf20Sopenharmony_ci	return (gfn_t)(gpa >> PAGE_SHIFT);
11678c2ecf20Sopenharmony_ci}
11688c2ecf20Sopenharmony_ci
11698c2ecf20Sopenharmony_cistatic inline hpa_t pfn_to_hpa(kvm_pfn_t pfn)
11708c2ecf20Sopenharmony_ci{
11718c2ecf20Sopenharmony_ci	return (hpa_t)pfn << PAGE_SHIFT;
11728c2ecf20Sopenharmony_ci}
11738c2ecf20Sopenharmony_ci
11748c2ecf20Sopenharmony_cistatic inline struct page *kvm_vcpu_gpa_to_page(struct kvm_vcpu *vcpu,
11758c2ecf20Sopenharmony_ci						gpa_t gpa)
11768c2ecf20Sopenharmony_ci{
11778c2ecf20Sopenharmony_ci	return kvm_vcpu_gfn_to_page(vcpu, gpa_to_gfn(gpa));
11788c2ecf20Sopenharmony_ci}
11798c2ecf20Sopenharmony_ci
11808c2ecf20Sopenharmony_cistatic inline bool kvm_is_error_gpa(struct kvm *kvm, gpa_t gpa)
11818c2ecf20Sopenharmony_ci{
11828c2ecf20Sopenharmony_ci	unsigned long hva = gfn_to_hva(kvm, gpa_to_gfn(gpa));
11838c2ecf20Sopenharmony_ci
11848c2ecf20Sopenharmony_ci	return kvm_is_error_hva(hva);
11858c2ecf20Sopenharmony_ci}
11868c2ecf20Sopenharmony_ci
11878c2ecf20Sopenharmony_cienum kvm_stat_kind {
11888c2ecf20Sopenharmony_ci	KVM_STAT_VM,
11898c2ecf20Sopenharmony_ci	KVM_STAT_VCPU,
11908c2ecf20Sopenharmony_ci};
11918c2ecf20Sopenharmony_ci
11928c2ecf20Sopenharmony_cistruct kvm_stat_data {
11938c2ecf20Sopenharmony_ci	struct kvm *kvm;
11948c2ecf20Sopenharmony_ci	struct kvm_stats_debugfs_item *dbgfs_item;
11958c2ecf20Sopenharmony_ci};
11968c2ecf20Sopenharmony_ci
11978c2ecf20Sopenharmony_cistruct kvm_stats_debugfs_item {
11988c2ecf20Sopenharmony_ci	const char *name;
11998c2ecf20Sopenharmony_ci	int offset;
12008c2ecf20Sopenharmony_ci	enum kvm_stat_kind kind;
12018c2ecf20Sopenharmony_ci	int mode;
12028c2ecf20Sopenharmony_ci};
12038c2ecf20Sopenharmony_ci
12048c2ecf20Sopenharmony_ci#define KVM_DBGFS_GET_MODE(dbgfs_item)                                         \
12058c2ecf20Sopenharmony_ci	((dbgfs_item)->mode ? (dbgfs_item)->mode : 0644)
12068c2ecf20Sopenharmony_ci
12078c2ecf20Sopenharmony_ci#define VM_STAT(n, x, ...) 							\
12088c2ecf20Sopenharmony_ci	{ n, offsetof(struct kvm, stat.x), KVM_STAT_VM, ## __VA_ARGS__ }
12098c2ecf20Sopenharmony_ci#define VCPU_STAT(n, x, ...)							\
12108c2ecf20Sopenharmony_ci	{ n, offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU, ## __VA_ARGS__ }
12118c2ecf20Sopenharmony_ci
12128c2ecf20Sopenharmony_ciextern struct kvm_stats_debugfs_item debugfs_entries[];
12138c2ecf20Sopenharmony_ciextern struct dentry *kvm_debugfs_dir;
12148c2ecf20Sopenharmony_ci
12158c2ecf20Sopenharmony_ci#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
12168c2ecf20Sopenharmony_cistatic inline int mmu_notifier_retry(struct kvm *kvm, unsigned long mmu_seq)
12178c2ecf20Sopenharmony_ci{
12188c2ecf20Sopenharmony_ci	if (unlikely(kvm->mmu_notifier_count))
12198c2ecf20Sopenharmony_ci		return 1;
12208c2ecf20Sopenharmony_ci	/*
12218c2ecf20Sopenharmony_ci	 * Ensure the read of mmu_notifier_count happens before the read
12228c2ecf20Sopenharmony_ci	 * of mmu_notifier_seq.  This interacts with the smp_wmb() in
12238c2ecf20Sopenharmony_ci	 * mmu_notifier_invalidate_range_end to make sure that the caller
12248c2ecf20Sopenharmony_ci	 * either sees the old (non-zero) value of mmu_notifier_count or
12258c2ecf20Sopenharmony_ci	 * the new (incremented) value of mmu_notifier_seq.
12268c2ecf20Sopenharmony_ci	 * PowerPC Book3s HV KVM calls this under a per-page lock
12278c2ecf20Sopenharmony_ci	 * rather than under kvm->mmu_lock, for scalability, so
12288c2ecf20Sopenharmony_ci	 * can't rely on kvm->mmu_lock to keep things ordered.
12298c2ecf20Sopenharmony_ci	 */
12308c2ecf20Sopenharmony_ci	smp_rmb();
12318c2ecf20Sopenharmony_ci	if (kvm->mmu_notifier_seq != mmu_seq)
12328c2ecf20Sopenharmony_ci		return 1;
12338c2ecf20Sopenharmony_ci	return 0;
12348c2ecf20Sopenharmony_ci}
12358c2ecf20Sopenharmony_ci#endif
12368c2ecf20Sopenharmony_ci
12378c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
12388c2ecf20Sopenharmony_ci
12398c2ecf20Sopenharmony_ci#define KVM_MAX_IRQ_ROUTES 4096 /* might need extension/rework in the future */
12408c2ecf20Sopenharmony_ci
12418c2ecf20Sopenharmony_cibool kvm_arch_can_set_irq_routing(struct kvm *kvm);
12428c2ecf20Sopenharmony_ciint kvm_set_irq_routing(struct kvm *kvm,
12438c2ecf20Sopenharmony_ci			const struct kvm_irq_routing_entry *entries,
12448c2ecf20Sopenharmony_ci			unsigned nr,
12458c2ecf20Sopenharmony_ci			unsigned flags);
12468c2ecf20Sopenharmony_ciint kvm_set_routing_entry(struct kvm *kvm,
12478c2ecf20Sopenharmony_ci			  struct kvm_kernel_irq_routing_entry *e,
12488c2ecf20Sopenharmony_ci			  const struct kvm_irq_routing_entry *ue);
12498c2ecf20Sopenharmony_civoid kvm_free_irq_routing(struct kvm *kvm);
12508c2ecf20Sopenharmony_ci
12518c2ecf20Sopenharmony_ci#else
12528c2ecf20Sopenharmony_ci
12538c2ecf20Sopenharmony_cistatic inline void kvm_free_irq_routing(struct kvm *kvm) {}
12548c2ecf20Sopenharmony_ci
12558c2ecf20Sopenharmony_ci#endif
12568c2ecf20Sopenharmony_ci
12578c2ecf20Sopenharmony_ciint kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi);
12588c2ecf20Sopenharmony_ci
12598c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_EVENTFD
12608c2ecf20Sopenharmony_ci
12618c2ecf20Sopenharmony_civoid kvm_eventfd_init(struct kvm *kvm);
12628c2ecf20Sopenharmony_ciint kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args);
12638c2ecf20Sopenharmony_ci
12648c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_IRQFD
12658c2ecf20Sopenharmony_ciint kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args);
12668c2ecf20Sopenharmony_civoid kvm_irqfd_release(struct kvm *kvm);
12678c2ecf20Sopenharmony_civoid kvm_irq_routing_update(struct kvm *);
12688c2ecf20Sopenharmony_ci#else
12698c2ecf20Sopenharmony_cistatic inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args)
12708c2ecf20Sopenharmony_ci{
12718c2ecf20Sopenharmony_ci	return -EINVAL;
12728c2ecf20Sopenharmony_ci}
12738c2ecf20Sopenharmony_ci
12748c2ecf20Sopenharmony_cistatic inline void kvm_irqfd_release(struct kvm *kvm) {}
12758c2ecf20Sopenharmony_ci#endif
12768c2ecf20Sopenharmony_ci
12778c2ecf20Sopenharmony_ci#else
12788c2ecf20Sopenharmony_ci
12798c2ecf20Sopenharmony_cistatic inline void kvm_eventfd_init(struct kvm *kvm) {}
12808c2ecf20Sopenharmony_ci
12818c2ecf20Sopenharmony_cistatic inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args)
12828c2ecf20Sopenharmony_ci{
12838c2ecf20Sopenharmony_ci	return -EINVAL;
12848c2ecf20Sopenharmony_ci}
12858c2ecf20Sopenharmony_ci
12868c2ecf20Sopenharmony_cistatic inline void kvm_irqfd_release(struct kvm *kvm) {}
12878c2ecf20Sopenharmony_ci
12888c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_IRQCHIP
12898c2ecf20Sopenharmony_cistatic inline void kvm_irq_routing_update(struct kvm *kvm)
12908c2ecf20Sopenharmony_ci{
12918c2ecf20Sopenharmony_ci}
12928c2ecf20Sopenharmony_ci#endif
12938c2ecf20Sopenharmony_ci
12948c2ecf20Sopenharmony_cistatic inline int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
12958c2ecf20Sopenharmony_ci{
12968c2ecf20Sopenharmony_ci	return -ENOSYS;
12978c2ecf20Sopenharmony_ci}
12988c2ecf20Sopenharmony_ci
12998c2ecf20Sopenharmony_ci#endif /* CONFIG_HAVE_KVM_EVENTFD */
13008c2ecf20Sopenharmony_ci
13018c2ecf20Sopenharmony_civoid kvm_arch_irq_routing_update(struct kvm *kvm);
13028c2ecf20Sopenharmony_ci
13038c2ecf20Sopenharmony_cistatic inline void kvm_make_request(int req, struct kvm_vcpu *vcpu)
13048c2ecf20Sopenharmony_ci{
13058c2ecf20Sopenharmony_ci	/*
13068c2ecf20Sopenharmony_ci	 * Ensure the rest of the request is published to kvm_check_request's
13078c2ecf20Sopenharmony_ci	 * caller.  Paired with the smp_mb__after_atomic in kvm_check_request.
13088c2ecf20Sopenharmony_ci	 */
13098c2ecf20Sopenharmony_ci	smp_wmb();
13108c2ecf20Sopenharmony_ci	set_bit(req & KVM_REQUEST_MASK, (void *)&vcpu->requests);
13118c2ecf20Sopenharmony_ci}
13128c2ecf20Sopenharmony_ci
13138c2ecf20Sopenharmony_cistatic inline bool kvm_request_pending(struct kvm_vcpu *vcpu)
13148c2ecf20Sopenharmony_ci{
13158c2ecf20Sopenharmony_ci	return READ_ONCE(vcpu->requests);
13168c2ecf20Sopenharmony_ci}
13178c2ecf20Sopenharmony_ci
13188c2ecf20Sopenharmony_cistatic inline bool kvm_test_request(int req, struct kvm_vcpu *vcpu)
13198c2ecf20Sopenharmony_ci{
13208c2ecf20Sopenharmony_ci	return test_bit(req & KVM_REQUEST_MASK, (void *)&vcpu->requests);
13218c2ecf20Sopenharmony_ci}
13228c2ecf20Sopenharmony_ci
13238c2ecf20Sopenharmony_cistatic inline void kvm_clear_request(int req, struct kvm_vcpu *vcpu)
13248c2ecf20Sopenharmony_ci{
13258c2ecf20Sopenharmony_ci	clear_bit(req & KVM_REQUEST_MASK, (void *)&vcpu->requests);
13268c2ecf20Sopenharmony_ci}
13278c2ecf20Sopenharmony_ci
13288c2ecf20Sopenharmony_cistatic inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu)
13298c2ecf20Sopenharmony_ci{
13308c2ecf20Sopenharmony_ci	if (kvm_test_request(req, vcpu)) {
13318c2ecf20Sopenharmony_ci		kvm_clear_request(req, vcpu);
13328c2ecf20Sopenharmony_ci
13338c2ecf20Sopenharmony_ci		/*
13348c2ecf20Sopenharmony_ci		 * Ensure the rest of the request is visible to kvm_check_request's
13358c2ecf20Sopenharmony_ci		 * caller.  Paired with the smp_wmb in kvm_make_request.
13368c2ecf20Sopenharmony_ci		 */
13378c2ecf20Sopenharmony_ci		smp_mb__after_atomic();
13388c2ecf20Sopenharmony_ci		return true;
13398c2ecf20Sopenharmony_ci	} else {
13408c2ecf20Sopenharmony_ci		return false;
13418c2ecf20Sopenharmony_ci	}
13428c2ecf20Sopenharmony_ci}
13438c2ecf20Sopenharmony_ci
13448c2ecf20Sopenharmony_ciextern bool kvm_rebooting;
13458c2ecf20Sopenharmony_ci
13468c2ecf20Sopenharmony_ciextern unsigned int halt_poll_ns;
13478c2ecf20Sopenharmony_ciextern unsigned int halt_poll_ns_grow;
13488c2ecf20Sopenharmony_ciextern unsigned int halt_poll_ns_grow_start;
13498c2ecf20Sopenharmony_ciextern unsigned int halt_poll_ns_shrink;
13508c2ecf20Sopenharmony_ci
13518c2ecf20Sopenharmony_cistruct kvm_device {
13528c2ecf20Sopenharmony_ci	const struct kvm_device_ops *ops;
13538c2ecf20Sopenharmony_ci	struct kvm *kvm;
13548c2ecf20Sopenharmony_ci	void *private;
13558c2ecf20Sopenharmony_ci	struct list_head vm_node;
13568c2ecf20Sopenharmony_ci};
13578c2ecf20Sopenharmony_ci
13588c2ecf20Sopenharmony_ci/* create, destroy, and name are mandatory */
13598c2ecf20Sopenharmony_cistruct kvm_device_ops {
13608c2ecf20Sopenharmony_ci	const char *name;
13618c2ecf20Sopenharmony_ci
13628c2ecf20Sopenharmony_ci	/*
13638c2ecf20Sopenharmony_ci	 * create is called holding kvm->lock and any operations not suitable
13648c2ecf20Sopenharmony_ci	 * to do while holding the lock should be deferred to init (see
13658c2ecf20Sopenharmony_ci	 * below).
13668c2ecf20Sopenharmony_ci	 */
13678c2ecf20Sopenharmony_ci	int (*create)(struct kvm_device *dev, u32 type);
13688c2ecf20Sopenharmony_ci
13698c2ecf20Sopenharmony_ci	/*
13708c2ecf20Sopenharmony_ci	 * init is called after create if create is successful and is called
13718c2ecf20Sopenharmony_ci	 * outside of holding kvm->lock.
13728c2ecf20Sopenharmony_ci	 */
13738c2ecf20Sopenharmony_ci	void (*init)(struct kvm_device *dev);
13748c2ecf20Sopenharmony_ci
13758c2ecf20Sopenharmony_ci	/*
13768c2ecf20Sopenharmony_ci	 * Destroy is responsible for freeing dev.
13778c2ecf20Sopenharmony_ci	 *
13788c2ecf20Sopenharmony_ci	 * Destroy may be called before or after destructors are called
13798c2ecf20Sopenharmony_ci	 * on emulated I/O regions, depending on whether a reference is
13808c2ecf20Sopenharmony_ci	 * held by a vcpu or other kvm component that gets destroyed
13818c2ecf20Sopenharmony_ci	 * after the emulated I/O.
13828c2ecf20Sopenharmony_ci	 */
13838c2ecf20Sopenharmony_ci	void (*destroy)(struct kvm_device *dev);
13848c2ecf20Sopenharmony_ci
13858c2ecf20Sopenharmony_ci	/*
13868c2ecf20Sopenharmony_ci	 * Release is an alternative method to free the device. It is
13878c2ecf20Sopenharmony_ci	 * called when the device file descriptor is closed. Once
13888c2ecf20Sopenharmony_ci	 * release is called, the destroy method will not be called
13898c2ecf20Sopenharmony_ci	 * anymore as the device is removed from the device list of
13908c2ecf20Sopenharmony_ci	 * the VM. kvm->lock is held.
13918c2ecf20Sopenharmony_ci	 */
13928c2ecf20Sopenharmony_ci	void (*release)(struct kvm_device *dev);
13938c2ecf20Sopenharmony_ci
13948c2ecf20Sopenharmony_ci	int (*set_attr)(struct kvm_device *dev, struct kvm_device_attr *attr);
13958c2ecf20Sopenharmony_ci	int (*get_attr)(struct kvm_device *dev, struct kvm_device_attr *attr);
13968c2ecf20Sopenharmony_ci	int (*has_attr)(struct kvm_device *dev, struct kvm_device_attr *attr);
13978c2ecf20Sopenharmony_ci	long (*ioctl)(struct kvm_device *dev, unsigned int ioctl,
13988c2ecf20Sopenharmony_ci		      unsigned long arg);
13998c2ecf20Sopenharmony_ci	int (*mmap)(struct kvm_device *dev, struct vm_area_struct *vma);
14008c2ecf20Sopenharmony_ci};
14018c2ecf20Sopenharmony_ci
14028c2ecf20Sopenharmony_civoid kvm_device_get(struct kvm_device *dev);
14038c2ecf20Sopenharmony_civoid kvm_device_put(struct kvm_device *dev);
14048c2ecf20Sopenharmony_cistruct kvm_device *kvm_device_from_filp(struct file *filp);
14058c2ecf20Sopenharmony_ciint kvm_register_device_ops(const struct kvm_device_ops *ops, u32 type);
14068c2ecf20Sopenharmony_civoid kvm_unregister_device_ops(u32 type);
14078c2ecf20Sopenharmony_ci
14088c2ecf20Sopenharmony_ciextern struct kvm_device_ops kvm_mpic_ops;
14098c2ecf20Sopenharmony_ciextern struct kvm_device_ops kvm_arm_vgic_v2_ops;
14108c2ecf20Sopenharmony_ciextern struct kvm_device_ops kvm_arm_vgic_v3_ops;
14118c2ecf20Sopenharmony_ci
14128c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT
14138c2ecf20Sopenharmony_ci
14148c2ecf20Sopenharmony_cistatic inline void kvm_vcpu_set_in_spin_loop(struct kvm_vcpu *vcpu, bool val)
14158c2ecf20Sopenharmony_ci{
14168c2ecf20Sopenharmony_ci	vcpu->spin_loop.in_spin_loop = val;
14178c2ecf20Sopenharmony_ci}
14188c2ecf20Sopenharmony_cistatic inline void kvm_vcpu_set_dy_eligible(struct kvm_vcpu *vcpu, bool val)
14198c2ecf20Sopenharmony_ci{
14208c2ecf20Sopenharmony_ci	vcpu->spin_loop.dy_eligible = val;
14218c2ecf20Sopenharmony_ci}
14228c2ecf20Sopenharmony_ci
14238c2ecf20Sopenharmony_ci#else /* !CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT */
14248c2ecf20Sopenharmony_ci
14258c2ecf20Sopenharmony_cistatic inline void kvm_vcpu_set_in_spin_loop(struct kvm_vcpu *vcpu, bool val)
14268c2ecf20Sopenharmony_ci{
14278c2ecf20Sopenharmony_ci}
14288c2ecf20Sopenharmony_ci
14298c2ecf20Sopenharmony_cistatic inline void kvm_vcpu_set_dy_eligible(struct kvm_vcpu *vcpu, bool val)
14308c2ecf20Sopenharmony_ci{
14318c2ecf20Sopenharmony_ci}
14328c2ecf20Sopenharmony_ci#endif /* CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT */
14338c2ecf20Sopenharmony_ci
14348c2ecf20Sopenharmony_cistatic inline bool kvm_is_visible_memslot(struct kvm_memory_slot *memslot)
14358c2ecf20Sopenharmony_ci{
14368c2ecf20Sopenharmony_ci	return (memslot && memslot->id < KVM_USER_MEM_SLOTS &&
14378c2ecf20Sopenharmony_ci		!(memslot->flags & KVM_MEMSLOT_INVALID));
14388c2ecf20Sopenharmony_ci}
14398c2ecf20Sopenharmony_ci
14408c2ecf20Sopenharmony_cistruct kvm_vcpu *kvm_get_running_vcpu(void);
14418c2ecf20Sopenharmony_cistruct kvm_vcpu * __percpu *kvm_get_running_vcpus(void);
14428c2ecf20Sopenharmony_ci
14438c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_IRQ_BYPASS
14448c2ecf20Sopenharmony_cibool kvm_arch_has_irq_bypass(void);
14458c2ecf20Sopenharmony_ciint kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *,
14468c2ecf20Sopenharmony_ci			   struct irq_bypass_producer *);
14478c2ecf20Sopenharmony_civoid kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *,
14488c2ecf20Sopenharmony_ci			   struct irq_bypass_producer *);
14498c2ecf20Sopenharmony_civoid kvm_arch_irq_bypass_stop(struct irq_bypass_consumer *);
14508c2ecf20Sopenharmony_civoid kvm_arch_irq_bypass_start(struct irq_bypass_consumer *);
14518c2ecf20Sopenharmony_ciint kvm_arch_update_irqfd_routing(struct kvm *kvm, unsigned int host_irq,
14528c2ecf20Sopenharmony_ci				  uint32_t guest_irq, bool set);
14538c2ecf20Sopenharmony_ci#endif /* CONFIG_HAVE_KVM_IRQ_BYPASS */
14548c2ecf20Sopenharmony_ci
14558c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_INVALID_WAKEUPS
14568c2ecf20Sopenharmony_ci/* If we wakeup during the poll time, was it a sucessful poll? */
14578c2ecf20Sopenharmony_cistatic inline bool vcpu_valid_wakeup(struct kvm_vcpu *vcpu)
14588c2ecf20Sopenharmony_ci{
14598c2ecf20Sopenharmony_ci	return vcpu->valid_wakeup;
14608c2ecf20Sopenharmony_ci}
14618c2ecf20Sopenharmony_ci
14628c2ecf20Sopenharmony_ci#else
14638c2ecf20Sopenharmony_cistatic inline bool vcpu_valid_wakeup(struct kvm_vcpu *vcpu)
14648c2ecf20Sopenharmony_ci{
14658c2ecf20Sopenharmony_ci	return true;
14668c2ecf20Sopenharmony_ci}
14678c2ecf20Sopenharmony_ci#endif /* CONFIG_HAVE_KVM_INVALID_WAKEUPS */
14688c2ecf20Sopenharmony_ci
14698c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_NO_POLL
14708c2ecf20Sopenharmony_ci/* Callback that tells if we must not poll */
14718c2ecf20Sopenharmony_cibool kvm_arch_no_poll(struct kvm_vcpu *vcpu);
14728c2ecf20Sopenharmony_ci#else
14738c2ecf20Sopenharmony_cistatic inline bool kvm_arch_no_poll(struct kvm_vcpu *vcpu)
14748c2ecf20Sopenharmony_ci{
14758c2ecf20Sopenharmony_ci	return false;
14768c2ecf20Sopenharmony_ci}
14778c2ecf20Sopenharmony_ci#endif /* CONFIG_HAVE_KVM_NO_POLL */
14788c2ecf20Sopenharmony_ci
14798c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_VCPU_ASYNC_IOCTL
14808c2ecf20Sopenharmony_cilong kvm_arch_vcpu_async_ioctl(struct file *filp,
14818c2ecf20Sopenharmony_ci			       unsigned int ioctl, unsigned long arg);
14828c2ecf20Sopenharmony_ci#else
14838c2ecf20Sopenharmony_cistatic inline long kvm_arch_vcpu_async_ioctl(struct file *filp,
14848c2ecf20Sopenharmony_ci					     unsigned int ioctl,
14858c2ecf20Sopenharmony_ci					     unsigned long arg)
14868c2ecf20Sopenharmony_ci{
14878c2ecf20Sopenharmony_ci	return -ENOIOCTLCMD;
14888c2ecf20Sopenharmony_ci}
14898c2ecf20Sopenharmony_ci#endif /* CONFIG_HAVE_KVM_VCPU_ASYNC_IOCTL */
14908c2ecf20Sopenharmony_ci
14918c2ecf20Sopenharmony_civoid kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
14928c2ecf20Sopenharmony_ci					    unsigned long start, unsigned long end);
14938c2ecf20Sopenharmony_ci
14948c2ecf20Sopenharmony_civoid kvm_arch_guest_memory_reclaimed(struct kvm *kvm);
14958c2ecf20Sopenharmony_ci
14968c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE
14978c2ecf20Sopenharmony_ciint kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu);
14988c2ecf20Sopenharmony_ci#else
14998c2ecf20Sopenharmony_cistatic inline int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
15008c2ecf20Sopenharmony_ci{
15018c2ecf20Sopenharmony_ci	return 0;
15028c2ecf20Sopenharmony_ci}
15038c2ecf20Sopenharmony_ci#endif /* CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE */
15048c2ecf20Sopenharmony_ci
15058c2ecf20Sopenharmony_citypedef int (*kvm_vm_thread_fn_t)(struct kvm *kvm, uintptr_t data);
15068c2ecf20Sopenharmony_ci
15078c2ecf20Sopenharmony_ciint kvm_vm_create_worker_thread(struct kvm *kvm, kvm_vm_thread_fn_t thread_fn,
15088c2ecf20Sopenharmony_ci				uintptr_t data, const char *name,
15098c2ecf20Sopenharmony_ci				struct task_struct **thread_ptr);
15108c2ecf20Sopenharmony_ci
15118c2ecf20Sopenharmony_ci#ifdef CONFIG_KVM_XFER_TO_GUEST_WORK
15128c2ecf20Sopenharmony_cistatic inline void kvm_handle_signal_exit(struct kvm_vcpu *vcpu)
15138c2ecf20Sopenharmony_ci{
15148c2ecf20Sopenharmony_ci	vcpu->run->exit_reason = KVM_EXIT_INTR;
15158c2ecf20Sopenharmony_ci	vcpu->stat.signal_exits++;
15168c2ecf20Sopenharmony_ci}
15178c2ecf20Sopenharmony_ci#endif /* CONFIG_KVM_XFER_TO_GUEST_WORK */
15188c2ecf20Sopenharmony_ci
15198c2ecf20Sopenharmony_ci#endif
1520