summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Snow <jsnow@redhat.com>2015-02-05 12:41:21 -0500
committerStefan Hajnoczi <stefanha@redhat.com>2015-02-16 15:07:17 +0000
commit52515766f1e18b596a6dc31421ca14a63114c9eb (patch)
tree651c3dc0fc798901afea7aefa4e652bf9dd98728
parent36e367261c15f0fa9acfbe9f4301c96e19be7f52 (diff)
downloadqemu-52515766f1e18b596a6dc31421ca14a63114c9eb.tar.gz
qemu-52515766f1e18b596a6dc31421ca14a63114c9eb.tar.bz2
qemu-52515766f1e18b596a6dc31421ca14a63114c9eb.zip
qtest/ahci: add ahci_write_fis
Similar to ahci_set_command_header, add a helper that takes an in-memory representation of a command FIS and writes it to guest memory, handling endianness as-needed. Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 1423158090-25580-11-git-send-email-jsnow@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
-rw-r--r--tests/ahci-test.c2
-rw-r--r--tests/libqos/ahci.c14
-rw-r--r--tests/libqos/ahci.h3
3 files changed, 17 insertions, 2 deletions
diff --git a/tests/ahci-test.c b/tests/ahci-test.c
index 211274e8c3..658956d6a1 100644
--- a/tests/ahci-test.c
+++ b/tests/ahci-test.c
@@ -728,7 +728,7 @@ static void ahci_test_identify(AHCIQState *ahci)
g_assert_cmphex(ahci_px_rreg(ahci, i, AHCI_PX_IS), ==, 0);
/* Commit the Command FIS to the Command Table */
- memwrite(table, &fis, sizeof(fis));
+ ahci_write_fis(ahci, &fis, table);
/* Commit the PRD entry to the Command Table */
memwrite(table + 0x80, &prd, sizeof(prd));
diff --git a/tests/libqos/ahci.c b/tests/libqos/ahci.c
index 8ecfdd30d8..1294f8083c 100644
--- a/tests/libqos/ahci.c
+++ b/tests/libqos/ahci.c
@@ -464,6 +464,20 @@ void ahci_destroy_command(AHCIQState *ahci, uint8_t port, uint8_t slot)
ahci->port[port].prdtl[slot] = 0;
}
+void ahci_write_fis(AHCIQState *ahci, RegH2DFIS *fis, uint64_t addr)
+{
+ RegH2DFIS tmp = *fis;
+
+ /* The auxiliary FIS fields are defined per-command and are not
+ * currently implemented in libqos/ahci.o, but may or may not need
+ * to be flipped. */
+
+ /* All other FIS fields are 8 bit and do not need to be flipped. */
+ tmp.count = cpu_to_le16(tmp.count);
+
+ memwrite(addr, &tmp, sizeof(tmp));
+}
+
unsigned ahci_pick_cmd(AHCIQState *ahci, uint8_t port)
{
unsigned i;
diff --git a/tests/libqos/ahci.h b/tests/libqos/ahci.h
index 0837bf5032..83a62acf44 100644
--- a/tests/libqos/ahci.h
+++ b/tests/libqos/ahci.h
@@ -393,7 +393,7 @@ typedef struct RegH2DFIS {
uint8_t icc;
uint8_t control;
/* DW4 */
- uint32_t aux;
+ uint8_t aux[4];
} __attribute__((__packed__)) RegH2DFIS;
/**
@@ -515,6 +515,7 @@ void ahci_get_command_header(AHCIQState *ahci, uint8_t port,
void ahci_set_command_header(AHCIQState *ahci, uint8_t port,
uint8_t slot, AHCICommandHeader *cmd);
void ahci_destroy_command(AHCIQState *ahci, uint8_t port, uint8_t slot);
+void ahci_write_fis(AHCIQState *ahci, RegH2DFIS *fis, uint64_t addr);
unsigned ahci_pick_cmd(AHCIQState *ahci, uint8_t port);
#endif