qemu/hw/ide
Niklas Cassel 4f6c553717 hw/ide/ahci: fix broken SError handling
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>
(cherry picked from commit 9f89423537)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
2023-09-10 19:40:11 +03:00
..
ahci-allwinner.c ahci: Move QOM macro to header 2020-08-27 14:04:54 -04:00
ahci.c hw/ide/ahci: fix broken SError handling 2023-09-10 19:40:11 +03:00
ahci_internal.h hw: replace most qemu_bh_new calls with qemu_bh_new_guarded 2023-09-10 19:38:01 +03:00
atapi.c hw/ide: Rename ide_set_irq() -> ide_bus_set_irq() 2023-02-27 22:29:02 +01:00
cmd646.c hw/ide: replace TABs with space 2023-03-24 11:45:33 +01:00
core.c hw/ide/core: set ERR_STAT in unsupported command completion 2023-09-10 19:39:41 +03:00
ich.c hw/ide: Un-inline ide_set_irq() 2023-02-27 22:29:02 +01:00
ioport.c hw/ide/ioport: Remove unnecessary includes 2023-02-27 22:29:02 +01:00
isa.c hw/ide: Rename ide_init2() -> ide_bus_init_output_irq() 2023-02-27 22:29:02 +01:00
Kconfig hw/ide/Kconfig: Add missing dependency PCI -> IDE_QDEV 2021-07-20 15:30:42 +02:00
macio.c hw/ide: Rename idebus_active_if() -> ide_bus_active_if() 2023-02-27 22:29:02 +01:00
meson.build meson: convert hw/ide 2020-08-21 06:30:30 -04:00
microdrive.c hw/ide: replace TABs with space 2023-03-24 11:45:33 +01:00
mmio.c hw/ide: Rename ide_init2() -> ide_bus_init_output_irq() 2023-02-27 22:29:02 +01:00
pci.c hw/ide/pci: Unexport bmdma_active_if() 2023-02-27 22:29:02 +01:00
piix.c hw/ide/piix: properly initialize the BMIBA register 2023-07-31 08:52:38 +03:00
qdev.c hw/ide: Rename ide_create_drive() -> ide_bus_create_drive() 2023-02-27 22:29:02 +01:00
sii3112.c hw/ide: Rename ide_init2() -> ide_bus_init_output_irq() 2023-02-27 22:29:02 +01:00
trace-events hw/ide: Rename ide_exec_cmd() -> ide_bus_exec_cmd() 2023-02-27 22:29:02 +01:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
via.c hw/ide/via: Replace magic 2 value by ARRAY_SIZE / MAX_IDE_DEVS 2023-02-27 22:29:02 +01:00