18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Kernel-based Virtual Machine driver for Linux 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * This header defines architecture specific interfaces, x86 version 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef _ASM_X86_KVM_HOST_H 98c2ecf20Sopenharmony_ci#define _ASM_X86_KVM_HOST_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/types.h> 128c2ecf20Sopenharmony_ci#include <linux/mm.h> 138c2ecf20Sopenharmony_ci#include <linux/mmu_notifier.h> 148c2ecf20Sopenharmony_ci#include <linux/tracepoint.h> 158c2ecf20Sopenharmony_ci#include <linux/cpumask.h> 168c2ecf20Sopenharmony_ci#include <linux/irq_work.h> 178c2ecf20Sopenharmony_ci#include <linux/irq.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include <linux/kvm.h> 208c2ecf20Sopenharmony_ci#include <linux/kvm_para.h> 218c2ecf20Sopenharmony_ci#include <linux/kvm_types.h> 228c2ecf20Sopenharmony_ci#include <linux/perf_event.h> 238c2ecf20Sopenharmony_ci#include <linux/pvclock_gtod.h> 248c2ecf20Sopenharmony_ci#include <linux/clocksource.h> 258c2ecf20Sopenharmony_ci#include <linux/irqbypass.h> 268c2ecf20Sopenharmony_ci#include <linux/hyperv.h> 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#include <asm/apic.h> 298c2ecf20Sopenharmony_ci#include <asm/pvclock-abi.h> 308c2ecf20Sopenharmony_ci#include <asm/desc.h> 318c2ecf20Sopenharmony_ci#include <asm/mtrr.h> 328c2ecf20Sopenharmony_ci#include <asm/msr-index.h> 338c2ecf20Sopenharmony_ci#include <asm/asm.h> 348c2ecf20Sopenharmony_ci#include <asm/kvm_page_track.h> 358c2ecf20Sopenharmony_ci#include <asm/kvm_vcpu_regs.h> 368c2ecf20Sopenharmony_ci#include <asm/hyperv-tlfs.h> 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#define __KVM_HAVE_ARCH_VCPU_DEBUGFS 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci#define KVM_MAX_VCPUS 288 418c2ecf20Sopenharmony_ci#define KVM_SOFT_MAX_VCPUS 240 428c2ecf20Sopenharmony_ci#define KVM_MAX_VCPU_ID 1023 438c2ecf20Sopenharmony_ci#define KVM_USER_MEM_SLOTS 509 448c2ecf20Sopenharmony_ci/* memory slots that are not exposed to userspace */ 458c2ecf20Sopenharmony_ci#define KVM_PRIVATE_MEM_SLOTS 3 468c2ecf20Sopenharmony_ci#define KVM_MEM_SLOTS_NUM (KVM_USER_MEM_SLOTS + KVM_PRIVATE_MEM_SLOTS) 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#define KVM_HALT_POLL_NS_DEFAULT 200000 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci#define KVM_IRQCHIP_NUM_PINS KVM_IOAPIC_NUM_PINS 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci#define KVM_DIRTY_LOG_MANUAL_CAPS (KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE | \ 538c2ecf20Sopenharmony_ci KVM_DIRTY_LOG_INITIALLY_SET) 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci/* x86-specific vcpu->requests bit members */ 568c2ecf20Sopenharmony_ci#define KVM_REQ_MIGRATE_TIMER KVM_ARCH_REQ(0) 578c2ecf20Sopenharmony_ci#define KVM_REQ_REPORT_TPR_ACCESS KVM_ARCH_REQ(1) 588c2ecf20Sopenharmony_ci#define KVM_REQ_TRIPLE_FAULT KVM_ARCH_REQ(2) 598c2ecf20Sopenharmony_ci#define KVM_REQ_MMU_SYNC KVM_ARCH_REQ(3) 608c2ecf20Sopenharmony_ci#define KVM_REQ_CLOCK_UPDATE KVM_ARCH_REQ(4) 618c2ecf20Sopenharmony_ci#define KVM_REQ_LOAD_MMU_PGD KVM_ARCH_REQ(5) 628c2ecf20Sopenharmony_ci#define KVM_REQ_EVENT KVM_ARCH_REQ(6) 638c2ecf20Sopenharmony_ci#define KVM_REQ_APF_HALT KVM_ARCH_REQ(7) 648c2ecf20Sopenharmony_ci#define KVM_REQ_STEAL_UPDATE KVM_ARCH_REQ(8) 658c2ecf20Sopenharmony_ci#define KVM_REQ_NMI KVM_ARCH_REQ(9) 668c2ecf20Sopenharmony_ci#define KVM_REQ_PMU KVM_ARCH_REQ(10) 678c2ecf20Sopenharmony_ci#define KVM_REQ_PMI KVM_ARCH_REQ(11) 688c2ecf20Sopenharmony_ci#define KVM_REQ_SMI KVM_ARCH_REQ(12) 698c2ecf20Sopenharmony_ci#define KVM_REQ_MASTERCLOCK_UPDATE KVM_ARCH_REQ(13) 708c2ecf20Sopenharmony_ci#define KVM_REQ_MCLOCK_INPROGRESS \ 718c2ecf20Sopenharmony_ci KVM_ARCH_REQ_FLAGS(14, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) 728c2ecf20Sopenharmony_ci#define KVM_REQ_SCAN_IOAPIC \ 738c2ecf20Sopenharmony_ci KVM_ARCH_REQ_FLAGS(15, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) 748c2ecf20Sopenharmony_ci#define KVM_REQ_GLOBAL_CLOCK_UPDATE KVM_ARCH_REQ(16) 758c2ecf20Sopenharmony_ci#define KVM_REQ_APIC_PAGE_RELOAD \ 768c2ecf20Sopenharmony_ci KVM_ARCH_REQ_FLAGS(17, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) 778c2ecf20Sopenharmony_ci#define KVM_REQ_HV_CRASH KVM_ARCH_REQ(18) 788c2ecf20Sopenharmony_ci#define KVM_REQ_IOAPIC_EOI_EXIT KVM_ARCH_REQ(19) 798c2ecf20Sopenharmony_ci#define KVM_REQ_HV_RESET KVM_ARCH_REQ(20) 808c2ecf20Sopenharmony_ci#define KVM_REQ_HV_EXIT KVM_ARCH_REQ(21) 818c2ecf20Sopenharmony_ci#define KVM_REQ_HV_STIMER KVM_ARCH_REQ(22) 828c2ecf20Sopenharmony_ci#define KVM_REQ_LOAD_EOI_EXITMAP KVM_ARCH_REQ(23) 838c2ecf20Sopenharmony_ci#define KVM_REQ_GET_NESTED_STATE_PAGES KVM_ARCH_REQ(24) 848c2ecf20Sopenharmony_ci#define KVM_REQ_APICV_UPDATE \ 858c2ecf20Sopenharmony_ci KVM_ARCH_REQ_FLAGS(25, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) 868c2ecf20Sopenharmony_ci#define KVM_REQ_TLB_FLUSH_CURRENT KVM_ARCH_REQ(26) 878c2ecf20Sopenharmony_ci#define KVM_REQ_TLB_FLUSH_GUEST \ 888c2ecf20Sopenharmony_ci KVM_ARCH_REQ_FLAGS(27, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) 898c2ecf20Sopenharmony_ci#define KVM_REQ_APF_READY KVM_ARCH_REQ(28) 908c2ecf20Sopenharmony_ci#define KVM_REQ_MSR_FILTER_CHANGED KVM_ARCH_REQ(29) 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci#define CR0_RESERVED_BITS \ 938c2ecf20Sopenharmony_ci (~(unsigned long)(X86_CR0_PE | X86_CR0_MP | X86_CR0_EM | X86_CR0_TS \ 948c2ecf20Sopenharmony_ci | X86_CR0_ET | X86_CR0_NE | X86_CR0_WP | X86_CR0_AM \ 958c2ecf20Sopenharmony_ci | X86_CR0_NW | X86_CR0_CD | X86_CR0_PG)) 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci#define CR4_RESERVED_BITS \ 988c2ecf20Sopenharmony_ci (~(unsigned long)(X86_CR4_VME | X86_CR4_PVI | X86_CR4_TSD | X86_CR4_DE\ 998c2ecf20Sopenharmony_ci | X86_CR4_PSE | X86_CR4_PAE | X86_CR4_MCE \ 1008c2ecf20Sopenharmony_ci | X86_CR4_PGE | X86_CR4_PCE | X86_CR4_OSFXSR | X86_CR4_PCIDE \ 1018c2ecf20Sopenharmony_ci | X86_CR4_OSXSAVE | X86_CR4_SMEP | X86_CR4_FSGSBASE \ 1028c2ecf20Sopenharmony_ci | X86_CR4_OSXMMEXCPT | X86_CR4_LA57 | X86_CR4_VMXE \ 1038c2ecf20Sopenharmony_ci | X86_CR4_SMAP | X86_CR4_PKE | X86_CR4_UMIP)) 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci#define CR8_RESERVED_BITS (~(unsigned long)X86_CR8_TPR) 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci#define INVALID_PAGE (~(hpa_t)0) 1108c2ecf20Sopenharmony_ci#define VALID_PAGE(x) ((x) != INVALID_PAGE) 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci#define UNMAPPED_GVA (~(gpa_t)0) 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci/* KVM Hugepage definitions for x86 */ 1158c2ecf20Sopenharmony_ci#define KVM_MAX_HUGEPAGE_LEVEL PG_LEVEL_1G 1168c2ecf20Sopenharmony_ci#define KVM_NR_PAGE_SIZES (KVM_MAX_HUGEPAGE_LEVEL - PG_LEVEL_4K + 1) 1178c2ecf20Sopenharmony_ci#define KVM_HPAGE_GFN_SHIFT(x) (((x) - 1) * 9) 1188c2ecf20Sopenharmony_ci#define KVM_HPAGE_SHIFT(x) (PAGE_SHIFT + KVM_HPAGE_GFN_SHIFT(x)) 1198c2ecf20Sopenharmony_ci#define KVM_HPAGE_SIZE(x) (1UL << KVM_HPAGE_SHIFT(x)) 1208c2ecf20Sopenharmony_ci#define KVM_HPAGE_MASK(x) (~(KVM_HPAGE_SIZE(x) - 1)) 1218c2ecf20Sopenharmony_ci#define KVM_PAGES_PER_HPAGE(x) (KVM_HPAGE_SIZE(x) / PAGE_SIZE) 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_cistatic inline gfn_t gfn_to_index(gfn_t gfn, gfn_t base_gfn, int level) 1248c2ecf20Sopenharmony_ci{ 1258c2ecf20Sopenharmony_ci /* KVM_HPAGE_GFN_SHIFT(PG_LEVEL_4K) must be 0. */ 1268c2ecf20Sopenharmony_ci return (gfn >> KVM_HPAGE_GFN_SHIFT(level)) - 1278c2ecf20Sopenharmony_ci (base_gfn >> KVM_HPAGE_GFN_SHIFT(level)); 1288c2ecf20Sopenharmony_ci} 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci#define KVM_PERMILLE_MMU_PAGES 20 1318c2ecf20Sopenharmony_ci#define KVM_MIN_ALLOC_MMU_PAGES 64UL 1328c2ecf20Sopenharmony_ci#define KVM_MMU_HASH_SHIFT 12 1338c2ecf20Sopenharmony_ci#define KVM_NUM_MMU_PAGES (1 << KVM_MMU_HASH_SHIFT) 1348c2ecf20Sopenharmony_ci#define KVM_MIN_FREE_MMU_PAGES 5 1358c2ecf20Sopenharmony_ci#define KVM_REFILL_PAGES 25 1368c2ecf20Sopenharmony_ci#define KVM_MAX_CPUID_ENTRIES 256 1378c2ecf20Sopenharmony_ci#define KVM_NR_FIXED_MTRR_REGION 88 1388c2ecf20Sopenharmony_ci#define KVM_NR_VAR_MTRR 8 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci#define ASYNC_PF_PER_VCPU 64 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_cienum kvm_reg { 1438c2ecf20Sopenharmony_ci VCPU_REGS_RAX = __VCPU_REGS_RAX, 1448c2ecf20Sopenharmony_ci VCPU_REGS_RCX = __VCPU_REGS_RCX, 1458c2ecf20Sopenharmony_ci VCPU_REGS_RDX = __VCPU_REGS_RDX, 1468c2ecf20Sopenharmony_ci VCPU_REGS_RBX = __VCPU_REGS_RBX, 1478c2ecf20Sopenharmony_ci VCPU_REGS_RSP = __VCPU_REGS_RSP, 1488c2ecf20Sopenharmony_ci VCPU_REGS_RBP = __VCPU_REGS_RBP, 1498c2ecf20Sopenharmony_ci VCPU_REGS_RSI = __VCPU_REGS_RSI, 1508c2ecf20Sopenharmony_ci VCPU_REGS_RDI = __VCPU_REGS_RDI, 1518c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_64 1528c2ecf20Sopenharmony_ci VCPU_REGS_R8 = __VCPU_REGS_R8, 1538c2ecf20Sopenharmony_ci VCPU_REGS_R9 = __VCPU_REGS_R9, 1548c2ecf20Sopenharmony_ci VCPU_REGS_R10 = __VCPU_REGS_R10, 1558c2ecf20Sopenharmony_ci VCPU_REGS_R11 = __VCPU_REGS_R11, 1568c2ecf20Sopenharmony_ci VCPU_REGS_R12 = __VCPU_REGS_R12, 1578c2ecf20Sopenharmony_ci VCPU_REGS_R13 = __VCPU_REGS_R13, 1588c2ecf20Sopenharmony_ci VCPU_REGS_R14 = __VCPU_REGS_R14, 1598c2ecf20Sopenharmony_ci VCPU_REGS_R15 = __VCPU_REGS_R15, 1608c2ecf20Sopenharmony_ci#endif 1618c2ecf20Sopenharmony_ci VCPU_REGS_RIP, 1628c2ecf20Sopenharmony_ci NR_VCPU_REGS, 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci VCPU_EXREG_PDPTR = NR_VCPU_REGS, 1658c2ecf20Sopenharmony_ci VCPU_EXREG_CR0, 1668c2ecf20Sopenharmony_ci VCPU_EXREG_CR3, 1678c2ecf20Sopenharmony_ci VCPU_EXREG_CR4, 1688c2ecf20Sopenharmony_ci VCPU_EXREG_RFLAGS, 1698c2ecf20Sopenharmony_ci VCPU_EXREG_SEGMENTS, 1708c2ecf20Sopenharmony_ci VCPU_EXREG_EXIT_INFO_1, 1718c2ecf20Sopenharmony_ci VCPU_EXREG_EXIT_INFO_2, 1728c2ecf20Sopenharmony_ci}; 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_cienum { 1758c2ecf20Sopenharmony_ci VCPU_SREG_ES, 1768c2ecf20Sopenharmony_ci VCPU_SREG_CS, 1778c2ecf20Sopenharmony_ci VCPU_SREG_SS, 1788c2ecf20Sopenharmony_ci VCPU_SREG_DS, 1798c2ecf20Sopenharmony_ci VCPU_SREG_FS, 1808c2ecf20Sopenharmony_ci VCPU_SREG_GS, 1818c2ecf20Sopenharmony_ci VCPU_SREG_TR, 1828c2ecf20Sopenharmony_ci VCPU_SREG_LDTR, 1838c2ecf20Sopenharmony_ci}; 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_cienum exit_fastpath_completion { 1868c2ecf20Sopenharmony_ci EXIT_FASTPATH_NONE, 1878c2ecf20Sopenharmony_ci EXIT_FASTPATH_REENTER_GUEST, 1888c2ecf20Sopenharmony_ci EXIT_FASTPATH_EXIT_HANDLED, 1898c2ecf20Sopenharmony_ci}; 1908c2ecf20Sopenharmony_citypedef enum exit_fastpath_completion fastpath_t; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_cistruct x86_emulate_ctxt; 1938c2ecf20Sopenharmony_cistruct x86_exception; 1948c2ecf20Sopenharmony_cienum x86_intercept; 1958c2ecf20Sopenharmony_cienum x86_intercept_stage; 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci#define KVM_NR_DB_REGS 4 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci#define DR6_BD (1 << 13) 2008c2ecf20Sopenharmony_ci#define DR6_BS (1 << 14) 2018c2ecf20Sopenharmony_ci#define DR6_BT (1 << 15) 2028c2ecf20Sopenharmony_ci#define DR6_RTM (1 << 16) 2038c2ecf20Sopenharmony_ci#define DR6_FIXED_1 0xfffe0ff0 2048c2ecf20Sopenharmony_ci#define DR6_INIT 0xffff0ff0 2058c2ecf20Sopenharmony_ci#define DR6_VOLATILE 0x0001e00f 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci#define DR7_BP_EN_MASK 0x000000ff 2088c2ecf20Sopenharmony_ci#define DR7_GE (1 << 9) 2098c2ecf20Sopenharmony_ci#define DR7_GD (1 << 13) 2108c2ecf20Sopenharmony_ci#define DR7_FIXED_1 0x00000400 2118c2ecf20Sopenharmony_ci#define DR7_VOLATILE 0xffff2bff 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci#define PFERR_PRESENT_BIT 0 2148c2ecf20Sopenharmony_ci#define PFERR_WRITE_BIT 1 2158c2ecf20Sopenharmony_ci#define PFERR_USER_BIT 2 2168c2ecf20Sopenharmony_ci#define PFERR_RSVD_BIT 3 2178c2ecf20Sopenharmony_ci#define PFERR_FETCH_BIT 4 2188c2ecf20Sopenharmony_ci#define PFERR_PK_BIT 5 2198c2ecf20Sopenharmony_ci#define PFERR_GUEST_FINAL_BIT 32 2208c2ecf20Sopenharmony_ci#define PFERR_GUEST_PAGE_BIT 33 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_ci#define PFERR_PRESENT_MASK (1U << PFERR_PRESENT_BIT) 2238c2ecf20Sopenharmony_ci#define PFERR_WRITE_MASK (1U << PFERR_WRITE_BIT) 2248c2ecf20Sopenharmony_ci#define PFERR_USER_MASK (1U << PFERR_USER_BIT) 2258c2ecf20Sopenharmony_ci#define PFERR_RSVD_MASK (1U << PFERR_RSVD_BIT) 2268c2ecf20Sopenharmony_ci#define PFERR_FETCH_MASK (1U << PFERR_FETCH_BIT) 2278c2ecf20Sopenharmony_ci#define PFERR_PK_MASK (1U << PFERR_PK_BIT) 2288c2ecf20Sopenharmony_ci#define PFERR_GUEST_FINAL_MASK (1ULL << PFERR_GUEST_FINAL_BIT) 2298c2ecf20Sopenharmony_ci#define PFERR_GUEST_PAGE_MASK (1ULL << PFERR_GUEST_PAGE_BIT) 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci#define PFERR_NESTED_GUEST_PAGE (PFERR_GUEST_PAGE_MASK | \ 2328c2ecf20Sopenharmony_ci PFERR_WRITE_MASK | \ 2338c2ecf20Sopenharmony_ci PFERR_PRESENT_MASK) 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci/* apic attention bits */ 2368c2ecf20Sopenharmony_ci#define KVM_APIC_CHECK_VAPIC 0 2378c2ecf20Sopenharmony_ci/* 2388c2ecf20Sopenharmony_ci * The following bit is set with PV-EOI, unset on EOI. 2398c2ecf20Sopenharmony_ci * We detect PV-EOI changes by guest by comparing 2408c2ecf20Sopenharmony_ci * this bit with PV-EOI in guest memory. 2418c2ecf20Sopenharmony_ci * See the implementation in apic_update_pv_eoi. 2428c2ecf20Sopenharmony_ci */ 2438c2ecf20Sopenharmony_ci#define KVM_APIC_PV_EOI_PENDING 1 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_cistruct kvm_kernel_irq_routing_entry; 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci/* 2488c2ecf20Sopenharmony_ci * the pages used as guest page table on soft mmu are tracked by 2498c2ecf20Sopenharmony_ci * kvm_memory_slot.arch.gfn_track which is 16 bits, so the role bits used 2508c2ecf20Sopenharmony_ci * by indirect shadow page can not be more than 15 bits. 2518c2ecf20Sopenharmony_ci * 2528c2ecf20Sopenharmony_ci * Currently, we used 14 bits that are @level, @gpte_is_8_bytes, @quadrant, @access, 2538c2ecf20Sopenharmony_ci * @nxe, @cr0_wp, @smep_andnot_wp and @smap_andnot_wp. 2548c2ecf20Sopenharmony_ci */ 2558c2ecf20Sopenharmony_ciunion kvm_mmu_page_role { 2568c2ecf20Sopenharmony_ci u32 word; 2578c2ecf20Sopenharmony_ci struct { 2588c2ecf20Sopenharmony_ci unsigned level:4; 2598c2ecf20Sopenharmony_ci unsigned gpte_is_8_bytes:1; 2608c2ecf20Sopenharmony_ci unsigned quadrant:2; 2618c2ecf20Sopenharmony_ci unsigned direct:1; 2628c2ecf20Sopenharmony_ci unsigned access:3; 2638c2ecf20Sopenharmony_ci unsigned invalid:1; 2648c2ecf20Sopenharmony_ci unsigned nxe:1; 2658c2ecf20Sopenharmony_ci unsigned cr0_wp:1; 2668c2ecf20Sopenharmony_ci unsigned smep_andnot_wp:1; 2678c2ecf20Sopenharmony_ci unsigned smap_andnot_wp:1; 2688c2ecf20Sopenharmony_ci unsigned ad_disabled:1; 2698c2ecf20Sopenharmony_ci unsigned guest_mode:1; 2708c2ecf20Sopenharmony_ci unsigned :6; 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci /* 2738c2ecf20Sopenharmony_ci * This is left at the top of the word so that 2748c2ecf20Sopenharmony_ci * kvm_memslots_for_spte_role can extract it with a 2758c2ecf20Sopenharmony_ci * simple shift. While there is room, give it a whole 2768c2ecf20Sopenharmony_ci * byte so it is also faster to load it from memory. 2778c2ecf20Sopenharmony_ci */ 2788c2ecf20Sopenharmony_ci unsigned smm:8; 2798c2ecf20Sopenharmony_ci }; 2808c2ecf20Sopenharmony_ci}; 2818c2ecf20Sopenharmony_ci 2828c2ecf20Sopenharmony_ciunion kvm_mmu_extended_role { 2838c2ecf20Sopenharmony_ci/* 2848c2ecf20Sopenharmony_ci * This structure complements kvm_mmu_page_role caching everything needed for 2858c2ecf20Sopenharmony_ci * MMU configuration. If nothing in both these structures changed, MMU 2868c2ecf20Sopenharmony_ci * re-configuration can be skipped. @valid bit is set on first usage so we don't 2878c2ecf20Sopenharmony_ci * treat all-zero structure as valid data. 2888c2ecf20Sopenharmony_ci */ 2898c2ecf20Sopenharmony_ci u32 word; 2908c2ecf20Sopenharmony_ci struct { 2918c2ecf20Sopenharmony_ci unsigned int valid:1; 2928c2ecf20Sopenharmony_ci unsigned int execonly:1; 2938c2ecf20Sopenharmony_ci unsigned int cr0_pg:1; 2948c2ecf20Sopenharmony_ci unsigned int cr4_pae:1; 2958c2ecf20Sopenharmony_ci unsigned int cr4_pse:1; 2968c2ecf20Sopenharmony_ci unsigned int cr4_pke:1; 2978c2ecf20Sopenharmony_ci unsigned int cr4_smap:1; 2988c2ecf20Sopenharmony_ci unsigned int cr4_smep:1; 2998c2ecf20Sopenharmony_ci unsigned int cr4_la57:1; 3008c2ecf20Sopenharmony_ci unsigned int maxphyaddr:6; 3018c2ecf20Sopenharmony_ci }; 3028c2ecf20Sopenharmony_ci}; 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_ciunion kvm_mmu_role { 3058c2ecf20Sopenharmony_ci u64 as_u64; 3068c2ecf20Sopenharmony_ci struct { 3078c2ecf20Sopenharmony_ci union kvm_mmu_page_role base; 3088c2ecf20Sopenharmony_ci union kvm_mmu_extended_role ext; 3098c2ecf20Sopenharmony_ci }; 3108c2ecf20Sopenharmony_ci}; 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_cistruct kvm_rmap_head { 3138c2ecf20Sopenharmony_ci unsigned long val; 3148c2ecf20Sopenharmony_ci}; 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_cistruct kvm_pio_request { 3178c2ecf20Sopenharmony_ci unsigned long linear_rip; 3188c2ecf20Sopenharmony_ci unsigned long count; 3198c2ecf20Sopenharmony_ci int in; 3208c2ecf20Sopenharmony_ci int port; 3218c2ecf20Sopenharmony_ci int size; 3228c2ecf20Sopenharmony_ci}; 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_ci#define PT64_ROOT_MAX_LEVEL 5 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_cistruct rsvd_bits_validate { 3278c2ecf20Sopenharmony_ci u64 rsvd_bits_mask[2][PT64_ROOT_MAX_LEVEL]; 3288c2ecf20Sopenharmony_ci u64 bad_mt_xwr; 3298c2ecf20Sopenharmony_ci}; 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_cistruct kvm_mmu_root_info { 3328c2ecf20Sopenharmony_ci gpa_t pgd; 3338c2ecf20Sopenharmony_ci hpa_t hpa; 3348c2ecf20Sopenharmony_ci}; 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_ci#define KVM_MMU_ROOT_INFO_INVALID \ 3378c2ecf20Sopenharmony_ci ((struct kvm_mmu_root_info) { .pgd = INVALID_PAGE, .hpa = INVALID_PAGE }) 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ci#define KVM_MMU_NUM_PREV_ROOTS 3 3408c2ecf20Sopenharmony_ci 3418c2ecf20Sopenharmony_cistruct kvm_mmu_page; 3428c2ecf20Sopenharmony_ci 3438c2ecf20Sopenharmony_ci/* 3448c2ecf20Sopenharmony_ci * x86 supports 4 paging modes (5-level 64-bit, 4-level 64-bit, 3-level 32-bit, 3458c2ecf20Sopenharmony_ci * and 2-level 32-bit). The kvm_mmu structure abstracts the details of the 3468c2ecf20Sopenharmony_ci * current mmu mode. 3478c2ecf20Sopenharmony_ci */ 3488c2ecf20Sopenharmony_cistruct kvm_mmu { 3498c2ecf20Sopenharmony_ci unsigned long (*get_guest_pgd)(struct kvm_vcpu *vcpu); 3508c2ecf20Sopenharmony_ci u64 (*get_pdptr)(struct kvm_vcpu *vcpu, int index); 3518c2ecf20Sopenharmony_ci int (*page_fault)(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u32 err, 3528c2ecf20Sopenharmony_ci bool prefault); 3538c2ecf20Sopenharmony_ci void (*inject_page_fault)(struct kvm_vcpu *vcpu, 3548c2ecf20Sopenharmony_ci struct x86_exception *fault); 3558c2ecf20Sopenharmony_ci gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gpa_t gva_or_gpa, 3568c2ecf20Sopenharmony_ci u32 access, struct x86_exception *exception); 3578c2ecf20Sopenharmony_ci gpa_t (*translate_gpa)(struct kvm_vcpu *vcpu, gpa_t gpa, u32 access, 3588c2ecf20Sopenharmony_ci struct x86_exception *exception); 3598c2ecf20Sopenharmony_ci int (*sync_page)(struct kvm_vcpu *vcpu, 3608c2ecf20Sopenharmony_ci struct kvm_mmu_page *sp); 3618c2ecf20Sopenharmony_ci void (*invlpg)(struct kvm_vcpu *vcpu, gva_t gva, hpa_t root_hpa); 3628c2ecf20Sopenharmony_ci hpa_t root_hpa; 3638c2ecf20Sopenharmony_ci gpa_t root_pgd; 3648c2ecf20Sopenharmony_ci union kvm_mmu_role mmu_role; 3658c2ecf20Sopenharmony_ci u8 root_level; 3668c2ecf20Sopenharmony_ci u8 shadow_root_level; 3678c2ecf20Sopenharmony_ci u8 ept_ad; 3688c2ecf20Sopenharmony_ci bool direct_map; 3698c2ecf20Sopenharmony_ci struct kvm_mmu_root_info prev_roots[KVM_MMU_NUM_PREV_ROOTS]; 3708c2ecf20Sopenharmony_ci 3718c2ecf20Sopenharmony_ci /* 3728c2ecf20Sopenharmony_ci * Bitmap; bit set = permission fault 3738c2ecf20Sopenharmony_ci * Byte index: page fault error code [4:1] 3748c2ecf20Sopenharmony_ci * Bit index: pte permissions in ACC_* format 3758c2ecf20Sopenharmony_ci */ 3768c2ecf20Sopenharmony_ci u8 permissions[16]; 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ci /* 3798c2ecf20Sopenharmony_ci * The pkru_mask indicates if protection key checks are needed. It 3808c2ecf20Sopenharmony_ci * consists of 16 domains indexed by page fault error code bits [4:1], 3818c2ecf20Sopenharmony_ci * with PFEC.RSVD replaced by ACC_USER_MASK from the page tables. 3828c2ecf20Sopenharmony_ci * Each domain has 2 bits which are ANDed with AD and WD from PKRU. 3838c2ecf20Sopenharmony_ci */ 3848c2ecf20Sopenharmony_ci u32 pkru_mask; 3858c2ecf20Sopenharmony_ci 3868c2ecf20Sopenharmony_ci u64 *pae_root; 3878c2ecf20Sopenharmony_ci u64 *lm_root; 3888c2ecf20Sopenharmony_ci 3898c2ecf20Sopenharmony_ci /* 3908c2ecf20Sopenharmony_ci * check zero bits on shadow page table entries, these 3918c2ecf20Sopenharmony_ci * bits include not only hardware reserved bits but also 3928c2ecf20Sopenharmony_ci * the bits spte never used. 3938c2ecf20Sopenharmony_ci */ 3948c2ecf20Sopenharmony_ci struct rsvd_bits_validate shadow_zero_check; 3958c2ecf20Sopenharmony_ci 3968c2ecf20Sopenharmony_ci struct rsvd_bits_validate guest_rsvd_check; 3978c2ecf20Sopenharmony_ci 3988c2ecf20Sopenharmony_ci /* Can have large pages at levels 2..last_nonleaf_level-1. */ 3998c2ecf20Sopenharmony_ci u8 last_nonleaf_level; 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_ci bool nx; 4028c2ecf20Sopenharmony_ci 4038c2ecf20Sopenharmony_ci u64 pdptrs[4]; /* pae */ 4048c2ecf20Sopenharmony_ci}; 4058c2ecf20Sopenharmony_ci 4068c2ecf20Sopenharmony_cistruct kvm_tlb_range { 4078c2ecf20Sopenharmony_ci u64 start_gfn; 4088c2ecf20Sopenharmony_ci u64 pages; 4098c2ecf20Sopenharmony_ci}; 4108c2ecf20Sopenharmony_ci 4118c2ecf20Sopenharmony_cienum pmc_type { 4128c2ecf20Sopenharmony_ci KVM_PMC_GP = 0, 4138c2ecf20Sopenharmony_ci KVM_PMC_FIXED, 4148c2ecf20Sopenharmony_ci}; 4158c2ecf20Sopenharmony_ci 4168c2ecf20Sopenharmony_cistruct kvm_pmc { 4178c2ecf20Sopenharmony_ci enum pmc_type type; 4188c2ecf20Sopenharmony_ci u8 idx; 4198c2ecf20Sopenharmony_ci u64 counter; 4208c2ecf20Sopenharmony_ci u64 eventsel; 4218c2ecf20Sopenharmony_ci struct perf_event *perf_event; 4228c2ecf20Sopenharmony_ci struct kvm_vcpu *vcpu; 4238c2ecf20Sopenharmony_ci /* 4248c2ecf20Sopenharmony_ci * eventsel value for general purpose counters, 4258c2ecf20Sopenharmony_ci * ctrl value for fixed counters. 4268c2ecf20Sopenharmony_ci */ 4278c2ecf20Sopenharmony_ci u64 current_config; 4288c2ecf20Sopenharmony_ci}; 4298c2ecf20Sopenharmony_ci 4308c2ecf20Sopenharmony_cistruct kvm_pmu { 4318c2ecf20Sopenharmony_ci unsigned nr_arch_gp_counters; 4328c2ecf20Sopenharmony_ci unsigned nr_arch_fixed_counters; 4338c2ecf20Sopenharmony_ci unsigned available_event_types; 4348c2ecf20Sopenharmony_ci u64 fixed_ctr_ctrl; 4358c2ecf20Sopenharmony_ci u64 fixed_ctr_ctrl_mask; 4368c2ecf20Sopenharmony_ci u64 global_ctrl; 4378c2ecf20Sopenharmony_ci u64 global_status; 4388c2ecf20Sopenharmony_ci u64 global_ovf_ctrl; 4398c2ecf20Sopenharmony_ci u64 counter_bitmask[2]; 4408c2ecf20Sopenharmony_ci u64 global_ctrl_mask; 4418c2ecf20Sopenharmony_ci u64 global_ovf_ctrl_mask; 4428c2ecf20Sopenharmony_ci u64 reserved_bits; 4438c2ecf20Sopenharmony_ci u64 raw_event_mask; 4448c2ecf20Sopenharmony_ci u8 version; 4458c2ecf20Sopenharmony_ci struct kvm_pmc gp_counters[INTEL_PMC_MAX_GENERIC]; 4468c2ecf20Sopenharmony_ci struct kvm_pmc fixed_counters[INTEL_PMC_MAX_FIXED]; 4478c2ecf20Sopenharmony_ci struct irq_work irq_work; 4488c2ecf20Sopenharmony_ci DECLARE_BITMAP(reprogram_pmi, X86_PMC_IDX_MAX); 4498c2ecf20Sopenharmony_ci DECLARE_BITMAP(all_valid_pmc_idx, X86_PMC_IDX_MAX); 4508c2ecf20Sopenharmony_ci DECLARE_BITMAP(pmc_in_use, X86_PMC_IDX_MAX); 4518c2ecf20Sopenharmony_ci 4528c2ecf20Sopenharmony_ci /* 4538c2ecf20Sopenharmony_ci * The gate to release perf_events not marked in 4548c2ecf20Sopenharmony_ci * pmc_in_use only once in a vcpu time slice. 4558c2ecf20Sopenharmony_ci */ 4568c2ecf20Sopenharmony_ci bool need_cleanup; 4578c2ecf20Sopenharmony_ci 4588c2ecf20Sopenharmony_ci /* 4598c2ecf20Sopenharmony_ci * The total number of programmed perf_events and it helps to avoid 4608c2ecf20Sopenharmony_ci * redundant check before cleanup if guest don't use vPMU at all. 4618c2ecf20Sopenharmony_ci */ 4628c2ecf20Sopenharmony_ci u8 event_count; 4638c2ecf20Sopenharmony_ci}; 4648c2ecf20Sopenharmony_ci 4658c2ecf20Sopenharmony_cistruct kvm_pmu_ops; 4668c2ecf20Sopenharmony_ci 4678c2ecf20Sopenharmony_cienum { 4688c2ecf20Sopenharmony_ci KVM_DEBUGREG_BP_ENABLED = 1, 4698c2ecf20Sopenharmony_ci KVM_DEBUGREG_WONT_EXIT = 2, 4708c2ecf20Sopenharmony_ci KVM_DEBUGREG_RELOAD = 4, 4718c2ecf20Sopenharmony_ci}; 4728c2ecf20Sopenharmony_ci 4738c2ecf20Sopenharmony_cistruct kvm_mtrr_range { 4748c2ecf20Sopenharmony_ci u64 base; 4758c2ecf20Sopenharmony_ci u64 mask; 4768c2ecf20Sopenharmony_ci struct list_head node; 4778c2ecf20Sopenharmony_ci}; 4788c2ecf20Sopenharmony_ci 4798c2ecf20Sopenharmony_cistruct kvm_mtrr { 4808c2ecf20Sopenharmony_ci struct kvm_mtrr_range var_ranges[KVM_NR_VAR_MTRR]; 4818c2ecf20Sopenharmony_ci mtrr_type fixed_ranges[KVM_NR_FIXED_MTRR_REGION]; 4828c2ecf20Sopenharmony_ci u64 deftype; 4838c2ecf20Sopenharmony_ci 4848c2ecf20Sopenharmony_ci struct list_head head; 4858c2ecf20Sopenharmony_ci}; 4868c2ecf20Sopenharmony_ci 4878c2ecf20Sopenharmony_ci/* Hyper-V SynIC timer */ 4888c2ecf20Sopenharmony_cistruct kvm_vcpu_hv_stimer { 4898c2ecf20Sopenharmony_ci struct hrtimer timer; 4908c2ecf20Sopenharmony_ci int index; 4918c2ecf20Sopenharmony_ci union hv_stimer_config config; 4928c2ecf20Sopenharmony_ci u64 count; 4938c2ecf20Sopenharmony_ci u64 exp_time; 4948c2ecf20Sopenharmony_ci struct hv_message msg; 4958c2ecf20Sopenharmony_ci bool msg_pending; 4968c2ecf20Sopenharmony_ci}; 4978c2ecf20Sopenharmony_ci 4988c2ecf20Sopenharmony_ci/* Hyper-V synthetic interrupt controller (SynIC)*/ 4998c2ecf20Sopenharmony_cistruct kvm_vcpu_hv_synic { 5008c2ecf20Sopenharmony_ci u64 version; 5018c2ecf20Sopenharmony_ci u64 control; 5028c2ecf20Sopenharmony_ci u64 msg_page; 5038c2ecf20Sopenharmony_ci u64 evt_page; 5048c2ecf20Sopenharmony_ci atomic64_t sint[HV_SYNIC_SINT_COUNT]; 5058c2ecf20Sopenharmony_ci atomic_t sint_to_gsi[HV_SYNIC_SINT_COUNT]; 5068c2ecf20Sopenharmony_ci DECLARE_BITMAP(auto_eoi_bitmap, 256); 5078c2ecf20Sopenharmony_ci DECLARE_BITMAP(vec_bitmap, 256); 5088c2ecf20Sopenharmony_ci bool active; 5098c2ecf20Sopenharmony_ci bool dont_zero_synic_pages; 5108c2ecf20Sopenharmony_ci}; 5118c2ecf20Sopenharmony_ci 5128c2ecf20Sopenharmony_ci/* Hyper-V per vcpu emulation context */ 5138c2ecf20Sopenharmony_cistruct kvm_vcpu_hv { 5148c2ecf20Sopenharmony_ci u32 vp_index; 5158c2ecf20Sopenharmony_ci u64 hv_vapic; 5168c2ecf20Sopenharmony_ci s64 runtime_offset; 5178c2ecf20Sopenharmony_ci struct kvm_vcpu_hv_synic synic; 5188c2ecf20Sopenharmony_ci struct kvm_hyperv_exit exit; 5198c2ecf20Sopenharmony_ci struct kvm_vcpu_hv_stimer stimer[HV_SYNIC_STIMER_COUNT]; 5208c2ecf20Sopenharmony_ci DECLARE_BITMAP(stimer_pending_bitmap, HV_SYNIC_STIMER_COUNT); 5218c2ecf20Sopenharmony_ci cpumask_t tlb_flush; 5228c2ecf20Sopenharmony_ci}; 5238c2ecf20Sopenharmony_ci 5248c2ecf20Sopenharmony_cistruct kvm_vcpu_arch { 5258c2ecf20Sopenharmony_ci /* 5268c2ecf20Sopenharmony_ci * rip and regs accesses must go through 5278c2ecf20Sopenharmony_ci * kvm_{register,rip}_{read,write} functions. 5288c2ecf20Sopenharmony_ci */ 5298c2ecf20Sopenharmony_ci unsigned long regs[NR_VCPU_REGS]; 5308c2ecf20Sopenharmony_ci u32 regs_avail; 5318c2ecf20Sopenharmony_ci u32 regs_dirty; 5328c2ecf20Sopenharmony_ci 5338c2ecf20Sopenharmony_ci unsigned long cr0; 5348c2ecf20Sopenharmony_ci unsigned long cr0_guest_owned_bits; 5358c2ecf20Sopenharmony_ci unsigned long cr2; 5368c2ecf20Sopenharmony_ci unsigned long cr3; 5378c2ecf20Sopenharmony_ci unsigned long cr4; 5388c2ecf20Sopenharmony_ci unsigned long cr4_guest_owned_bits; 5398c2ecf20Sopenharmony_ci unsigned long cr4_guest_rsvd_bits; 5408c2ecf20Sopenharmony_ci unsigned long cr8; 5418c2ecf20Sopenharmony_ci u32 host_pkru; 5428c2ecf20Sopenharmony_ci u32 pkru; 5438c2ecf20Sopenharmony_ci u32 hflags; 5448c2ecf20Sopenharmony_ci u64 efer; 5458c2ecf20Sopenharmony_ci u64 apic_base; 5468c2ecf20Sopenharmony_ci struct kvm_lapic *apic; /* kernel irqchip context */ 5478c2ecf20Sopenharmony_ci bool apicv_active; 5488c2ecf20Sopenharmony_ci bool load_eoi_exitmap_pending; 5498c2ecf20Sopenharmony_ci DECLARE_BITMAP(ioapic_handled_vectors, 256); 5508c2ecf20Sopenharmony_ci unsigned long apic_attention; 5518c2ecf20Sopenharmony_ci int32_t apic_arb_prio; 5528c2ecf20Sopenharmony_ci int mp_state; 5538c2ecf20Sopenharmony_ci u64 ia32_misc_enable_msr; 5548c2ecf20Sopenharmony_ci u64 smbase; 5558c2ecf20Sopenharmony_ci u64 smi_count; 5568c2ecf20Sopenharmony_ci bool at_instruction_boundary; 5578c2ecf20Sopenharmony_ci bool tpr_access_reporting; 5588c2ecf20Sopenharmony_ci bool xsaves_enabled; 5598c2ecf20Sopenharmony_ci u64 ia32_xss; 5608c2ecf20Sopenharmony_ci u64 microcode_version; 5618c2ecf20Sopenharmony_ci u64 arch_capabilities; 5628c2ecf20Sopenharmony_ci u64 perf_capabilities; 5638c2ecf20Sopenharmony_ci 5648c2ecf20Sopenharmony_ci /* 5658c2ecf20Sopenharmony_ci * Paging state of the vcpu 5668c2ecf20Sopenharmony_ci * 5678c2ecf20Sopenharmony_ci * If the vcpu runs in guest mode with two level paging this still saves 5688c2ecf20Sopenharmony_ci * the paging mode of the l1 guest. This context is always used to 5698c2ecf20Sopenharmony_ci * handle faults. 5708c2ecf20Sopenharmony_ci */ 5718c2ecf20Sopenharmony_ci struct kvm_mmu *mmu; 5728c2ecf20Sopenharmony_ci 5738c2ecf20Sopenharmony_ci /* Non-nested MMU for L1 */ 5748c2ecf20Sopenharmony_ci struct kvm_mmu root_mmu; 5758c2ecf20Sopenharmony_ci 5768c2ecf20Sopenharmony_ci /* L1 MMU when running nested */ 5778c2ecf20Sopenharmony_ci struct kvm_mmu guest_mmu; 5788c2ecf20Sopenharmony_ci 5798c2ecf20Sopenharmony_ci /* 5808c2ecf20Sopenharmony_ci * Paging state of an L2 guest (used for nested npt) 5818c2ecf20Sopenharmony_ci * 5828c2ecf20Sopenharmony_ci * This context will save all necessary information to walk page tables 5838c2ecf20Sopenharmony_ci * of an L2 guest. This context is only initialized for page table 5848c2ecf20Sopenharmony_ci * walking and not for faulting since we never handle l2 page faults on 5858c2ecf20Sopenharmony_ci * the host. 5868c2ecf20Sopenharmony_ci */ 5878c2ecf20Sopenharmony_ci struct kvm_mmu nested_mmu; 5888c2ecf20Sopenharmony_ci 5898c2ecf20Sopenharmony_ci /* 5908c2ecf20Sopenharmony_ci * Pointer to the mmu context currently used for 5918c2ecf20Sopenharmony_ci * gva_to_gpa translations. 5928c2ecf20Sopenharmony_ci */ 5938c2ecf20Sopenharmony_ci struct kvm_mmu *walk_mmu; 5948c2ecf20Sopenharmony_ci 5958c2ecf20Sopenharmony_ci struct kvm_mmu_memory_cache mmu_pte_list_desc_cache; 5968c2ecf20Sopenharmony_ci struct kvm_mmu_memory_cache mmu_shadow_page_cache; 5978c2ecf20Sopenharmony_ci struct kvm_mmu_memory_cache mmu_gfn_array_cache; 5988c2ecf20Sopenharmony_ci struct kvm_mmu_memory_cache mmu_page_header_cache; 5998c2ecf20Sopenharmony_ci 6008c2ecf20Sopenharmony_ci /* 6018c2ecf20Sopenharmony_ci * QEMU userspace and the guest each have their own FPU state. 6028c2ecf20Sopenharmony_ci * In vcpu_run, we switch between the user and guest FPU contexts. 6038c2ecf20Sopenharmony_ci * While running a VCPU, the VCPU thread will have the guest FPU 6048c2ecf20Sopenharmony_ci * context. 6058c2ecf20Sopenharmony_ci * 6068c2ecf20Sopenharmony_ci * Note that while the PKRU state lives inside the fpu registers, 6078c2ecf20Sopenharmony_ci * it is switched out separately at VMENTER and VMEXIT time. The 6088c2ecf20Sopenharmony_ci * "guest_fpu" state here contains the guest FPU context, with the 6098c2ecf20Sopenharmony_ci * host PRKU bits. 6108c2ecf20Sopenharmony_ci */ 6118c2ecf20Sopenharmony_ci struct fpu *user_fpu; 6128c2ecf20Sopenharmony_ci struct fpu *guest_fpu; 6138c2ecf20Sopenharmony_ci 6148c2ecf20Sopenharmony_ci u64 xcr0; 6158c2ecf20Sopenharmony_ci u64 guest_supported_xcr0; 6168c2ecf20Sopenharmony_ci 6178c2ecf20Sopenharmony_ci struct kvm_pio_request pio; 6188c2ecf20Sopenharmony_ci void *pio_data; 6198c2ecf20Sopenharmony_ci 6208c2ecf20Sopenharmony_ci u8 event_exit_inst_len; 6218c2ecf20Sopenharmony_ci 6228c2ecf20Sopenharmony_ci struct kvm_queued_exception { 6238c2ecf20Sopenharmony_ci bool pending; 6248c2ecf20Sopenharmony_ci bool injected; 6258c2ecf20Sopenharmony_ci bool has_error_code; 6268c2ecf20Sopenharmony_ci u8 nr; 6278c2ecf20Sopenharmony_ci u32 error_code; 6288c2ecf20Sopenharmony_ci unsigned long payload; 6298c2ecf20Sopenharmony_ci bool has_payload; 6308c2ecf20Sopenharmony_ci u8 nested_apf; 6318c2ecf20Sopenharmony_ci } exception; 6328c2ecf20Sopenharmony_ci 6338c2ecf20Sopenharmony_ci struct kvm_queued_interrupt { 6348c2ecf20Sopenharmony_ci bool injected; 6358c2ecf20Sopenharmony_ci bool soft; 6368c2ecf20Sopenharmony_ci u8 nr; 6378c2ecf20Sopenharmony_ci } interrupt; 6388c2ecf20Sopenharmony_ci 6398c2ecf20Sopenharmony_ci int halt_request; /* real mode on Intel only */ 6408c2ecf20Sopenharmony_ci 6418c2ecf20Sopenharmony_ci int cpuid_nent; 6428c2ecf20Sopenharmony_ci struct kvm_cpuid_entry2 *cpuid_entries; 6438c2ecf20Sopenharmony_ci 6448c2ecf20Sopenharmony_ci unsigned long cr3_lm_rsvd_bits; 6458c2ecf20Sopenharmony_ci int maxphyaddr; 6468c2ecf20Sopenharmony_ci int max_tdp_level; 6478c2ecf20Sopenharmony_ci 6488c2ecf20Sopenharmony_ci /* emulate context */ 6498c2ecf20Sopenharmony_ci 6508c2ecf20Sopenharmony_ci struct x86_emulate_ctxt *emulate_ctxt; 6518c2ecf20Sopenharmony_ci bool emulate_regs_need_sync_to_vcpu; 6528c2ecf20Sopenharmony_ci bool emulate_regs_need_sync_from_vcpu; 6538c2ecf20Sopenharmony_ci int (*complete_userspace_io)(struct kvm_vcpu *vcpu); 6548c2ecf20Sopenharmony_ci 6558c2ecf20Sopenharmony_ci gpa_t time; 6568c2ecf20Sopenharmony_ci struct pvclock_vcpu_time_info hv_clock; 6578c2ecf20Sopenharmony_ci unsigned int hw_tsc_khz; 6588c2ecf20Sopenharmony_ci struct gfn_to_hva_cache pv_time; 6598c2ecf20Sopenharmony_ci bool pv_time_enabled; 6608c2ecf20Sopenharmony_ci /* set guest stopped flag in pvclock flags field */ 6618c2ecf20Sopenharmony_ci bool pvclock_set_guest_stopped_request; 6628c2ecf20Sopenharmony_ci 6638c2ecf20Sopenharmony_ci struct { 6648c2ecf20Sopenharmony_ci u8 preempted; 6658c2ecf20Sopenharmony_ci u64 msr_val; 6668c2ecf20Sopenharmony_ci u64 last_steal; 6678c2ecf20Sopenharmony_ci struct gfn_to_hva_cache cache; 6688c2ecf20Sopenharmony_ci } st; 6698c2ecf20Sopenharmony_ci 6708c2ecf20Sopenharmony_ci u64 l1_tsc_offset; 6718c2ecf20Sopenharmony_ci u64 tsc_offset; 6728c2ecf20Sopenharmony_ci u64 last_guest_tsc; 6738c2ecf20Sopenharmony_ci u64 last_host_tsc; 6748c2ecf20Sopenharmony_ci u64 tsc_offset_adjustment; 6758c2ecf20Sopenharmony_ci u64 this_tsc_nsec; 6768c2ecf20Sopenharmony_ci u64 this_tsc_write; 6778c2ecf20Sopenharmony_ci u64 this_tsc_generation; 6788c2ecf20Sopenharmony_ci bool tsc_catchup; 6798c2ecf20Sopenharmony_ci bool tsc_always_catchup; 6808c2ecf20Sopenharmony_ci s8 virtual_tsc_shift; 6818c2ecf20Sopenharmony_ci u32 virtual_tsc_mult; 6828c2ecf20Sopenharmony_ci u32 virtual_tsc_khz; 6838c2ecf20Sopenharmony_ci s64 ia32_tsc_adjust_msr; 6848c2ecf20Sopenharmony_ci u64 msr_ia32_power_ctl; 6858c2ecf20Sopenharmony_ci u64 tsc_scaling_ratio; 6868c2ecf20Sopenharmony_ci 6878c2ecf20Sopenharmony_ci atomic_t nmi_queued; /* unprocessed asynchronous NMIs */ 6888c2ecf20Sopenharmony_ci unsigned nmi_pending; /* NMI queued after currently running handler */ 6898c2ecf20Sopenharmony_ci bool nmi_injected; /* Trying to inject an NMI this entry */ 6908c2ecf20Sopenharmony_ci bool smi_pending; /* SMI queued after currently running handler */ 6918c2ecf20Sopenharmony_ci 6928c2ecf20Sopenharmony_ci struct kvm_mtrr mtrr_state; 6938c2ecf20Sopenharmony_ci u64 pat; 6948c2ecf20Sopenharmony_ci 6958c2ecf20Sopenharmony_ci unsigned switch_db_regs; 6968c2ecf20Sopenharmony_ci unsigned long db[KVM_NR_DB_REGS]; 6978c2ecf20Sopenharmony_ci unsigned long dr6; 6988c2ecf20Sopenharmony_ci unsigned long dr7; 6998c2ecf20Sopenharmony_ci unsigned long eff_db[KVM_NR_DB_REGS]; 7008c2ecf20Sopenharmony_ci unsigned long guest_debug_dr7; 7018c2ecf20Sopenharmony_ci u64 msr_platform_info; 7028c2ecf20Sopenharmony_ci u64 msr_misc_features_enables; 7038c2ecf20Sopenharmony_ci 7048c2ecf20Sopenharmony_ci u64 mcg_cap; 7058c2ecf20Sopenharmony_ci u64 mcg_status; 7068c2ecf20Sopenharmony_ci u64 mcg_ctl; 7078c2ecf20Sopenharmony_ci u64 mcg_ext_ctl; 7088c2ecf20Sopenharmony_ci u64 *mce_banks; 7098c2ecf20Sopenharmony_ci 7108c2ecf20Sopenharmony_ci /* Cache MMIO info */ 7118c2ecf20Sopenharmony_ci u64 mmio_gva; 7128c2ecf20Sopenharmony_ci unsigned mmio_access; 7138c2ecf20Sopenharmony_ci gfn_t mmio_gfn; 7148c2ecf20Sopenharmony_ci u64 mmio_gen; 7158c2ecf20Sopenharmony_ci 7168c2ecf20Sopenharmony_ci struct kvm_pmu pmu; 7178c2ecf20Sopenharmony_ci 7188c2ecf20Sopenharmony_ci /* used for guest single stepping over the given code position */ 7198c2ecf20Sopenharmony_ci unsigned long singlestep_rip; 7208c2ecf20Sopenharmony_ci 7218c2ecf20Sopenharmony_ci struct kvm_vcpu_hv hyperv; 7228c2ecf20Sopenharmony_ci 7238c2ecf20Sopenharmony_ci cpumask_var_t wbinvd_dirty_mask; 7248c2ecf20Sopenharmony_ci 7258c2ecf20Sopenharmony_ci unsigned long last_retry_eip; 7268c2ecf20Sopenharmony_ci unsigned long last_retry_addr; 7278c2ecf20Sopenharmony_ci 7288c2ecf20Sopenharmony_ci struct { 7298c2ecf20Sopenharmony_ci bool halted; 7308c2ecf20Sopenharmony_ci gfn_t gfns[ASYNC_PF_PER_VCPU]; 7318c2ecf20Sopenharmony_ci struct gfn_to_hva_cache data; 7328c2ecf20Sopenharmony_ci u64 msr_en_val; /* MSR_KVM_ASYNC_PF_EN */ 7338c2ecf20Sopenharmony_ci u64 msr_int_val; /* MSR_KVM_ASYNC_PF_INT */ 7348c2ecf20Sopenharmony_ci u16 vec; 7358c2ecf20Sopenharmony_ci u32 id; 7368c2ecf20Sopenharmony_ci bool send_user_only; 7378c2ecf20Sopenharmony_ci u32 host_apf_flags; 7388c2ecf20Sopenharmony_ci unsigned long nested_apf_token; 7398c2ecf20Sopenharmony_ci bool delivery_as_pf_vmexit; 7408c2ecf20Sopenharmony_ci bool pageready_pending; 7418c2ecf20Sopenharmony_ci } apf; 7428c2ecf20Sopenharmony_ci 7438c2ecf20Sopenharmony_ci /* OSVW MSRs (AMD only) */ 7448c2ecf20Sopenharmony_ci struct { 7458c2ecf20Sopenharmony_ci u64 length; 7468c2ecf20Sopenharmony_ci u64 status; 7478c2ecf20Sopenharmony_ci } osvw; 7488c2ecf20Sopenharmony_ci 7498c2ecf20Sopenharmony_ci struct { 7508c2ecf20Sopenharmony_ci u64 msr_val; 7518c2ecf20Sopenharmony_ci struct gfn_to_hva_cache data; 7528c2ecf20Sopenharmony_ci } pv_eoi; 7538c2ecf20Sopenharmony_ci 7548c2ecf20Sopenharmony_ci u64 msr_kvm_poll_control; 7558c2ecf20Sopenharmony_ci 7568c2ecf20Sopenharmony_ci /* 7578c2ecf20Sopenharmony_ci * Indicates the guest is trying to write a gfn that contains one or 7588c2ecf20Sopenharmony_ci * more of the PTEs used to translate the write itself, i.e. the access 7598c2ecf20Sopenharmony_ci * is changing its own translation in the guest page tables. KVM exits 7608c2ecf20Sopenharmony_ci * to userspace if emulation of the faulting instruction fails and this 7618c2ecf20Sopenharmony_ci * flag is set, as KVM cannot make forward progress. 7628c2ecf20Sopenharmony_ci * 7638c2ecf20Sopenharmony_ci * If emulation fails for a write to guest page tables, KVM unprotects 7648c2ecf20Sopenharmony_ci * (zaps) the shadow page for the target gfn and resumes the guest to 7658c2ecf20Sopenharmony_ci * retry the non-emulatable instruction (on hardware). Unprotecting the 7668c2ecf20Sopenharmony_ci * gfn doesn't allow forward progress for a self-changing access because 7678c2ecf20Sopenharmony_ci * doing so also zaps the translation for the gfn, i.e. retrying the 7688c2ecf20Sopenharmony_ci * instruction will hit a !PRESENT fault, which results in a new shadow 7698c2ecf20Sopenharmony_ci * page and sends KVM back to square one. 7708c2ecf20Sopenharmony_ci */ 7718c2ecf20Sopenharmony_ci bool write_fault_to_shadow_pgtable; 7728c2ecf20Sopenharmony_ci 7738c2ecf20Sopenharmony_ci /* set at EPT violation at this point */ 7748c2ecf20Sopenharmony_ci unsigned long exit_qualification; 7758c2ecf20Sopenharmony_ci 7768c2ecf20Sopenharmony_ci /* pv related host specific info */ 7778c2ecf20Sopenharmony_ci struct { 7788c2ecf20Sopenharmony_ci bool pv_unhalted; 7798c2ecf20Sopenharmony_ci } pv; 7808c2ecf20Sopenharmony_ci 7818c2ecf20Sopenharmony_ci int pending_ioapic_eoi; 7828c2ecf20Sopenharmony_ci int pending_external_vector; 7838c2ecf20Sopenharmony_ci 7848c2ecf20Sopenharmony_ci /* be preempted when it's in kernel-mode(cpl=0) */ 7858c2ecf20Sopenharmony_ci bool preempted_in_kernel; 7868c2ecf20Sopenharmony_ci 7878c2ecf20Sopenharmony_ci /* Flush the L1 Data cache for L1TF mitigation on VMENTER */ 7888c2ecf20Sopenharmony_ci bool l1tf_flush_l1d; 7898c2ecf20Sopenharmony_ci 7908c2ecf20Sopenharmony_ci /* Host CPU on which VM-entry was most recently attempted */ 7918c2ecf20Sopenharmony_ci unsigned int last_vmentry_cpu; 7928c2ecf20Sopenharmony_ci 7938c2ecf20Sopenharmony_ci /* AMD MSRC001_0015 Hardware Configuration */ 7948c2ecf20Sopenharmony_ci u64 msr_hwcr; 7958c2ecf20Sopenharmony_ci 7968c2ecf20Sopenharmony_ci /* pv related cpuid info */ 7978c2ecf20Sopenharmony_ci struct { 7988c2ecf20Sopenharmony_ci /* 7998c2ecf20Sopenharmony_ci * value of the eax register in the KVM_CPUID_FEATURES CPUID 8008c2ecf20Sopenharmony_ci * leaf. 8018c2ecf20Sopenharmony_ci */ 8028c2ecf20Sopenharmony_ci u32 features; 8038c2ecf20Sopenharmony_ci 8048c2ecf20Sopenharmony_ci /* 8058c2ecf20Sopenharmony_ci * indicates whether pv emulation should be disabled if features 8068c2ecf20Sopenharmony_ci * are not present in the guest's cpuid 8078c2ecf20Sopenharmony_ci */ 8088c2ecf20Sopenharmony_ci bool enforce; 8098c2ecf20Sopenharmony_ci } pv_cpuid; 8108c2ecf20Sopenharmony_ci}; 8118c2ecf20Sopenharmony_ci 8128c2ecf20Sopenharmony_cistruct kvm_lpage_info { 8138c2ecf20Sopenharmony_ci int disallow_lpage; 8148c2ecf20Sopenharmony_ci}; 8158c2ecf20Sopenharmony_ci 8168c2ecf20Sopenharmony_cistruct kvm_arch_memory_slot { 8178c2ecf20Sopenharmony_ci struct kvm_rmap_head *rmap[KVM_NR_PAGE_SIZES]; 8188c2ecf20Sopenharmony_ci struct kvm_lpage_info *lpage_info[KVM_NR_PAGE_SIZES - 1]; 8198c2ecf20Sopenharmony_ci unsigned short *gfn_track[KVM_PAGE_TRACK_MAX]; 8208c2ecf20Sopenharmony_ci}; 8218c2ecf20Sopenharmony_ci 8228c2ecf20Sopenharmony_ci/* 8238c2ecf20Sopenharmony_ci * We use as the mode the number of bits allocated in the LDR for the 8248c2ecf20Sopenharmony_ci * logical processor ID. It happens that these are all powers of two. 8258c2ecf20Sopenharmony_ci * This makes it is very easy to detect cases where the APICs are 8268c2ecf20Sopenharmony_ci * configured for multiple modes; in that case, we cannot use the map and 8278c2ecf20Sopenharmony_ci * hence cannot use kvm_irq_delivery_to_apic_fast either. 8288c2ecf20Sopenharmony_ci */ 8298c2ecf20Sopenharmony_ci#define KVM_APIC_MODE_XAPIC_CLUSTER 4 8308c2ecf20Sopenharmony_ci#define KVM_APIC_MODE_XAPIC_FLAT 8 8318c2ecf20Sopenharmony_ci#define KVM_APIC_MODE_X2APIC 16 8328c2ecf20Sopenharmony_ci 8338c2ecf20Sopenharmony_cistruct kvm_apic_map { 8348c2ecf20Sopenharmony_ci struct rcu_head rcu; 8358c2ecf20Sopenharmony_ci u8 mode; 8368c2ecf20Sopenharmony_ci u32 max_apic_id; 8378c2ecf20Sopenharmony_ci union { 8388c2ecf20Sopenharmony_ci struct kvm_lapic *xapic_flat_map[8]; 8398c2ecf20Sopenharmony_ci struct kvm_lapic *xapic_cluster_map[16][4]; 8408c2ecf20Sopenharmony_ci }; 8418c2ecf20Sopenharmony_ci struct kvm_lapic *phys_map[]; 8428c2ecf20Sopenharmony_ci}; 8438c2ecf20Sopenharmony_ci 8448c2ecf20Sopenharmony_ci/* Hyper-V synthetic debugger (SynDbg)*/ 8458c2ecf20Sopenharmony_cistruct kvm_hv_syndbg { 8468c2ecf20Sopenharmony_ci struct { 8478c2ecf20Sopenharmony_ci u64 control; 8488c2ecf20Sopenharmony_ci u64 status; 8498c2ecf20Sopenharmony_ci u64 send_page; 8508c2ecf20Sopenharmony_ci u64 recv_page; 8518c2ecf20Sopenharmony_ci u64 pending_page; 8528c2ecf20Sopenharmony_ci } control; 8538c2ecf20Sopenharmony_ci u64 options; 8548c2ecf20Sopenharmony_ci}; 8558c2ecf20Sopenharmony_ci 8568c2ecf20Sopenharmony_ci/* Hyper-V emulation context */ 8578c2ecf20Sopenharmony_cistruct kvm_hv { 8588c2ecf20Sopenharmony_ci struct mutex hv_lock; 8598c2ecf20Sopenharmony_ci u64 hv_guest_os_id; 8608c2ecf20Sopenharmony_ci u64 hv_hypercall; 8618c2ecf20Sopenharmony_ci u64 hv_tsc_page; 8628c2ecf20Sopenharmony_ci 8638c2ecf20Sopenharmony_ci /* Hyper-v based guest crash (NT kernel bugcheck) parameters */ 8648c2ecf20Sopenharmony_ci u64 hv_crash_param[HV_X64_MSR_CRASH_PARAMS]; 8658c2ecf20Sopenharmony_ci u64 hv_crash_ctl; 8668c2ecf20Sopenharmony_ci 8678c2ecf20Sopenharmony_ci struct ms_hyperv_tsc_page tsc_ref; 8688c2ecf20Sopenharmony_ci 8698c2ecf20Sopenharmony_ci struct idr conn_to_evt; 8708c2ecf20Sopenharmony_ci 8718c2ecf20Sopenharmony_ci u64 hv_reenlightenment_control; 8728c2ecf20Sopenharmony_ci u64 hv_tsc_emulation_control; 8738c2ecf20Sopenharmony_ci u64 hv_tsc_emulation_status; 8748c2ecf20Sopenharmony_ci 8758c2ecf20Sopenharmony_ci /* How many vCPUs have VP index != vCPU index */ 8768c2ecf20Sopenharmony_ci atomic_t num_mismatched_vp_indexes; 8778c2ecf20Sopenharmony_ci 8788c2ecf20Sopenharmony_ci struct hv_partition_assist_pg *hv_pa_pg; 8798c2ecf20Sopenharmony_ci struct kvm_hv_syndbg hv_syndbg; 8808c2ecf20Sopenharmony_ci}; 8818c2ecf20Sopenharmony_ci 8828c2ecf20Sopenharmony_cistruct msr_bitmap_range { 8838c2ecf20Sopenharmony_ci u32 flags; 8848c2ecf20Sopenharmony_ci u32 nmsrs; 8858c2ecf20Sopenharmony_ci u32 base; 8868c2ecf20Sopenharmony_ci unsigned long *bitmap; 8878c2ecf20Sopenharmony_ci}; 8888c2ecf20Sopenharmony_ci 8898c2ecf20Sopenharmony_cienum kvm_irqchip_mode { 8908c2ecf20Sopenharmony_ci KVM_IRQCHIP_NONE, 8918c2ecf20Sopenharmony_ci KVM_IRQCHIP_KERNEL, /* created with KVM_CREATE_IRQCHIP */ 8928c2ecf20Sopenharmony_ci KVM_IRQCHIP_SPLIT, /* created with KVM_CAP_SPLIT_IRQCHIP */ 8938c2ecf20Sopenharmony_ci}; 8948c2ecf20Sopenharmony_ci 8958c2ecf20Sopenharmony_cistruct kvm_x86_msr_filter { 8968c2ecf20Sopenharmony_ci u8 count; 8978c2ecf20Sopenharmony_ci bool default_allow:1; 8988c2ecf20Sopenharmony_ci struct msr_bitmap_range ranges[16]; 8998c2ecf20Sopenharmony_ci}; 9008c2ecf20Sopenharmony_ci 9018c2ecf20Sopenharmony_ci#define APICV_INHIBIT_REASON_DISABLE 0 9028c2ecf20Sopenharmony_ci#define APICV_INHIBIT_REASON_HYPERV 1 9038c2ecf20Sopenharmony_ci#define APICV_INHIBIT_REASON_NESTED 2 9048c2ecf20Sopenharmony_ci#define APICV_INHIBIT_REASON_IRQWIN 3 9058c2ecf20Sopenharmony_ci#define APICV_INHIBIT_REASON_PIT_REINJ 4 9068c2ecf20Sopenharmony_ci#define APICV_INHIBIT_REASON_X2APIC 5 9078c2ecf20Sopenharmony_ci 9088c2ecf20Sopenharmony_cistruct kvm_arch { 9098c2ecf20Sopenharmony_ci unsigned long n_used_mmu_pages; 9108c2ecf20Sopenharmony_ci unsigned long n_requested_mmu_pages; 9118c2ecf20Sopenharmony_ci unsigned long n_max_mmu_pages; 9128c2ecf20Sopenharmony_ci unsigned int indirect_shadow_pages; 9138c2ecf20Sopenharmony_ci u8 mmu_valid_gen; 9148c2ecf20Sopenharmony_ci struct hlist_head mmu_page_hash[KVM_NUM_MMU_PAGES]; 9158c2ecf20Sopenharmony_ci /* 9168c2ecf20Sopenharmony_ci * Hash table of struct kvm_mmu_page. 9178c2ecf20Sopenharmony_ci */ 9188c2ecf20Sopenharmony_ci struct list_head active_mmu_pages; 9198c2ecf20Sopenharmony_ci struct list_head zapped_obsolete_pages; 9208c2ecf20Sopenharmony_ci struct list_head lpage_disallowed_mmu_pages; 9218c2ecf20Sopenharmony_ci struct kvm_page_track_notifier_node mmu_sp_tracker; 9228c2ecf20Sopenharmony_ci struct kvm_page_track_notifier_head track_notifier_head; 9238c2ecf20Sopenharmony_ci 9248c2ecf20Sopenharmony_ci struct list_head assigned_dev_head; 9258c2ecf20Sopenharmony_ci struct iommu_domain *iommu_domain; 9268c2ecf20Sopenharmony_ci bool iommu_noncoherent; 9278c2ecf20Sopenharmony_ci#define __KVM_HAVE_ARCH_NONCOHERENT_DMA 9288c2ecf20Sopenharmony_ci atomic_t noncoherent_dma_count; 9298c2ecf20Sopenharmony_ci#define __KVM_HAVE_ARCH_ASSIGNED_DEVICE 9308c2ecf20Sopenharmony_ci atomic_t assigned_device_count; 9318c2ecf20Sopenharmony_ci struct kvm_pic *vpic; 9328c2ecf20Sopenharmony_ci struct kvm_ioapic *vioapic; 9338c2ecf20Sopenharmony_ci struct kvm_pit *vpit; 9348c2ecf20Sopenharmony_ci atomic_t vapics_in_nmi_mode; 9358c2ecf20Sopenharmony_ci struct mutex apic_map_lock; 9368c2ecf20Sopenharmony_ci struct kvm_apic_map *apic_map; 9378c2ecf20Sopenharmony_ci atomic_t apic_map_dirty; 9388c2ecf20Sopenharmony_ci 9398c2ecf20Sopenharmony_ci bool apic_access_page_done; 9408c2ecf20Sopenharmony_ci unsigned long apicv_inhibit_reasons; 9418c2ecf20Sopenharmony_ci 9428c2ecf20Sopenharmony_ci gpa_t wall_clock; 9438c2ecf20Sopenharmony_ci 9448c2ecf20Sopenharmony_ci bool mwait_in_guest; 9458c2ecf20Sopenharmony_ci bool hlt_in_guest; 9468c2ecf20Sopenharmony_ci bool pause_in_guest; 9478c2ecf20Sopenharmony_ci bool cstate_in_guest; 9488c2ecf20Sopenharmony_ci 9498c2ecf20Sopenharmony_ci unsigned long irq_sources_bitmap; 9508c2ecf20Sopenharmony_ci s64 kvmclock_offset; 9518c2ecf20Sopenharmony_ci raw_spinlock_t tsc_write_lock; 9528c2ecf20Sopenharmony_ci u64 last_tsc_nsec; 9538c2ecf20Sopenharmony_ci u64 last_tsc_write; 9548c2ecf20Sopenharmony_ci u32 last_tsc_khz; 9558c2ecf20Sopenharmony_ci u64 cur_tsc_nsec; 9568c2ecf20Sopenharmony_ci u64 cur_tsc_write; 9578c2ecf20Sopenharmony_ci u64 cur_tsc_offset; 9588c2ecf20Sopenharmony_ci u64 cur_tsc_generation; 9598c2ecf20Sopenharmony_ci int nr_vcpus_matched_tsc; 9608c2ecf20Sopenharmony_ci 9618c2ecf20Sopenharmony_ci spinlock_t pvclock_gtod_sync_lock; 9628c2ecf20Sopenharmony_ci bool use_master_clock; 9638c2ecf20Sopenharmony_ci u64 master_kernel_ns; 9648c2ecf20Sopenharmony_ci u64 master_cycle_now; 9658c2ecf20Sopenharmony_ci struct delayed_work kvmclock_update_work; 9668c2ecf20Sopenharmony_ci struct delayed_work kvmclock_sync_work; 9678c2ecf20Sopenharmony_ci 9688c2ecf20Sopenharmony_ci struct kvm_xen_hvm_config xen_hvm_config; 9698c2ecf20Sopenharmony_ci 9708c2ecf20Sopenharmony_ci /* reads protected by irq_srcu, writes by irq_lock */ 9718c2ecf20Sopenharmony_ci struct hlist_head mask_notifier_list; 9728c2ecf20Sopenharmony_ci 9738c2ecf20Sopenharmony_ci struct kvm_hv hyperv; 9748c2ecf20Sopenharmony_ci 9758c2ecf20Sopenharmony_ci #ifdef CONFIG_KVM_MMU_AUDIT 9768c2ecf20Sopenharmony_ci int audit_point; 9778c2ecf20Sopenharmony_ci #endif 9788c2ecf20Sopenharmony_ci 9798c2ecf20Sopenharmony_ci bool backwards_tsc_observed; 9808c2ecf20Sopenharmony_ci bool boot_vcpu_runs_old_kvmclock; 9818c2ecf20Sopenharmony_ci u32 bsp_vcpu_id; 9828c2ecf20Sopenharmony_ci 9838c2ecf20Sopenharmony_ci u64 disabled_quirks; 9848c2ecf20Sopenharmony_ci 9858c2ecf20Sopenharmony_ci enum kvm_irqchip_mode irqchip_mode; 9868c2ecf20Sopenharmony_ci u8 nr_reserved_ioapic_pins; 9878c2ecf20Sopenharmony_ci 9888c2ecf20Sopenharmony_ci bool disabled_lapic_found; 9898c2ecf20Sopenharmony_ci 9908c2ecf20Sopenharmony_ci bool x2apic_format; 9918c2ecf20Sopenharmony_ci bool x2apic_broadcast_quirk_disabled; 9928c2ecf20Sopenharmony_ci 9938c2ecf20Sopenharmony_ci bool guest_can_read_msr_platform_info; 9948c2ecf20Sopenharmony_ci bool exception_payload_enabled; 9958c2ecf20Sopenharmony_ci 9968c2ecf20Sopenharmony_ci bool bus_lock_detection_enabled; 9978c2ecf20Sopenharmony_ci 9988c2ecf20Sopenharmony_ci /* Deflect RDMSR and WRMSR to user space when they trigger a #GP */ 9998c2ecf20Sopenharmony_ci u32 user_space_msr_mask; 10008c2ecf20Sopenharmony_ci 10018c2ecf20Sopenharmony_ci struct kvm_x86_msr_filter __rcu *msr_filter; 10028c2ecf20Sopenharmony_ci 10038c2ecf20Sopenharmony_ci struct kvm_pmu_event_filter *pmu_event_filter; 10048c2ecf20Sopenharmony_ci struct task_struct *nx_lpage_recovery_thread; 10058c2ecf20Sopenharmony_ci 10068c2ecf20Sopenharmony_ci /* 10078c2ecf20Sopenharmony_ci * Whether the TDP MMU is enabled for this VM. This contains a 10088c2ecf20Sopenharmony_ci * snapshot of the TDP MMU module parameter from when the VM was 10098c2ecf20Sopenharmony_ci * created and remains unchanged for the life of the VM. If this is 10108c2ecf20Sopenharmony_ci * true, TDP MMU handler functions will run for various MMU 10118c2ecf20Sopenharmony_ci * operations. 10128c2ecf20Sopenharmony_ci */ 10138c2ecf20Sopenharmony_ci bool tdp_mmu_enabled; 10148c2ecf20Sopenharmony_ci 10158c2ecf20Sopenharmony_ci /* List of struct tdp_mmu_pages being used as roots */ 10168c2ecf20Sopenharmony_ci struct list_head tdp_mmu_roots; 10178c2ecf20Sopenharmony_ci /* List of struct tdp_mmu_pages not being used as roots */ 10188c2ecf20Sopenharmony_ci struct list_head tdp_mmu_pages; 10198c2ecf20Sopenharmony_ci}; 10208c2ecf20Sopenharmony_ci 10218c2ecf20Sopenharmony_cistruct kvm_vm_stat { 10228c2ecf20Sopenharmony_ci ulong mmu_shadow_zapped; 10238c2ecf20Sopenharmony_ci ulong mmu_pte_write; 10248c2ecf20Sopenharmony_ci ulong mmu_pde_zapped; 10258c2ecf20Sopenharmony_ci ulong mmu_flooded; 10268c2ecf20Sopenharmony_ci ulong mmu_recycled; 10278c2ecf20Sopenharmony_ci ulong mmu_cache_miss; 10288c2ecf20Sopenharmony_ci ulong mmu_unsync; 10298c2ecf20Sopenharmony_ci ulong remote_tlb_flush; 10308c2ecf20Sopenharmony_ci ulong lpages; 10318c2ecf20Sopenharmony_ci ulong nx_lpage_splits; 10328c2ecf20Sopenharmony_ci ulong max_mmu_page_hash_collisions; 10338c2ecf20Sopenharmony_ci}; 10348c2ecf20Sopenharmony_ci 10358c2ecf20Sopenharmony_cistruct kvm_vcpu_stat { 10368c2ecf20Sopenharmony_ci u64 pf_fixed; 10378c2ecf20Sopenharmony_ci u64 pf_guest; 10388c2ecf20Sopenharmony_ci u64 tlb_flush; 10398c2ecf20Sopenharmony_ci u64 invlpg; 10408c2ecf20Sopenharmony_ci 10418c2ecf20Sopenharmony_ci u64 exits; 10428c2ecf20Sopenharmony_ci u64 io_exits; 10438c2ecf20Sopenharmony_ci u64 mmio_exits; 10448c2ecf20Sopenharmony_ci u64 signal_exits; 10458c2ecf20Sopenharmony_ci u64 irq_window_exits; 10468c2ecf20Sopenharmony_ci u64 nmi_window_exits; 10478c2ecf20Sopenharmony_ci u64 l1d_flush; 10488c2ecf20Sopenharmony_ci u64 halt_exits; 10498c2ecf20Sopenharmony_ci u64 halt_successful_poll; 10508c2ecf20Sopenharmony_ci u64 halt_attempted_poll; 10518c2ecf20Sopenharmony_ci u64 halt_poll_invalid; 10528c2ecf20Sopenharmony_ci u64 halt_wakeup; 10538c2ecf20Sopenharmony_ci u64 request_irq_exits; 10548c2ecf20Sopenharmony_ci u64 irq_exits; 10558c2ecf20Sopenharmony_ci u64 host_state_reload; 10568c2ecf20Sopenharmony_ci u64 fpu_reload; 10578c2ecf20Sopenharmony_ci u64 insn_emulation; 10588c2ecf20Sopenharmony_ci u64 insn_emulation_fail; 10598c2ecf20Sopenharmony_ci u64 hypercalls; 10608c2ecf20Sopenharmony_ci u64 irq_injections; 10618c2ecf20Sopenharmony_ci u64 nmi_injections; 10628c2ecf20Sopenharmony_ci u64 req_event; 10638c2ecf20Sopenharmony_ci u64 halt_poll_success_ns; 10648c2ecf20Sopenharmony_ci u64 halt_poll_fail_ns; 10658c2ecf20Sopenharmony_ci u64 preemption_reported; 10668c2ecf20Sopenharmony_ci u64 preemption_other; 10678c2ecf20Sopenharmony_ci}; 10688c2ecf20Sopenharmony_ci 10698c2ecf20Sopenharmony_cistruct x86_instruction_info; 10708c2ecf20Sopenharmony_ci 10718c2ecf20Sopenharmony_cistruct msr_data { 10728c2ecf20Sopenharmony_ci bool host_initiated; 10738c2ecf20Sopenharmony_ci u32 index; 10748c2ecf20Sopenharmony_ci u64 data; 10758c2ecf20Sopenharmony_ci}; 10768c2ecf20Sopenharmony_ci 10778c2ecf20Sopenharmony_cistruct kvm_lapic_irq { 10788c2ecf20Sopenharmony_ci u32 vector; 10798c2ecf20Sopenharmony_ci u16 delivery_mode; 10808c2ecf20Sopenharmony_ci u16 dest_mode; 10818c2ecf20Sopenharmony_ci bool level; 10828c2ecf20Sopenharmony_ci u16 trig_mode; 10838c2ecf20Sopenharmony_ci u32 shorthand; 10848c2ecf20Sopenharmony_ci u32 dest_id; 10858c2ecf20Sopenharmony_ci bool msi_redir_hint; 10868c2ecf20Sopenharmony_ci}; 10878c2ecf20Sopenharmony_ci 10888c2ecf20Sopenharmony_cistatic inline u16 kvm_lapic_irq_dest_mode(bool dest_mode_logical) 10898c2ecf20Sopenharmony_ci{ 10908c2ecf20Sopenharmony_ci return dest_mode_logical ? APIC_DEST_LOGICAL : APIC_DEST_PHYSICAL; 10918c2ecf20Sopenharmony_ci} 10928c2ecf20Sopenharmony_ci 10938c2ecf20Sopenharmony_cistruct kvm_x86_ops { 10948c2ecf20Sopenharmony_ci int (*hardware_enable)(void); 10958c2ecf20Sopenharmony_ci void (*hardware_disable)(void); 10968c2ecf20Sopenharmony_ci void (*hardware_unsetup)(void); 10978c2ecf20Sopenharmony_ci bool (*cpu_has_accelerated_tpr)(void); 10988c2ecf20Sopenharmony_ci bool (*has_emulated_msr)(u32 index); 10998c2ecf20Sopenharmony_ci void (*vcpu_after_set_cpuid)(struct kvm_vcpu *vcpu); 11008c2ecf20Sopenharmony_ci 11018c2ecf20Sopenharmony_ci unsigned int vm_size; 11028c2ecf20Sopenharmony_ci int (*vm_init)(struct kvm *kvm); 11038c2ecf20Sopenharmony_ci void (*vm_destroy)(struct kvm *kvm); 11048c2ecf20Sopenharmony_ci 11058c2ecf20Sopenharmony_ci /* Create, but do not attach this VCPU */ 11068c2ecf20Sopenharmony_ci int (*vcpu_create)(struct kvm_vcpu *vcpu); 11078c2ecf20Sopenharmony_ci void (*vcpu_free)(struct kvm_vcpu *vcpu); 11088c2ecf20Sopenharmony_ci void (*vcpu_reset)(struct kvm_vcpu *vcpu, bool init_event); 11098c2ecf20Sopenharmony_ci 11108c2ecf20Sopenharmony_ci void (*prepare_guest_switch)(struct kvm_vcpu *vcpu); 11118c2ecf20Sopenharmony_ci void (*vcpu_load)(struct kvm_vcpu *vcpu, int cpu); 11128c2ecf20Sopenharmony_ci void (*vcpu_put)(struct kvm_vcpu *vcpu); 11138c2ecf20Sopenharmony_ci 11148c2ecf20Sopenharmony_ci void (*update_exception_bitmap)(struct kvm_vcpu *vcpu); 11158c2ecf20Sopenharmony_ci int (*get_msr)(struct kvm_vcpu *vcpu, struct msr_data *msr); 11168c2ecf20Sopenharmony_ci int (*set_msr)(struct kvm_vcpu *vcpu, struct msr_data *msr); 11178c2ecf20Sopenharmony_ci u64 (*get_segment_base)(struct kvm_vcpu *vcpu, int seg); 11188c2ecf20Sopenharmony_ci void (*get_segment)(struct kvm_vcpu *vcpu, 11198c2ecf20Sopenharmony_ci struct kvm_segment *var, int seg); 11208c2ecf20Sopenharmony_ci int (*get_cpl)(struct kvm_vcpu *vcpu); 11218c2ecf20Sopenharmony_ci void (*set_segment)(struct kvm_vcpu *vcpu, 11228c2ecf20Sopenharmony_ci struct kvm_segment *var, int seg); 11238c2ecf20Sopenharmony_ci void (*get_cs_db_l_bits)(struct kvm_vcpu *vcpu, int *db, int *l); 11248c2ecf20Sopenharmony_ci void (*set_cr0)(struct kvm_vcpu *vcpu, unsigned long cr0); 11258c2ecf20Sopenharmony_ci bool (*is_valid_cr4)(struct kvm_vcpu *vcpu, unsigned long cr0); 11268c2ecf20Sopenharmony_ci void (*set_cr4)(struct kvm_vcpu *vcpu, unsigned long cr4); 11278c2ecf20Sopenharmony_ci int (*set_efer)(struct kvm_vcpu *vcpu, u64 efer); 11288c2ecf20Sopenharmony_ci void (*get_idt)(struct kvm_vcpu *vcpu, struct desc_ptr *dt); 11298c2ecf20Sopenharmony_ci void (*set_idt)(struct kvm_vcpu *vcpu, struct desc_ptr *dt); 11308c2ecf20Sopenharmony_ci void (*get_gdt)(struct kvm_vcpu *vcpu, struct desc_ptr *dt); 11318c2ecf20Sopenharmony_ci void (*set_gdt)(struct kvm_vcpu *vcpu, struct desc_ptr *dt); 11328c2ecf20Sopenharmony_ci void (*sync_dirty_debug_regs)(struct kvm_vcpu *vcpu); 11338c2ecf20Sopenharmony_ci void (*set_dr7)(struct kvm_vcpu *vcpu, unsigned long value); 11348c2ecf20Sopenharmony_ci void (*cache_reg)(struct kvm_vcpu *vcpu, enum kvm_reg reg); 11358c2ecf20Sopenharmony_ci unsigned long (*get_rflags)(struct kvm_vcpu *vcpu); 11368c2ecf20Sopenharmony_ci void (*set_rflags)(struct kvm_vcpu *vcpu, unsigned long rflags); 11378c2ecf20Sopenharmony_ci 11388c2ecf20Sopenharmony_ci void (*tlb_flush_all)(struct kvm_vcpu *vcpu); 11398c2ecf20Sopenharmony_ci void (*tlb_flush_current)(struct kvm_vcpu *vcpu); 11408c2ecf20Sopenharmony_ci int (*tlb_remote_flush)(struct kvm *kvm); 11418c2ecf20Sopenharmony_ci int (*tlb_remote_flush_with_range)(struct kvm *kvm, 11428c2ecf20Sopenharmony_ci struct kvm_tlb_range *range); 11438c2ecf20Sopenharmony_ci 11448c2ecf20Sopenharmony_ci /* 11458c2ecf20Sopenharmony_ci * Flush any TLB entries associated with the given GVA. 11468c2ecf20Sopenharmony_ci * Does not need to flush GPA->HPA mappings. 11478c2ecf20Sopenharmony_ci * Can potentially get non-canonical addresses through INVLPGs, which 11488c2ecf20Sopenharmony_ci * the implementation may choose to ignore if appropriate. 11498c2ecf20Sopenharmony_ci */ 11508c2ecf20Sopenharmony_ci void (*tlb_flush_gva)(struct kvm_vcpu *vcpu, gva_t addr); 11518c2ecf20Sopenharmony_ci 11528c2ecf20Sopenharmony_ci /* 11538c2ecf20Sopenharmony_ci * Flush any TLB entries created by the guest. Like tlb_flush_gva(), 11548c2ecf20Sopenharmony_ci * does not need to flush GPA->HPA mappings. 11558c2ecf20Sopenharmony_ci */ 11568c2ecf20Sopenharmony_ci void (*tlb_flush_guest)(struct kvm_vcpu *vcpu); 11578c2ecf20Sopenharmony_ci 11588c2ecf20Sopenharmony_ci enum exit_fastpath_completion (*run)(struct kvm_vcpu *vcpu); 11598c2ecf20Sopenharmony_ci int (*handle_exit)(struct kvm_vcpu *vcpu, 11608c2ecf20Sopenharmony_ci enum exit_fastpath_completion exit_fastpath); 11618c2ecf20Sopenharmony_ci int (*skip_emulated_instruction)(struct kvm_vcpu *vcpu); 11628c2ecf20Sopenharmony_ci void (*update_emulated_instruction)(struct kvm_vcpu *vcpu); 11638c2ecf20Sopenharmony_ci void (*set_interrupt_shadow)(struct kvm_vcpu *vcpu, int mask); 11648c2ecf20Sopenharmony_ci u32 (*get_interrupt_shadow)(struct kvm_vcpu *vcpu); 11658c2ecf20Sopenharmony_ci void (*patch_hypercall)(struct kvm_vcpu *vcpu, 11668c2ecf20Sopenharmony_ci unsigned char *hypercall_addr); 11678c2ecf20Sopenharmony_ci void (*set_irq)(struct kvm_vcpu *vcpu); 11688c2ecf20Sopenharmony_ci void (*set_nmi)(struct kvm_vcpu *vcpu); 11698c2ecf20Sopenharmony_ci void (*queue_exception)(struct kvm_vcpu *vcpu); 11708c2ecf20Sopenharmony_ci void (*cancel_injection)(struct kvm_vcpu *vcpu); 11718c2ecf20Sopenharmony_ci int (*interrupt_allowed)(struct kvm_vcpu *vcpu, bool for_injection); 11728c2ecf20Sopenharmony_ci int (*nmi_allowed)(struct kvm_vcpu *vcpu, bool for_injection); 11738c2ecf20Sopenharmony_ci bool (*get_nmi_mask)(struct kvm_vcpu *vcpu); 11748c2ecf20Sopenharmony_ci void (*set_nmi_mask)(struct kvm_vcpu *vcpu, bool masked); 11758c2ecf20Sopenharmony_ci void (*enable_nmi_window)(struct kvm_vcpu *vcpu); 11768c2ecf20Sopenharmony_ci void (*enable_irq_window)(struct kvm_vcpu *vcpu); 11778c2ecf20Sopenharmony_ci void (*update_cr8_intercept)(struct kvm_vcpu *vcpu, int tpr, int irr); 11788c2ecf20Sopenharmony_ci bool (*check_apicv_inhibit_reasons)(ulong bit); 11798c2ecf20Sopenharmony_ci void (*pre_update_apicv_exec_ctrl)(struct kvm *kvm, bool activate); 11808c2ecf20Sopenharmony_ci void (*refresh_apicv_exec_ctrl)(struct kvm_vcpu *vcpu); 11818c2ecf20Sopenharmony_ci void (*hwapic_irr_update)(struct kvm_vcpu *vcpu, int max_irr); 11828c2ecf20Sopenharmony_ci void (*hwapic_isr_update)(struct kvm_vcpu *vcpu, int isr); 11838c2ecf20Sopenharmony_ci bool (*guest_apic_has_interrupt)(struct kvm_vcpu *vcpu); 11848c2ecf20Sopenharmony_ci void (*load_eoi_exitmap)(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap); 11858c2ecf20Sopenharmony_ci void (*set_virtual_apic_mode)(struct kvm_vcpu *vcpu); 11868c2ecf20Sopenharmony_ci void (*set_apic_access_page_addr)(struct kvm_vcpu *vcpu); 11878c2ecf20Sopenharmony_ci int (*deliver_posted_interrupt)(struct kvm_vcpu *vcpu, int vector); 11888c2ecf20Sopenharmony_ci int (*sync_pir_to_irr)(struct kvm_vcpu *vcpu); 11898c2ecf20Sopenharmony_ci int (*set_tss_addr)(struct kvm *kvm, unsigned int addr); 11908c2ecf20Sopenharmony_ci int (*set_identity_map_addr)(struct kvm *kvm, u64 ident_addr); 11918c2ecf20Sopenharmony_ci u64 (*get_mt_mask)(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio); 11928c2ecf20Sopenharmony_ci 11938c2ecf20Sopenharmony_ci void (*load_mmu_pgd)(struct kvm_vcpu *vcpu, unsigned long pgd, 11948c2ecf20Sopenharmony_ci int pgd_level); 11958c2ecf20Sopenharmony_ci 11968c2ecf20Sopenharmony_ci bool (*has_wbinvd_exit)(void); 11978c2ecf20Sopenharmony_ci 11988c2ecf20Sopenharmony_ci /* Returns actual tsc_offset set in active VMCS */ 11998c2ecf20Sopenharmony_ci u64 (*write_l1_tsc_offset)(struct kvm_vcpu *vcpu, u64 offset); 12008c2ecf20Sopenharmony_ci 12018c2ecf20Sopenharmony_ci /* 12028c2ecf20Sopenharmony_ci * Retrieve somewhat arbitrary exit information. Intended to be used 12038c2ecf20Sopenharmony_ci * only from within tracepoints to avoid VMREADs when tracing is off. 12048c2ecf20Sopenharmony_ci */ 12058c2ecf20Sopenharmony_ci void (*get_exit_info)(struct kvm_vcpu *vcpu, u64 *info1, u64 *info2, 12068c2ecf20Sopenharmony_ci u32 *exit_int_info, u32 *exit_int_info_err_code); 12078c2ecf20Sopenharmony_ci 12088c2ecf20Sopenharmony_ci int (*check_intercept)(struct kvm_vcpu *vcpu, 12098c2ecf20Sopenharmony_ci struct x86_instruction_info *info, 12108c2ecf20Sopenharmony_ci enum x86_intercept_stage stage, 12118c2ecf20Sopenharmony_ci struct x86_exception *exception); 12128c2ecf20Sopenharmony_ci void (*handle_exit_irqoff)(struct kvm_vcpu *vcpu); 12138c2ecf20Sopenharmony_ci 12148c2ecf20Sopenharmony_ci void (*request_immediate_exit)(struct kvm_vcpu *vcpu); 12158c2ecf20Sopenharmony_ci 12168c2ecf20Sopenharmony_ci void (*sched_in)(struct kvm_vcpu *kvm, int cpu); 12178c2ecf20Sopenharmony_ci 12188c2ecf20Sopenharmony_ci /* 12198c2ecf20Sopenharmony_ci * Arch-specific dirty logging hooks. These hooks are only supposed to 12208c2ecf20Sopenharmony_ci * be valid if the specific arch has hardware-accelerated dirty logging 12218c2ecf20Sopenharmony_ci * mechanism. Currently only for PML on VMX. 12228c2ecf20Sopenharmony_ci * 12238c2ecf20Sopenharmony_ci * - slot_enable_log_dirty: 12248c2ecf20Sopenharmony_ci * called when enabling log dirty mode for the slot. 12258c2ecf20Sopenharmony_ci * - slot_disable_log_dirty: 12268c2ecf20Sopenharmony_ci * called when disabling log dirty mode for the slot. 12278c2ecf20Sopenharmony_ci * also called when slot is created with log dirty disabled. 12288c2ecf20Sopenharmony_ci * - flush_log_dirty: 12298c2ecf20Sopenharmony_ci * called before reporting dirty_bitmap to userspace. 12308c2ecf20Sopenharmony_ci * - enable_log_dirty_pt_masked: 12318c2ecf20Sopenharmony_ci * called when reenabling log dirty for the GFNs in the mask after 12328c2ecf20Sopenharmony_ci * corresponding bits are cleared in slot->dirty_bitmap. 12338c2ecf20Sopenharmony_ci */ 12348c2ecf20Sopenharmony_ci void (*slot_enable_log_dirty)(struct kvm *kvm, 12358c2ecf20Sopenharmony_ci struct kvm_memory_slot *slot); 12368c2ecf20Sopenharmony_ci void (*slot_disable_log_dirty)(struct kvm *kvm, 12378c2ecf20Sopenharmony_ci struct kvm_memory_slot *slot); 12388c2ecf20Sopenharmony_ci void (*flush_log_dirty)(struct kvm *kvm); 12398c2ecf20Sopenharmony_ci void (*enable_log_dirty_pt_masked)(struct kvm *kvm, 12408c2ecf20Sopenharmony_ci struct kvm_memory_slot *slot, 12418c2ecf20Sopenharmony_ci gfn_t offset, unsigned long mask); 12428c2ecf20Sopenharmony_ci 12438c2ecf20Sopenharmony_ci /* pmu operations of sub-arch */ 12448c2ecf20Sopenharmony_ci const struct kvm_pmu_ops *pmu_ops; 12458c2ecf20Sopenharmony_ci const struct kvm_x86_nested_ops *nested_ops; 12468c2ecf20Sopenharmony_ci 12478c2ecf20Sopenharmony_ci /* 12488c2ecf20Sopenharmony_ci * Architecture specific hooks for vCPU blocking due to 12498c2ecf20Sopenharmony_ci * HLT instruction. 12508c2ecf20Sopenharmony_ci * Returns for .pre_block(): 12518c2ecf20Sopenharmony_ci * - 0 means continue to block the vCPU. 12528c2ecf20Sopenharmony_ci * - 1 means we cannot block the vCPU since some event 12538c2ecf20Sopenharmony_ci * happens during this period, such as, 'ON' bit in 12548c2ecf20Sopenharmony_ci * posted-interrupts descriptor is set. 12558c2ecf20Sopenharmony_ci */ 12568c2ecf20Sopenharmony_ci int (*pre_block)(struct kvm_vcpu *vcpu); 12578c2ecf20Sopenharmony_ci void (*post_block)(struct kvm_vcpu *vcpu); 12588c2ecf20Sopenharmony_ci 12598c2ecf20Sopenharmony_ci void (*vcpu_blocking)(struct kvm_vcpu *vcpu); 12608c2ecf20Sopenharmony_ci void (*vcpu_unblocking)(struct kvm_vcpu *vcpu); 12618c2ecf20Sopenharmony_ci 12628c2ecf20Sopenharmony_ci int (*update_pi_irte)(struct kvm *kvm, unsigned int host_irq, 12638c2ecf20Sopenharmony_ci uint32_t guest_irq, bool set); 12648c2ecf20Sopenharmony_ci void (*apicv_post_state_restore)(struct kvm_vcpu *vcpu); 12658c2ecf20Sopenharmony_ci bool (*dy_apicv_has_pending_interrupt)(struct kvm_vcpu *vcpu); 12668c2ecf20Sopenharmony_ci 12678c2ecf20Sopenharmony_ci int (*set_hv_timer)(struct kvm_vcpu *vcpu, u64 guest_deadline_tsc, 12688c2ecf20Sopenharmony_ci bool *expired); 12698c2ecf20Sopenharmony_ci void (*cancel_hv_timer)(struct kvm_vcpu *vcpu); 12708c2ecf20Sopenharmony_ci 12718c2ecf20Sopenharmony_ci void (*setup_mce)(struct kvm_vcpu *vcpu); 12728c2ecf20Sopenharmony_ci 12738c2ecf20Sopenharmony_ci int (*smi_allowed)(struct kvm_vcpu *vcpu, bool for_injection); 12748c2ecf20Sopenharmony_ci int (*pre_enter_smm)(struct kvm_vcpu *vcpu, char *smstate); 12758c2ecf20Sopenharmony_ci int (*pre_leave_smm)(struct kvm_vcpu *vcpu, const char *smstate); 12768c2ecf20Sopenharmony_ci void (*enable_smi_window)(struct kvm_vcpu *vcpu); 12778c2ecf20Sopenharmony_ci 12788c2ecf20Sopenharmony_ci int (*mem_enc_op)(struct kvm *kvm, void __user *argp); 12798c2ecf20Sopenharmony_ci int (*mem_enc_reg_region)(struct kvm *kvm, struct kvm_enc_region *argp); 12808c2ecf20Sopenharmony_ci int (*mem_enc_unreg_region)(struct kvm *kvm, struct kvm_enc_region *argp); 12818c2ecf20Sopenharmony_ci void (*guest_memory_reclaimed)(struct kvm *kvm); 12828c2ecf20Sopenharmony_ci 12838c2ecf20Sopenharmony_ci int (*get_msr_feature)(struct kvm_msr_entry *entry); 12848c2ecf20Sopenharmony_ci 12858c2ecf20Sopenharmony_ci bool (*can_emulate_instruction)(struct kvm_vcpu *vcpu, void *insn, int insn_len); 12868c2ecf20Sopenharmony_ci 12878c2ecf20Sopenharmony_ci bool (*apic_init_signal_blocked)(struct kvm_vcpu *vcpu); 12888c2ecf20Sopenharmony_ci int (*enable_direct_tlbflush)(struct kvm_vcpu *vcpu); 12898c2ecf20Sopenharmony_ci 12908c2ecf20Sopenharmony_ci void (*migrate_timers)(struct kvm_vcpu *vcpu); 12918c2ecf20Sopenharmony_ci void (*msr_filter_changed)(struct kvm_vcpu *vcpu); 12928c2ecf20Sopenharmony_ci}; 12938c2ecf20Sopenharmony_ci 12948c2ecf20Sopenharmony_cistruct kvm_x86_nested_ops { 12958c2ecf20Sopenharmony_ci void (*leave_nested)(struct kvm_vcpu *vcpu); 12968c2ecf20Sopenharmony_ci int (*check_events)(struct kvm_vcpu *vcpu); 12978c2ecf20Sopenharmony_ci bool (*hv_timer_pending)(struct kvm_vcpu *vcpu); 12988c2ecf20Sopenharmony_ci int (*get_state)(struct kvm_vcpu *vcpu, 12998c2ecf20Sopenharmony_ci struct kvm_nested_state __user *user_kvm_nested_state, 13008c2ecf20Sopenharmony_ci unsigned user_data_size); 13018c2ecf20Sopenharmony_ci int (*set_state)(struct kvm_vcpu *vcpu, 13028c2ecf20Sopenharmony_ci struct kvm_nested_state __user *user_kvm_nested_state, 13038c2ecf20Sopenharmony_ci struct kvm_nested_state *kvm_state); 13048c2ecf20Sopenharmony_ci bool (*get_nested_state_pages)(struct kvm_vcpu *vcpu); 13058c2ecf20Sopenharmony_ci int (*write_log_dirty)(struct kvm_vcpu *vcpu, gpa_t l2_gpa); 13068c2ecf20Sopenharmony_ci 13078c2ecf20Sopenharmony_ci int (*enable_evmcs)(struct kvm_vcpu *vcpu, 13088c2ecf20Sopenharmony_ci uint16_t *vmcs_version); 13098c2ecf20Sopenharmony_ci uint16_t (*get_evmcs_version)(struct kvm_vcpu *vcpu); 13108c2ecf20Sopenharmony_ci}; 13118c2ecf20Sopenharmony_ci 13128c2ecf20Sopenharmony_cistruct kvm_x86_init_ops { 13138c2ecf20Sopenharmony_ci int (*cpu_has_kvm_support)(void); 13148c2ecf20Sopenharmony_ci int (*disabled_by_bios)(void); 13158c2ecf20Sopenharmony_ci int (*check_processor_compatibility)(void); 13168c2ecf20Sopenharmony_ci int (*hardware_setup)(void); 13178c2ecf20Sopenharmony_ci bool (*intel_pt_intr_in_guest)(void); 13188c2ecf20Sopenharmony_ci 13198c2ecf20Sopenharmony_ci struct kvm_x86_ops *runtime_ops; 13208c2ecf20Sopenharmony_ci}; 13218c2ecf20Sopenharmony_ci 13228c2ecf20Sopenharmony_cistruct kvm_arch_async_pf { 13238c2ecf20Sopenharmony_ci u32 token; 13248c2ecf20Sopenharmony_ci gfn_t gfn; 13258c2ecf20Sopenharmony_ci unsigned long cr3; 13268c2ecf20Sopenharmony_ci bool direct_map; 13278c2ecf20Sopenharmony_ci}; 13288c2ecf20Sopenharmony_ci 13298c2ecf20Sopenharmony_ciextern u64 __read_mostly host_efer; 13308c2ecf20Sopenharmony_ciextern bool __read_mostly allow_smaller_maxphyaddr; 13318c2ecf20Sopenharmony_ciextern struct kvm_x86_ops kvm_x86_ops; 13328c2ecf20Sopenharmony_ci 13338c2ecf20Sopenharmony_ci#define __KVM_HAVE_ARCH_VM_ALLOC 13348c2ecf20Sopenharmony_cistatic inline struct kvm *kvm_arch_alloc_vm(void) 13358c2ecf20Sopenharmony_ci{ 13368c2ecf20Sopenharmony_ci return __vmalloc(kvm_x86_ops.vm_size, GFP_KERNEL_ACCOUNT | __GFP_ZERO); 13378c2ecf20Sopenharmony_ci} 13388c2ecf20Sopenharmony_civoid kvm_arch_free_vm(struct kvm *kvm); 13398c2ecf20Sopenharmony_ci 13408c2ecf20Sopenharmony_ci#define __KVM_HAVE_ARCH_FLUSH_REMOTE_TLB 13418c2ecf20Sopenharmony_cistatic inline int kvm_arch_flush_remote_tlb(struct kvm *kvm) 13428c2ecf20Sopenharmony_ci{ 13438c2ecf20Sopenharmony_ci if (kvm_x86_ops.tlb_remote_flush && 13448c2ecf20Sopenharmony_ci !kvm_x86_ops.tlb_remote_flush(kvm)) 13458c2ecf20Sopenharmony_ci return 0; 13468c2ecf20Sopenharmony_ci else 13478c2ecf20Sopenharmony_ci return -ENOTSUPP; 13488c2ecf20Sopenharmony_ci} 13498c2ecf20Sopenharmony_ci 13508c2ecf20Sopenharmony_civoid __init kvm_mmu_x86_module_init(void); 13518c2ecf20Sopenharmony_ciint kvm_mmu_vendor_module_init(void); 13528c2ecf20Sopenharmony_civoid kvm_mmu_vendor_module_exit(void); 13538c2ecf20Sopenharmony_ci 13548c2ecf20Sopenharmony_civoid kvm_mmu_destroy(struct kvm_vcpu *vcpu); 13558c2ecf20Sopenharmony_ciint kvm_mmu_create(struct kvm_vcpu *vcpu); 13568c2ecf20Sopenharmony_civoid kvm_mmu_init_vm(struct kvm *kvm); 13578c2ecf20Sopenharmony_civoid kvm_mmu_uninit_vm(struct kvm *kvm); 13588c2ecf20Sopenharmony_civoid kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_mask, 13598c2ecf20Sopenharmony_ci u64 dirty_mask, u64 nx_mask, u64 x_mask, u64 p_mask, 13608c2ecf20Sopenharmony_ci u64 acc_track_mask, u64 me_mask); 13618c2ecf20Sopenharmony_ci 13628c2ecf20Sopenharmony_civoid kvm_mmu_reset_context(struct kvm_vcpu *vcpu); 13638c2ecf20Sopenharmony_civoid kvm_mmu_slot_remove_write_access(struct kvm *kvm, 13648c2ecf20Sopenharmony_ci struct kvm_memory_slot *memslot, 13658c2ecf20Sopenharmony_ci int start_level); 13668c2ecf20Sopenharmony_civoid kvm_mmu_zap_collapsible_sptes(struct kvm *kvm, 13678c2ecf20Sopenharmony_ci const struct kvm_memory_slot *memslot); 13688c2ecf20Sopenharmony_civoid kvm_mmu_slot_leaf_clear_dirty(struct kvm *kvm, 13698c2ecf20Sopenharmony_ci struct kvm_memory_slot *memslot); 13708c2ecf20Sopenharmony_civoid kvm_mmu_slot_largepage_remove_write_access(struct kvm *kvm, 13718c2ecf20Sopenharmony_ci struct kvm_memory_slot *memslot); 13728c2ecf20Sopenharmony_civoid kvm_mmu_slot_set_dirty(struct kvm *kvm, 13738c2ecf20Sopenharmony_ci struct kvm_memory_slot *memslot); 13748c2ecf20Sopenharmony_civoid kvm_mmu_clear_dirty_pt_masked(struct kvm *kvm, 13758c2ecf20Sopenharmony_ci struct kvm_memory_slot *slot, 13768c2ecf20Sopenharmony_ci gfn_t gfn_offset, unsigned long mask); 13778c2ecf20Sopenharmony_civoid kvm_mmu_zap_all(struct kvm *kvm); 13788c2ecf20Sopenharmony_civoid kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, u64 gen); 13798c2ecf20Sopenharmony_ciunsigned long kvm_mmu_calculate_default_mmu_pages(struct kvm *kvm); 13808c2ecf20Sopenharmony_civoid kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned long kvm_nr_mmu_pages); 13818c2ecf20Sopenharmony_ci 13828c2ecf20Sopenharmony_ciint load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3); 13838c2ecf20Sopenharmony_cibool pdptrs_changed(struct kvm_vcpu *vcpu); 13848c2ecf20Sopenharmony_ci 13858c2ecf20Sopenharmony_ciint emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa, 13868c2ecf20Sopenharmony_ci const void *val, int bytes); 13878c2ecf20Sopenharmony_ci 13888c2ecf20Sopenharmony_cistruct kvm_irq_mask_notifier { 13898c2ecf20Sopenharmony_ci void (*func)(struct kvm_irq_mask_notifier *kimn, bool masked); 13908c2ecf20Sopenharmony_ci int irq; 13918c2ecf20Sopenharmony_ci struct hlist_node link; 13928c2ecf20Sopenharmony_ci}; 13938c2ecf20Sopenharmony_ci 13948c2ecf20Sopenharmony_civoid kvm_register_irq_mask_notifier(struct kvm *kvm, int irq, 13958c2ecf20Sopenharmony_ci struct kvm_irq_mask_notifier *kimn); 13968c2ecf20Sopenharmony_civoid kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, 13978c2ecf20Sopenharmony_ci struct kvm_irq_mask_notifier *kimn); 13988c2ecf20Sopenharmony_civoid kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin, 13998c2ecf20Sopenharmony_ci bool mask); 14008c2ecf20Sopenharmony_ci 14018c2ecf20Sopenharmony_ciextern bool tdp_enabled; 14028c2ecf20Sopenharmony_ci 14038c2ecf20Sopenharmony_ciu64 vcpu_tsc_khz(struct kvm_vcpu *vcpu); 14048c2ecf20Sopenharmony_ci 14058c2ecf20Sopenharmony_ci/* control of guest tsc rate supported? */ 14068c2ecf20Sopenharmony_ciextern bool kvm_has_tsc_control; 14078c2ecf20Sopenharmony_ci/* maximum supported tsc_khz for guests */ 14088c2ecf20Sopenharmony_ciextern u32 kvm_max_guest_tsc_khz; 14098c2ecf20Sopenharmony_ci/* number of bits of the fractional part of the TSC scaling ratio */ 14108c2ecf20Sopenharmony_ciextern u8 kvm_tsc_scaling_ratio_frac_bits; 14118c2ecf20Sopenharmony_ci/* maximum allowed value of TSC scaling ratio */ 14128c2ecf20Sopenharmony_ciextern u64 kvm_max_tsc_scaling_ratio; 14138c2ecf20Sopenharmony_ci/* 1ull << kvm_tsc_scaling_ratio_frac_bits */ 14148c2ecf20Sopenharmony_ciextern u64 kvm_default_tsc_scaling_ratio; 14158c2ecf20Sopenharmony_ci 14168c2ecf20Sopenharmony_ciextern u64 kvm_mce_cap_supported; 14178c2ecf20Sopenharmony_ci 14188c2ecf20Sopenharmony_ci/* 14198c2ecf20Sopenharmony_ci * EMULTYPE_NO_DECODE - Set when re-emulating an instruction (after completing 14208c2ecf20Sopenharmony_ci * userspace I/O) to indicate that the emulation context 14218c2ecf20Sopenharmony_ci * should be resued as is, i.e. skip initialization of 14228c2ecf20Sopenharmony_ci * emulation context, instruction fetch and decode. 14238c2ecf20Sopenharmony_ci * 14248c2ecf20Sopenharmony_ci * EMULTYPE_TRAP_UD - Set when emulating an intercepted #UD from hardware. 14258c2ecf20Sopenharmony_ci * Indicates that only select instructions (tagged with 14268c2ecf20Sopenharmony_ci * EmulateOnUD) should be emulated (to minimize the emulator 14278c2ecf20Sopenharmony_ci * attack surface). See also EMULTYPE_TRAP_UD_FORCED. 14288c2ecf20Sopenharmony_ci * 14298c2ecf20Sopenharmony_ci * EMULTYPE_SKIP - Set when emulating solely to skip an instruction, i.e. to 14308c2ecf20Sopenharmony_ci * decode the instruction length. For use *only* by 14318c2ecf20Sopenharmony_ci * kvm_x86_ops.skip_emulated_instruction() implementations. 14328c2ecf20Sopenharmony_ci * 14338c2ecf20Sopenharmony_ci * EMULTYPE_ALLOW_RETRY_PF - Set when the emulator should resume the guest to 14348c2ecf20Sopenharmony_ci * retry native execution under certain conditions, 14358c2ecf20Sopenharmony_ci * Can only be set in conjunction with EMULTYPE_PF. 14368c2ecf20Sopenharmony_ci * 14378c2ecf20Sopenharmony_ci * EMULTYPE_TRAP_UD_FORCED - Set when emulating an intercepted #UD that was 14388c2ecf20Sopenharmony_ci * triggered by KVM's magic "force emulation" prefix, 14398c2ecf20Sopenharmony_ci * which is opt in via module param (off by default). 14408c2ecf20Sopenharmony_ci * Bypasses EmulateOnUD restriction despite emulating 14418c2ecf20Sopenharmony_ci * due to an intercepted #UD (see EMULTYPE_TRAP_UD). 14428c2ecf20Sopenharmony_ci * Used to test the full emulator from userspace. 14438c2ecf20Sopenharmony_ci * 14448c2ecf20Sopenharmony_ci * EMULTYPE_VMWARE_GP - Set when emulating an intercepted #GP for VMware 14458c2ecf20Sopenharmony_ci * backdoor emulation, which is opt in via module param. 14468c2ecf20Sopenharmony_ci * VMware backoor emulation handles select instructions 14478c2ecf20Sopenharmony_ci * and reinjects the #GP for all other cases. 14488c2ecf20Sopenharmony_ci * 14498c2ecf20Sopenharmony_ci * EMULTYPE_PF - Set when emulating MMIO by way of an intercepted #PF, in which 14508c2ecf20Sopenharmony_ci * case the CR2/GPA value pass on the stack is valid. 14518c2ecf20Sopenharmony_ci */ 14528c2ecf20Sopenharmony_ci#define EMULTYPE_NO_DECODE (1 << 0) 14538c2ecf20Sopenharmony_ci#define EMULTYPE_TRAP_UD (1 << 1) 14548c2ecf20Sopenharmony_ci#define EMULTYPE_SKIP (1 << 2) 14558c2ecf20Sopenharmony_ci#define EMULTYPE_ALLOW_RETRY_PF (1 << 3) 14568c2ecf20Sopenharmony_ci#define EMULTYPE_TRAP_UD_FORCED (1 << 4) 14578c2ecf20Sopenharmony_ci#define EMULTYPE_VMWARE_GP (1 << 5) 14588c2ecf20Sopenharmony_ci#define EMULTYPE_PF (1 << 6) 14598c2ecf20Sopenharmony_ci 14608c2ecf20Sopenharmony_ciint kvm_emulate_instruction(struct kvm_vcpu *vcpu, int emulation_type); 14618c2ecf20Sopenharmony_ciint kvm_emulate_instruction_from_buffer(struct kvm_vcpu *vcpu, 14628c2ecf20Sopenharmony_ci void *insn, int insn_len); 14638c2ecf20Sopenharmony_ci 14648c2ecf20Sopenharmony_civoid kvm_enable_efer_bits(u64); 14658c2ecf20Sopenharmony_cibool kvm_valid_efer(struct kvm_vcpu *vcpu, u64 efer); 14668c2ecf20Sopenharmony_ciint __kvm_get_msr(struct kvm_vcpu *vcpu, u32 index, u64 *data, bool host_initiated); 14678c2ecf20Sopenharmony_ciint kvm_get_msr(struct kvm_vcpu *vcpu, u32 index, u64 *data); 14688c2ecf20Sopenharmony_ciint kvm_set_msr(struct kvm_vcpu *vcpu, u32 index, u64 data); 14698c2ecf20Sopenharmony_ciint kvm_emulate_rdmsr(struct kvm_vcpu *vcpu); 14708c2ecf20Sopenharmony_ciint kvm_emulate_wrmsr(struct kvm_vcpu *vcpu); 14718c2ecf20Sopenharmony_ci 14728c2ecf20Sopenharmony_ciint kvm_fast_pio(struct kvm_vcpu *vcpu, int size, unsigned short port, int in); 14738c2ecf20Sopenharmony_ciint kvm_emulate_cpuid(struct kvm_vcpu *vcpu); 14748c2ecf20Sopenharmony_ciint kvm_emulate_halt(struct kvm_vcpu *vcpu); 14758c2ecf20Sopenharmony_ciint kvm_vcpu_halt(struct kvm_vcpu *vcpu); 14768c2ecf20Sopenharmony_ciint kvm_emulate_wbinvd(struct kvm_vcpu *vcpu); 14778c2ecf20Sopenharmony_ci 14788c2ecf20Sopenharmony_civoid kvm_get_segment(struct kvm_vcpu *vcpu, struct kvm_segment *var, int seg); 14798c2ecf20Sopenharmony_ciint kvm_load_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector, int seg); 14808c2ecf20Sopenharmony_civoid kvm_vcpu_deliver_sipi_vector(struct kvm_vcpu *vcpu, u8 vector); 14818c2ecf20Sopenharmony_ci 14828c2ecf20Sopenharmony_ciint kvm_task_switch(struct kvm_vcpu *vcpu, u16 tss_selector, int idt_index, 14838c2ecf20Sopenharmony_ci int reason, bool has_error_code, u32 error_code); 14848c2ecf20Sopenharmony_ci 14858c2ecf20Sopenharmony_ciint kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0); 14868c2ecf20Sopenharmony_ciint kvm_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3); 14878c2ecf20Sopenharmony_ciint kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4); 14888c2ecf20Sopenharmony_ciint kvm_set_cr8(struct kvm_vcpu *vcpu, unsigned long cr8); 14898c2ecf20Sopenharmony_ciint kvm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long val); 14908c2ecf20Sopenharmony_ciint kvm_get_dr(struct kvm_vcpu *vcpu, int dr, unsigned long *val); 14918c2ecf20Sopenharmony_ciunsigned long kvm_get_cr8(struct kvm_vcpu *vcpu); 14928c2ecf20Sopenharmony_civoid kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw); 14938c2ecf20Sopenharmony_civoid kvm_get_cs_db_l_bits(struct kvm_vcpu *vcpu, int *db, int *l); 14948c2ecf20Sopenharmony_ciint kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr); 14958c2ecf20Sopenharmony_ci 14968c2ecf20Sopenharmony_ciint kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr); 14978c2ecf20Sopenharmony_ciint kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr); 14988c2ecf20Sopenharmony_ci 14998c2ecf20Sopenharmony_ciunsigned long kvm_get_rflags(struct kvm_vcpu *vcpu); 15008c2ecf20Sopenharmony_civoid kvm_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags); 15018c2ecf20Sopenharmony_cibool kvm_rdpmc(struct kvm_vcpu *vcpu); 15028c2ecf20Sopenharmony_ci 15038c2ecf20Sopenharmony_civoid kvm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr); 15048c2ecf20Sopenharmony_civoid kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code); 15058c2ecf20Sopenharmony_civoid kvm_queue_exception_p(struct kvm_vcpu *vcpu, unsigned nr, unsigned long payload); 15068c2ecf20Sopenharmony_civoid kvm_requeue_exception(struct kvm_vcpu *vcpu, unsigned nr); 15078c2ecf20Sopenharmony_civoid kvm_requeue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code); 15088c2ecf20Sopenharmony_civoid kvm_inject_page_fault(struct kvm_vcpu *vcpu, struct x86_exception *fault); 15098c2ecf20Sopenharmony_cibool kvm_inject_emulated_page_fault(struct kvm_vcpu *vcpu, 15108c2ecf20Sopenharmony_ci struct x86_exception *fault); 15118c2ecf20Sopenharmony_ciint kvm_read_guest_page_mmu(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, 15128c2ecf20Sopenharmony_ci gfn_t gfn, void *data, int offset, int len, 15138c2ecf20Sopenharmony_ci u32 access); 15148c2ecf20Sopenharmony_cibool kvm_require_cpl(struct kvm_vcpu *vcpu, int required_cpl); 15158c2ecf20Sopenharmony_cibool kvm_require_dr(struct kvm_vcpu *vcpu, int dr); 15168c2ecf20Sopenharmony_ci 15178c2ecf20Sopenharmony_cistatic inline int __kvm_irq_line_state(unsigned long *irq_state, 15188c2ecf20Sopenharmony_ci int irq_source_id, int level) 15198c2ecf20Sopenharmony_ci{ 15208c2ecf20Sopenharmony_ci /* Logical OR for level trig interrupt */ 15218c2ecf20Sopenharmony_ci if (level) 15228c2ecf20Sopenharmony_ci __set_bit(irq_source_id, irq_state); 15238c2ecf20Sopenharmony_ci else 15248c2ecf20Sopenharmony_ci __clear_bit(irq_source_id, irq_state); 15258c2ecf20Sopenharmony_ci 15268c2ecf20Sopenharmony_ci return !!(*irq_state); 15278c2ecf20Sopenharmony_ci} 15288c2ecf20Sopenharmony_ci 15298c2ecf20Sopenharmony_ci#define KVM_MMU_ROOT_CURRENT BIT(0) 15308c2ecf20Sopenharmony_ci#define KVM_MMU_ROOT_PREVIOUS(i) BIT(1+i) 15318c2ecf20Sopenharmony_ci#define KVM_MMU_ROOTS_ALL (~0UL) 15328c2ecf20Sopenharmony_ci 15338c2ecf20Sopenharmony_ciint kvm_pic_set_irq(struct kvm_pic *pic, int irq, int irq_source_id, int level); 15348c2ecf20Sopenharmony_civoid kvm_pic_clear_all(struct kvm_pic *pic, int irq_source_id); 15358c2ecf20Sopenharmony_ci 15368c2ecf20Sopenharmony_civoid kvm_inject_nmi(struct kvm_vcpu *vcpu); 15378c2ecf20Sopenharmony_ci 15388c2ecf20Sopenharmony_civoid kvm_update_dr7(struct kvm_vcpu *vcpu); 15398c2ecf20Sopenharmony_ci 15408c2ecf20Sopenharmony_ciint kvm_mmu_unprotect_page(struct kvm *kvm, gfn_t gfn); 15418c2ecf20Sopenharmony_ciint kvm_mmu_unprotect_page_virt(struct kvm_vcpu *vcpu, gva_t gva); 15428c2ecf20Sopenharmony_civoid __kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu); 15438c2ecf20Sopenharmony_ciint kvm_mmu_load(struct kvm_vcpu *vcpu); 15448c2ecf20Sopenharmony_civoid kvm_mmu_unload(struct kvm_vcpu *vcpu); 15458c2ecf20Sopenharmony_civoid kvm_mmu_sync_roots(struct kvm_vcpu *vcpu); 15468c2ecf20Sopenharmony_civoid kvm_mmu_free_roots(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, 15478c2ecf20Sopenharmony_ci ulong roots_to_free); 15488c2ecf20Sopenharmony_cigpa_t translate_nested_gpa(struct kvm_vcpu *vcpu, gpa_t gpa, u32 access, 15498c2ecf20Sopenharmony_ci struct x86_exception *exception); 15508c2ecf20Sopenharmony_cigpa_t kvm_mmu_gva_to_gpa_read(struct kvm_vcpu *vcpu, gva_t gva, 15518c2ecf20Sopenharmony_ci struct x86_exception *exception); 15528c2ecf20Sopenharmony_cigpa_t kvm_mmu_gva_to_gpa_fetch(struct kvm_vcpu *vcpu, gva_t gva, 15538c2ecf20Sopenharmony_ci struct x86_exception *exception); 15548c2ecf20Sopenharmony_cigpa_t kvm_mmu_gva_to_gpa_write(struct kvm_vcpu *vcpu, gva_t gva, 15558c2ecf20Sopenharmony_ci struct x86_exception *exception); 15568c2ecf20Sopenharmony_cigpa_t kvm_mmu_gva_to_gpa_system(struct kvm_vcpu *vcpu, gva_t gva, 15578c2ecf20Sopenharmony_ci struct x86_exception *exception); 15588c2ecf20Sopenharmony_ci 15598c2ecf20Sopenharmony_cibool kvm_apicv_activated(struct kvm *kvm); 15608c2ecf20Sopenharmony_civoid kvm_apicv_init(struct kvm *kvm, bool enable); 15618c2ecf20Sopenharmony_civoid kvm_vcpu_update_apicv(struct kvm_vcpu *vcpu); 15628c2ecf20Sopenharmony_civoid kvm_request_apicv_update(struct kvm *kvm, bool activate, 15638c2ecf20Sopenharmony_ci unsigned long bit); 15648c2ecf20Sopenharmony_ci 15658c2ecf20Sopenharmony_ciint kvm_emulate_hypercall(struct kvm_vcpu *vcpu); 15668c2ecf20Sopenharmony_ci 15678c2ecf20Sopenharmony_ciint kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u64 error_code, 15688c2ecf20Sopenharmony_ci void *insn, int insn_len); 15698c2ecf20Sopenharmony_civoid kvm_mmu_invlpg(struct kvm_vcpu *vcpu, gva_t gva); 15708c2ecf20Sopenharmony_civoid kvm_mmu_invalidate_gva(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, 15718c2ecf20Sopenharmony_ci gva_t gva, hpa_t root_hpa); 15728c2ecf20Sopenharmony_civoid kvm_mmu_invpcid_gva(struct kvm_vcpu *vcpu, gva_t gva, unsigned long pcid); 15738c2ecf20Sopenharmony_civoid kvm_mmu_new_pgd(struct kvm_vcpu *vcpu, gpa_t new_pgd, bool skip_tlb_flush, 15748c2ecf20Sopenharmony_ci bool skip_mmu_sync); 15758c2ecf20Sopenharmony_ci 15768c2ecf20Sopenharmony_civoid kvm_configure_mmu(bool enable_tdp, int tdp_max_root_level, 15778c2ecf20Sopenharmony_ci int tdp_huge_page_level); 15788c2ecf20Sopenharmony_ci 15798c2ecf20Sopenharmony_cistatic inline u16 kvm_read_ldt(void) 15808c2ecf20Sopenharmony_ci{ 15818c2ecf20Sopenharmony_ci u16 ldt; 15828c2ecf20Sopenharmony_ci asm("sldt %0" : "=g"(ldt)); 15838c2ecf20Sopenharmony_ci return ldt; 15848c2ecf20Sopenharmony_ci} 15858c2ecf20Sopenharmony_ci 15868c2ecf20Sopenharmony_cistatic inline void kvm_load_ldt(u16 sel) 15878c2ecf20Sopenharmony_ci{ 15888c2ecf20Sopenharmony_ci asm("lldt %0" : : "rm"(sel)); 15898c2ecf20Sopenharmony_ci} 15908c2ecf20Sopenharmony_ci 15918c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_64 15928c2ecf20Sopenharmony_cistatic inline unsigned long read_msr(unsigned long msr) 15938c2ecf20Sopenharmony_ci{ 15948c2ecf20Sopenharmony_ci u64 value; 15958c2ecf20Sopenharmony_ci 15968c2ecf20Sopenharmony_ci rdmsrl(msr, value); 15978c2ecf20Sopenharmony_ci return value; 15988c2ecf20Sopenharmony_ci} 15998c2ecf20Sopenharmony_ci#endif 16008c2ecf20Sopenharmony_ci 16018c2ecf20Sopenharmony_cistatic inline u32 get_rdx_init_val(void) 16028c2ecf20Sopenharmony_ci{ 16038c2ecf20Sopenharmony_ci return 0x600; /* P6 family */ 16048c2ecf20Sopenharmony_ci} 16058c2ecf20Sopenharmony_ci 16068c2ecf20Sopenharmony_cistatic inline void kvm_inject_gp(struct kvm_vcpu *vcpu, u32 error_code) 16078c2ecf20Sopenharmony_ci{ 16088c2ecf20Sopenharmony_ci kvm_queue_exception_e(vcpu, GP_VECTOR, error_code); 16098c2ecf20Sopenharmony_ci} 16108c2ecf20Sopenharmony_ci 16118c2ecf20Sopenharmony_ci#define TSS_IOPB_BASE_OFFSET 0x66 16128c2ecf20Sopenharmony_ci#define TSS_BASE_SIZE 0x68 16138c2ecf20Sopenharmony_ci#define TSS_IOPB_SIZE (65536 / 8) 16148c2ecf20Sopenharmony_ci#define TSS_REDIRECTION_SIZE (256 / 8) 16158c2ecf20Sopenharmony_ci#define RMODE_TSS_SIZE \ 16168c2ecf20Sopenharmony_ci (TSS_BASE_SIZE + TSS_REDIRECTION_SIZE + TSS_IOPB_SIZE + 1) 16178c2ecf20Sopenharmony_ci 16188c2ecf20Sopenharmony_cienum { 16198c2ecf20Sopenharmony_ci TASK_SWITCH_CALL = 0, 16208c2ecf20Sopenharmony_ci TASK_SWITCH_IRET = 1, 16218c2ecf20Sopenharmony_ci TASK_SWITCH_JMP = 2, 16228c2ecf20Sopenharmony_ci TASK_SWITCH_GATE = 3, 16238c2ecf20Sopenharmony_ci}; 16248c2ecf20Sopenharmony_ci 16258c2ecf20Sopenharmony_ci#define HF_GIF_MASK (1 << 0) 16268c2ecf20Sopenharmony_ci#define HF_NMI_MASK (1 << 3) 16278c2ecf20Sopenharmony_ci#define HF_IRET_MASK (1 << 4) 16288c2ecf20Sopenharmony_ci#define HF_GUEST_MASK (1 << 5) /* VCPU is in guest-mode */ 16298c2ecf20Sopenharmony_ci#define HF_SMM_MASK (1 << 6) 16308c2ecf20Sopenharmony_ci#define HF_SMM_INSIDE_NMI_MASK (1 << 7) 16318c2ecf20Sopenharmony_ci 16328c2ecf20Sopenharmony_ci#define __KVM_VCPU_MULTIPLE_ADDRESS_SPACE 16338c2ecf20Sopenharmony_ci#define KVM_ADDRESS_SPACE_NUM 2 16348c2ecf20Sopenharmony_ci 16358c2ecf20Sopenharmony_ci#define kvm_arch_vcpu_memslots_id(vcpu) ((vcpu)->arch.hflags & HF_SMM_MASK ? 1 : 0) 16368c2ecf20Sopenharmony_ci#define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, (role).smm) 16378c2ecf20Sopenharmony_ci 16388c2ecf20Sopenharmony_ciasmlinkage void kvm_spurious_fault(void); 16398c2ecf20Sopenharmony_ci 16408c2ecf20Sopenharmony_ci/* 16418c2ecf20Sopenharmony_ci * Hardware virtualization extension instructions may fault if a 16428c2ecf20Sopenharmony_ci * reboot turns off virtualization while processes are running. 16438c2ecf20Sopenharmony_ci * Usually after catching the fault we just panic; during reboot 16448c2ecf20Sopenharmony_ci * instead the instruction is ignored. 16458c2ecf20Sopenharmony_ci */ 16468c2ecf20Sopenharmony_ci#define __kvm_handle_fault_on_reboot(insn) \ 16478c2ecf20Sopenharmony_ci "666: \n\t" \ 16488c2ecf20Sopenharmony_ci insn "\n\t" \ 16498c2ecf20Sopenharmony_ci "jmp 668f \n\t" \ 16508c2ecf20Sopenharmony_ci "667: \n\t" \ 16518c2ecf20Sopenharmony_ci "1: \n\t" \ 16528c2ecf20Sopenharmony_ci ".pushsection .discard.instr_begin \n\t" \ 16538c2ecf20Sopenharmony_ci ".long 1b - . \n\t" \ 16548c2ecf20Sopenharmony_ci ".popsection \n\t" \ 16558c2ecf20Sopenharmony_ci "call kvm_spurious_fault \n\t" \ 16568c2ecf20Sopenharmony_ci "1: \n\t" \ 16578c2ecf20Sopenharmony_ci ".pushsection .discard.instr_end \n\t" \ 16588c2ecf20Sopenharmony_ci ".long 1b - . \n\t" \ 16598c2ecf20Sopenharmony_ci ".popsection \n\t" \ 16608c2ecf20Sopenharmony_ci "668: \n\t" \ 16618c2ecf20Sopenharmony_ci _ASM_EXTABLE(666b, 667b) 16628c2ecf20Sopenharmony_ci 16638c2ecf20Sopenharmony_ci#define KVM_ARCH_WANT_MMU_NOTIFIER 16648c2ecf20Sopenharmony_ciint kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end, 16658c2ecf20Sopenharmony_ci unsigned flags); 16668c2ecf20Sopenharmony_ciint kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end); 16678c2ecf20Sopenharmony_ciint kvm_test_age_hva(struct kvm *kvm, unsigned long hva); 16688c2ecf20Sopenharmony_ciint kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte); 16698c2ecf20Sopenharmony_ciint kvm_cpu_has_injectable_intr(struct kvm_vcpu *v); 16708c2ecf20Sopenharmony_ciint kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu); 16718c2ecf20Sopenharmony_ciint kvm_cpu_has_extint(struct kvm_vcpu *v); 16728c2ecf20Sopenharmony_ciint kvm_arch_interrupt_allowed(struct kvm_vcpu *vcpu); 16738c2ecf20Sopenharmony_ciint kvm_cpu_get_interrupt(struct kvm_vcpu *v); 16748c2ecf20Sopenharmony_civoid kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event); 16758c2ecf20Sopenharmony_civoid kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu); 16768c2ecf20Sopenharmony_ci 16778c2ecf20Sopenharmony_ciint kvm_pv_send_ipi(struct kvm *kvm, unsigned long ipi_bitmap_low, 16788c2ecf20Sopenharmony_ci unsigned long ipi_bitmap_high, u32 min, 16798c2ecf20Sopenharmony_ci unsigned long icr, int op_64_bit); 16808c2ecf20Sopenharmony_ci 16818c2ecf20Sopenharmony_civoid kvm_define_user_return_msr(unsigned index, u32 msr); 16828c2ecf20Sopenharmony_ciint kvm_probe_user_return_msr(u32 msr); 16838c2ecf20Sopenharmony_ciint kvm_set_user_return_msr(unsigned index, u64 val, u64 mask); 16848c2ecf20Sopenharmony_ci 16858c2ecf20Sopenharmony_ciu64 kvm_scale_tsc(struct kvm_vcpu *vcpu, u64 tsc); 16868c2ecf20Sopenharmony_ciu64 kvm_read_l1_tsc(struct kvm_vcpu *vcpu, u64 host_tsc); 16878c2ecf20Sopenharmony_ci 16888c2ecf20Sopenharmony_ciunsigned long kvm_get_linear_rip(struct kvm_vcpu *vcpu); 16898c2ecf20Sopenharmony_cibool kvm_is_linear_rip(struct kvm_vcpu *vcpu, unsigned long linear_rip); 16908c2ecf20Sopenharmony_ci 16918c2ecf20Sopenharmony_civoid kvm_make_mclock_inprogress_request(struct kvm *kvm); 16928c2ecf20Sopenharmony_civoid kvm_make_scan_ioapic_request(struct kvm *kvm); 16938c2ecf20Sopenharmony_civoid kvm_make_scan_ioapic_request_mask(struct kvm *kvm, 16948c2ecf20Sopenharmony_ci unsigned long *vcpu_bitmap); 16958c2ecf20Sopenharmony_ci 16968c2ecf20Sopenharmony_cibool kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu, 16978c2ecf20Sopenharmony_ci struct kvm_async_pf *work); 16988c2ecf20Sopenharmony_civoid kvm_arch_async_page_present(struct kvm_vcpu *vcpu, 16998c2ecf20Sopenharmony_ci struct kvm_async_pf *work); 17008c2ecf20Sopenharmony_civoid kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, 17018c2ecf20Sopenharmony_ci struct kvm_async_pf *work); 17028c2ecf20Sopenharmony_civoid kvm_arch_async_page_present_queued(struct kvm_vcpu *vcpu); 17038c2ecf20Sopenharmony_cibool kvm_arch_can_dequeue_async_page_present(struct kvm_vcpu *vcpu); 17048c2ecf20Sopenharmony_ciextern bool kvm_find_async_pf_gfn(struct kvm_vcpu *vcpu, gfn_t gfn); 17058c2ecf20Sopenharmony_ci 17068c2ecf20Sopenharmony_ciint kvm_skip_emulated_instruction(struct kvm_vcpu *vcpu); 17078c2ecf20Sopenharmony_ciint kvm_complete_insn_gp(struct kvm_vcpu *vcpu, int err); 17088c2ecf20Sopenharmony_civoid __kvm_request_immediate_exit(struct kvm_vcpu *vcpu); 17098c2ecf20Sopenharmony_ci 17108c2ecf20Sopenharmony_ciint kvm_is_in_guest(void); 17118c2ecf20Sopenharmony_ci 17128c2ecf20Sopenharmony_ciint __x86_set_memory_region(struct kvm *kvm, int id, gpa_t gpa, u32 size); 17138c2ecf20Sopenharmony_cibool kvm_vcpu_is_reset_bsp(struct kvm_vcpu *vcpu); 17148c2ecf20Sopenharmony_cibool kvm_vcpu_is_bsp(struct kvm_vcpu *vcpu); 17158c2ecf20Sopenharmony_ci 17168c2ecf20Sopenharmony_cibool kvm_intr_is_single_vcpu(struct kvm *kvm, struct kvm_lapic_irq *irq, 17178c2ecf20Sopenharmony_ci struct kvm_vcpu **dest_vcpu); 17188c2ecf20Sopenharmony_ci 17198c2ecf20Sopenharmony_civoid kvm_set_msi_irq(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, 17208c2ecf20Sopenharmony_ci struct kvm_lapic_irq *irq); 17218c2ecf20Sopenharmony_ci 17228c2ecf20Sopenharmony_cistatic inline bool kvm_irq_is_postable(struct kvm_lapic_irq *irq) 17238c2ecf20Sopenharmony_ci{ 17248c2ecf20Sopenharmony_ci /* We can only post Fixed and LowPrio IRQs */ 17258c2ecf20Sopenharmony_ci return (irq->delivery_mode == APIC_DM_FIXED || 17268c2ecf20Sopenharmony_ci irq->delivery_mode == APIC_DM_LOWEST); 17278c2ecf20Sopenharmony_ci} 17288c2ecf20Sopenharmony_ci 17298c2ecf20Sopenharmony_cistatic inline void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu) 17308c2ecf20Sopenharmony_ci{ 17318c2ecf20Sopenharmony_ci if (kvm_x86_ops.vcpu_blocking) 17328c2ecf20Sopenharmony_ci kvm_x86_ops.vcpu_blocking(vcpu); 17338c2ecf20Sopenharmony_ci} 17348c2ecf20Sopenharmony_ci 17358c2ecf20Sopenharmony_cistatic inline void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu) 17368c2ecf20Sopenharmony_ci{ 17378c2ecf20Sopenharmony_ci if (kvm_x86_ops.vcpu_unblocking) 17388c2ecf20Sopenharmony_ci kvm_x86_ops.vcpu_unblocking(vcpu); 17398c2ecf20Sopenharmony_ci} 17408c2ecf20Sopenharmony_ci 17418c2ecf20Sopenharmony_cistatic inline void kvm_arch_vcpu_block_finish(struct kvm_vcpu *vcpu) {} 17428c2ecf20Sopenharmony_ci 17438c2ecf20Sopenharmony_cistatic inline int kvm_cpu_get_apicid(int mps_cpu) 17448c2ecf20Sopenharmony_ci{ 17458c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_LOCAL_APIC 17468c2ecf20Sopenharmony_ci return default_cpu_present_to_apicid(mps_cpu); 17478c2ecf20Sopenharmony_ci#else 17488c2ecf20Sopenharmony_ci WARN_ON_ONCE(1); 17498c2ecf20Sopenharmony_ci return BAD_APICID; 17508c2ecf20Sopenharmony_ci#endif 17518c2ecf20Sopenharmony_ci} 17528c2ecf20Sopenharmony_ci 17538c2ecf20Sopenharmony_ci#define put_smstate(type, buf, offset, val) \ 17548c2ecf20Sopenharmony_ci *(type *)((buf) + (offset) - 0x7e00) = val 17558c2ecf20Sopenharmony_ci 17568c2ecf20Sopenharmony_ci#define GET_SMSTATE(type, buf, offset) \ 17578c2ecf20Sopenharmony_ci (*(type *)((buf) + (offset) - 0x7e00)) 17588c2ecf20Sopenharmony_ci 17598c2ecf20Sopenharmony_ci#endif /* _ASM_X86_KVM_HOST_H */ 1760