summaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/svm.c
diff options
context:
space:
mode:
authorJoerg Roedel2008-09-09 19:11:51 +0200
committerAvi Kivity2008-09-11 10:39:25 +0200
commite5eab0cede4b1ffaca4ad857d840127622038e55 (patch)
tree1471ba4a46298778271f1440b14a5f4e795bc291 /arch/x86/kvm/svm.c
parentKVM: SVM: fix random segfaults with NPT enabled (diff)
downloadkernel-qcow2-linux-e5eab0cede4b1ffaca4ad857d840127622038e55.tar.gz
kernel-qcow2-linux-e5eab0cede4b1ffaca4ad857d840127622038e55.tar.xz
kernel-qcow2-linux-e5eab0cede4b1ffaca4ad857d840127622038e55.zip
KVM: SVM: fix guest global tlb flushes with NPT
Accesses to CR4 are intercepted even with Nested Paging enabled. But the code does not check if the guest wants to do a global TLB flush. So this flush gets lost. This patch adds the check and the flush to svm_set_cr4. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'arch/x86/kvm/svm.c')
-rw-r--r--arch/x86/kvm/svm.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index d1106cddab0d..8233b86c778c 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -879,6 +879,10 @@ set:
static void svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
{
unsigned long host_cr4_mce = read_cr4() & X86_CR4_MCE;
+ unsigned long old_cr4 = to_svm(vcpu)->vmcb->save.cr4;
+
+ if (npt_enabled && ((old_cr4 ^ cr4) & X86_CR4_PGE))
+ force_new_asid(vcpu);
vcpu->arch.cr4 = cr4;
if (!npt_enabled)