KVM: SVM: Sync all control registers on nested vmexit

Currently the vmexit emulation does not sync control
registers were the access is typically intercepted by the
nested hypervisor. But we can not count on that intercepts
to sync these registers too and make the code
architecturally more correct.

Cc: stable@kernel.org
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
Joerg Roedel 2010-02-19 16:23:03 +01:00 коммит произвёл Avi Kivity
Родитель b8e88bc8ff
Коммит cdbbdc1210
1 изменённых файлов: 4 добавлений и 0 удалений

Просмотреть файл

@ -1647,9 +1647,13 @@ static int nested_svm_vmexit(struct vcpu_svm *svm)
nested_vmcb->save.ds = vmcb->save.ds; nested_vmcb->save.ds = vmcb->save.ds;
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);
if (npt_enabled) if (npt_enabled)
nested_vmcb->save.cr3 = vmcb->save.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.rflags = vmcb->save.rflags; nested_vmcb->save.rflags = vmcb->save.rflags;
nested_vmcb->save.rip = vmcb->save.rip; nested_vmcb->save.rip = vmcb->save.rip;
nested_vmcb->save.rsp = vmcb->save.rsp; nested_vmcb->save.rsp = vmcb->save.rsp;