1*9c17d615SPaolo Bonzini /* 2*9c17d615SPaolo Bonzini * QEMU memory mapping 3*9c17d615SPaolo Bonzini * 4*9c17d615SPaolo Bonzini * Copyright Fujitsu, Corp. 2011, 2012 5*9c17d615SPaolo Bonzini * 6*9c17d615SPaolo Bonzini * Authors: 7*9c17d615SPaolo Bonzini * Wen Congyang <wency@cn.fujitsu.com> 8*9c17d615SPaolo Bonzini * 9*9c17d615SPaolo Bonzini * This work is licensed under the terms of the GNU GPL, version 2 or later. 10*9c17d615SPaolo Bonzini * See the COPYING file in the top-level directory. 11*9c17d615SPaolo Bonzini * 12*9c17d615SPaolo Bonzini */ 13*9c17d615SPaolo Bonzini 14*9c17d615SPaolo Bonzini #ifndef MEMORY_MAPPING_H 15*9c17d615SPaolo Bonzini #define MEMORY_MAPPING_H 16*9c17d615SPaolo Bonzini 17*9c17d615SPaolo Bonzini #include "qemu/queue.h" 18*9c17d615SPaolo Bonzini 19*9c17d615SPaolo Bonzini /* The physical and virtual address in the memory mapping are contiguous. */ 20*9c17d615SPaolo Bonzini typedef struct MemoryMapping { 21*9c17d615SPaolo Bonzini hwaddr phys_addr; 22*9c17d615SPaolo Bonzini target_ulong virt_addr; 23*9c17d615SPaolo Bonzini ram_addr_t length; 24*9c17d615SPaolo Bonzini QTAILQ_ENTRY(MemoryMapping) next; 25*9c17d615SPaolo Bonzini } MemoryMapping; 26*9c17d615SPaolo Bonzini 27*9c17d615SPaolo Bonzini typedef struct MemoryMappingList { 28*9c17d615SPaolo Bonzini unsigned int num; 29*9c17d615SPaolo Bonzini MemoryMapping *last_mapping; 30*9c17d615SPaolo Bonzini QTAILQ_HEAD(, MemoryMapping) head; 31*9c17d615SPaolo Bonzini } MemoryMappingList; 32*9c17d615SPaolo Bonzini 33*9c17d615SPaolo Bonzini int cpu_get_memory_mapping(MemoryMappingList *list, CPUArchState *env); 34*9c17d615SPaolo Bonzini bool cpu_paging_enabled(CPUArchState *env); 35*9c17d615SPaolo Bonzini 36*9c17d615SPaolo Bonzini /* 37*9c17d615SPaolo Bonzini * add or merge the memory region [phys_addr, phys_addr + length) into the 38*9c17d615SPaolo Bonzini * memory mapping's list. The region's virtual address starts with virt_addr, 39*9c17d615SPaolo Bonzini * and is contiguous. The list is sorted by phys_addr. 40*9c17d615SPaolo Bonzini */ 41*9c17d615SPaolo Bonzini void memory_mapping_list_add_merge_sorted(MemoryMappingList *list, 42*9c17d615SPaolo Bonzini hwaddr phys_addr, 43*9c17d615SPaolo Bonzini hwaddr virt_addr, 44*9c17d615SPaolo Bonzini ram_addr_t length); 45*9c17d615SPaolo Bonzini 46*9c17d615SPaolo Bonzini void memory_mapping_list_free(MemoryMappingList *list); 47*9c17d615SPaolo Bonzini 48*9c17d615SPaolo Bonzini void memory_mapping_list_init(MemoryMappingList *list); 49*9c17d615SPaolo Bonzini 50*9c17d615SPaolo Bonzini /* 51*9c17d615SPaolo Bonzini * Return value: 52*9c17d615SPaolo Bonzini * 0: success 53*9c17d615SPaolo Bonzini * -1: failed 54*9c17d615SPaolo Bonzini * -2: unsupported 55*9c17d615SPaolo Bonzini */ 56*9c17d615SPaolo Bonzini int qemu_get_guest_memory_mapping(MemoryMappingList *list); 57*9c17d615SPaolo Bonzini 58*9c17d615SPaolo Bonzini /* get guest's memory mapping without do paging(virtual address is 0). */ 59*9c17d615SPaolo Bonzini void qemu_get_guest_simple_memory_mapping(MemoryMappingList *list); 60*9c17d615SPaolo Bonzini 61*9c17d615SPaolo Bonzini void memory_mapping_filter(MemoryMappingList *list, int64_t begin, 62*9c17d615SPaolo Bonzini int64_t length); 63*9c17d615SPaolo Bonzini 64*9c17d615SPaolo Bonzini #endif 65