static bool addrrange_intersects(AddrRange r1, AddrRange r2)
{
- return (r1.start >= r2.start && r1.start < r2.start + r2.size)
- || (r2.start >= r1.start && r2.start < r1.start + r1.size);
+ return (r1.start >= r2.start && (r1.start - r2.start) < r2.size)
+ || (r2.start >= r1.start && (r2.start - r1.start) < r1.size);
}
static AddrRange addrrange_intersection(AddrRange r1, AddrRange r2)
}
if (!fr->readable) {
- phys_offset &= TARGET_PAGE_MASK;
+ phys_offset &= ~TARGET_PAGE_MASK & ~IO_MEM_ROMD;
}
cpu_register_physical_memory_log(fr->addr.start,
void memory_region_init_rom_device(MemoryRegion *mr,
const MemoryRegionOps *ops,
+ void *opaque,
DeviceState *dev,
const char *name,
uint64_t size)
{
memory_region_init(mr, name, size);
mr->ops = ops;
+ mr->opaque = opaque;
mr->terminates = true;
mr->destructor = memory_region_destructor_rom_device;
mr->ram_addr = qemu_ram_alloc(dev, name, size);
assert(mr->terminates);
- return qemu_get_ram_ptr(mr->ram_addr);
+ return qemu_get_ram_ptr(mr->ram_addr & TARGET_PAGE_MASK);
}
static void memory_region_update_coalesced_range(MemoryRegion *mr)
if (subregion->may_overlap || other->may_overlap) {
continue;
}
- if (offset >= other->offset + other->size
- || offset + subregion->size <= other->offset) {
+ if (offset >= other->addr + other->size
+ || offset + subregion->size <= other->addr) {
continue;
}
#if 0
- printf("warning: subregion collision %llx/%llx vs %llx/%llx\n",
+ printf("warning: subregion collision %llx/%llx (%s) "
+ "vs %llx/%llx (%s)\n",
(unsigned long long)offset,
(unsigned long long)subregion->size,
- (unsigned long long)other->offset,
- (unsigned long long)other->size);
+ subregion->name,
+ (unsigned long long)other->addr,
+ (unsigned long long)other->size,
+ other->name);
#endif
}
QTAILQ_FOREACH(other, &mr->subregions, subregions_link) {