From eec10867d11c9c8dfd499933a21d322854b9b69a Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Sun, 24 May 2009 22:19:00 +0300 Subject: [PATCH] --- yaml --- r: 145247 b: refs/heads/master c: a2edf57f510cce6a389cc14e58c6ad0a4296d6f9 h: refs/heads/master i: 145245: 0af59981440bacfa5f8a6b0bf5fccd08b3bccf58 145243: ca285c34de49822df746d09b1a5f634ab02a410c 145239: 1df1948fa71fa4691755ed9dd318ff9359ed3316 145231: 8c9ad3dc69eb9f831b5756401871405d5d403d79 145215: 8353fa91ed88663ccc5f36d13518bf07c1b77bcc v: v3 --- [refs] | 2 +- trunk/arch/x86/kvm/x86.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 204d6fb36526..c048bb886ae9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a8cd0244e9cebcf9b358d24c7e7410062f3665cb +refs/heads/master: a2edf57f510cce6a389cc14e58c6ad0a4296d6f9 diff --git a/trunk/arch/x86/kvm/x86.c b/trunk/arch/x86/kvm/x86.c index 49079a46687b..3944e917e794 100644 --- a/trunk/arch/x86/kvm/x86.c +++ b/trunk/arch/x86/kvm/x86.c @@ -338,6 +338,9 @@ EXPORT_SYMBOL_GPL(kvm_lmsw); void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) { + unsigned long old_cr4 = vcpu->arch.cr4; + unsigned long pdptr_bits = X86_CR4_PGE | X86_CR4_PSE | X86_CR4_PAE; + if (cr4 & CR4_RESERVED_BITS) { printk(KERN_DEBUG "set_cr4: #GP, reserved bits\n"); kvm_inject_gp(vcpu, 0); @@ -351,7 +354,8 @@ void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) kvm_inject_gp(vcpu, 0); return; } - } else if (is_paging(vcpu) && !is_pae(vcpu) && (cr4 & X86_CR4_PAE) + } else if (is_paging(vcpu) && (cr4 & X86_CR4_PAE) + && ((cr4 ^ old_cr4) & pdptr_bits) && !load_pdptrs(vcpu, vcpu->arch.cr3)) { printk(KERN_DEBUG "set_cr4: #GP, pdptrs reserved bits\n"); kvm_inject_gp(vcpu, 0);