diff options
Diffstat (limited to 'arch/x86/kvm/svm.c')
-rw-r--r-- | arch/x86/kvm/svm.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 506e4fe23adc..475d1c948501 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -1496,11 +1496,14 @@ static void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0) | |||
1496 | update_cr0_intercept(svm); | 1496 | update_cr0_intercept(svm); |
1497 | } | 1497 | } |
1498 | 1498 | ||
1499 | static void svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) | 1499 | static int svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) |
1500 | { | 1500 | { |
1501 | unsigned long host_cr4_mce = read_cr4() & X86_CR4_MCE; | 1501 | unsigned long host_cr4_mce = read_cr4() & X86_CR4_MCE; |
1502 | unsigned long old_cr4 = to_svm(vcpu)->vmcb->save.cr4; | 1502 | unsigned long old_cr4 = to_svm(vcpu)->vmcb->save.cr4; |
1503 | 1503 | ||
1504 | if (cr4 & X86_CR4_VMXE) | ||
1505 | return 1; | ||
1506 | |||
1504 | if (npt_enabled && ((old_cr4 ^ cr4) & X86_CR4_PGE)) | 1507 | if (npt_enabled && ((old_cr4 ^ cr4) & X86_CR4_PGE)) |
1505 | svm_flush_tlb(vcpu); | 1508 | svm_flush_tlb(vcpu); |
1506 | 1509 | ||
@@ -1510,6 +1513,7 @@ static void svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) | |||
1510 | cr4 |= host_cr4_mce; | 1513 | cr4 |= host_cr4_mce; |
1511 | to_svm(vcpu)->vmcb->save.cr4 = cr4; | 1514 | to_svm(vcpu)->vmcb->save.cr4 = cr4; |
1512 | mark_dirty(to_svm(vcpu)->vmcb, VMCB_CR); | 1515 | mark_dirty(to_svm(vcpu)->vmcb, VMCB_CR); |
1516 | return 0; | ||
1513 | } | 1517 | } |
1514 | 1518 | ||
1515 | static void svm_set_segment(struct kvm_vcpu *vcpu, | 1519 | static void svm_set_segment(struct kvm_vcpu *vcpu, |