fix console change race exposed by CFS
[pandora-kernel.git] / drivers / kvm / paging_tmpl.h
index fabc2c9..4b5391c 100644 (file)
@@ -31,7 +31,6 @@
        #define PT_INDEX(addr, level) PT64_INDEX(addr, level)
        #define SHADOW_PT_INDEX(addr, level) PT64_INDEX(addr, level)
        #define PT_LEVEL_MASK(level) PT64_LEVEL_MASK(level)
-       #define PT_PTE_COPY_MASK PT64_PTE_COPY_MASK
        #ifdef CONFIG_X86_64
        #define PT_MAX_FULL_LEVELS 4
        #else
@@ -46,7 +45,6 @@
        #define PT_INDEX(addr, level) PT32_INDEX(addr, level)
        #define SHADOW_PT_INDEX(addr, level) PT64_INDEX(addr, level)
        #define PT_LEVEL_MASK(level) PT32_LEVEL_MASK(level)
-       #define PT_PTE_COPY_MASK PT32_PTE_COPY_MASK
        #define PT_MAX_FULL_LEVELS 2
 #else
        #error Invalid PTTYPE value
@@ -219,8 +217,8 @@ static void FNAME(set_pte_common)(struct kvm_vcpu *vcpu,
                FNAME(mark_pagetable_dirty)(vcpu->kvm, walker);
        }
 
-       spte |= *gpte & PT_PTE_COPY_MASK;
-       spte |= access_bits << PT_SHADOW_BITS_OFFSET;
+       spte |= PT_PRESENT_MASK | PT_ACCESSED_MASK | PT_DIRTY_MASK;
+       spte |= *gpte & PT64_NX_MASK;
        if (!dirty)
                access_bits &= ~PT_WRITABLE_MASK;
 
@@ -240,17 +238,6 @@ static void FNAME(set_pte_common)(struct kvm_vcpu *vcpu,
 
        spte |= paddr;
 
-       if (!write_fault && (spte & PT_SHADOW_USER_MASK) &&
-           !(spte & PT_USER_MASK)) {
-               /*
-                * If supervisor write protect is disabled, we shadow kernel
-                * pages as user pages so we can trap the write access.
-                */
-               spte |= PT_USER_MASK;
-               spte &= ~PT_WRITABLE_MASK;
-               access_bits &= ~PT_WRITABLE_MASK;
-       }
-
        if ((access_bits & PT_WRITABLE_MASK)
            || (write_fault && !is_write_protection(vcpu) && !user_fault)) {
                struct kvm_mmu_page *shadow;
@@ -379,6 +366,8 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
                        metaphysical = 1;
                        hugepage_access = *guest_ent;
                        hugepage_access &= PT_USER_MASK | PT_WRITABLE_MASK;
+                       if (*guest_ent & PT64_NX_MASK)
+                               hugepage_access |= (1 << 2);
                        hugepage_access >>= PT_WRITABLE_SHIFT;
                        table_gfn = (*guest_ent & PT_BASE_ADDR_MASK)
                                >> PAGE_SHIFT;
@@ -397,8 +386,6 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
        }
 
        if (walker->level == PT_DIRECTORY_LEVEL) {
-               if (prev_shadow_ent)
-                       *prev_shadow_ent |= PT_SHADOW_PS_MARK;
                FNAME(set_pde)(vcpu, guest_ent, shadow_ent,
                               walker->inherited_ar, user_fault, write_fault,
                               ptwrite, walker, walker->gfn);
@@ -506,7 +493,5 @@ static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr)
 #undef PT_INDEX
 #undef SHADOW_PT_INDEX
 #undef PT_LEVEL_MASK
-#undef PT_PTE_COPY_MASK
-#undef PT_NON_PTE_COPY_MASK
 #undef PT_DIR_BASE_ADDR_MASK
 #undef PT_MAX_FULL_LEVELS