qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: John Snow <jsnow@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Thomas Huth" <thuth@redhat.com>, "John Snow" <jsnow@redhat.com>,
	"Laurent Vivier" <lvivier@redhat.com>,
	qemu-block@nongnu.org, "Paolo Bonzini" <pbonzini@redhat.com>,
	"Niklas Cassel" <niklas.cassel@wdc.com>,
	"Philippe Mathieu-Daudé" <philmd@linaro.org>
Subject: [PULL for-6.2 7/7] hw/ide/ahci: fix broken SError handling
Date: Wed,  6 Sep 2023 23:42:28 -0400	[thread overview]
Message-ID: <20230907034228.4054839-8-jsnow@redhat.com> (raw)
In-Reply-To: <20230907034228.4054839-1-jsnow@redhat.com>

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



  parent reply	other threads:[~2023-09-07  3:44 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-07  3:42 [PULL for-6.2 0/7] Ide patches John Snow
2023-09-07  3:42 ` [PULL for-6.2 1/7] hw/ide/core: set ERR_STAT in unsupported command completion John Snow
2023-09-07  3:42 ` [PULL for-6.2 2/7] hw/ide/ahci: write D2H FIS when processing NCQ command John Snow
2023-09-07  3:42 ` [PULL for-6.2 3/7] hw/ide/ahci: simplify and document PxCI handling John Snow
2023-09-07  3:42 ` [PULL for-6.2 4/7] hw/ide/ahci: PxSACT and PxCI is cleared when PxCMD.ST is cleared John Snow
2023-09-07  3:42 ` [PULL for-6.2 5/7] hw/ide/ahci: PxCI should not get cleared when ERR_STAT is set John Snow
2023-09-07  3:42 ` [PULL for-6.2 6/7] hw/ide/ahci: fix ahci_write_fis_sdb() John Snow
2023-09-07  3:42 ` John Snow [this message]
2023-09-07  3:43 ` [PULL for-6.2 0/7] Ide patches John Snow
2023-09-07  6:08   ` Philippe Mathieu-Daudé
2023-09-07 15:43 ` Stefan Hajnoczi
2023-09-07 16:49 ` Michael Tokarev
2023-09-07 16:54   ` John Snow
2023-09-07 18:16     ` Michael Tokarev
2023-09-08  7:53       ` Philippe Mathieu-Daudé
2023-09-08  8:06         ` Michael Tokarev
2023-09-08  8:26           ` Michael Tokarev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230907034228.4054839-8-jsnow@redhat.com \
    --to=jsnow@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=niklas.cassel@wdc.com \
    --cc=pbonzini@redhat.com \
    --cc=philmd@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).