From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56363) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wnha6-0002IU-Gr for qemu-devel@nongnu.org; Fri, 23 May 2014 00:59:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WnhZt-0005iN-1k for qemu-devel@nongnu.org; Fri, 23 May 2014 00:59:46 -0400 Received: from e23smtp05.au.ibm.com ([202.81.31.147]:48159) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WnhZs-0005h7-8R for qemu-devel@nongnu.org; Fri, 23 May 2014 00:59:32 -0400 Received: from /spool/local by e23smtp05.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 23 May 2014 14:59:27 +1000 From: Alexey Kardashevskiy Date: Fri, 23 May 2014 14:59:16 +1000 Message-Id: <1400821160-25258-4-git-send-email-aik@ozlabs.ru> In-Reply-To: <1400821160-25258-1-git-send-email-aik@ozlabs.ru> References: <1400821160-25258-1-git-send-email-aik@ozlabs.ru> Subject: [Qemu-devel] [PATCH v6 3/7] 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 , Alex Williamson , qemu-ppc@nongnu.org, Alexander Graf 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 Reviewed-by: Paolo Bonzini --- Changes: v3: * 64bit @end is calculated from 128-bit @llend instead of repeating the same calculation steps v2: * used new function int128_exts64() --- hw/misc/vfio.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c index 9cf5b84..3ff776a 100644 --- a/hw/misc/vfio.c +++ b/hw/misc/vfio.c @@ -2248,6 +2248,7 @@ static void vfio_listener_region_add(MemoryListener *listener, VFIOContainer *container = container_of(listener, VFIOContainer, iommu_data.type1.listener); hwaddr iova, end; + Int128 llend; void *vaddr; int ret; @@ -2268,13 +2269,15 @@ 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 = int128_get64(llend); vaddr = memory_region_get_ram_ptr(section->mr) + section->offset_within_region + (iova - section->offset_within_address_space); -- 1.9.rc0