]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
ahci: Fix sglist offset manipulation for BE machines
authorJohn Snow <jsnow@redhat.com>
Fri, 20 Mar 2015 00:24:15 +0000 (20:24 -0400)
committerJohn Snow <jsnow@redhat.com>
Mon, 23 Mar 2015 16:24:16 +0000 (12:24 -0400)
This does not bother DMA, because DMA generally transfers
the entire SGList in one shot if it can.

PIO, on the other hand, tries to transfer just one sector
at a time, and will make multiple visits to the sglist
to fetch memory addresses.

Fix the memory address calculaton when we have an offset
by moving the offset addition OUTSIDE of the le64_to_cpu
calculation.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Tested-by: Andreas Färber <afaerber@suse.de>
Message-id: 1426811056-2202-4-git-send-email-jsnow@redhat.com

hw/ide/ahci.c

index e1ae36f7cd51f6a252c4afe272a336a6a9602d04..7a223bede78eb8782da09b58a50a66379753618a 100644 (file)
@@ -799,7 +799,7 @@ static int ahci_populate_sglist(AHCIDevice *ad, QEMUSGList *sglist,
 
         qemu_sglist_init(sglist, qbus->parent, (sglist_alloc_hint - off_idx),
                          ad->hba->as);
-        qemu_sglist_add(sglist, le64_to_cpu(tbl[off_idx].addr + off_pos),
+        qemu_sglist_add(sglist, le64_to_cpu(tbl[off_idx].addr) + off_pos,
                         prdt_tbl_entry_size(&tbl[off_idx]) - off_pos);
 
         for (i = off_idx + 1; i < sglist_alloc_hint; i++) {