Message ID | 20120823025337.GA27969@cs.nctu.edu.tw |
---|---|
State | New |
Headers | show |
> It's quite embarrassing. The code I posted before is buggy, and it dumps all > 1024 * 1024 page table entries. It takes a lot of time, so that I think the > system hangs. Attach is the code snipt what I am using, which works fine now. > Another question is, I would like to know the hva corresponding to gpa (i.e., > the guest page pointed by guest pte). Do you happen to know there is such > gpa2hva function in QEMU? I think I found one, cpu_physical_memory_map (exec.c). Below is how I convert gpa to hva by using cpu_physical_memory_map. target_ulong pde_addr = (env->cr[3] + 32 * 4) & env->a20_mask; target_phys_addr_t len = 4; void *ptr = cpu_physical_memory_map(pde_addr, &len, 0); The only thing I am not sure about is what value of len I should use. Regards, chenwj
// we only consider x86 w/o pae static void dump_guest_pgtable(CPUX86State *env) { int i, j; target_ulong pde_addr, pte_addr; target_ulong phyaddr, phyaddr2; uint32_t pde, pte; pde_addr = (env->cr[3] & ~0xfff) & env->a20_mask; // first level page directory, iterate pde for (i = 0; i < NUM_ENTRY; ++i) { phyaddr = (pde_addr + i * 4) & env->a20_mask; pde = ldl_phys(phyaddr); pd[i] = pde; if (!(pde & PG_PRESENT_MASK)) continue; pte_addr = (pde & ~0xfff) & env->a20_mask; // second level page table, iterate pte for (j = 0; j < NUM_ENTRY; ++j) { phyaddr2 = (pte_addr + j * 4) & env->a20_mask; pte = ldl_phys(phyaddr2); if (!(pte & PG_PRESENT_MASK)) pt[i][j] = 0; pt[i][j] = pte; } } }