Message ID | 1430152117-100558-30-git-send-email-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
On Mon, 04/27 18:28, Paolo Bonzini wrote: > mr->terminates alone doesn't guarantee that we are looking at a RAM region. > mr->ram_addr also has to be checked, in order to distinguish RAM and I/O > regions. > > IOMMU regions were not setting mr->ram_addr to a bogus value, do it now > so that the assertions would fire for IOMMU regions as well. > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> It would be nicer to introduce a memory_region_is_ram(MemoryRegion *mr), the ~(ram_addr_t) duplications are too many. Fam > --- > memory.c | 15 ++++++++------- > 1 file changed, 8 insertions(+), 7 deletions(-) > > diff --git a/memory.c b/memory.c > index bb86b4b..82d9df6 100644 > --- a/memory.c > +++ b/memory.c > @@ -1242,6 +1242,7 @@ void memory_region_init_iommu(MemoryRegion *mr, > memory_region_init(mr, owner, name, size); > mr->iommu_ops = ops, > mr->terminates = true; /* then re-forwards */ > + mr->ram_addr = ~(ram_addr_t)0; > notifier_list_init(&mr->iommu_notify); > } > > @@ -1382,14 +1383,14 @@ void memory_region_set_log(MemoryRegion *mr, bool log, unsigned client) > bool memory_region_get_dirty(MemoryRegion *mr, hwaddr addr, > hwaddr size, unsigned client) > { > - assert(mr->terminates); > + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); > return cpu_physical_memory_get_dirty(mr->ram_addr + addr, size, client); > } > > void memory_region_set_dirty(MemoryRegion *mr, hwaddr addr, > hwaddr size) > { > - assert(mr->terminates); > + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); > cpu_physical_memory_set_dirty_range(mr->ram_addr + addr, size, > memory_region_get_dirty_log_mask(mr)); > } > @@ -1397,7 +1398,7 @@ void memory_region_set_dirty(MemoryRegion *mr, hwaddr addr, > bool memory_region_test_and_clear_dirty(MemoryRegion *mr, hwaddr addr, > hwaddr size, unsigned client) > { > - assert(mr->terminates); > + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); > return cpu_physical_memory_test_and_clear_dirty(mr->ram_addr + addr, > size, client); > } > @@ -1442,7 +1443,7 @@ void memory_region_rom_device_set_romd(MemoryRegion *mr, bool romd_mode) > void memory_region_reset_dirty(MemoryRegion *mr, hwaddr addr, > hwaddr size, unsigned client) > { > - assert(mr->terminates); > + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); > cpu_physical_memory_test_and_clear_dirty(mr->ram_addr + addr, size, > client); > } > @@ -1453,7 +1454,7 @@ int memory_region_get_fd(MemoryRegion *mr) > return memory_region_get_fd(mr->alias); > } > > - assert(mr->terminates); > + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); > > return qemu_get_ram_fd(mr->ram_addr & TARGET_PAGE_MASK); > } > @@ -1464,14 +1465,14 @@ void *memory_region_get_ram_ptr(MemoryRegion *mr) > return memory_region_get_ram_ptr(mr->alias) + mr->alias_offset; > } > > - assert(mr->terminates); > + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); > > return qemu_get_ram_ptr(mr->ram_addr & TARGET_PAGE_MASK); > } > > void memory_region_ram_resize(MemoryRegion *mr, ram_addr_t newsize, Error **errp) > { > - assert(mr->terminates); > + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); > > qemu_ram_resize(mr->ram_addr, newsize, errp); > } > -- > 1.8.3.1 >
On 26/05/2015 14:49, Fam Zheng wrote: > It would be nicer to introduce a memory_region_is_ram(MemoryRegion *mr), the > ~(ram_addr_t) duplications are too many. Is RAM_ADDR_INVALID okay too? Paolo > Fam > >> --- >> memory.c | 15 ++++++++------- >> 1 file changed, 8 insertions(+), 7 deletions(-) >> >> diff --git a/memory.c b/memory.c >> index bb86b4b..82d9df6 100644 >> --- a/memory.c >> +++ b/memory.c >> @@ -1242,6 +1242,7 @@ void memory_region_init_iommu(MemoryRegion *mr, >> memory_region_init(mr, owner, name, size); >> mr->iommu_ops = ops, >> mr->terminates = true; /* then re-forwards */ >> + mr->ram_addr = ~(ram_addr_t)0; >> notifier_list_init(&mr->iommu_notify); >> } >> >> @@ -1382,14 +1383,14 @@ void memory_region_set_log(MemoryRegion *mr, bool log, unsigned client) >> bool memory_region_get_dirty(MemoryRegion *mr, hwaddr addr, >> hwaddr size, unsigned client) >> { >> - assert(mr->terminates); >> + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); >> return cpu_physical_memory_get_dirty(mr->ram_addr + addr, size, client); >> } >> >> void memory_region_set_dirty(MemoryRegion *mr, hwaddr addr, >> hwaddr size) >> { >> - assert(mr->terminates); >> + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); >> cpu_physical_memory_set_dirty_range(mr->ram_addr + addr, size, >> memory_region_get_dirty_log_mask(mr)); >> } >> @@ -1397,7 +1398,7 @@ void memory_region_set_dirty(MemoryRegion *mr, hwaddr addr, >> bool memory_region_test_and_clear_dirty(MemoryRegion *mr, hwaddr addr, >> hwaddr size, unsigned client) >> { >> - assert(mr->terminates); >> + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); >> return cpu_physical_memory_test_and_clear_dirty(mr->ram_addr + addr, >> size, client); >> } >> @@ -1442,7 +1443,7 @@ void memory_region_rom_device_set_romd(MemoryRegion *mr, bool romd_mode) >> void memory_region_reset_dirty(MemoryRegion *mr, hwaddr addr, >> hwaddr size, unsigned client) >> { >> - assert(mr->terminates); >> + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); >> cpu_physical_memory_test_and_clear_dirty(mr->ram_addr + addr, size, >> client); >> } >> @@ -1453,7 +1454,7 @@ int memory_region_get_fd(MemoryRegion *mr) >> return memory_region_get_fd(mr->alias); >> } >> >> - assert(mr->terminates); >> + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); >> >> return qemu_get_ram_fd(mr->ram_addr & TARGET_PAGE_MASK); >> } >> @@ -1464,14 +1465,14 @@ void *memory_region_get_ram_ptr(MemoryRegion *mr) >> return memory_region_get_ram_ptr(mr->alias) + mr->alias_offset; >> } >> >> - assert(mr->terminates); >> + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); >> >> return qemu_get_ram_ptr(mr->ram_addr & TARGET_PAGE_MASK); >> } >> >> void memory_region_ram_resize(MemoryRegion *mr, ram_addr_t newsize, Error **errp) >> { >> - assert(mr->terminates); >> + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); >> >> qemu_ram_resize(mr->ram_addr, newsize, errp); >> } >> -- >> 1.8.3.1 >>
On Tue, 05/26 14:52, Paolo Bonzini wrote: > > > On 26/05/2015 14:49, Fam Zheng wrote: > > It would be nicer to introduce a memory_region_is_ram(MemoryRegion *mr), the > > ~(ram_addr_t) duplications are too many. > > Is RAM_ADDR_INVALID okay too? I think so. If you replace every ~(ram_addr_t)0 with RAM_ADDR_INVALID, you can add my Reviewed-by: Fam Zheng <famz@redhat.com>
diff --git a/memory.c b/memory.c index bb86b4b..82d9df6 100644 --- a/memory.c +++ b/memory.c @@ -1242,6 +1242,7 @@ void memory_region_init_iommu(MemoryRegion *mr, memory_region_init(mr, owner, name, size); mr->iommu_ops = ops, mr->terminates = true; /* then re-forwards */ + mr->ram_addr = ~(ram_addr_t)0; notifier_list_init(&mr->iommu_notify); } @@ -1382,14 +1383,14 @@ void memory_region_set_log(MemoryRegion *mr, bool log, unsigned client) bool memory_region_get_dirty(MemoryRegion *mr, hwaddr addr, hwaddr size, unsigned client) { - assert(mr->terminates); + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); return cpu_physical_memory_get_dirty(mr->ram_addr + addr, size, client); } void memory_region_set_dirty(MemoryRegion *mr, hwaddr addr, hwaddr size) { - assert(mr->terminates); + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); cpu_physical_memory_set_dirty_range(mr->ram_addr + addr, size, memory_region_get_dirty_log_mask(mr)); } @@ -1397,7 +1398,7 @@ void memory_region_set_dirty(MemoryRegion *mr, hwaddr addr, bool memory_region_test_and_clear_dirty(MemoryRegion *mr, hwaddr addr, hwaddr size, unsigned client) { - assert(mr->terminates); + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); return cpu_physical_memory_test_and_clear_dirty(mr->ram_addr + addr, size, client); } @@ -1442,7 +1443,7 @@ void memory_region_rom_device_set_romd(MemoryRegion *mr, bool romd_mode) void memory_region_reset_dirty(MemoryRegion *mr, hwaddr addr, hwaddr size, unsigned client) { - assert(mr->terminates); + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); cpu_physical_memory_test_and_clear_dirty(mr->ram_addr + addr, size, client); } @@ -1453,7 +1454,7 @@ int memory_region_get_fd(MemoryRegion *mr) return memory_region_get_fd(mr->alias); } - assert(mr->terminates); + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); return qemu_get_ram_fd(mr->ram_addr & TARGET_PAGE_MASK); } @@ -1464,14 +1465,14 @@ void *memory_region_get_ram_ptr(MemoryRegion *mr) return memory_region_get_ram_ptr(mr->alias) + mr->alias_offset; } - assert(mr->terminates); + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); return qemu_get_ram_ptr(mr->ram_addr & TARGET_PAGE_MASK); } void memory_region_ram_resize(MemoryRegion *mr, ram_addr_t newsize, Error **errp) { - assert(mr->terminates); + assert(mr->terminates && mr->ram_addr != ~(ram_addr_t)0); qemu_ram_resize(mr->ram_addr, newsize, errp); }
mr->terminates alone doesn't guarantee that we are looking at a RAM region. mr->ram_addr also has to be checked, in order to distinguish RAM and I/O regions. IOMMU regions were not setting mr->ram_addr to a bogus value, do it now so that the assertions would fire for IOMMU regions as well. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- memory.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)