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