> I am studying QEMU, I would like to know that Is QEMU TB lookup based on > guest system virtual address or physical address ?
QEMU lookups TB in two steps: tb_find_fast (exec.c): It'll try to use guest virtual address (pc) to index tb_jmp_cache. tb = env->tb_jmp_cache[tb_jmp_cache_hash_func(pc)]; Then it'll check if there is a hit or not. Also check the finded TB is valid or not. if (unlikely(!tb || tb->pc != pc || tb->cs_base != cs_base || tb->flags != flags)) { tb = tb_find_slow(env, pc, cs_base, flags); } tb_find_slow (exec.c): If tb_find_fast fail to find a TB by using guest virtual address (pc), then it comes to tb_find_slow. tb_find_slow use pc's corresponding guest physical address to index tb_phys_hash. /* find translated block using physical mappings */ phys_pc = get_page_addr_code(env, pc); phys_page1 = phys_pc & TARGET_PAGE_MASK; h = tb_phys_hash_func(phys_pc); ptb1 = &tb_phys_hash[h]; Then it'll check if there is a hit or not. Also check the finded TB is valid or not. If tb_phys_hash hit and the finded TB is valid, then it goes to lable found: found: /* we add the TB in the virtual pc hash table */ env->tb_jmp_cache[tb_jmp_cache_hash_func(pc)] = tb; Otherwise, it goes to lable not_found: not_found: /* if no translated code available, then translate it now */ tb = tb_gen_code(env, pc, cs_base, flags, 0); Regards, chenwj -- Wei-Ren Chen (陳韋任) Computer Systems Lab, Institute of Information Science, Academia Sinica, Taiwan (R.O.C.) Tel:886-2-2788-3799 #1667