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 | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ memory_mapping.h | 1 + 2 files changed, 66 insertions(+), 0 deletions(-) diff --git a/memory_mapping.c b/memory_mapping.c index d83b7d7..fc0ddee 100644 --- a/memory_mapping.c +++ b/memory_mapping.c @@ -128,3 +128,68 @@ void free_memory_mapping_list(MemoryMappingList *list) list->num = 0; } + +void get_memory_mapping(MemoryMappingList *list) +{ + CPUState *env; + MemoryMapping *memory_mapping; + RAMBlock *block; + ram_addr_t offset, length; + + last_mapping = NULL; + + for (env = first_cpu; env != NULL; env = env->next_cpu) { + cpu_get_memory_mapping(list, env); + } + + /* some memory may be not mapped, add them into memory mapping's list */ + QLIST_FOREACH(block, &ram_list.blocks, next) { + offset = block->offset; + length = block->length; + + QTAILQ_FOREACH(memory_mapping, &list->head, next) { + if (memory_mapping->phys_addr >= (offset + length)) { + /* + * memory_mapping's list does not conatin the region + * [offset, offset+length) + */ + create_new_memory_mapping(list, offset, 0, length); + length = 0; + break; + } + + if ((memory_mapping->phys_addr + memory_mapping->length) <= + offset) { + continue; + } + + if (memory_mapping->phys_addr > offset) { + /* + * memory_mapping's list does not conatin the region + * [offset, memory_mapping->phys_addr) + */ + create_new_memory_mapping(list, offset, 0, + memory_mapping->phys_addr - offset); + } + + if ((offset + length) <= + (memory_mapping->phys_addr + memory_mapping->length)) { + length = 0; + break; + } + length -= memory_mapping->phys_addr + memory_mapping->length - + offset; + offset = memory_mapping->phys_addr + memory_mapping->length; + } + + if (length > 0) { + /* + * memory_mapping's list does not conatin the region + * [offset, memory_mapping->phys_addr) + */ + create_new_memory_mapping(list, offset, 0, length); + } + } + + return; +} diff --git a/memory_mapping.h b/memory_mapping.h index a4b1532..679f9ef 100644 --- a/memory_mapping.h +++ b/memory_mapping.h @@ -34,5 +34,6 @@ void add_to_memory_mapping(MemoryMappingList *list, ram_addr_t length); void free_memory_mapping_list(MemoryMappingList *list); +void get_memory_mapping(MemoryMappingList *list); #endif -- 1.7.1