Instead of 3 consecutive dma_memory_read() calls, use a packed structure to read the descriptor in a single call.
Signed-off-by: Philippe Mathieu-Daudé <[email protected]> --- hw/sd/sdhci.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c index 0a95f49b93..2d8fa3151a 100644 --- a/hw/sd/sdhci.c +++ b/hw/sd/sdhci.c @@ -740,16 +740,20 @@ static void get_adma_description(SDHCIState *s, ADMADescr *dscr) } case SDHC_CTRL_ADMA2_64: { - dma_memory_read(s->dma_as, entry_addr, &dscr->attr, 1, + struct { + uint8_t attr; + uint8_t pad; + uint16_t length; + uint64_t addr; + } QEMU_PACKED adma2; + QEMU_BUILD_BUG_ON(sizeof(adma2) != 12); + + dma_memory_read(s->dma_as, entry_addr, &adma2, sizeof(adma2), MEMTXATTRS_UNSPECIFIED); - dma_memory_read(s->dma_as, entry_addr + 2, &dscr->length, 2, - MEMTXATTRS_UNSPECIFIED); - dscr->length = le16_to_cpu(dscr->length); - dma_memory_read(s->dma_as, entry_addr + 4, &dscr->addr, 8, - MEMTXATTRS_UNSPECIFIED); - dscr->addr = le64_to_cpu(dscr->addr); - dscr->attr &= (uint8_t) ~0xC0; - dscr->incr = 12; + dscr->length = le16_to_cpu(adma2.length); + dscr->addr = le64_to_cpu(adma2.addr); + dscr->attr = adma2.attr & (uint8_t) ~0xc0; + dscr->incr = sizeof(adma2); trace_adma_description("ADMA2_64", dscr); break; } -- 2.45.2
