From c8135d9af670d091359cb8b03f594c7591f199ec Mon Sep 17 00:00:00 2001 From: bellard Date: Tue, 13 Jan 2004 00:00:25 +0000 Subject: [PATCH] fixed subtle bug: in some cases PG_DIRTY was not set correctly git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@547 c046a42c-6fe2-441c-8c8c-71466251a162 --- target-i386/helper2.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/target-i386/helper2.c b/target-i386/helper2.c index fcceb1de56..2feccc3459 100644 --- a/target-i386/helper2.c +++ b/target-i386/helper2.c @@ -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: