diff options
author | Avi Kivity <avi@redhat.com> | 2012-01-02 13:12:08 +0200 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-01-04 13:34:50 +0200 |
commit | a621f38de85598a13d8d8524d1a94fc6a1818215 (patch) | |
tree | 1b72656e5b100a967a0c1f399287c27d84d62a39 /exec.c | |
parent | 1ec9b909ff207a44d5ef2609cb4a2e3d449d485f (diff) |
Direct dispatch through MemoryRegion
Now that all mmio goes through MemoryRegions, we can convert
io_mem_opaque to be a MemoryRegion pointer, and remove the thunks
that convert from old-style CPU{Read,Write}MemoryFunc to MemoryRegionOps.
Signed-off-by: Avi Kivity <avi@redhat.com>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Diffstat (limited to 'exec.c')
-rw-r--r-- | exec.c | 40 |
1 files changed, 10 insertions, 30 deletions
@@ -208,9 +208,7 @@ static void io_mem_init(void); static void memory_map_init(void); /* io memory support */ -CPUWriteMemoryFunc *_io_mem_write[IO_MEM_NB_ENTRIES][4]; -CPUReadMemoryFunc *_io_mem_read[IO_MEM_NB_ENTRIES][4]; -void *io_mem_opaque[IO_MEM_NB_ENTRIES]; +MemoryRegion *io_mem_region[IO_MEM_NB_ENTRIES]; static char io_mem_used[IO_MEM_NB_ENTRIES]; static MemoryRegion io_mem_watch; #endif @@ -2563,8 +2561,10 @@ void cpu_register_physical_memory_log(MemoryRegionSection *section, &p->phys_offset, orig_memory, p->region_offset); } else { - subpage = io_mem_opaque[(orig_memory & ~TARGET_PAGE_MASK) - >> IO_MEM_SHIFT]; + MemoryRegion *mr + = io_mem_region[(orig_memory & ~TARGET_PAGE_MASK) + >> IO_MEM_SHIFT]; + subpage = container_of(mr, subpage_t, iomem); } subpage_register(subpage, start_addr2, end_addr2, phys_offset, region_offset); @@ -3427,13 +3427,8 @@ static int get_free_io_mem_idx(void) modified. If it is zero, a new io zone is allocated. The return value can be used with cpu_register_physical_memory(). (-1) is returned if error. */ -static int cpu_register_io_memory_fixed(int io_index, - CPUReadMemoryFunc * const *mem_read, - CPUWriteMemoryFunc * const *mem_write, - void *opaque) +static int cpu_register_io_memory_fixed(int io_index, MemoryRegion *mr) { - int i; - if (io_index <= 0) { io_index = get_free_io_mem_idx(); if (io_index == -1) @@ -3444,36 +3439,21 @@ static int cpu_register_io_memory_fixed(int io_index, return -1; } - for (i = 0; i < 3; ++i) { - assert(mem_read[i]); - _io_mem_read[io_index][i] = mem_read[i]; - } - for (i = 0; i < 3; ++i) { - assert(mem_write[i]); - _io_mem_write[io_index][i] = mem_write[i]; - } - io_mem_opaque[io_index] = opaque; + io_mem_region[io_index] = mr; return (io_index << IO_MEM_SHIFT); } -int cpu_register_io_memory(CPUReadMemoryFunc * const *mem_read, - CPUWriteMemoryFunc * const *mem_write, - void *opaque) +int cpu_register_io_memory(MemoryRegion *mr) { - return cpu_register_io_memory_fixed(0, mem_read, mem_write, opaque); + return cpu_register_io_memory_fixed(0, mr); } void cpu_unregister_io_memory(int io_table_address) { - int i; int io_index = io_table_address >> IO_MEM_SHIFT; - for (i=0;i < 3; i++) { - _io_mem_read[io_index][i] = NULL; - _io_mem_write[io_index][i] = NULL; - } - io_mem_opaque[io_index] = NULL; + io_mem_region[io_index] = NULL; io_mem_used[io_index] = 0; } |