aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/svm.c
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2009-09-16 09:24:15 -0400
committerAvi Kivity <avi@redhat.com>2009-12-03 02:32:11 -0500
commit7fcdb5103d10d2eb75876637a2efa9679cce14d3 (patch)
treef8879cd7baeab1e2d40a2dbadac8df638200ba8b /arch/x86/kvm/svm.c
parentbfc33beaed3ecf0f92612dc7fb7095029ae7722e (diff)
KVM: SVM: reorganize svm_interrupt_allowed
This patch reorganizes the logic in svm_interrupt_allowed to make it better to read. This is important because the logic is a lot more complicated with Nested SVM. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/kvm/svm.c')
-rw-r--r--arch/x86/kvm/svm.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 59fe4d54da11..3f3fe815c21b 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -2472,10 +2472,18 @@ static int svm_interrupt_allowed(struct kvm_vcpu *vcpu)
2472{ 2472{
2473 struct vcpu_svm *svm = to_svm(vcpu); 2473 struct vcpu_svm *svm = to_svm(vcpu);
2474 struct vmcb *vmcb = svm->vmcb; 2474 struct vmcb *vmcb = svm->vmcb;
2475 return (vmcb->save.rflags & X86_EFLAGS_IF) && 2475 int ret;
2476 !(vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) && 2476
2477 gif_set(svm) && 2477 if (!gif_set(svm) ||
2478 !(is_nested(svm) && (svm->vcpu.arch.hflags & HF_VINTR_MASK)); 2478 (vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK))
2479 return 0;
2480
2481 ret = !!(vmcb->save.rflags & X86_EFLAGS_IF);
2482
2483 if (is_nested(svm))
2484 return ret && !(svm->vcpu.arch.hflags & HF_VINTR_MASK);
2485
2486 return ret;
2479} 2487}
2480 2488
2481static void enable_irq_window(struct kvm_vcpu *vcpu) 2489static void enable_irq_window(struct kvm_vcpu *vcpu)