KVM: MMU: Check for root_level instead of long mode
authorJoerg Roedel <joerg.roedel@amd.com>
Fri, 10 Sep 2010 15:30:38 +0000 (17:30 +0200)
committerAvi Kivity <avi@redhat.com>
Sun, 24 Oct 2010 08:52:27 +0000 (10:52 +0200)
The walk_addr function checks for !is_long_mode in its 64
bit version. But what is meant here is a check for pae
paging. Change the condition to really check for pae paging
so that it also works with nested nested paging.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/paging_tmpl.h

index debe77035366fc818dfdcf8dd2682e7a07147393..e4ad3dc84df369b37b039ec91766eef961d95b47 100644 (file)
@@ -132,7 +132,7 @@ walk:
        walker->level = vcpu->arch.mmu.root_level;
        pte = vcpu->arch.cr3;
 #if PTTYPE == 64
-       if (!is_long_mode(vcpu)) {
+       if (vcpu->arch.mmu.root_level == PT32E_ROOT_LEVEL) {
                pte = kvm_pdptr_read(vcpu, (addr >> 30) & 3);
                trace_kvm_mmu_paging_element(pte, walker->level);
                if (!is_present_gpte(pte)) {
@@ -205,7 +205,7 @@ walk:
                                (PTTYPE == 64 || is_pse(vcpu))) ||
                    ((walker->level == PT_PDPE_LEVEL) &&
                                is_large_pte(pte) &&
-                               is_long_mode(vcpu))) {
+                               vcpu->arch.mmu.root_level == PT64_ROOT_LEVEL)) {
                        int lvl = walker->level;
 
                        walker->gfn = gpte_to_gfn_lvl(pte, lvl);