Skip to content

Commit

Permalink
KVM: VMX: Handle NMIs before enabling interrupts and preemption
Browse files Browse the repository at this point in the history
This makes sure we handle NMI on the current cpu, and that we don't service
maskable interrupts before non-maskable ones.

Signed-off-by: Avi Kivity <avi@qumranet.com>
  • Loading branch information
Avi Kivity committed Oct 22, 2007
1 parent 7f2145a commit 1b6269d
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions drivers/kvm/vmx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1760,10 +1760,8 @@ static int handle_exception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
set_bit(irq / BITS_PER_LONG, &vcpu->irq_summary);
}

if ((intr_info & INTR_INFO_INTR_TYPE_MASK) == 0x200) { /* nmi */
asm ("int $2");
return 1;
}
if ((intr_info & INTR_INFO_INTR_TYPE_MASK) == 0x200) /* nmi */
return 1; /* already handled by vmx_vcpu_run() */

if (is_no_device(intr_info)) {
vmx_fpu_activate(vcpu);
Expand Down Expand Up @@ -2196,6 +2194,7 @@ static void vmx_intr_assist(struct kvm_vcpu *vcpu)
static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
{
struct vcpu_vmx *vmx = to_vmx(vcpu);
u32 intr_info;

/*
* Loading guest fpu may have cleared host cr0.ts
Expand Down Expand Up @@ -2322,6 +2321,12 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)

asm ("mov %0, %%ds; mov %0, %%es" : : "r"(__USER_DS));
vmx->launched = 1;

intr_info = vmcs_read32(VM_EXIT_INTR_INFO);

/* We need to handle NMIs before interrupts are enabled */
if ((intr_info & INTR_INFO_INTR_TYPE_MASK) == 0x200) /* nmi */
asm("int $2");
}

static void vmx_inject_page_fault(struct kvm_vcpu *vcpu,
Expand Down

0 comments on commit 1b6269d

Please sign in to comment.