]> git.ipfire.org Git - thirdparty/kernel/stable.git/blobdiff - arch/x86/include/asm/kvm_host.h
Merge tag 'kvm-x86-mmu-6.8' of https://github.com/kvm-x86/linux into HEAD
[thirdparty/kernel/stable.git] / arch / x86 / include / asm / kvm_host.h
index 414691169a0465eb9c42f37df26dc4835c76c1ad..7bc1daf6874174d5102d91eee51e4f860d1c0c1a 100644 (file)
                          | X86_CR4_PGE | X86_CR4_PCE | X86_CR4_OSFXSR | X86_CR4_PCIDE \
                          | X86_CR4_OSXSAVE | X86_CR4_SMEP | X86_CR4_FSGSBASE \
                          | X86_CR4_OSXMMEXCPT | X86_CR4_LA57 | X86_CR4_VMXE \
-                         | X86_CR4_SMAP | X86_CR4_PKE | X86_CR4_UMIP))
+                         | X86_CR4_SMAP | X86_CR4_PKE | X86_CR4_UMIP \
+                         | X86_CR4_LAM_SUP))
 
 #define CR8_RESERVED_BITS (~(unsigned long)X86_CR8_TPR)
 
@@ -500,8 +501,23 @@ struct kvm_pmc {
        u8 idx;
        bool is_paused;
        bool intr;
+       /*
+        * Base value of the PMC counter, relative to the *consumed* count in
+        * the associated perf_event.  This value includes counter updates from
+        * the perf_event and emulated_count since the last time the counter
+        * was reprogrammed, but it is *not* the current value as seen by the
+        * guest or userspace.
+        *
+        * The count is relative to the associated perf_event so that KVM
+        * doesn't need to reprogram the perf_event every time the guest writes
+        * to the counter.
+        */
        u64 counter;
-       u64 prev_counter;
+       /*
+        * PMC events triggered by KVM emulation that haven't been fully
+        * processed, i.e. haven't undergone overflow detection.
+        */
+       u64 emulated_counter;
        u64 eventsel;
        struct perf_event *perf_event;
        struct kvm_vcpu *vcpu;
@@ -937,8 +953,10 @@ struct kvm_vcpu_arch {
        /* used for guest single stepping over the given code position */
        unsigned long singlestep_rip;
 
+#ifdef CONFIG_KVM_HYPERV
        bool hyperv_enabled;
        struct kvm_vcpu_hv *hyperv;
+#endif
 #ifdef CONFIG_KVM_XEN
        struct kvm_vcpu_xen xen;
 #endif
@@ -1095,6 +1113,7 @@ enum hv_tsc_page_status {
        HV_TSC_PAGE_BROKEN,
 };
 
+#ifdef CONFIG_KVM_HYPERV
 /* Hyper-V emulation context */
 struct kvm_hv {
        struct mutex hv_lock;
@@ -1125,9 +1144,9 @@ struct kvm_hv {
         */
        unsigned int synic_auto_eoi_used;
 
-       struct hv_partition_assist_pg *hv_pa_pg;
        struct kvm_hv_syndbg hv_syndbg;
 };
+#endif
 
 struct msr_bitmap_range {
        u32 flags;
@@ -1136,6 +1155,7 @@ struct msr_bitmap_range {
        unsigned long *bitmap;
 };
 
+#ifdef CONFIG_KVM_XEN
 /* Xen emulation context */
 struct kvm_xen {
        struct mutex xen_lock;
@@ -1147,6 +1167,7 @@ struct kvm_xen {
        struct idr evtchn_ports;
        unsigned long poll_mask[BITS_TO_LONGS(KVM_MAX_VCPUS)];
 };
+#endif
 
 enum kvm_irqchip_mode {
        KVM_IRQCHIP_NONE,
@@ -1348,8 +1369,13 @@ struct kvm_arch {
        /* reads protected by irq_srcu, writes by irq_lock */
        struct hlist_head mask_notifier_list;
 
+#ifdef CONFIG_KVM_HYPERV
        struct kvm_hv hyperv;
+#endif
+
+#ifdef CONFIG_KVM_XEN
        struct kvm_xen xen;
+#endif
 
        bool backwards_tsc_observed;
        bool boot_vcpu_runs_old_kvmclock;
@@ -1443,6 +1469,7 @@ struct kvm_arch {
 #if IS_ENABLED(CONFIG_HYPERV)
        hpa_t   hv_root_tdp;
        spinlock_t hv_root_tdp_lock;
+       struct hv_partition_assist_pg *hv_pa_pg;
 #endif
        /*
         * VM-scope maximum vCPU ID. Used to determine the size of structures
@@ -1615,9 +1642,11 @@ struct kvm_x86_ops {
 
        void (*flush_tlb_all)(struct kvm_vcpu *vcpu);
        void (*flush_tlb_current)(struct kvm_vcpu *vcpu);
+#if IS_ENABLED(CONFIG_HYPERV)
        int  (*flush_remote_tlbs)(struct kvm *kvm);
        int  (*flush_remote_tlbs_range)(struct kvm *kvm, gfn_t gfn,
                                        gfn_t nr_pages);
+#endif
 
        /*
         * Flush any TLB entries associated with the given GVA.
@@ -1763,6 +1792,8 @@ struct kvm_x86_ops {
         * Returns vCPU specific APICv inhibit reasons
         */
        unsigned long (*vcpu_get_apicv_inhibit_reasons)(struct kvm_vcpu *vcpu);
+
+       gva_t (*get_untagged_addr)(struct kvm_vcpu *vcpu, gva_t gva, unsigned int flags);
 };
 
 struct kvm_x86_nested_ops {
@@ -1826,6 +1857,7 @@ static inline struct kvm *kvm_arch_alloc_vm(void)
 #define __KVM_HAVE_ARCH_VM_FREE
 void kvm_arch_free_vm(struct kvm *kvm);
 
+#if IS_ENABLED(CONFIG_HYPERV)
 #define __KVM_HAVE_ARCH_FLUSH_REMOTE_TLBS
 static inline int kvm_arch_flush_remote_tlbs(struct kvm *kvm)
 {
@@ -1837,6 +1869,15 @@ static inline int kvm_arch_flush_remote_tlbs(struct kvm *kvm)
 }
 
 #define __KVM_HAVE_ARCH_FLUSH_REMOTE_TLBS_RANGE
+static inline int kvm_arch_flush_remote_tlbs_range(struct kvm *kvm, gfn_t gfn,
+                                                  u64 nr_pages)
+{
+       if (!kvm_x86_ops.flush_remote_tlbs_range)
+               return -EOPNOTSUPP;
+
+       return static_call(kvm_x86_flush_remote_tlbs_range)(kvm, gfn, nr_pages);
+}
+#endif /* CONFIG_HYPERV */
 
 #define kvm_arch_pmi_in_guest(vcpu) \
        ((vcpu) && (vcpu)->arch.handling_intr_from_guest)