On Wed, 24 Apr 2024 at 19:13, Alexandra Diupina <adiup...@astralinux.ru> wrote: > > Add a function xlnx_dpdma_read_descriptor() that > combines reading the descriptor from desc_addr > by calling dma_memory_read() and swapping desc > fields from guest memory order to host memory order. > > Found by Linux Verification Center (linuxtesting.org) with SVACE. > > Fixes: d3c6369a96 ("introduce xlnx-dpdma") > Signed-off-by: Alexandra Diupina <adiup...@astralinux.ru> > --- > hw/dma/xlnx_dpdma.c | 38 +++++++++++++++++++++++++++++++++----- > 1 file changed, 33 insertions(+), 5 deletions(-) > > diff --git a/hw/dma/xlnx_dpdma.c b/hw/dma/xlnx_dpdma.c > index 1f5cd64ed1..5fd4e31699 100644 > --- a/hw/dma/xlnx_dpdma.c > +++ b/hw/dma/xlnx_dpdma.c > @@ -614,6 +614,38 @@ static void xlnx_dpdma_register_types(void) > type_register_static(&xlnx_dpdma_info); > } > > +static MemTxResult xlnx_dpdma_read_descriptor(XlnxDPDMAState *s, uint8_t > channel, > + uint64_t desc_addr, DPDMADescriptor > *desc) > +{ > + if (dma_memory_read(&address_space_memory, desc_addr, &desc, > + sizeof(DPDMADescriptor), > MEMTXATTRS_UNSPECIFIED)) { > + s->registers[DPDMA_EISR] |= ((1 << 1) << channel); > + xlnx_dpdma_update_irq(s); > + s->operation_finished[channel] = true;
I think these three lines in the if() here should remain at the callsite -- although we only have one place that reads a descriptor at the moment, different callers might in theory handle the descriptor-read failure differently. > + return MEMTX_ERROR; Otherwise this looks good; thanks. -- PMM