diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2010-12-03 05:45:54 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-01-12 04:30:30 -0500 |
commit | dcca1a6506123cd47af334b7ee2a4b0288196389 (patch) | |
tree | 645253d0781d12e40cdef1b732a93ac9586d3bdc /arch/x86/kvm/svm.c | |
parent | b2747166dc315b31281fb659a5b8938873d5f1d7 (diff) |
KVM: SVM: Add clean-bit for control registers
This patch implements the CRx clean-bit for the vmcb. This
bit covers cr0, cr3, cr4, and efer.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/svm.c')
-rw-r--r-- | arch/x86/kvm/svm.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 5038201d6f3d..0f55b8a69540 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -192,6 +192,7 @@ enum { | |||
192 | VMCB_ASID, /* ASID */ | 192 | VMCB_ASID, /* ASID */ |
193 | VMCB_INTR, /* int_ctl, int_vector */ | 193 | VMCB_INTR, /* int_ctl, int_vector */ |
194 | VMCB_NPT, /* npt_en, nCR3, gPAT */ | 194 | VMCB_NPT, /* npt_en, nCR3, gPAT */ |
195 | VMCB_CR, /* CR0, CR3, CR4, EFER */ | ||
195 | VMCB_DIRTY_MAX, | 196 | VMCB_DIRTY_MAX, |
196 | }; | 197 | }; |
197 | 198 | ||
@@ -441,6 +442,7 @@ static void svm_set_efer(struct kvm_vcpu *vcpu, u64 efer) | |||
441 | efer &= ~EFER_LME; | 442 | efer &= ~EFER_LME; |
442 | 443 | ||
443 | to_svm(vcpu)->vmcb->save.efer = efer | EFER_SVME; | 444 | to_svm(vcpu)->vmcb->save.efer = efer | EFER_SVME; |
445 | mark_dirty(to_svm(vcpu)->vmcb, VMCB_CR); | ||
444 | } | 446 | } |
445 | 447 | ||
446 | static int is_external_interrupt(u32 info) | 448 | static int is_external_interrupt(u32 info) |
@@ -1338,6 +1340,7 @@ static void update_cr0_intercept(struct vcpu_svm *svm) | |||
1338 | *hcr0 = (*hcr0 & ~SVM_CR0_SELECTIVE_MASK) | 1340 | *hcr0 = (*hcr0 & ~SVM_CR0_SELECTIVE_MASK) |
1339 | | (gcr0 & SVM_CR0_SELECTIVE_MASK); | 1341 | | (gcr0 & SVM_CR0_SELECTIVE_MASK); |
1340 | 1342 | ||
1343 | mark_dirty(svm->vmcb, VMCB_CR); | ||
1341 | 1344 | ||
1342 | if (gcr0 == *hcr0 && svm->vcpu.fpu_active) { | 1345 | if (gcr0 == *hcr0 && svm->vcpu.fpu_active) { |
1343 | clr_cr_intercept(svm, INTERCEPT_CR0_READ); | 1346 | clr_cr_intercept(svm, INTERCEPT_CR0_READ); |
@@ -1404,6 +1407,7 @@ static void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0) | |||
1404 | */ | 1407 | */ |
1405 | cr0 &= ~(X86_CR0_CD | X86_CR0_NW); | 1408 | cr0 &= ~(X86_CR0_CD | X86_CR0_NW); |
1406 | svm->vmcb->save.cr0 = cr0; | 1409 | svm->vmcb->save.cr0 = cr0; |
1410 | mark_dirty(svm->vmcb, VMCB_CR); | ||
1407 | update_cr0_intercept(svm); | 1411 | update_cr0_intercept(svm); |
1408 | } | 1412 | } |
1409 | 1413 | ||
@@ -1420,6 +1424,7 @@ static void svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) | |||
1420 | cr4 |= X86_CR4_PAE; | 1424 | cr4 |= X86_CR4_PAE; |
1421 | cr4 |= host_cr4_mce; | 1425 | cr4 |= host_cr4_mce; |
1422 | to_svm(vcpu)->vmcb->save.cr4 = cr4; | 1426 | to_svm(vcpu)->vmcb->save.cr4 = cr4; |
1427 | mark_dirty(to_svm(vcpu)->vmcb, VMCB_CR); | ||
1423 | } | 1428 | } |
1424 | 1429 | ||
1425 | static void svm_set_segment(struct kvm_vcpu *vcpu, | 1430 | static void svm_set_segment(struct kvm_vcpu *vcpu, |
@@ -3549,6 +3554,7 @@ static void svm_set_cr3(struct kvm_vcpu *vcpu, unsigned long root) | |||
3549 | struct vcpu_svm *svm = to_svm(vcpu); | 3554 | struct vcpu_svm *svm = to_svm(vcpu); |
3550 | 3555 | ||
3551 | svm->vmcb->save.cr3 = root; | 3556 | svm->vmcb->save.cr3 = root; |
3557 | mark_dirty(svm->vmcb, VMCB_CR); | ||
3552 | force_new_asid(vcpu); | 3558 | force_new_asid(vcpu); |
3553 | } | 3559 | } |
3554 | 3560 | ||
@@ -3561,6 +3567,7 @@ static void set_tdp_cr3(struct kvm_vcpu *vcpu, unsigned long root) | |||
3561 | 3567 | ||
3562 | /* Also sync guest cr3 here in case we live migrate */ | 3568 | /* Also sync guest cr3 here in case we live migrate */ |
3563 | svm->vmcb->save.cr3 = vcpu->arch.cr3; | 3569 | svm->vmcb->save.cr3 = vcpu->arch.cr3; |
3570 | mark_dirty(svm->vmcb, VMCB_CR); | ||
3564 | 3571 | ||
3565 | force_new_asid(vcpu); | 3572 | force_new_asid(vcpu); |
3566 | } | 3573 | } |