[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 02/30] ahci: fix PxCI register race
From: |
John Snow |
Subject: |
[Qemu-devel] [PULL 02/30] ahci: fix PxCI register race |
Date: |
Fri, 8 Jun 2018 13:47:05 -0400 |
Fixes: https://bugs.launchpad.net/qemu/+bug/1769189
AHCI presently signals completion prior to the PxCI register being
cleared to indicate completion. If a guest driver attempts to issue
a new command in its IRQ handler, it might be surprised to learn there
is still a command pending.
In the case of Windows 10's boot driver, it will actually poll the IRQ
register hoping to find out when the command is done running -- which
will never happen, as there isn't a command running.
Fix this: clear PxCI in ahci_cmd_done and not in the asynchronous BH.
Because it now runs synchronously, we don't need to check if the command
is actually done by spying on the ATA registers. We know it's done.
CC: qemu-stable <address@hidden>
Reported-by: François Guerraz <address@hidden>
Tested-by: Bruce Rogers <address@hidden>
Signed-off-by: John Snow <address@hidden>
Reviewed-by: Stefan Hajnoczi <address@hidden>
Reviewed-by: Jeff Cody <address@hidden>
Message-id: address@hidden
Signed-off-by: John Snow <address@hidden>
---
hw/ide/ahci.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 66f55aecb3..b11640ddbb 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -532,13 +532,6 @@ static void ahci_check_cmd_bh(void *opaque)
qemu_bh_delete(ad->check_bh);
ad->check_bh = NULL;
- if ((ad->busy_slot != -1) &&
- !(ad->port.ifs[0].status & (BUSY_STAT|DRQ_STAT))) {
- /* no longer busy */
- ad->port_regs.cmd_issue &= ~(1 << ad->busy_slot);
- ad->busy_slot = -1;
- }
-
check_cmd(ad->hba, ad->port_no);
}
@@ -1425,6 +1418,12 @@ static void ahci_cmd_done(IDEDMA *dma)
trace_ahci_cmd_done(ad->hba, ad->port_no);
+ /* no longer busy */
+ if (ad->busy_slot != -1) {
+ ad->port_regs.cmd_issue &= ~(1 << ad->busy_slot);
+ ad->busy_slot = -1;
+ }
+
/* update d2h status */
ahci_write_fis_d2h(ad);
--
2.14.3
- [Qemu-devel] [PULL 00/30] Ide patches, John Snow, 2018/06/08
- [Qemu-devel] [PULL 02/30] ahci: fix PxCI register race,
John Snow <=
- [Qemu-devel] [PULL 03/30] ahci: don't schedule unnecessary BH, John Snow, 2018/06/08
- [Qemu-devel] [PULL 01/30] ahci: trim signatures on raise/lower, John Snow, 2018/06/08
- [Qemu-devel] [PULL 15/30] ahci: make mem_read_32 traces more descriptive, John Snow, 2018/06/08
- [Qemu-devel] [PULL 18/30] ahci: delete old host register address definitions, John Snow, 2018/06/08
- [Qemu-devel] [PULL 05/30] ahci: modify ahci_port_read to use register numbers, John Snow, 2018/06/08
- [Qemu-devel] [PULL 08/30] ahci: combine identical clauses in port write, John Snow, 2018/06/08
- [Qemu-devel] [PULL 14/30] ahci: modify ahci_mem_read_32 to work on register numbers, John Snow, 2018/06/08
- [Qemu-devel] [PULL 13/30] ahci: fix host register max address, John Snow, 2018/06/08
- [Qemu-devel] [PULL 11/30] ahci: delete old port register address definitions, John Snow, 2018/06/08
- [Qemu-devel] [PULL 12/30] ahci: add host register enumeration, John Snow, 2018/06/08