On 03/26/2012 01:01 PM, Stefano Stabellini wrote: > On Sun, 25 Mar 2012, Avi Kivity wrote: > > On 03/23/2012 06:37 PM, Jan Kiszka wrote: > > > On 2012-03-23 16:08, Julien Grall wrote: > > > > On 03/22/2012 05:44 PM, Jan Kiszka wrote: > > > >>> > > > >>> static void core_region_nop(MemoryListener *listener, > > > >>> diff --git a/ioport.c b/ioport.c > > > >>> index 78a3b89..073ed75 100644 > > > >>> --- a/ioport.c > > > >>> +++ b/ioport.c > > > >>> @@ -28,6 +28,7 @@ > > > >>> #include "ioport.h" > > > >>> #include "trace.h" > > > >>> #include "memory.h" > > > >>> +#include "hw/xen.h" > > > >>> > > > >>> /***********************************************************/ > > > >>> /* IO Port */ > > > >>> @@ -155,6 +156,11 @@ int register_ioport_read(pio_addr_t start, int > > > >>> length, int size, > > > >>> i); > > > >>> ioport_opaque[i] = opaque; > > > >>> } > > > >>> + > > > >>> + if (xen_enabled()) { > > > >>> + xen_map_iorange(start, length, 0); > > > >>> + } > > > >>> + > > > >>> return 0; > > > >>> } > > > >>> > > > >>> @@ -175,7 +181,13 @@ int register_ioport_write(pio_addr_t start, int > > > >>> length, int size, > > > >>> i); > > > >>> ioport_opaque[i] = opaque; > > > >>> } > > > >>> + > > > >>> + if (xen_enabled()) { > > > >>> + xen_map_iorange(start, length, 0); > > > >>> + } > > > >>> + > > > >>> return 0; > > > >>> + > > > >>> } > > > >>> > > > >>> static uint32_t ioport_readb_thunk(void *opaque, uint32_t addr) > > > >>> @@ -260,6 +272,11 @@ void isa_unassign_ioport(pio_addr_t start, int > > > >>> length) > > > >>> ioport_destructor_table[start](ioport_opaque[start]); > > > >>> ioport_destructor_table[start] = NULL; > > > >>> } > > > >>> + > > > >>> + if (xen_enabled()) { > > > >>> + xen_unmap_iorange(start, length, 0); > > > >>> + } > > > >>> + > > > >>> for(i = start; i< start + length; i++) { > > > >>> ioport_read_table[0][i] = NULL; > > > >>> ioport_read_table[1][i] = NULL; > > > >>> > > > >> memory_listener_register(xen_hooks, system_io)? > > > >> > > > > QEMU doesn't seem to call region_add/region_del for ioport. > > > > Moreover, some of ioport are directly register without > > > > using memory hook (for example cirrus vga). > > > > > > > > What is the best way to do it ? > > > > > > I haven't looked at details. Maybe it is just a combination of "use case > > > not yet considered, but can easily be added" and "need to switch legacy > > > code to new scheme". Then this still remains the better option than this > > > hook. Avi? > > > > Just the second - region_add/del will be called, but only for ioports > > registered via the MemoryRegion APIs. > > It looks like there are quite a few register_ioport_read/write left > around, especially in the following files: > > hw/acpi_piix4.c > hw/cirrus_vga.c > hw/serial.c > hw/pckbd.c > hw/pc.c > > I guess they should all be converted to memory_region_init_io, right?
Right. -- error compiling committee.c: too many arguments to function