perf/core: Rework guest callbacks to prepare for static_call support
[linux-2.6-microblaze.git] / arch / x86 / include / asm / kvm_host.h
index 5a0298a..fa1b1a2 100644 (file)
@@ -38,7 +38,6 @@
 #define __KVM_HAVE_ARCH_VCPU_DEBUGFS
 
 #define KVM_MAX_VCPUS 1024
-#define KVM_SOFT_MAX_VCPUS 710
 
 /*
  * In x86, the VCPU ID corresponds to the APIC ID, and APIC IDs
@@ -50,7 +49,7 @@
  * so ratio of 4 should be enough.
  */
 #define KVM_VCPU_ID_RATIO 4
-#define KVM_MAX_VCPU_ID (KVM_MAX_VCPUS * KVM_VCPU_ID_RATIO)
+#define KVM_MAX_VCPU_IDS (KVM_MAX_VCPUS * KVM_VCPU_ID_RATIO)
 
 /* memory slots that are not exposed to userspace */
 #define KVM_PRIVATE_MEM_SLOTS 3
@@ -407,6 +406,7 @@ struct kvm_mmu_root_info {
 #define KVM_HAVE_MMU_RWLOCK
 
 struct kvm_mmu_page;
+struct kvm_page_fault;
 
 /*
  * x86 supports 4 paging modes (5-level 64-bit, 4-level 64-bit, 3-level 32-bit,
@@ -416,8 +416,7 @@ struct kvm_mmu_page;
 struct kvm_mmu {
        unsigned long (*get_guest_pgd)(struct kvm_vcpu *vcpu);
        u64 (*get_pdptr)(struct kvm_vcpu *vcpu, int index);
-       int (*page_fault)(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u32 err,
-                         bool prefault);
+       int (*page_fault)(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault);
        void (*inject_page_fault)(struct kvm_vcpu *vcpu,
                                  struct x86_exception *fault);
        gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gpa_t gva_or_gpa,
@@ -499,7 +498,6 @@ struct kvm_pmu {
        u64 fixed_ctr_ctrl;
        u64 global_ctrl;
        u64 global_status;
-       u64 global_ovf_ctrl;
        u64 counter_bitmask[2];
        u64 global_ctrl_mask;
        u64 global_ovf_ctrl_mask;
@@ -581,7 +579,6 @@ struct kvm_vcpu_hv {
        struct kvm_hyperv_exit exit;
        struct kvm_vcpu_hv_stimer stimer[HV_SYNIC_STIMER_COUNT];
        DECLARE_BITMAP(stimer_pending_bitmap, HV_SYNIC_STIMER_COUNT);
-       cpumask_t tlb_flush;
        bool enforce_cpuid;
        struct {
                u32 features_eax; /* HYPERV_CPUID_FEATURES.EAX */
@@ -691,11 +688,10 @@ struct kvm_vcpu_arch {
         *
         * Note that while the PKRU state lives inside the fpu registers,
         * it is switched out separately at VMENTER and VMEXIT time. The
-        * "guest_fpu" state here contains the guest FPU context, with the
+        * "guest_fpstate" state here contains the guest FPU context, with the
         * host PRKU bits.
         */
-       struct fpu *user_fpu;
-       struct fpu *guest_fpu;
+       struct fpu_guest guest_fpu;
 
        u64 xcr0;
        u64 guest_supported_xcr0;
@@ -728,6 +724,7 @@ struct kvm_vcpu_arch {
 
        int cpuid_nent;
        struct kvm_cpuid_entry2 *cpuid_entries;
+       u32 kvm_cpuid_base;
 
        u64 reserved_gpa_bits;
        int maxphyaddr;
@@ -751,7 +748,7 @@ struct kvm_vcpu_arch {
                u8 preempted;
                u64 msr_val;
                u64 last_steal;
-               struct gfn_to_pfn_cache cache;
+               struct gfn_to_hva_cache cache;
        } st;
 
        u64 l1_tsc_offset;
@@ -1037,6 +1034,7 @@ struct kvm_x86_msr_filter {
 #define APICV_INHIBIT_REASON_IRQWIN     3
 #define APICV_INHIBIT_REASON_PIT_REINJ  4
 #define APICV_INHIBIT_REASON_X2APIC    5
+#define APICV_INHIBIT_REASON_BLOCKIRQ  6
 
 struct kvm_arch {
        unsigned long n_used_mmu_pages;
@@ -1074,7 +1072,7 @@ struct kvm_arch {
        atomic_t apic_map_dirty;
 
        /* Protects apic_access_memslot_enabled and apicv_inhibit_reasons */
-       struct mutex apicv_update_lock;
+       struct rw_semaphore apicv_update_lock;
 
        bool apic_access_memslot_enabled;
        unsigned long apicv_inhibit_reasons;
@@ -1088,17 +1086,23 @@ struct kvm_arch {
 
        unsigned long irq_sources_bitmap;
        s64 kvmclock_offset;
+
+       /*
+        * This also protects nr_vcpus_matched_tsc which is read from a
+        * preemption-disabled region, so it must be a raw spinlock.
+        */
        raw_spinlock_t tsc_write_lock;
        u64 last_tsc_nsec;
        u64 last_tsc_write;
        u32 last_tsc_khz;
+       u64 last_tsc_offset;
        u64 cur_tsc_nsec;
        u64 cur_tsc_write;
        u64 cur_tsc_offset;
        u64 cur_tsc_generation;
        int nr_vcpus_matched_tsc;
 
-       spinlock_t pvclock_gtod_sync_lock;
+       seqcount_raw_spinlock_t pvclock_sc;
        bool use_master_clock;
        u64 master_kernel_ns;
        u64 master_cycle_now;
@@ -1208,10 +1212,11 @@ struct kvm_arch {
 #endif /* CONFIG_X86_64 */
 
        /*
-        * If set, rmaps have been allocated for all memslots and should be
-        * allocated for any newly created or modified memslots.
+        * If set, at least one shadow root has been allocated. This flag
+        * is used as one input when determining whether certain memslot
+        * related allocations are necessary.
         */
-       bool memslots_have_rmaps;
+       bool shadow_root_allocated;
 
 #if IS_ENABLED(CONFIG_HYPERV)
        hpa_t   hv_root_tdp;
@@ -1297,6 +1302,8 @@ static inline u16 kvm_lapic_irq_dest_mode(bool dest_mode_logical)
 }
 
 struct kvm_x86_ops {
+       const char *name;
+
        int (*hardware_enable)(void);
        void (*hardware_disable)(void);
        void (*hardware_unsetup)(void);
@@ -1406,10 +1413,11 @@ struct kvm_x86_ops {
        void (*write_tsc_multiplier)(struct kvm_vcpu *vcpu, u64 multiplier);
 
        /*
-        * Retrieve somewhat arbitrary exit information.  Intended to be used
-        * only from within tracepoints to avoid VMREADs when tracing is off.
+        * Retrieve somewhat arbitrary exit information.  Intended to
+        * be used only from within tracepoints or error paths.
         */
-       void (*get_exit_info)(struct kvm_vcpu *vcpu, u64 *info1, u64 *info2,
+       void (*get_exit_info)(struct kvm_vcpu *vcpu, u32 *reason,
+                             u64 *info1, u64 *info2,
                              u32 *exit_int_info, u32 *exit_int_info_err_code);
 
        int (*check_intercept)(struct kvm_vcpu *vcpu,
@@ -1469,6 +1477,7 @@ struct kvm_x86_ops {
        int (*mem_enc_reg_region)(struct kvm *kvm, struct kvm_enc_region *argp);
        int (*mem_enc_unreg_region)(struct kvm *kvm, struct kvm_enc_region *argp);
        int (*vm_copy_enc_context_from)(struct kvm *kvm, unsigned int source_fd);
+       int (*vm_move_enc_context_from)(struct kvm *kvm, unsigned int source_fd);
 
        int (*get_msr_feature)(struct kvm_msr_entry *entry);
 
@@ -1507,6 +1516,7 @@ struct kvm_x86_init_ops {
        int (*disabled_by_bios)(void);
        int (*check_processor_compatibility)(void);
        int (*hardware_setup)(void);
+       bool (*intel_pt_intr_in_guest)(void);
 
        struct kvm_x86_ops *runtime_ops;
 };
@@ -1542,6 +1552,8 @@ static inline struct kvm *kvm_arch_alloc_vm(void)
 {
        return __vmalloc(kvm_x86_ops.vm_size, GFP_KERNEL_ACCOUNT | __GFP_ZERO);
 }
+
+#define __KVM_HAVE_ARCH_VM_FREE
 void kvm_arch_free_vm(struct kvm *kvm);
 
 #define __KVM_HAVE_ARCH_FLUSH_REMOTE_TLB
@@ -1658,6 +1670,9 @@ extern u64 kvm_mce_cap_supported;
 int kvm_emulate_instruction(struct kvm_vcpu *vcpu, int emulation_type);
 int kvm_emulate_instruction_from_buffer(struct kvm_vcpu *vcpu,
                                        void *insn, int insn_len);
+void __kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu,
+                                         u64 *data, u8 ndata);
+void kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu);
 
 void kvm_enable_efer_bits(u64);
 bool kvm_valid_efer(struct kvm_vcpu *vcpu, u64 efer);
@@ -1686,8 +1701,6 @@ void kvm_vcpu_deliver_sipi_vector(struct kvm_vcpu *vcpu, u8 vector);
 int kvm_task_switch(struct kvm_vcpu *vcpu, u16 tss_selector, int idt_index,
                    int reason, bool has_error_code, u32 error_code);
 
-void kvm_free_guest_fpu(struct kvm_vcpu *vcpu);
-
 void kvm_post_set_cr0(struct kvm_vcpu *vcpu, unsigned long old_cr0, unsigned long cr0);
 void kvm_post_set_cr4(struct kvm_vcpu *vcpu, unsigned long old_cr4, unsigned long cr4);
 int kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0);
@@ -1716,9 +1729,6 @@ void kvm_requeue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code)
 void kvm_inject_page_fault(struct kvm_vcpu *vcpu, struct x86_exception *fault);
 bool kvm_inject_emulated_page_fault(struct kvm_vcpu *vcpu,
                                    struct x86_exception *fault);
-int kvm_read_guest_page_mmu(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
-                           gfn_t gfn, void *data, int offset, int len,
-                           u32 access);
 bool kvm_require_cpl(struct kvm_vcpu *vcpu, int required_cpl);
 bool kvm_require_dr(struct kvm_vcpu *vcpu, int dr);
 
@@ -1867,7 +1877,6 @@ u64 kvm_calc_nested_tsc_multiplier(u64 l1_multiplier, u64 l2_multiplier);
 unsigned long kvm_get_linear_rip(struct kvm_vcpu *vcpu);
 bool kvm_is_linear_rip(struct kvm_vcpu *vcpu, unsigned long linear_rip);
 
-void kvm_make_mclock_inprogress_request(struct kvm *kvm);
 void kvm_make_scan_ioapic_request(struct kvm *kvm);
 void kvm_make_scan_ioapic_request_mask(struct kvm *kvm,
                                       unsigned long *vcpu_bitmap);
@@ -1886,7 +1895,7 @@ int kvm_skip_emulated_instruction(struct kvm_vcpu *vcpu);
 int kvm_complete_insn_gp(struct kvm_vcpu *vcpu, int err);
 void __kvm_request_immediate_exit(struct kvm_vcpu *vcpu);
 
-int kvm_is_in_guest(void);
+unsigned int kvm_guest_state(void);
 
 void __user *__x86_set_memory_region(struct kvm *kvm, int id, gpa_t gpa,
                                     u32 size);
@@ -1936,6 +1945,9 @@ static inline int kvm_cpu_get_apicid(int mps_cpu)
 
 int kvm_cpu_dirty_log_size(void);
 
-int alloc_all_memslots_rmaps(struct kvm *kvm);
+int memslot_rmap_alloc(struct kvm_memory_slot *slot, unsigned long npages);
+
+#define KVM_CLOCK_VALID_FLAGS                                          \
+       (KVM_CLOCK_TSC_STABLE | KVM_CLOCK_REALTIME | KVM_CLOCK_HOST_TSC)
 
 #endif /* _ASM_X86_KVM_HOST_H */