Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[linux-block.git] / arch / x86 / include / asm / kvm_host.h
index aa381ab69a1911ffb5afde4e49dc26ab67edc783..61b9dd34d333ec928521908971116d954db574ee 100644 (file)
@@ -615,6 +615,8 @@ struct kvm_vcpu_hv {
                u32 enlightenments_eax; /* HYPERV_CPUID_ENLIGHTMENT_INFO.EAX */
                u32 enlightenments_ebx; /* HYPERV_CPUID_ENLIGHTMENT_INFO.EBX */
                u32 syndbg_cap_eax; /* HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES.EAX */
+               u32 nested_eax; /* HYPERV_CPUID_NESTED_FEATURES.EAX */
+               u32 nested_ebx; /* HYPERV_CPUID_NESTED_FEATURES.EBX */
        } cpuid_cache;
 };
 
@@ -639,6 +641,16 @@ struct kvm_vcpu_xen {
        struct timer_list poll_timer;
 };
 
+struct kvm_queued_exception {
+       bool pending;
+       bool injected;
+       bool has_error_code;
+       u8 vector;
+       u32 error_code;
+       unsigned long payload;
+       bool has_payload;
+};
+
 struct kvm_vcpu_arch {
        /*
         * rip and regs accesses must go through
@@ -738,16 +750,12 @@ struct kvm_vcpu_arch {
 
        u8 event_exit_inst_len;
 
-       struct kvm_queued_exception {
-               bool pending;
-               bool injected;
-               bool has_error_code;
-               u8 nr;
-               u32 error_code;
-               unsigned long payload;
-               bool has_payload;
-               u8 nested_apf;
-       } exception;
+       bool exception_from_userspace;
+
+       /* Exceptions to be injected to the guest. */
+       struct kvm_queued_exception exception;
+       /* Exception VM-Exits to be synthesized to L1. */
+       struct kvm_queued_exception exception_vmexit;
 
        struct kvm_queued_interrupt {
                bool injected;
@@ -858,7 +866,6 @@ struct kvm_vcpu_arch {
                u32 id;
                bool send_user_only;
                u32 host_apf_flags;
-               unsigned long nested_apf_token;
                bool delivery_as_pf_vmexit;
                bool pageready_pending;
        } apf;
@@ -1524,7 +1531,7 @@ struct kvm_x86_ops {
                                unsigned char *hypercall_addr);
        void (*inject_irq)(struct kvm_vcpu *vcpu, bool reinjected);
        void (*inject_nmi)(struct kvm_vcpu *vcpu);
-       void (*queue_exception)(struct kvm_vcpu *vcpu);
+       void (*inject_exception)(struct kvm_vcpu *vcpu);
        void (*cancel_injection)(struct kvm_vcpu *vcpu);
        int (*interrupt_allowed)(struct kvm_vcpu *vcpu, bool for_injection);
        int (*nmi_allowed)(struct kvm_vcpu *vcpu, bool for_injection);
@@ -1634,10 +1641,10 @@ struct kvm_x86_ops {
 
 struct kvm_x86_nested_ops {
        void (*leave_nested)(struct kvm_vcpu *vcpu);
+       bool (*is_exception_vmexit)(struct kvm_vcpu *vcpu, u8 vector,
+                                   u32 error_code);
        int (*check_events)(struct kvm_vcpu *vcpu);
-       bool (*handle_page_fault_workaround)(struct kvm_vcpu *vcpu,
-                                            struct x86_exception *fault);
-       bool (*hv_timer_pending)(struct kvm_vcpu *vcpu);
+       bool (*has_events)(struct kvm_vcpu *vcpu);
        void (*triple_fault)(struct kvm_vcpu *vcpu);
        int (*get_state)(struct kvm_vcpu *vcpu,
                         struct kvm_nested_state __user *user_kvm_nested_state,
@@ -1863,7 +1870,7 @@ void kvm_queue_exception_p(struct kvm_vcpu *vcpu, unsigned nr, unsigned long pay
 void kvm_requeue_exception(struct kvm_vcpu *vcpu, unsigned nr);
 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,
+void kvm_inject_emulated_page_fault(struct kvm_vcpu *vcpu,
                                    struct x86_exception *fault);
 bool kvm_require_cpl(struct kvm_vcpu *vcpu, int required_cpl);
 bool kvm_require_dr(struct kvm_vcpu *vcpu, int dr);