From ac38123609742ce3fbdf53774a797ac230cbf118 Mon Sep 17 00:00:00 2001 From: John Snow Date: Thu, 19 Mar 2015 20:24:15 -0400 Subject: [PATCH] ahci: Fix sglist offset manipulation for BE machines MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Stefan Hajnoczi Tested-by: Andreas Färber Message-id: 1426811056-2202-4-git-send-email-jsnow@redhat.com --- hw/ide/ahci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index e1ae36f7cd5..7a223bede78 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -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++) { -- 2.39.5