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:
parent
9e62fd7f26
commit
c8135d9af6
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue