From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35045) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ymlw2-0002qB-Tw for qemu-devel@nongnu.org; Mon, 27 Apr 2015 12:31:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Ymlw1-0003QU-Kk for qemu-devel@nongnu.org; Mon, 27 Apr 2015 12:31:06 -0400 Received: from mail-wi0-x234.google.com ([2a00:1450:400c:c05::234]:38227) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ymlw1-0003QL-FE for qemu-devel@nongnu.org; Mon, 27 Apr 2015 12:31:05 -0400 Received: by wiun10 with SMTP id n10so96537022wiu.1 for ; Mon, 27 Apr 2015 09:31:05 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Mon, 27 Apr 2015 18:28:37 +0200 Message-Id: <1430152117-100558-30-git-send-email-pbonzini@redhat.com> In-Reply-To: <1430152117-100558-1-git-send-email-pbonzini@redhat.com> References: <1430152117-100558-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 29/29] memory: strengthen assertions on mr->terminates List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: famz@redhat.com, stefanha@redhat.com, mst@redhat.com 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 --- 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