mirror of https://github.com/xemu-project/xemu.git
target-i386: simplify pte/vaddr calculation
They can moved to after the dirty bit processing, and unified between CR0.PG=1 and CR0.PG=0. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
e8f6d00c30
commit
e7e898a76a
|
@ -527,7 +527,7 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr,
|
||||||
hwaddr paddr;
|
hwaddr paddr;
|
||||||
uint64_t rsvd_mask = PG_HI_RSVD_MASK;
|
uint64_t rsvd_mask = PG_HI_RSVD_MASK;
|
||||||
uint32_t page_offset;
|
uint32_t page_offset;
|
||||||
target_ulong vaddr, virt_addr;
|
target_ulong vaddr;
|
||||||
|
|
||||||
is_user = mmu_idx == MMU_USER_IDX;
|
is_user = mmu_idx == MMU_USER_IDX;
|
||||||
#if defined(DEBUG_MMU)
|
#if defined(DEBUG_MMU)
|
||||||
|
@ -544,7 +544,6 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr,
|
||||||
pte = (uint32_t)pte;
|
pte = (uint32_t)pte;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
virt_addr = addr & TARGET_PAGE_MASK;
|
|
||||||
prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
|
prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
|
||||||
page_size = 4096;
|
page_size = 4096;
|
||||||
goto do_mapping;
|
goto do_mapping;
|
||||||
|
@ -748,9 +747,6 @@ do_check_protect:
|
||||||
}
|
}
|
||||||
stl_phys_notdirty(cs->as, pte_addr, pte);
|
stl_phys_notdirty(cs->as, pte_addr, pte);
|
||||||
}
|
}
|
||||||
/* align to page_size */
|
|
||||||
pte &= ((PHYS_ADDR_MASK & ~(page_size - 1)) | 0xfff);
|
|
||||||
virt_addr = addr & ~(page_size - 1);
|
|
||||||
|
|
||||||
/* the page can be put in the TLB */
|
/* the page can be put in the TLB */
|
||||||
prot = PAGE_READ;
|
prot = PAGE_READ;
|
||||||
|
@ -771,11 +767,14 @@ do_check_protect:
|
||||||
do_mapping:
|
do_mapping:
|
||||||
pte = pte & env->a20_mask;
|
pte = pte & env->a20_mask;
|
||||||
|
|
||||||
|
/* align to page_size */
|
||||||
|
pte &= PG_ADDRESS_MASK & ~(page_size - 1);
|
||||||
|
|
||||||
/* Even if 4MB pages, we map only one 4KB page in the cache to
|
/* Even if 4MB pages, we map only one 4KB page in the cache to
|
||||||
avoid filling it too fast */
|
avoid filling it too fast */
|
||||||
page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1);
|
vaddr = addr & TARGET_PAGE_MASK;
|
||||||
paddr = (pte & TARGET_PAGE_MASK) + page_offset;
|
page_offset = vaddr & (page_size - 1);
|
||||||
vaddr = virt_addr + page_offset;
|
paddr = pte + page_offset;
|
||||||
|
|
||||||
tlb_set_page(cs, vaddr, paddr, prot, mmu_idx, page_size);
|
tlb_set_page(cs, vaddr, paddr, prot, mmu_idx, page_size);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue