target-i386: unify reserved bits and NX bit check
authorPaolo Bonzini <pbonzini@redhat.com>
Tue, 27 May 2014 11:58:46 +0000 (13:58 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 5 Jun 2014 14:10:34 +0000 (16:10 +0200)
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
target-i386/helper.c

index 153a91bf339d03da0854c260bb9accde0389ba70..a2e8bd1a354c4aaf7f08021796e3e691c934ad6b 100644 (file)
@@ -549,6 +549,10 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr,
         goto do_mapping;
     }
 
+    if (!(env->efer & MSR_EFER_NXE)) {
+        rsvd_mask |= PG_NX_MASK;
+    }
+
     if (env->cr[4] & CR4_PAE_MASK) {
         uint64_t pde, pdpe;
         target_ulong pdpe_addr;
@@ -575,9 +579,6 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr,
             if (pml4e & (rsvd_mask | PG_PSE_MASK)) {
                 goto do_fault_rsvd;
             }
-            if (!(env->efer & MSR_EFER_NXE) && (pml4e & PG_NX_MASK)) {
-                goto do_fault_rsvd;
-            }
             if (!(pml4e & PG_ACCESSED_MASK)) {
                 pml4e |= PG_ACCESSED_MASK;
                 stl_phys_notdirty(cs->as, pml4e_addr, pml4e);
@@ -592,9 +593,6 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr,
             if (pdpe & rsvd_mask) {
                 goto do_fault_rsvd;
             }
-            if (!(env->efer & MSR_EFER_NXE) && (pdpe & PG_NX_MASK)) {
-                goto do_fault_rsvd;
-            }
             ptep &= pdpe ^ PG_NX_MASK;
             if (!(pdpe & PG_ACCESSED_MASK)) {
                 pdpe |= PG_ACCESSED_MASK;
@@ -633,9 +631,6 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr,
         if (pde & rsvd_mask) {
             goto do_fault_rsvd;
         }
-        if (!(env->efer & MSR_EFER_NXE) && (pde & PG_NX_MASK)) {
-            goto do_fault_rsvd;
-        }
         ptep &= pde ^ PG_NX_MASK;
         if (pde & PG_PSE_MASK) {
             /* 2 MB page */
@@ -658,9 +653,6 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr,
         if (pte & rsvd_mask) {
             goto do_fault_rsvd;
         }
-        if (!(env->efer & MSR_EFER_NXE) && (pte & PG_NX_MASK)) {
-            goto do_fault_rsvd;
-        }
         /* combine pde and pte nx, user and rw protections */
         ptep &= pte ^ PG_NX_MASK;
         page_size = 4096;