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 <address@hidden>
---
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