From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35577) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z5Gpy-0004mg-04 for qemu-devel@nongnu.org; Wed, 17 Jun 2015 13:09:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z5Gpu-00034H-Lw for qemu-devel@nongnu.org; Wed, 17 Jun 2015 13:09:17 -0400 Received: from mail-wi0-x236.google.com ([2a00:1450:400c:c05::236]:37019) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z5Gpu-00034C-F7 for qemu-devel@nongnu.org; Wed, 17 Jun 2015 13:09:14 -0400 Received: by wifx6 with SMTP id x6so60631869wif.0 for ; Wed, 17 Jun 2015 10:09:13 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <5581A9B7.3040700@redhat.com> Date: Wed, 17 Jun 2015 19:09:11 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1434054631-32241-1-git-send-email-hpoussin@reactos.org> <20150611233006.GA14284@aurel32.net> <557F3943.1040300@reactos.org> <20150616174846.GA17031@aurel32.net> <558130CA.4030502@redhat.com> In-Reply-To: <558130CA.4030502@redhat.com> Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH] dma/rc4030: do multiple calls to address_space_rw when doing DMA transfers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Aurelien Jarno , =?ISO-8859-15?Q?Herv=E9_Pous?= =?ISO-8859-15?Q?sineau?= Cc: Peter Maydell , Leon Alrae , qemu-devel@nongnu.org On 17/06/2015 10:33, Paolo Bonzini wrote: > On 16/06/2015 19:48, Aurelien Jarno wrote: >> The code assumes that if you don't have an IOMMU, the address range in >> the underlying memory region is linear. > > I think this is exactly what Peter Crosthwaite's infamous :) "exec: > Respect as_translate_internal length clamp" patch was trying to fix. > However, address_space_translate_internal uses section->mr->size instead > of section->size. I'll post a patch once I'm through the email deluge > from 1 week of absence. Can you test this? diff --git a/exec.c b/exec.c index 76bfc4a..fabb8bb 100644 --- a/exec.c +++ b/exec.c @@ -350,7 +350,7 @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x /* Compute offset within MemoryRegion */ *xlat = addr + section->offset_within_region; - diff = int128_sub(section->mr->size, int128_make64(addr)); + diff = int128_sub(section->size, int128_make64(addr)); *plen = int128_get64(int128_min(diff, int128_make64(*plen))); return section; } Paolo