diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kvm/vmx.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 927d8404505a..541f0d2412b4 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -182,6 +182,7 @@ static int init_rmode(struct kvm *kvm); | |||
182 | static u64 construct_eptp(unsigned long root_hpa); | 182 | static u64 construct_eptp(unsigned long root_hpa); |
183 | static void kvm_cpu_vmxon(u64 addr); | 183 | static void kvm_cpu_vmxon(u64 addr); |
184 | static void kvm_cpu_vmxoff(void); | 184 | static void kvm_cpu_vmxoff(void); |
185 | static void fixup_rmode_irq(struct vcpu_vmx *vmx); | ||
185 | 186 | ||
186 | static DEFINE_PER_CPU(struct vmcs *, vmxarea); | 187 | static DEFINE_PER_CPU(struct vmcs *, vmxarea); |
187 | static DEFINE_PER_CPU(struct vmcs *, current_vmcs); | 188 | static DEFINE_PER_CPU(struct vmcs *, current_vmcs); |
@@ -3828,11 +3829,15 @@ static void vmx_recover_nmi_blocking(struct vcpu_vmx *vmx) | |||
3828 | 3829 | ||
3829 | static void vmx_complete_interrupts(struct vcpu_vmx *vmx) | 3830 | static void vmx_complete_interrupts(struct vcpu_vmx *vmx) |
3830 | { | 3831 | { |
3831 | u32 idt_vectoring_info = vmx->idt_vectoring_info; | 3832 | u32 idt_vectoring_info; |
3832 | u8 vector; | 3833 | u8 vector; |
3833 | int type; | 3834 | int type; |
3834 | bool idtv_info_valid; | 3835 | bool idtv_info_valid; |
3835 | 3836 | ||
3837 | if (vmx->rmode.irq.pending) | ||
3838 | fixup_rmode_irq(vmx); | ||
3839 | |||
3840 | idt_vectoring_info = vmx->idt_vectoring_info; | ||
3836 | idtv_info_valid = idt_vectoring_info & VECTORING_INFO_VALID_MASK; | 3841 | idtv_info_valid = idt_vectoring_info & VECTORING_INFO_VALID_MASK; |
3837 | 3842 | ||
3838 | vmx->vcpu.arch.nmi_injected = false; | 3843 | vmx->vcpu.arch.nmi_injected = false; |
@@ -4040,8 +4045,6 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu) | |||
4040 | vcpu->arch.regs_dirty = 0; | 4045 | vcpu->arch.regs_dirty = 0; |
4041 | 4046 | ||
4042 | vmx->idt_vectoring_info = vmcs_read32(IDT_VECTORING_INFO_FIELD); | 4047 | vmx->idt_vectoring_info = vmcs_read32(IDT_VECTORING_INFO_FIELD); |
4043 | if (vmx->rmode.irq.pending) | ||
4044 | fixup_rmode_irq(vmx); | ||
4045 | 4048 | ||
4046 | asm("mov %0, %%ds; mov %0, %%es" : : "r"(__USER_DS)); | 4049 | asm("mov %0, %%ds; mov %0, %%es" : : "r"(__USER_DS)); |
4047 | vmx->launched = 1; | 4050 | vmx->launched = 1; |