From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58304) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VCT5R-0000yU-DY for qemu-devel@nongnu.org; Thu, 22 Aug 2013 07:30:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VCT5L-0002Zb-7a for qemu-devel@nongnu.org; Thu, 22 Aug 2013 07:29:57 -0400 Received: from mail-pa0-f44.google.com ([209.85.220.44]:64572) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VCT5L-0002ZX-1S for qemu-devel@nongnu.org; Thu, 22 Aug 2013 07:29:51 -0400 Received: by mail-pa0-f44.google.com with SMTP id fz6so2094161pac.3 for ; Thu, 22 Aug 2013 04:29:50 -0700 (PDT) From: Alexey Kardashevskiy Date: Thu, 22 Aug 2013 21:29:25 +1000 Message-Id: <1377170965-9905-4-git-send-email-aik@ozlabs.ru> In-Reply-To: <1377170965-9905-1-git-send-email-aik@ozlabs.ru> References: <1377170965-9905-1-git-send-email-aik@ozlabs.ru> Subject: [Qemu-devel] [PATCH v3 3/3] vfio: Fix 128 bit handling List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Alexey Kardashevskiy , Paolo Bonzini , Alex Williamson , Peter Maydell Upcoming VFIO on SPAPR PPC64 support will initialize the IOMMU memory region with UINT64_MAX (2^64 bytes) size so int128_get64() will assert. The patch takes care of this check. The existing type1 IOMMU code is not expected to map all 64 bits of RAM so the patch does not touch that part. Signed-off-by: Alexey Kardashevskiy --- Changes: v2: * used new function int128_exts64() --- hw/misc/vfio.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c index dfe3a80..3878fc7 100644 --- a/hw/misc/vfio.c +++ b/hw/misc/vfio.c @@ -1920,6 +1920,7 @@ static void vfio_listener_region_add(MemoryListener *listener, VFIOContainer *container = container_of(listener, VFIOContainer, iommu_data.listener); hwaddr iova, end; + Int128 llend; void *vaddr; int ret; @@ -1940,13 +1941,17 @@ static void vfio_listener_region_add(MemoryListener *listener, } iova = TARGET_PAGE_ALIGN(section->offset_within_address_space); - end = (section->offset_within_address_space + int128_get64(section->size)) & - TARGET_PAGE_MASK; + llend = int128_make64(section->offset_within_address_space); + llend = int128_add(llend, section->size); + llend = int128_and(llend, int128_exts64(TARGET_PAGE_MASK)); - if (iova >= end) { + if (int128_ge(int128_make64(iova), llend)) { return; } + end = (section->offset_within_address_space + int128_get64(section->size)) & + TARGET_PAGE_MASK; + vaddr = memory_region_get_ram_ptr(section->mr) + section->offset_within_region + (iova - section->offset_within_address_space); -- 1.8.4.rc4