On Wed, Oct 27, 2010 at 6:14 AM, <tung.ho...@vn.panasonic.com> wrote: > >>As I remember it, it's on the lines of: > >>tlb_entry = env->tlb_table[mem_index][hash(guest_virtual_address)]; >>if (tlb_entry.<access_type> == guest_virtual_address) { >> host_virtual_address = tlb_entry.addend >>} else { >> call the slow path through __ld routines >>} > > No, At qemu-0.10.0 > host_virtual_addres = guest virtual address + tlb_entry.addend > not as : > host_virtual_address = tlb_entry.addend > > Can you explain more?
This is the TLB calculation when taking out checks, for the RAM address case: index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); tlb_addr = env->tlb_table[mmu_idx][index].ADDR_READ; addend = env->tlb_table[mmu_idx][index].addend; res = glue(glue(ld, USUFFIX), _raw)((uint8_t *)(long)(addr+addend)); TLB addend is calculated in exec.c, tlb_set_page(): addend = (unsigned long)qemu_get_ram_ptr(pd & TARGET_PAGE_MASK); te->addend = addend - vaddr; So taking into account both, the virtual address is subtracted, leaving only host pointer to RAM area.