Revision 16ef61c9 memory.c

b/memory.c
165 165
    }
166 166
}
167 167

  
168
static void memory_region_prepare_ram_addr(MemoryRegion *mr);
169

  
168 170
static void as_memory_range_add(AddressSpace *as, FlatRange *fr)
169 171
{
170 172
    ram_addr_t phys_offset, region_offset;
171 173

  
174
    memory_region_prepare_ram_addr(fr->mr);
175

  
172 176
    phys_offset = fr->mr->ram_addr;
173 177
    region_offset = fr->offset_in_region;
174 178
    /* cpu_register_physical_memory_log() wants region_offset for
......
519 523
    memory_region_write_thunk_l,
520 524
};
521 525

  
526
static void memory_region_prepare_ram_addr(MemoryRegion *mr)
527
{
528
    if (mr->backend_registered) {
529
        return;
530
    }
531

  
532
    mr->ram_addr = cpu_register_io_memory(memory_region_read_thunk,
533
                                          memory_region_write_thunk,
534
                                          mr,
535
                                          mr->ops->endianness);
536
    mr->backend_registered = true;
537
}
538

  
522 539
void memory_region_init_io(MemoryRegion *mr,
523 540
                           const MemoryRegionOps *ops,
524 541
                           void *opaque,
......
529 546
    mr->ops = ops;
530 547
    mr->opaque = opaque;
531 548
    mr->terminates = true;
532
    mr->ram_addr = cpu_register_io_memory(memory_region_read_thunk,
533
                                          memory_region_write_thunk,
534
                                          mr,
535
                                          mr->ops->endianness);
549
    mr->backend_registered = false;
536 550
}
537 551

  
538 552
void memory_region_init_ram(MemoryRegion *mr,
......
543 557
    memory_region_init(mr, name, size);
544 558
    mr->terminates = true;
545 559
    mr->ram_addr = qemu_ram_alloc(dev, name, size);
560
    mr->backend_registered = true;
546 561
}
547 562

  
548 563
void memory_region_init_ram_ptr(MemoryRegion *mr,
......
554 569
    memory_region_init(mr, name, size);
555 570
    mr->terminates = true;
556 571
    mr->ram_addr = qemu_ram_alloc_from_ptr(dev, name, size, ptr);
572
    mr->backend_registered = true;
557 573
}
558 574

  
559 575
void memory_region_init_alias(MemoryRegion *mr,

Also available in: Unified diff