Il 13/09/2014 06:34, John Snow ha scritto: > The prepare_buf callback takes an argument named /is_write/, > however in core.c we are checking to see if this DMA command > is /is_read/. I am adding a small macro to correct this oversight. > > Impact: Nothing, yet. > -The prepare_buf callback is only used in ahci and pci, and both > versions of this callback name the incoming argument is_write. > -Both functions ignore this hint currently, anyway. > > This is therefore a simple patch to avoid future mistakes. > > Signed-off-by: John Snow <js...@redhat.com> > --- > hw/ide/core.c | 2 +- > hw/ide/internal.h | 2 ++ > 2 files changed, 3 insertions(+), 1 deletion(-) > > diff --git a/hw/ide/core.c b/hw/ide/core.c > index 191f893..3d682e2 100644 > --- a/hw/ide/core.c > +++ b/hw/ide/core.c > @@ -718,7 +718,7 @@ void ide_dma_cb(void *opaque, int ret) > n = s->nsector; > s->io_buffer_index = 0; > s->io_buffer_size = n * 512; > - if (s->bus->dma->ops->prepare_buf(s->bus->dma, ide_cmd_is_read(s)) == 0) > { > + if (s->bus->dma->ops->prepare_buf(s->bus->dma, ide_cmd_is_write(s)) == > 0) { > /* The PRDs were too short. Reset the Active bit, but don't raise an > * interrupt. */ > s->status = READY_STAT | SEEK_STAT; > diff --git a/hw/ide/internal.h b/hw/ide/internal.h > index 5c19f79..72d0147 100644 > --- a/hw/ide/internal.h > +++ b/hw/ide/internal.h > @@ -338,6 +338,8 @@ enum ide_dma_cmd { > > #define ide_cmd_is_read(s) \ > ((s)->dma_cmd == IDE_DMA_READ) > +#define ide_cmd_is_write(s) \ > + ((s)->dma_cmd == IDE_DMA_WRITE) > > /* NOTE: IDEState represents in fact one drive */ > struct IDEState { >
Actually the code is right (!). A read command corresponds to a DMA write. A write or trim will read data from memory, so it is a DMA read. See for example how rw_buf is only used from the READ CD command, but passes 1 for the second argument of prepare_buf. Paolo