提交 79122e93 编写于 作者: A Anthony Liguori

Merge remote-tracking branch 'qemu-kvm/memory/core' into staging

* qemu-kvm/memory/core:
  memory: get rid of cpu_register_io_memory()
  memory: dispatch directly via MemoryRegion
  exec: fix code tlb entry misused as iotlb in get_page_addr_code()
  memory: store section indices in iotlb instead of io indices
  memory: make phys_page_find() return an unadjusted section
...@@ -498,14 +498,6 @@ extern RAMList ram_list; ...@@ -498,14 +498,6 @@ extern RAMList ram_list;
extern const char *mem_path; extern const char *mem_path;
extern int mem_prealloc; extern int mem_prealloc;
/* physical memory access */
/* MMIO pages are identified by a combination of an IO device index and
3 flags. The ROMD code stores the page ram offset in iotlb entry,
so only a limited number of ids are avaiable. */
#define IO_MEM_NB_ENTRIES (1 << TARGET_PAGE_BITS)
/* Flags stored in the low bits of the TLB virtual address. These are /* Flags stored in the low bits of the TLB virtual address. These are
defined so that fast path ram access is all zeros. */ defined so that fast path ram access is all zeros. */
/* Zero if TLB entry is valid. */ /* Zero if TLB entry is valid. */
......
...@@ -299,10 +299,11 @@ extern void *tci_tb_ptr; ...@@ -299,10 +299,11 @@ extern void *tci_tb_ptr;
#if !defined(CONFIG_USER_ONLY) #if !defined(CONFIG_USER_ONLY)
uint64_t io_mem_read(int index, target_phys_addr_t addr, unsigned size); struct MemoryRegion *iotlb_to_region(target_phys_addr_t index);
void io_mem_write(int index, target_phys_addr_t addr, uint64_t value, uint64_t io_mem_read(struct MemoryRegion *mr, target_phys_addr_t addr,
unsigned size); unsigned size);
extern struct MemoryRegion *io_mem_region[IO_MEM_NB_ENTRIES]; void io_mem_write(struct MemoryRegion *mr, target_phys_addr_t addr,
uint64_t value, unsigned size);
void tlb_fill(CPUState *env1, target_ulong addr, int is_write, int mmu_idx, void tlb_fill(CPUState *env1, target_ulong addr, int is_write, int mmu_idx,
void *retaddr); void *retaddr);
......
...@@ -32,9 +32,6 @@ void qemu_ram_free(ram_addr_t addr); ...@@ -32,9 +32,6 @@ void qemu_ram_free(ram_addr_t addr);
void qemu_ram_free_from_ptr(ram_addr_t addr); void qemu_ram_free_from_ptr(ram_addr_t addr);
struct MemoryRegion; struct MemoryRegion;
int cpu_register_io_memory(MemoryRegion *mr);
void cpu_unregister_io_memory(int table_address);
struct MemoryRegionSection; struct MemoryRegionSection;
void cpu_register_physical_memory_log(struct MemoryRegionSection *section, void cpu_register_physical_memory_log(struct MemoryRegionSection *section,
bool readonly); bool readonly);
......
此差异已折叠。
...@@ -781,13 +781,11 @@ static void memory_region_destructor_ram_from_ptr(MemoryRegion *mr) ...@@ -781,13 +781,11 @@ static void memory_region_destructor_ram_from_ptr(MemoryRegion *mr)
static void memory_region_destructor_iomem(MemoryRegion *mr) static void memory_region_destructor_iomem(MemoryRegion *mr)
{ {
cpu_unregister_io_memory(mr->ram_addr);
} }
static void memory_region_destructor_rom_device(MemoryRegion *mr) static void memory_region_destructor_rom_device(MemoryRegion *mr)
{ {
qemu_ram_free(mr->ram_addr & TARGET_PAGE_MASK); qemu_ram_free(mr->ram_addr & TARGET_PAGE_MASK);
cpu_unregister_io_memory(mr->ram_addr & ~TARGET_PAGE_MASK);
} }
static bool memory_region_wrong_endianness(MemoryRegion *mr) static bool memory_region_wrong_endianness(MemoryRegion *mr)
...@@ -942,7 +940,7 @@ void memory_region_init_io(MemoryRegion *mr, ...@@ -942,7 +940,7 @@ void memory_region_init_io(MemoryRegion *mr,
mr->opaque = opaque; mr->opaque = opaque;
mr->terminates = true; mr->terminates = true;
mr->destructor = memory_region_destructor_iomem; mr->destructor = memory_region_destructor_iomem;
mr->ram_addr = cpu_register_io_memory(mr); mr->ram_addr = ~(ram_addr_t)0;
} }
void memory_region_init_ram(MemoryRegion *mr, void memory_region_init_ram(MemoryRegion *mr,
...@@ -992,7 +990,6 @@ void memory_region_init_rom_device(MemoryRegion *mr, ...@@ -992,7 +990,6 @@ void memory_region_init_rom_device(MemoryRegion *mr,
mr->rom_device = true; mr->rom_device = true;
mr->destructor = memory_region_destructor_rom_device; mr->destructor = memory_region_destructor_rom_device;
mr->ram_addr = qemu_ram_alloc(size, mr); mr->ram_addr = qemu_ram_alloc(size, mr);
mr->ram_addr |= cpu_register_io_memory(mr);
} }
static uint64_t invalid_read(void *opaque, target_phys_addr_t addr, static uint64_t invalid_read(void *opaque, target_phys_addr_t addr,
...@@ -1501,15 +1498,15 @@ void set_system_io_map(MemoryRegion *mr) ...@@ -1501,15 +1498,15 @@ void set_system_io_map(MemoryRegion *mr)
memory_region_update_topology(NULL); memory_region_update_topology(NULL);
} }
uint64_t io_mem_read(int io_index, target_phys_addr_t addr, unsigned size) uint64_t io_mem_read(MemoryRegion *mr, target_phys_addr_t addr, unsigned size)
{ {
return memory_region_dispatch_read(io_mem_region[io_index], addr, size); return memory_region_dispatch_read(mr, addr, size);
} }
void io_mem_write(int io_index, target_phys_addr_t addr, void io_mem_write(MemoryRegion *mr, target_phys_addr_t addr,
uint64_t val, unsigned size) uint64_t val, unsigned size)
{ {
memory_region_dispatch_write(io_mem_region[io_index], addr, val, size); memory_region_dispatch_write(mr, addr, val, size);
} }
typedef struct MemoryRegionList MemoryRegionList; typedef struct MemoryRegionList MemoryRegionList;
......
...@@ -62,27 +62,27 @@ static inline DATA_TYPE glue(io_read, SUFFIX)(target_phys_addr_t physaddr, ...@@ -62,27 +62,27 @@ static inline DATA_TYPE glue(io_read, SUFFIX)(target_phys_addr_t physaddr,
void *retaddr) void *retaddr)
{ {
DATA_TYPE res; DATA_TYPE res;
int index; MemoryRegion *mr = iotlb_to_region(physaddr);
index = physaddr & (IO_MEM_NB_ENTRIES - 1);
physaddr = (physaddr & TARGET_PAGE_MASK) + addr; physaddr = (physaddr & TARGET_PAGE_MASK) + addr;
env->mem_io_pc = (unsigned long)retaddr; env->mem_io_pc = (unsigned long)retaddr;
if (index != io_mem_ram.ram_addr && index != io_mem_rom.ram_addr if (mr != &io_mem_ram && mr != &io_mem_rom
&& index != io_mem_unassigned.ram_addr && mr != &io_mem_unassigned
&& index != io_mem_notdirty.ram_addr && mr != &io_mem_notdirty
&& !can_do_io(env)) { && !can_do_io(env)) {
cpu_io_recompile(env, retaddr); cpu_io_recompile(env, retaddr);
} }
env->mem_io_vaddr = addr; env->mem_io_vaddr = addr;
#if SHIFT <= 2 #if SHIFT <= 2
res = io_mem_read(index, physaddr, 1 << SHIFT); res = io_mem_read(mr, physaddr, 1 << SHIFT);
#else #else
#ifdef TARGET_WORDS_BIGENDIAN #ifdef TARGET_WORDS_BIGENDIAN
res = io_mem_read(index, physaddr, 4) << 32; res = io_mem_read(mr, physaddr, 4) << 32;
res |= io_mem_read(index, physaddr + 4, 4); res |= io_mem_read(mr, physaddr + 4, 4);
#else #else
res = io_mem_read(index, physaddr, 4); res = io_mem_read(mr, physaddr, 4);
res |= io_mem_read(index, physaddr + 4, 4) << 32; res |= io_mem_read(mr, physaddr + 4, 4) << 32;
#endif #endif
#endif /* SHIFT > 2 */ #endif /* SHIFT > 2 */
return res; return res;
...@@ -207,12 +207,12 @@ static inline void glue(io_write, SUFFIX)(target_phys_addr_t physaddr, ...@@ -207,12 +207,12 @@ static inline void glue(io_write, SUFFIX)(target_phys_addr_t physaddr,
target_ulong addr, target_ulong addr,
void *retaddr) void *retaddr)
{ {
int index; MemoryRegion *mr = iotlb_to_region(physaddr);
index = physaddr & (IO_MEM_NB_ENTRIES - 1);
physaddr = (physaddr & TARGET_PAGE_MASK) + addr; physaddr = (physaddr & TARGET_PAGE_MASK) + addr;
if (index != io_mem_ram.ram_addr && index != io_mem_rom.ram_addr if (mr != &io_mem_ram && mr != &io_mem_rom
&& index != io_mem_unassigned.ram_addr && mr != &io_mem_unassigned
&& index != io_mem_notdirty.ram_addr && mr != &io_mem_notdirty
&& !can_do_io(env)) { && !can_do_io(env)) {
cpu_io_recompile(env, retaddr); cpu_io_recompile(env, retaddr);
} }
...@@ -220,14 +220,14 @@ static inline void glue(io_write, SUFFIX)(target_phys_addr_t physaddr, ...@@ -220,14 +220,14 @@ static inline void glue(io_write, SUFFIX)(target_phys_addr_t physaddr,
env->mem_io_vaddr = addr; env->mem_io_vaddr = addr;
env->mem_io_pc = (unsigned long)retaddr; env->mem_io_pc = (unsigned long)retaddr;
#if SHIFT <= 2 #if SHIFT <= 2
io_mem_write(index, physaddr, val, 1 << SHIFT); io_mem_write(mr, physaddr, val, 1 << SHIFT);
#else #else
#ifdef TARGET_WORDS_BIGENDIAN #ifdef TARGET_WORDS_BIGENDIAN
io_mem_write(index, physaddr, (val >> 32), 4); io_mem_write(mr, physaddr, (val >> 32), 4);
io_mem_write(index, physaddr + 4, (uint32_t)val, 4); io_mem_write(mr, physaddr + 4, (uint32_t)val, 4);
#else #else
io_mem_write(index, physaddr, (uint32_t)val, 4); io_mem_write(mr, physaddr, (uint32_t)val, 4);
io_mem_write(index, physaddr + 4, val >> 32, 4); io_mem_write(mr, physaddr + 4, val >> 32, 4);
#endif #endif
#endif /* SHIFT > 2 */ #endif /* SHIFT > 2 */
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册