[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL for-6.2 7/7] hw/ide/ahci: fix broken SError handling
From: |
John Snow |
Subject: |
[PULL for-6.2 7/7] hw/ide/ahci: fix broken SError handling |
Date: |
Wed, 6 Sep 2023 23:42:28 -0400 |
From: Niklas Cassel <niklas.cassel@wdc.com>
When encountering an NCQ error, you should not write the NCQ tag to the
SError register. This is completely wrong.
The SError register has a clear definition, where each bit represents a
different error, see PxSERR definition in AHCI 1.3.1.
If we write a random value (like the NCQ tag) in SError, e.g. Linux will
read SError, and will trigger arbitrary error handling depending on the
NCQ tag that happened to be executing.
In case of success, ncq_cb() will call ncq_finish().
In case of error, ncq_cb() will call ncq_err() (which will clear
ncq_tfs->used), and then call ncq_finish(), thus using ncq_tfs->used is
sufficient to tell if finished should get set or not.
Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-id: 20230609140844.202795-9-nks@flawful.org
Signed-off-by: John Snow <jsnow@redhat.com>
---
hw/ide/ahci.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index ef6c9fc378..d0a774bc17 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -1012,7 +1012,6 @@ static void ncq_err(NCQTransferState *ncq_tfs)
ide_state->error = ABRT_ERR;
ide_state->status = READY_STAT | ERR_STAT;
- ncq_tfs->drive->port_regs.scr_err |= (1 << ncq_tfs->tag);
qemu_sglist_destroy(&ncq_tfs->sglist);
ncq_tfs->used = 0;
}
@@ -1022,7 +1021,7 @@ static void ncq_finish(NCQTransferState *ncq_tfs)
/* If we didn't error out, set our finished bit. Errored commands
* do not get a bit set for the SDB FIS ACT register, nor do they
* clear the outstanding bit in scr_act (PxSACT). */
- if (!(ncq_tfs->drive->port_regs.scr_err & (1 << ncq_tfs->tag))) {
+ if (ncq_tfs->used) {
ncq_tfs->drive->finished |= (1 << ncq_tfs->tag);
}
--
2.41.0
- [PULL for-6.2 0/7] Ide patches, John Snow, 2023/09/06
- [PULL for-6.2 2/7] hw/ide/ahci: write D2H FIS when processing NCQ command, John Snow, 2023/09/06
- [PULL for-6.2 1/7] hw/ide/core: set ERR_STAT in unsupported command completion, John Snow, 2023/09/06
- [PULL for-6.2 5/7] hw/ide/ahci: PxCI should not get cleared when ERR_STAT is set, John Snow, 2023/09/06
- [PULL for-6.2 4/7] hw/ide/ahci: PxSACT and PxCI is cleared when PxCMD.ST is cleared, John Snow, 2023/09/06
- [PULL for-6.2 6/7] hw/ide/ahci: fix ahci_write_fis_sdb(), John Snow, 2023/09/06
- [PULL for-6.2 7/7] hw/ide/ahci: fix broken SError handling,
John Snow <=
- [PULL for-6.2 3/7] hw/ide/ahci: simplify and document PxCI handling, John Snow, 2023/09/06
- Re: [PULL for-6.2 0/7] Ide patches, John Snow, 2023/09/06
- Re: [PULL for-6.2 0/7] Ide patches, Stefan Hajnoczi, 2023/09/07
- Re: [PULL for-6.2 0/7] Ide patches, Michael Tokarev, 2023/09/07