From: Wen Congyang <we...@cn.fujitsu.com> Subject: [RFC][PATCH 05/16 v8] Add API to get memory mapping Date: Fri, 02 Mar 2012 18:18:23 +0800
> Add API to get all virtual address and physical address mapping. > If there is no virtual address for some physical address, the virtual > address is 0. > > Signed-off-by: Wen Congyang <we...@cn.fujitsu.com> > --- > memory_mapping.c | 88 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > memory_mapping.h | 8 +++++ > 2 files changed, 96 insertions(+), 0 deletions(-) > > diff --git a/memory_mapping.c b/memory_mapping.c > index 718f271..f74c5d0 100644 > --- a/memory_mapping.c > +++ b/memory_mapping.c > @@ -164,3 +164,91 @@ void memory_mapping_list_init(MemoryMappingList *list) > list->last_mapping = NULL; > QTAILQ_INIT(&list->head); > } > + > +int qemu_get_guest_memory_mapping(MemoryMappingList *list) > +{ > + CPUState *env; > + MemoryMapping *memory_mapping; > + RAMBlock *block; > + ram_addr_t offset, length, m_length; > + target_phys_addr_t m_phys_addr; > + int ret; > + bool paging_mode; > + > +#if defined(CONFIG_HAVE_GET_MEMORY_MAPPING) > + paging_mode = cpu_paging_enabled(first_cpu); > + if (paging_mode) { > + for (env = first_cpu; env != NULL; env = env->next_cpu) { > + ret = cpu_get_memory_mapping(list, env); > + if (ret < 0) { > + return -1; > + } > + } > + } > +#else > + return -2; > +#endif > + > + /* > + * some memory may be not in the memory mapping's list: > + * 1. the guest doesn't use paging > + * 2. the guest is in 2nd kernel, and the memory used by 1st kernel is > not > + * in paging table > + * add them into memory mapping's list > + */ > + QLIST_FOREACH(block, &ram_list.blocks, next) { How does the memory portion referenced by PT_LOAD program headers with p_vaddr == 0 looks through gdb? If we cannot access such portions, part not referenced by the page table CR3 has is unnecessary, isn't it? Thanks. HATAYAMA, Daisuke