forked from Minki/linux
KVM: SVM: Sync cr0 and cr3 to kvm state before nested handling
This patch syncs cr0 and cr3 from the vmcb to the kvm state before nested intercept handling is done. This allows to simplify the vmexit path. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
2041a06a50
commit
2be4fc7a02
@ -1799,10 +1799,7 @@ static int nested_svm_vmexit(struct vcpu_svm *svm)
|
||||
nested_vmcb->save.gdtr = vmcb->save.gdtr;
|
||||
nested_vmcb->save.idtr = vmcb->save.idtr;
|
||||
nested_vmcb->save.cr0 = kvm_read_cr0(&svm->vcpu);
|
||||
if (npt_enabled)
|
||||
nested_vmcb->save.cr3 = vmcb->save.cr3;
|
||||
else
|
||||
nested_vmcb->save.cr3 = svm->vcpu.arch.cr3;
|
||||
nested_vmcb->save.cr3 = svm->vcpu.arch.cr3;
|
||||
nested_vmcb->save.cr2 = vmcb->save.cr2;
|
||||
nested_vmcb->save.cr4 = svm->vcpu.arch.cr4;
|
||||
nested_vmcb->save.rflags = vmcb->save.rflags;
|
||||
@ -2641,6 +2638,11 @@ static int handle_exit(struct kvm_vcpu *vcpu)
|
||||
|
||||
trace_kvm_exit(exit_code, vcpu);
|
||||
|
||||
if (!(svm->vmcb->control.intercept_cr_write & INTERCEPT_CR0_MASK))
|
||||
vcpu->arch.cr0 = svm->vmcb->save.cr0;
|
||||
if (npt_enabled)
|
||||
vcpu->arch.cr3 = svm->vmcb->save.cr3;
|
||||
|
||||
if (unlikely(svm->nested.exit_required)) {
|
||||
nested_svm_vmexit(svm);
|
||||
svm->nested.exit_required = false;
|
||||
@ -2668,11 +2670,6 @@ static int handle_exit(struct kvm_vcpu *vcpu)
|
||||
|
||||
svm_complete_interrupts(svm);
|
||||
|
||||
if (!(svm->vmcb->control.intercept_cr_write & INTERCEPT_CR0_MASK))
|
||||
vcpu->arch.cr0 = svm->vmcb->save.cr0;
|
||||
if (npt_enabled)
|
||||
vcpu->arch.cr3 = svm->vmcb->save.cr3;
|
||||
|
||||
if (svm->vmcb->control.exit_code == SVM_EXIT_ERR) {
|
||||
kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY;
|
||||
kvm_run->fail_entry.hardware_entry_failure_reason
|
||||
|
Loading…
Reference in New Issue
Block a user