fixed subtle bug: in some cases PG_DIRTY was not set correctly
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 13 Jan 2004 00:00:25 +0000 (00:00 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 13 Jan 2004 00:00:25 +0000 (00:00 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@547 c046a42c-6fe2-441c-8c8c-71466251a162

target-i386/helper2.c

index fcceb1de5672061fbf40463c6af00c924900beef..2feccc345936b36da9ae3a78b17b4ce35027330c 100644 (file)
@@ -348,15 +348,20 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, uint32_t addr,
         page_size = 4096;
         virt_addr = addr & ~0xfff;
     }
+
     /* the page can be put in the TLB */
     prot = PROT_READ;
-    if (is_user) {
-        if (pte & PG_RW_MASK)
-            prot |= PROT_WRITE;
-    } else {
-        if (!(env->cr[0] & CR0_WP_MASK) || !(pte & PG_USER_MASK) ||
-            (pte & PG_RW_MASK))
-            prot |= PROT_WRITE;
+    if (pte & PG_DIRTY_MASK) {
+        /* only set write access if already dirty... otherwise wait
+           for dirty access */
+        if (is_user) {
+            if (pte & PG_RW_MASK)
+                prot |= PROT_WRITE;
+        } else {
+            if (!(env->cr[0] & CR0_WP_MASK) || !(pte & PG_USER_MASK) ||
+                (pte & PG_RW_MASK))
+                prot |= PROT_WRITE;
+        }
     }
     
  do_mapping: