|
@@ -3216,9 +3216,6 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
|
|
|
savesegment(gs, gs_selector);
|
|
|
ldt_selector = kvm_read_ldt();
|
|
|
svm->vmcb->save.cr2 = vcpu->arch.cr2;
|
|
|
- /* required for live migration with NPT */
|
|
|
- if (npt_enabled)
|
|
|
- svm->vmcb->save.cr3 = vcpu->arch.cr3;
|
|
|
|
|
|
clgi();
|
|
|
|
|
@@ -3340,16 +3337,22 @@ static void svm_set_cr3(struct kvm_vcpu *vcpu, unsigned long root)
|
|
|
{
|
|
|
struct vcpu_svm *svm = to_svm(vcpu);
|
|
|
|
|
|
- if (npt_enabled) {
|
|
|
- svm->vmcb->control.nested_cr3 = root;
|
|
|
- force_new_asid(vcpu);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
svm->vmcb->save.cr3 = root;
|
|
|
force_new_asid(vcpu);
|
|
|
}
|
|
|
|
|
|
+static void set_tdp_cr3(struct kvm_vcpu *vcpu, unsigned long root)
|
|
|
+{
|
|
|
+ struct vcpu_svm *svm = to_svm(vcpu);
|
|
|
+
|
|
|
+ svm->vmcb->control.nested_cr3 = root;
|
|
|
+
|
|
|
+ /* Also sync guest cr3 here in case we live migrate */
|
|
|
+ svm->vmcb->save.cr3 = vcpu->arch.cr3;
|
|
|
+
|
|
|
+ force_new_asid(vcpu);
|
|
|
+}
|
|
|
+
|
|
|
static int is_disabled(void)
|
|
|
{
|
|
|
u64 vm_cr;
|
|
@@ -3576,6 +3579,8 @@ static struct kvm_x86_ops svm_x86_ops = {
|
|
|
|
|
|
.write_tsc_offset = svm_write_tsc_offset,
|
|
|
.adjust_tsc_offset = svm_adjust_tsc_offset,
|
|
|
+
|
|
|
+ .set_tdp_cr3 = set_tdp_cr3,
|
|
|
};
|
|
|
|
|
|
static int __init svm_init(void)
|