Commit 2be4fc7a authored by Joerg Roedel's avatar Joerg Roedel Committed by Avi Kivity

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: default avatarJoerg Roedel <joerg.roedel@amd.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 2041a06a
...@@ -1799,10 +1799,7 @@ static int nested_svm_vmexit(struct vcpu_svm *svm) ...@@ -1799,10 +1799,7 @@ static int nested_svm_vmexit(struct vcpu_svm *svm)
nested_vmcb->save.gdtr = vmcb->save.gdtr; nested_vmcb->save.gdtr = vmcb->save.gdtr;
nested_vmcb->save.idtr = vmcb->save.idtr; nested_vmcb->save.idtr = vmcb->save.idtr;
nested_vmcb->save.cr0 = kvm_read_cr0(&svm->vcpu); nested_vmcb->save.cr0 = kvm_read_cr0(&svm->vcpu);
if (npt_enabled) nested_vmcb->save.cr3 = svm->vcpu.arch.cr3;
nested_vmcb->save.cr3 = vmcb->save.cr3;
else
nested_vmcb->save.cr3 = svm->vcpu.arch.cr3;
nested_vmcb->save.cr2 = vmcb->save.cr2; nested_vmcb->save.cr2 = vmcb->save.cr2;
nested_vmcb->save.cr4 = svm->vcpu.arch.cr4; nested_vmcb->save.cr4 = svm->vcpu.arch.cr4;
nested_vmcb->save.rflags = vmcb->save.rflags; nested_vmcb->save.rflags = vmcb->save.rflags;
...@@ -2641,6 +2638,11 @@ static int handle_exit(struct kvm_vcpu *vcpu) ...@@ -2641,6 +2638,11 @@ static int handle_exit(struct kvm_vcpu *vcpu)
trace_kvm_exit(exit_code, 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)) { if (unlikely(svm->nested.exit_required)) {
nested_svm_vmexit(svm); nested_svm_vmexit(svm);
svm->nested.exit_required = false; svm->nested.exit_required = false;
...@@ -2668,11 +2670,6 @@ static int handle_exit(struct kvm_vcpu *vcpu) ...@@ -2668,11 +2670,6 @@ static int handle_exit(struct kvm_vcpu *vcpu)
svm_complete_interrupts(svm); 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) { if (svm->vmcb->control.exit_code == SVM_EXIT_ERR) {
kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY; kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY;
kvm_run->fail_entry.hardware_entry_failure_reason kvm_run->fail_entry.hardware_entry_failure_reason
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment