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
This commit is contained in:
bellard 2004-01-13 00:00:25 +00:00
parent 9e62fd7f26
commit c8135d9af6

View File

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