From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NN35M-0004jI-Uz for qemu-devel@nongnu.org; Tue, 22 Dec 2009 06:39:28 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NN35I-0004WX-3T for qemu-devel@nongnu.org; Tue, 22 Dec 2009 06:39:28 -0500 Received: from [199.232.76.173] (port=57820 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NN35H-0004WB-V5 for qemu-devel@nongnu.org; Tue, 22 Dec 2009 06:39:23 -0500 Received: from mx1.redhat.com ([209.132.183.28]:47328) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NN35H-00043D-K9 for qemu-devel@nongnu.org; Tue, 22 Dec 2009 06:39:23 -0500 Date: Tue, 22 Dec 2009 13:36:26 +0200 From: "Michael S. Tsirkin" Message-ID: <20091222113626.GB16053@redhat.com> References: <1261477458-26222-1-git-send-email-agraf@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1261477458-26222-1-git-send-email-agraf@suse.de> Subject: [Qemu-devel] Re: [PATCH] Always swap endianness in DBDMA List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexander Graf Cc: qemu-devel@nongnu.org, Aurelien Jarno , Laurent Vivier On Tue, Dec 22, 2009 at 11:24:18AM +0100, Alexander Graf wrote: > When we get an MMIO request, we always get variables in host endianness. The > only time we need to actually reverse byte order is when we read bytes from > guest memory. > > Apparently the DBDMA implementation is different there. A lot of the logic > in there depends on values being big endian. Now, qemu does all the conversion > in the MMIO handlers for us already though, so it turns out that we're in > the same byte order from a C point of view, but cpu_to_be32 and be32_to_cpu > end up being nops. > > This makes the code work differently on x86 (little endian) than on ppc (big > endian). On x86 it works, on ppc it doesn't. > > This patch (while being seriously hacky and ugly) makes dbdma emulation work > on ppc hosts. I'll leave the real fixing to someone else. Come on, #define cpu_to_dbdma32 bswap32 #define dbdma_to_cpu32 bswap32 and then s/cpu_to_be32/cpu_to_dbdma32/g s/be32_to_cpu/dbdma32_to_cpu/g is not too hard, is it? > Signed-off-by: Alexander Graf > CC: Laurent Vivier > --- > hw/mac_dbdma.c | 8 ++++++++ > 1 files changed, 8 insertions(+), 0 deletions(-) > > diff --git a/hw/mac_dbdma.c b/hw/mac_dbdma.c > index 98dccfd..4dbfc16 100644 > --- a/hw/mac_dbdma.c > +++ b/hw/mac_dbdma.c > @@ -40,6 +40,14 @@ > #include "isa.h" > #include "mac_dbdma.h" > > +/* > + * XXX This is just plain wrong. Apparently we don't want to have big endian > + * values, but reversed endian ones. The code as is doesn't work on big > + * endian hosts. With these defines it does. > + */ > +#define cpu_to_be32 bswap32 > +#define be32_to_cpu bswap32 > + > /* debug DBDMA */ > //#define DEBUG_DBDMA > > -- > 1.6.0.2 > >