qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] dma/rc4030: do multiple calls to address_space_


From: Hervé Poussineau
Subject: Re: [Qemu-devel] [PATCH] dma/rc4030: do multiple calls to address_space_rw when doing DMA transfers
Date: Wed, 17 Jun 2015 20:31:22 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.7.0

Le 17/06/2015 19:09, Paolo Bonzini a écrit :


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?

Sure. It works well for my test case. Thanks Paolo!

However, it breaks PC machines.
mtree gives:
    0000000000000cf8-0000000000000cfb (prio 0, RW): pci-conf-idx
    0000000000000cf9-0000000000000cf9 (prio 1, RW): piix3-reset-control
"make check" wants to write 4 bytes to 0xcf8. Your patch makes it write only 1 
byte, and bad things happen.



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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]