Commit 4855d41a authored by Avi Kivity's avatar Avi Kivity
Browse files

memory: split memory listener for the two address spaces



The memory and I/O address spaces do different things, so split them into
two memory listeners.

Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 947f562c
Loading
Loading
Loading
Loading
+66 −14
Original line number Diff line number Diff line
@@ -3491,24 +3491,13 @@ static void io_mem_init(void)
static void core_region_add(MemoryListener *listener,
                            MemoryRegionSection *section)
{
    if (section->address_space == get_system_memory()) {
    cpu_register_physical_memory_log(section, section->readonly);
    } else {
        iorange_init(&section->mr->iorange, &memory_region_iorange_ops,
                     section->offset_within_address_space, section->size);
        ioport_register(&section->mr->iorange);
    }
}

static void core_region_del(MemoryListener *listener,
                            MemoryRegionSection *section)
{
    if (section->address_space == get_system_memory()) {
    cpu_register_physical_memory_log(section, false);
    } else {
        isa_unassign_ioport(section->offset_within_address_space,
                            section->size);
    }
}

static void core_log_start(MemoryListener *listener,
@@ -3548,6 +3537,55 @@ static void core_eventfd_del(MemoryListener *listener,
{
}

static void io_region_add(MemoryListener *listener,
                          MemoryRegionSection *section)
{
    iorange_init(&section->mr->iorange, &memory_region_iorange_ops,
                 section->offset_within_address_space, section->size);
    ioport_register(&section->mr->iorange);
}

static void io_region_del(MemoryListener *listener,
                          MemoryRegionSection *section)
{
    isa_unassign_ioport(section->offset_within_address_space, section->size);
}

static void io_log_start(MemoryListener *listener,
                         MemoryRegionSection *section)
{
}

static void io_log_stop(MemoryListener *listener,
                        MemoryRegionSection *section)
{
}

static void io_log_sync(MemoryListener *listener,
                        MemoryRegionSection *section)
{
}

static void io_log_global_start(MemoryListener *listener)
{
}

static void io_log_global_stop(MemoryListener *listener)
{
}

static void io_eventfd_add(MemoryListener *listener,
                           MemoryRegionSection *section,
                           bool match_data, uint64_t data, int fd)
{
}

static void io_eventfd_del(MemoryListener *listener,
                           MemoryRegionSection *section,
                           bool match_data, uint64_t data, int fd)
{
}

static MemoryListener core_memory_listener = {
    .region_add = core_region_add,
    .region_del = core_region_del,
@@ -3561,6 +3599,19 @@ static MemoryListener core_memory_listener = {
    .priority = 0,
};

static MemoryListener io_memory_listener = {
    .region_add = io_region_add,
    .region_del = io_region_del,
    .log_start = io_log_start,
    .log_stop = io_log_stop,
    .log_sync = io_log_sync,
    .log_global_start = io_log_global_start,
    .log_global_stop = io_log_global_stop,
    .eventfd_add = io_eventfd_add,
    .eventfd_del = io_eventfd_del,
    .priority = 0,
};

static void memory_map_init(void)
{
    system_memory = g_malloc(sizeof(*system_memory));
@@ -3571,7 +3622,8 @@ static void memory_map_init(void)
    memory_region_init(system_io, "io", 65536);
    set_system_io_map(system_io);

    memory_listener_register(&core_memory_listener, NULL);
    memory_listener_register(&core_memory_listener, system_memory);
    memory_listener_register(&io_memory_listener, system_io);
}

MemoryRegion *get_system_memory(void)