Skip to content

Commit

Permalink
KVM: SVM: Activate nested state only when guest state is complete
Browse files Browse the repository at this point in the history
Certain functions called during the emulated world switch
behave differently when the vcpu is running nested. This is
not the expected behavior during a world switch emulation.
This patch ensures that the nested state is activated only
if the vcpu is completly in nested state.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
  • Loading branch information
Joerg Roedel authored and Avi Kivity committed Apr 25, 2010
1 parent 88ab24a commit 06fc777
Showing 1 changed file with 9 additions and 6 deletions.
15 changes: 9 additions & 6 deletions arch/x86/kvm/svm.c
Original file line number Diff line number Diff line change
Expand Up @@ -1633,6 +1633,9 @@ static int nested_svm_vmexit(struct vcpu_svm *svm)
if (!nested_vmcb)
return 1;

/* Exit nested SVM mode */
svm->nested.vmcb = 0;

/* Give the current vmcb to the guest */
disable_gif(svm);

Expand Down Expand Up @@ -1720,9 +1723,6 @@ static int nested_svm_vmexit(struct vcpu_svm *svm)
svm->vmcb->save.cpl = 0;
svm->vmcb->control.exit_int_info = 0;

/* Exit nested SVM mode */
svm->nested.vmcb = 0;

nested_svm_unmap(page);

kvm_mmu_reset_context(&svm->vcpu);
Expand Down Expand Up @@ -1757,14 +1757,14 @@ static bool nested_svm_vmrun(struct vcpu_svm *svm)
struct vmcb *hsave = svm->nested.hsave;
struct vmcb *vmcb = svm->vmcb;
struct page *page;
u64 vmcb_gpa;

vmcb_gpa = svm->vmcb->save.rax;

nested_vmcb = nested_svm_map(svm, svm->vmcb->save.rax, &page);
if (!nested_vmcb)
return false;

/* nested_vmcb is our indicator if nested SVM is activated */
svm->nested.vmcb = svm->vmcb->save.rax;

trace_kvm_nested_vmrun(svm->vmcb->save.rip - 3, svm->nested.vmcb,
nested_vmcb->save.rip,
nested_vmcb->control.int_ctl,
Expand Down Expand Up @@ -1879,6 +1879,9 @@ static bool nested_svm_vmrun(struct vcpu_svm *svm)

nested_svm_unmap(page);

/* nested_vmcb is our indicator if nested SVM is activated */
svm->nested.vmcb = vmcb_gpa;

enable_gif(svm);

return true;
Expand Down

0 comments on commit 06fc777

Please sign in to comment.