From nobody Sun Apr 27 02:50:56 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1733994881; cv=none; d=zohomail.com; s=zohoarc; b=IZEEG3ahodfBHbkh7QimVQX3GL88xrFegXRjXg/pnLNEkzwhRpYrkkfyDqzinXrFGu+en+f5vz/rKMnA9x7QQbL/dcY+eY61PqNV1UOwpdAHJMGQhn1nuvEakxgIlq1b7o0TigmZMAWsQP1HF4GJvI42Cg/rVZNynLebDKjnCrE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733994881; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=vzr7yor2vNyxx++nCVtwqty4yb5+mRXEz0v+KHBkCPQ=; b=TiZijqowr7573hCXQa9lUpqlG5mINyZYFwfeT8DjTl7b4IjluPOLJovNW5q1xyy/DBOB3YDA9uFsehwddnGR40ZNNBC1OJbgpijXvA5mivwOFasdK7xLDiQFHgTASiXMp6DneUuZXd9dUDgw8mlK8qTR5UAJFrBwrsJImy8nDxg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733994881474624.766707935951; Thu, 12 Dec 2024 01:14:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLfGP-0003T0-If; Thu, 12 Dec 2024 04:13:41 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGN-0003SQ-R7 for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:13:39 -0500 Received: from mail-pg1-x533.google.com ([2607:f8b0:4864:20::533]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGM-0008Op-Dd for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:13:39 -0500 Received: by mail-pg1-x533.google.com with SMTP id 41be03b00d2f7-7fd10cd5b1aso311669a12.2 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 01:13:38 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142d92e2csm787021a91.9.2024.12.12.01.13.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 01:13:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733994817; x=1734599617; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vzr7yor2vNyxx++nCVtwqty4yb5+mRXEz0v+KHBkCPQ=; b=WfNT+0VpLqu4D3lFcpj1MZRDKzbP6TzX6N3t50nDw5VmqGxAttsdLtx7FSDGgJXXuy Ki/d2+f1sO0SlG2Dh5gkADwA1HfUYpOXWWpclrW78I82ipEGIWWUiUOGCtJVmwFc0NY1 07ggXpV13xrVC7xtO4ukf0aPQyZxmoXp8JZk0nn3vuw7S9H0fWpsVX6mV0PXUxtzwqU0 Qf+5WVnjhDAxthKQeljlV0rbxiccITM9Qpj0ZE7hCvgqTT6vwuz3AC+90MOV50xlcjOC s5g8CVQJ49pzdmvTA46USq+SjfyjKLPbePkKyO1fFc8Ve+lH6ZyBm68P3YFMJCMJLOjA z0Dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733994817; x=1734599617; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vzr7yor2vNyxx++nCVtwqty4yb5+mRXEz0v+KHBkCPQ=; b=eQSszw187lrnGFYnfzhgQvnBGXU8DDsaifHE3/5uHPbBmzEdy2JBwDTtPwb0MIW3+C MxAAIZ1cyE9kgzkC7m5djhMpDdQ42hZFaOJhUUiRZReiiFDr/F7Qhd9Q7etKSlIk0Wxt 1Elspy9l1Iqz3NHEr27s4GqXBAerTmOHn3o4fnClr1fG9sZGFE9QfaxzGmTNHYEfynfQ OjlqHB7TtDso0HPhAeqxoVj4UQp5ugDRIXXjaRHGOXUiYSuXY2ANF+w5JotZA+hzi2f7 dzs8Ns8S2oGnCXf+7btHUR/QCtWNIUnHhzHVS/YSs/26Et4z9LCFBN1T5b3qsfZH6CoT Pnjg== X-Gm-Message-State: AOJu0YzF5m4odseLi14ZfjPAPgk0a/kelUvTeQ0GH5uHBFPSq/lDlCi5 HhCYW8fQmPLGUqG3fr656oGhXT9yYhJ8qyucfs0ICS+9wlN5oNFdEt4o2g== X-Gm-Gg: ASbGncvhYDnGp8Xy4O9jiuKtCxWS9vCVR02zmsiJFVogFHF6IKSn1uc4ZpOnnxWEA4A aLJXMF2vZ0bYBhyEaBupMtlMjCjIVinZ8dTOyUmCOx+qKEPHGri0ZHxgx79WMkZGkrQwaUafFWD uk6i7W+ZT1a5y6lIanIUJa45Qiaa2K2TcTIyD2OP38KV2kE4yRdJi1LLgnWu73vxFTMoomEqMF8 sDtThB7lb8R2d+Q3EKnF4zvJAv/iFhaBuXX4PnAA/NxQzeKO25BsTkWoL0= X-Google-Smtp-Source: AGHT+IGOE7+zznvv+T+DL0vZwIUGVw7NvRbC/bwX6UN4UOexGyqlD0osUToIk7ADMuHB6E1fWAeCVw== X-Received: by 2002:a17:90b:1f92:b0:2ee:bbd8:2b9d with SMTP id 98e67ed59e1d1-2f12804fc56mr8534542a91.34.1733994816767; Thu, 12 Dec 2024 01:13:36 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, Gerd Hoffmann <kraxel@redhat.com>, Kevin Wolf <kwolf@redhat.com>, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= <philmd@linaro.org> Subject: [PATCH 01/11] usb/msd: Add status to usb_msd_packet_complete() function Date: Thu, 12 Dec 2024 19:13:12 +1000 Message-ID: <20241212091323.1442995-2-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212091323.1442995-1-npiggin@gmail.com> References: <20241212091323.1442995-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::533; envelope-from=npiggin@gmail.com; helo=mail-pg1-x533.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=subscribe> Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1733994883919116600 This is a convenience change that accepts a status when completing a packet. Reviewed-by: Philippe Mathieu-Daud=C3=A9 <philmd@linaro.org> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- hw/usb/dev-storage.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 341e505bd0a..4f1e8b7f6cb 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -177,7 +177,7 @@ static const USBDesc desc =3D { .str =3D desc_strings, }; =20 -static void usb_msd_packet_complete(MSDState *s) +static void usb_msd_packet_complete(MSDState *s, int status) { USBPacket *p =3D s->packet; =20 @@ -187,6 +187,7 @@ static void usb_msd_packet_complete(MSDState *s) * usb_packet_complete returns. */ trace_usb_msd_packet_complete(); + p->status =3D status; s->packet =3D NULL; usb_packet_complete(&s->dev, p); } @@ -196,8 +197,7 @@ static void usb_msd_fatal_error(MSDState *s) trace_usb_msd_fatal_error(); =20 if (s->packet) { - s->packet->status =3D USB_RET_STALL; - usb_msd_packet_complete(s); + usb_msd_packet_complete(s, USB_RET_STALL); } =20 /* @@ -255,8 +255,8 @@ void usb_msd_transfer_data(SCSIRequest *req, uint32_t l= en) usb_msd_copy_data(s, p); p =3D s->packet; if (p && p->actual_length =3D=3D p->iov.size) { - p->status =3D USB_RET_SUCCESS; /* Clear previous ASYNC status = */ - usb_msd_packet_complete(s); + /* USB_RET_SUCCESS status clears previous ASYNC status */ + usb_msd_packet_complete(s, USB_RET_SUCCESS); } } } @@ -295,8 +295,8 @@ void usb_msd_command_complete(SCSIRequest *req, size_t = resid) s->mode =3D USB_MSDM_CSW; } } - p->status =3D USB_RET_SUCCESS; /* Clear previous ASYNC status */ - usb_msd_packet_complete(s); + /* USB_RET_SUCCESS status clears previous ASYNC status */ + usb_msd_packet_complete(s, USB_RET_SUCCESS); } else if (s->data_len =3D=3D 0) { s->mode =3D USB_MSDM_CSW; } @@ -332,8 +332,7 @@ void usb_msd_handle_reset(USBDevice *dev) assert(s->req =3D=3D NULL); =20 if (s->packet) { - s->packet->status =3D USB_RET_STALL; - usb_msd_packet_complete(s); + usb_msd_packet_complete(s, USB_RET_STALL); } =20 memset(&s->csw, 0, sizeof(s->csw)); --=20 2.45.2 From nobody Sun Apr 27 02:50:56 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1733994933; cv=none; d=zohomail.com; s=zohoarc; b=KBotIyjk2ocDBcEc6b7YO5Og0ih1eFEljoqAZL40dLFmm/DE5uyP5vzjjnMivd10eWwEJ/p9jLRYc5/F1NRt6FR6l2aWIGgd3VNs2VTAmCrdiXM96uDhxcnMRxF58HkwAMqFXwVL1HglXwJQTTHnwZmuKkmwzK3gZJa9V2K/oys= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733994933; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=/F55ObCsESGa2ajDHpDHF4jP1HDevLQyTNQkvDxryZY=; b=L4xitV6c5a5WTVML3CTJ/hw4ObH41GUx4x46Byvx6DdmXfXORyISuT6t9lvc2mulBR+i1A+iR1hapYjDC0IyAVmZyz29gkx028RLTzuF68j56p4wRtsUbUHmgdRGBBDVzVyaJrvktXrUdzNX6yC1SrM2mcMrzAEheeOrzOdVemc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 173399493303190.09297403895164; Thu, 12 Dec 2024 01:15:33 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLfGX-0003Xa-MN; Thu, 12 Dec 2024 04:13:49 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGU-0003TF-LQ for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:13:46 -0500 Received: from mail-pg1-x530.google.com ([2607:f8b0:4864:20::530]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGP-0008PC-MG for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:13:46 -0500 Received: by mail-pg1-x530.google.com with SMTP id 41be03b00d2f7-7fcf59a41ddso220385a12.3 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 01:13:41 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142d92e2csm787021a91.9.2024.12.12.01.13.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 01:13:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733994820; x=1734599620; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/F55ObCsESGa2ajDHpDHF4jP1HDevLQyTNQkvDxryZY=; b=nXoKkm+2nOdmfFP//7wId9Yg5Uym5UVJZKBWkApECe4RyArGJXF1k5jfysigZTAAQ7 eYcyWWIZ0UJnKOD+JAHHeJa8Xgr5TBMxqeItMYJDXMw2D2IV3g8UQXif2rGqHAYa/dSy vpvGqrW8fzhoxKOfPLHLlDWV/MTBy193pZ9Jx5TLeZoKd+k4/doW0izjh/v4gWXqhSCV q15Bs12xGBbWlrvp8TD756wiblcw4JJspFnUySMgPWY9Wdm09Hhbj3vinss6Gn9vn8Io 6WFmN6tIGht670U7ugXB2KS+o5AanxtceOeJrWQlBXA0U1pUQFWbHnH1UqgEnM9zm1Kj VROA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733994820; x=1734599620; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/F55ObCsESGa2ajDHpDHF4jP1HDevLQyTNQkvDxryZY=; b=bP0vbLbj0b489AiYuBH3GCB97lfO/ACTz+mpoFWll7haSSwh4JxiIn+3BkQDR1W2C7 W1oQZkeI7Nbx0RmFBuVXSqVos1eRLCvJ54pUFsd6h+9ozfEO2muAtFp3tg35fFujvTMy ACa5b9RNz0ft7Q1p5ueJoIuQBN7Aa7L4i9mYsHN/iTR38alTqhujoMHgUYvVvQ1YdRQE dY9PWhs6nc4nWi3EpvwD8Sv6zcjtmhb0qBbdE4DCwOzs12YXnArypY/2ute6cUHWTitt N5R9sxn2tscbHbhD8fTNFebxm5u441Qq/b3zMwDux7W4SKjItAI8TccTNJouZ2C7Yb4Y 653A== X-Gm-Message-State: AOJu0YxsLfwrH3l8LkWT0kaW+BY2thAaJL3TIDac9cqQOHd45kbuZGLp +2x+0xRS/bv3eUPWTWUts+A9E9q9WF+5DjVc7zJSW5GjTzNdftdgZHq/7Q== X-Gm-Gg: ASbGncs8YOnCNdoWA7dIcF2zOdE+/+zbVm0pvZ5cjF8xT2SchMeGHuBcg6Yeznbh8SV UcWVPJDtT7kWFqUdWGdWjl3dODdMVhdRg70ASRdyNtZ6q3+gVOYnsZrVF0z4gq9bZSybNP/SWSM eyXQbw/qS24/c6CX4yiZtXKoAwG0Br0fZ9zhHiS2azvVeXC5emi5KicF6Laz13+g/nQh/MizqIf /ZVKLjvZL2gpscMjYh3EBEOkZ/A7SisVM23+sAcKRY3t+boDk1F1bODVfA= X-Google-Smtp-Source: AGHT+IGFDtjgOHUxo8g3ghYCgKiRSfX9nQvz+vDR5ly2F/IqbpKwvi3OGVUcH4kDcbFVdCS4nPwHwQ== X-Received: by 2002:a17:90b:2790:b0:2ee:f80c:688d with SMTP id 98e67ed59e1d1-2f12802a503mr8811041a91.25.1733994820087; Thu, 12 Dec 2024 01:13:40 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, Gerd Hoffmann <kraxel@redhat.com>, Kevin Wolf <kwolf@redhat.com> Subject: [PATCH 02/11] usb/msd: Split in and out packet handling Date: Thu, 12 Dec 2024 19:13:13 +1000 Message-ID: <20241212091323.1442995-3-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212091323.1442995-1-npiggin@gmail.com> References: <20241212091323.1442995-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::530; envelope-from=npiggin@gmail.com; helo=mail-pg1-x530.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=subscribe> Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1733994934238116600 Content-Type: text/plain; charset="utf-8" Split in and out packet handling int otheir own functions, to make them a bit more managable. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- hw/usb/dev-storage.c | 266 +++++++++++++++++++++++-------------------- 1 file changed, 145 insertions(+), 121 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 4f1e8b7f6cb..2d7306b0572 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -395,158 +395,182 @@ static void usb_msd_cancel_io(USBDevice *dev, USBPa= cket *p) } } =20 -static void usb_msd_handle_data(USBDevice *dev, USBPacket *p) +static void usb_msd_handle_data_out(USBDevice *dev, USBPacket *p) { MSDState *s =3D (MSDState *)dev; uint32_t tag; struct usb_msd_cbw cbw; - uint8_t devep =3D p->ep->nr; SCSIDevice *scsi_dev; int len; =20 - if (s->needs_reset) { - p->status =3D USB_RET_STALL; - return; - } + switch (s->mode) { + case USB_MSDM_CBW: + if (p->iov.size !=3D 31) { + error_report("usb-msd: Bad CBW size"); + goto fail; + } + usb_packet_copy(p, &cbw, 31); + if (le32_to_cpu(cbw.sig) !=3D 0x43425355) { + error_report("usb-msd: Bad signature %08x", + le32_to_cpu(cbw.sig)); + goto fail; + } + scsi_dev =3D scsi_device_find(&s->bus, 0, 0, cbw.lun); + if (scsi_dev =3D=3D NULL) { + error_report("usb-msd: Bad LUN %d", cbw.lun); + goto fail; + } + tag =3D le32_to_cpu(cbw.tag); + s->data_len =3D le32_to_cpu(cbw.data_len); + if (s->data_len =3D=3D 0) { + s->mode =3D USB_MSDM_CSW; + } else if (cbw.flags & 0x80) { + s->mode =3D USB_MSDM_DATAIN; + } else { + s->mode =3D USB_MSDM_DATAOUT; + } + trace_usb_msd_cmd_submit(cbw.lun, tag, cbw.flags, + cbw.cmd_len, s->data_len); + assert(le32_to_cpu(s->csw.residue) =3D=3D 0); + s->scsi_len =3D 0; + s->req =3D scsi_req_new(scsi_dev, tag, cbw.lun, + cbw.cmd, cbw.cmd_len, NULL); + if (s->commandlog) { + scsi_req_print(s->req); + } + len =3D scsi_req_enqueue(s->req); + if (len) { + scsi_req_continue(s->req); + } + break; =20 - switch (p->pid) { - case USB_TOKEN_OUT: - if (devep !=3D 2) + case USB_MSDM_DATAOUT: + trace_usb_msd_data_out(p->iov.size, s->data_len); + if (p->iov.size > s->data_len) { goto fail; + } =20 - switch (s->mode) { - case USB_MSDM_CBW: - if (p->iov.size !=3D 31) { - error_report("usb-msd: Bad CBW size"); - goto fail; - } - usb_packet_copy(p, &cbw, 31); - if (le32_to_cpu(cbw.sig) !=3D 0x43425355) { - error_report("usb-msd: Bad signature %08x", - le32_to_cpu(cbw.sig)); - goto fail; - } - scsi_dev =3D scsi_device_find(&s->bus, 0, 0, cbw.lun); - if (scsi_dev =3D=3D NULL) { - error_report("usb-msd: Bad LUN %d", cbw.lun); - goto fail; - } - tag =3D le32_to_cpu(cbw.tag); - s->data_len =3D le32_to_cpu(cbw.data_len); - if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; - } else if (cbw.flags & 0x80) { - s->mode =3D USB_MSDM_DATAIN; - } else { - s->mode =3D USB_MSDM_DATAOUT; - } - trace_usb_msd_cmd_submit(cbw.lun, tag, cbw.flags, - cbw.cmd_len, s->data_len); - assert(le32_to_cpu(s->csw.residue) =3D=3D 0); - s->scsi_len =3D 0; - s->req =3D scsi_req_new(scsi_dev, tag, cbw.lun, cbw.cmd, cbw.c= md_len, NULL); - if (s->commandlog) { - scsi_req_print(s->req); - } - len =3D scsi_req_enqueue(s->req); + if (s->scsi_len) { + usb_msd_copy_data(s, p); + } + if (le32_to_cpu(s->csw.residue)) { + len =3D p->iov.size - p->actual_length; if (len) { - scsi_req_continue(s->req); + usb_packet_skip(p, len); + if (len > s->data_len) { + len =3D s->data_len; + } + s->data_len -=3D len; + if (s->data_len =3D=3D 0) { + s->mode =3D USB_MSDM_CSW; + } } - break; + } + if (p->actual_length < p->iov.size) { + trace_usb_msd_packet_async(); + s->packet =3D p; + p->status =3D USB_RET_ASYNC; + } + break; =20 - case USB_MSDM_DATAOUT: - trace_usb_msd_data_out(p->iov.size, s->data_len); - if (p->iov.size > s->data_len) { - goto fail; - } + default: + goto fail; + } + return; =20 - if (s->scsi_len) { - usb_msd_copy_data(s, p); - } - if (le32_to_cpu(s->csw.residue)) { - len =3D p->iov.size - p->actual_length; - if (len) { - usb_packet_skip(p, len); - if (len > s->data_len) { - len =3D s->data_len; - } - s->data_len -=3D len; - if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; - } - } - } - if (p->actual_length < p->iov.size) { - trace_usb_msd_packet_async(); - s->packet =3D p; - p->status =3D USB_RET_ASYNC; - } - break; +fail: + p->status =3D USB_RET_STALL; +} =20 - default: +static void usb_msd_handle_data_in(USBDevice *dev, USBPacket *p) +{ + MSDState *s =3D (MSDState *)dev; + int len; + + switch (s->mode) { + case USB_MSDM_DATAOUT: + if (s->data_len !=3D 0 || p->iov.size < 13) { goto fail; } + /* Waiting for SCSI write to complete. */ + trace_usb_msd_packet_async(); + s->packet =3D p; + p->status =3D USB_RET_ASYNC; break; =20 - case USB_TOKEN_IN: - if (devep !=3D 1) + case USB_MSDM_CSW: + if (p->iov.size < 13) { goto fail; + } =20 - switch (s->mode) { - case USB_MSDM_DATAOUT: - if (s->data_len !=3D 0 || p->iov.size < 13) { - goto fail; - } - /* Waiting for SCSI write to complete. */ + if (s->req) { + /* still in flight */ trace_usb_msd_packet_async(); s->packet =3D p; p->status =3D USB_RET_ASYNC; - break; + } else { + usb_msd_send_status(s, p); + s->mode =3D USB_MSDM_CBW; + } + break; =20 - case USB_MSDM_CSW: - if (p->iov.size < 13) { - goto fail; + case USB_MSDM_DATAIN: + trace_usb_msd_data_in(p->iov.size, s->data_len, s->scsi_len); + if (s->scsi_len) { + usb_msd_copy_data(s, p); + } + if (le32_to_cpu(s->csw.residue)) { + len =3D p->iov.size - p->actual_length; + if (len) { + usb_packet_skip(p, len); + if (len > s->data_len) { + len =3D s->data_len; + } + s->data_len -=3D len; + if (s->data_len =3D=3D 0) { + s->mode =3D USB_MSDM_CSW; + } } + } + if (p->actual_length < p->iov.size && s->mode =3D=3D USB_MSDM_DATA= IN) { + trace_usb_msd_packet_async(); + s->packet =3D p; + p->status =3D USB_RET_ASYNC; + } + break; =20 - if (s->req) { - /* still in flight */ - trace_usb_msd_packet_async(); - s->packet =3D p; - p->status =3D USB_RET_ASYNC; - } else { - usb_msd_send_status(s, p); - s->mode =3D USB_MSDM_CBW; - } - break; + default: + goto fail; + } + return; =20 - case USB_MSDM_DATAIN: - trace_usb_msd_data_in(p->iov.size, s->data_len, s->scsi_len); - if (s->scsi_len) { - usb_msd_copy_data(s, p); - } - if (le32_to_cpu(s->csw.residue)) { - len =3D p->iov.size - p->actual_length; - if (len) { - usb_packet_skip(p, len); - if (len > s->data_len) { - len =3D s->data_len; - } - s->data_len -=3D len; - if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; - } - } - } - if (p->actual_length < p->iov.size && s->mode =3D=3D USB_MSDM_= DATAIN) { - trace_usb_msd_packet_async(); - s->packet =3D p; - p->status =3D USB_RET_ASYNC; - } - break; +fail: + p->status =3D USB_RET_STALL; +} + +static void usb_msd_handle_data(USBDevice *dev, USBPacket *p) +{ + MSDState *s =3D (MSDState *)dev; + uint8_t devep =3D p->ep->nr; =20 - default: + if (s->needs_reset) { + p->status =3D USB_RET_STALL; + return; + } + + switch (p->pid) { + case USB_TOKEN_OUT: + if (devep !=3D 2) { + goto fail; + } + usb_msd_handle_data_out(dev, p); + break; + + case USB_TOKEN_IN: + if (devep !=3D 1) { goto fail; } + usb_msd_handle_data_in(dev, p); break; =20 default: --=20 2.45.2 From nobody Sun Apr 27 02:50:56 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1733994934; cv=none; d=zohomail.com; s=zohoarc; b=CZ6yChkn/K6TPl0MBBnGJdb7O3av/J5RbuchROZkknFL1isvHZC61/a1PVcUFcMmeLwm3xh5YyNE/zA0JOZgsqZQI4qqyQ7kpomK1V6JBwHxGwRALg/aQnhMdXPIRzvWLAO93p8Ir32XmI5CEA2wNo+pVTjSjXLZr/QTyVQrPgE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733994934; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ULR1MOYYwr9yyGYfXLKVNEWBcuu6r/97Xn5RLFPLZiU=; b=ixETsb82xljFD1SwGr1IyaS+PtL7Aqpl9xZejqgXjAnPgAdjdcCXnmhaUdAsOSNTNF4z2mBf5mFe5qudkFriH4Ef+Tz5Aj+pA3rgFjwPmNQmPAJq+57r+g1020GvaNg+EYJgF02iIPX4dIlt+dU4jrGGMSKR+Fr8ed7z1GFD9gc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733994934615872.6239998703932; Thu, 12 Dec 2024 01:15:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLfGX-0003Ug-9f; Thu, 12 Dec 2024 04:13:49 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGU-0003TP-Sw for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:13:46 -0500 Received: from mail-pj1-x1032.google.com ([2607:f8b0:4864:20::1032]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGT-0008Pj-Bt for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:13:46 -0500 Received: by mail-pj1-x1032.google.com with SMTP id 98e67ed59e1d1-2ee9a780de4so230498a91.3 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 01:13:45 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142d92e2csm787021a91.9.2024.12.12.01.13.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 01:13:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733994823; x=1734599623; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ULR1MOYYwr9yyGYfXLKVNEWBcuu6r/97Xn5RLFPLZiU=; b=Z9FajGgF2An6Xz8gs8ivsuJUzjD2J8DLU8SV8VivWXaxKC5Sb6t5CFHjKeJkbBrQz8 av+j/Oamc+GsNLkQ3LX9987l9sQOLzu6JzAjE6mVlaOTQBfxNf318q+X4oQIY6t6VNpP rZHPPjKJ4ZEcNuR7TI0eATZNoqZkjp/jDPfjgA/vmw42EHLtfE/l7ZlUJ3/q1rPD528T ukv6JIm59FonXCxOo3OL8e5qwR1T36XiBbobOYSOgy3cUCCxfRUrSEAadtGBQpSTs2VF rnVSE5CtFLc3kCap3a0AtBrbH6WNidWAkhcDgN14fW97ww8ho0vQQyLzjryWupD1tywh dB+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733994823; x=1734599623; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ULR1MOYYwr9yyGYfXLKVNEWBcuu6r/97Xn5RLFPLZiU=; b=NIhO4biYqNL3z2oyk51vxdbZdqnOD6Sr63euY8DdHuaxwOlDNVf7l1CrGPGvuLVBwt wmfPNPsg1bp2+hvZnOgG2OXqrb7ZUwcUWAyu8ApnEAAAPKzngcVLww3vxW24uqYG/FDB 8oNa9Dd3owZqO+9X17r3Lvch6ZHKvxKvNMnQNAtrM0GcrTD/dMSrpjZjTj2ldygvDyBo VedHVZoyc4Ryd9cEeuiHNzZ0Wo+gJbzTPQUt30rKqX7IGNdIxle68WJVL98l0+J+Hyxy ZE/xCAEr/iqH9aRM84kjYcJ7VfqlVdcXgonGJo6RmemM5mvQ2iayNWcblP1q+X7X70co i0eQ== X-Gm-Message-State: AOJu0YxznPioK31Qzzw0IK/m9WsO0isU+uQmyiawDVsmFtD8qWGiyNCy beuwJWHKxw+LAVk/m7g30ZJClF1bOB5zRGzn6ZVrYZXV+UI2YRineWZkIg== X-Gm-Gg: ASbGnct3jQbZuShGG64eybggsnszOaWVWWCvfrrn/RwVvcWcOfI3ifCWpoYI3UP8X0t v1gVNx1haWkEWDHaqN+cx8X5CBq+Szp4xyLaKBA/gdvOdtwTN1/mODeMZPNaD/1Qb5OZehjXlbk khPJ96Dwh+L13ROOpLXocf+HZYdOOTI95JdSXvrATyGQWgFF3uz2zjzuX6krpJlaLX7MMNssu9P dc0iZ4xSMkXFuJtrr0WuTVB//NO3crRihrCa672wyf2+5iUzsdnxo+xArw= X-Google-Smtp-Source: AGHT+IGvLUkOVAVtOjJpi8pvPdgsZ4JY+K6gBQ/YqsTjZ5g39Y9YLHrEQ1LrywEc/Xr7gU5yy732Kw== X-Received: by 2002:a17:90b:4b04:b0:2ee:d824:b594 with SMTP id 98e67ed59e1d1-2f1393264c0mr4236965a91.31.1733994823468; Thu, 12 Dec 2024 01:13:43 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, Gerd Hoffmann <kraxel@redhat.com>, Kevin Wolf <kwolf@redhat.com> Subject: [PATCH 03/11] usb/msd: Ensure packet structure layout is correct Date: Thu, 12 Dec 2024 19:13:14 +1000 Message-ID: <20241212091323.1442995-4-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212091323.1442995-1-npiggin@gmail.com> References: <20241212091323.1442995-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::1032; envelope-from=npiggin@gmail.com; helo=mail-pj1-x1032.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=subscribe> Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1733994936234116600 Content-Type: text/plain; charset="utf-8" These structures are hardware interfaces, ensure the layout is correct. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- hw/usb/dev-storage.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 2d7306b0572..87c22476f6b 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -27,7 +27,7 @@ #define MassStorageReset 0xff #define GetMaxLun 0xfe =20 -struct usb_msd_cbw { +struct QEMU_PACKED usb_msd_cbw { uint32_t sig; uint32_t tag; uint32_t data_len; @@ -636,6 +636,9 @@ static const TypeInfo usb_storage_dev_type_info =3D { =20 static void usb_msd_register_types(void) { + qemu_build_assert(sizeof(struct usb_msd_cbw) =3D=3D 31); + qemu_build_assert(sizeof(struct usb_msd_csw) =3D=3D 13); + type_register_static(&usb_storage_dev_type_info); } =20 --=20 2.45.2 From nobody Sun Apr 27 02:50:56 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1733994897; cv=none; d=zohomail.com; s=zohoarc; b=Ts9DBJcXlS6v/zk1jZVQ7WdSUVY1Xo5o5+QUG8QeaTJNiCobdWIWl9zHdVJxOxY7th2KBCI9tSM/iKyrFAHGHJbwKKVsBRcMwhD6sIaqooJJiitbyfGtKFyM41KE6tYNWR+LPSNXbWG5vJgtPfhv9odqavb4qjS97VuBLxugUCA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733994897; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Ucwi6GLl0n1B3UVmS7TAz0uWRjmTT8zXFyAAzX+VsQg=; b=PmJxP7ZJFNWT+Dvw7J3fRauci36dzSAduP1RnwsKQ3tAxP8/e/bu3Q2onTmcrqIxYvDvduu509H8QL5Lr3sb/HXHvgn2Hq+lPkWOnT1krGMZ6GsbVf3ZuTTTeW0S3ZubeRcrqPIMPxn5luKMgcPHBNI9SDm1XyjHQN0kIIAQT/A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 173399489728652.822538425239486; Thu, 12 Dec 2024 01:14:57 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLfGZ-0003ad-H5; Thu, 12 Dec 2024 04:13:51 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGX-0003Xt-QP for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:13:49 -0500 Received: from mail-pj1-x1036.google.com ([2607:f8b0:4864:20::1036]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGW-0008QJ-9A for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:13:49 -0500 Received: by mail-pj1-x1036.google.com with SMTP id 98e67ed59e1d1-2ee50ffcf14so1312990a91.0 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 01:13:47 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142d92e2csm787021a91.9.2024.12.12.01.13.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 01:13:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733994827; x=1734599627; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Ucwi6GLl0n1B3UVmS7TAz0uWRjmTT8zXFyAAzX+VsQg=; b=DvjWIJJih+tY9UwffiHrHRzk6/DhIoq4mGiFsKurrsNDvHuRTH93wpSFSPEjdzHplP EwUPAKnIDTv1SoS7E0lM2ajBRWkFgNri+K4r49X9RCdhLvvsPmdW764a3zqrVqljQZGZ Fo5hc7wCBVJP57B5ZFsvZafcExgCe9dLcDc2hgC9FIZxAeGCWqFDJBRGDpw3GxB+5C9W q9iPayxvXnecQ0RNjhsQ7u93wah48ezNqmNhPX/xo/CZ76ij+zvGu+lrvYJT/cECnR/s 9L2U41IgsxjPYRHvlKJU8NlBhQtuzIozIkpxaiP3YxFz4kRPszcGPSaTUnApjgCUjgKv l42A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733994827; x=1734599627; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Ucwi6GLl0n1B3UVmS7TAz0uWRjmTT8zXFyAAzX+VsQg=; b=uGJkIMXObQooFqDQnLH6q73V4Tx+mRhUkm5O3qJD+9LP/ehyI7jHy4A+Nnyj7kkGLU olQ61GcwnGPkqJDw9StMFkRsb/eCVFt280Kf7BC0kYLYGKy6Gd9aVmaEriHoswN0vVlZ wiKzsXLN7KyRXff9FQxXK/nrmhzJGnLK+gNSGJGyWXvz9xrfxrzRrG3MXCMUhQUp26ux SIKmNLhzLRvNbBFDkFwRftFl5TtuNWeoX13dm7vpA/CbRxeZbDZx8P7MGVJ0FuTf9lbr b6jr/lRAmm8lrHE4PqSkQbzlXbL13Bm9QIrWrYPMbK18IVM6debpLpkMhiCD5yrsRepK hb5A== X-Gm-Message-State: AOJu0YwaERJ46xC+0bflN2fFG9gLu54fE59lyI7rTzz/G2GyRpZ8jI0j t9Jx5ngigp5a8D1Gy+jChyFtyKRw/2qE+b+k89DNzZXUvbLFWKtMmrTpYQ== X-Gm-Gg: ASbGncvuLX30YuqH0mvR4qVmb/CkANy7IRzR9KgPFWf4Gnt3hPzvfoB2TcGFzRazDEW UZ5KVWnR6SgKzJih76XcQq1ZA8iI9QVrDDjseB3CLffjflXPlCeD6jig95c+0NdkDaV8DplFLai Etd2Drt5FAeZdJkM7R6ygiyL/gT/ST0DURSnwtyBnN0FW7X//Rl2+7KMImEWdbpvlRU2majYnBb 43fon/B+FkcB8jl+8IrqBYEu0f+8pVW6ZPv2EpcZTiABd6zv1UHOj0TqaI= X-Google-Smtp-Source: AGHT+IEx6rq8Abxx5Wz1SytB24rBtT1pu0kxc+lCl/qHXCieTOHz/HwmOcAweE21/r3EOJu6O72xwA== X-Received: by 2002:a17:90b:1f81:b0:2e2:c2b0:d03e with SMTP id 98e67ed59e1d1-2f13abc6e43mr3677301a91.5.1733994826672; Thu, 12 Dec 2024 01:13:46 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, Gerd Hoffmann <kraxel@redhat.com>, Kevin Wolf <kwolf@redhat.com> Subject: [PATCH 04/11] usb/msd: Improved handling of mass storage reset Date: Thu, 12 Dec 2024 19:13:15 +1000 Message-ID: <20241212091323.1442995-5-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212091323.1442995-1-npiggin@gmail.com> References: <20241212091323.1442995-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::1036; envelope-from=npiggin@gmail.com; helo=mail-pj1-x1036.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=subscribe> Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1733994897964116600 Content-Type: text/plain; charset="utf-8" The mass storage reset request handling does not reset in-flight SCSI requests or USB MSD packets. Implement this by calling the device reset handler which should take care of everything. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- hw/usb/dev-storage.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 87c22476f6b..c7c36ac80fa 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -359,7 +359,7 @@ static void usb_msd_handle_control(USBDevice *dev, USBP= acket *p, /* Class specific requests. */ case ClassInterfaceOutRequest | MassStorageReset: /* Reset state ready for the next CBW. */ - s->mode =3D USB_MSDM_CBW; + usb_msd_handle_reset(dev); break; case ClassInterfaceRequest | GetMaxLun: maxlun =3D 0; --=20 2.45.2 From nobody Sun Apr 27 02:50:56 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1733994905; cv=none; d=zohomail.com; s=zohoarc; b=VzgzHWT1XQ3ypq6DpNN10Tj7xeSxBkqKzRFLI2ednz90rtYeBgjzWE/mjCx8yiGr20cum8dCk/mgSYxDYqH7dFJwhQWqZ+Yseux7JzoxuNAzQCWPN0SLGaJUGTUSgwm7jlhn47GHbPRThpO7GQ6hNKQYEJwVs4vg76JoQuU8lm8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733994905; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=R+NlZz6w0HTcOx1pynFp4oSUBV7Ez0wh9zENi+SUzMQ=; b=gxFpW+hJBF4VhS93/lOkgUZlyG6y5QvvVzuNamNdNf3qYqDhzbJNSdYnf+9XWHf1PmlY4mgBc5zABMyqdJBJaDpcbQPKvIBymtekwNqGhu58Pt6S/+pGCsdLkLoXF++nL7f4bv+BvRwP+QDQmlgN465CSpqRiEUgWPrKJ2AW1V0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733994905637328.6800034475348; Thu, 12 Dec 2024 01:15:05 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLfGd-0003u3-Be; Thu, 12 Dec 2024 04:13:55 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGc-0003lY-2N for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:13:54 -0500 Received: from mail-pj1-x102e.google.com ([2607:f8b0:4864:20::102e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGa-0008Qc-Cj for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:13:53 -0500 Received: by mail-pj1-x102e.google.com with SMTP id 98e67ed59e1d1-2ee397a82f6so295345a91.2 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 01:13:52 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142d92e2csm787021a91.9.2024.12.12.01.13.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 01:13:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733994830; x=1734599630; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=R+NlZz6w0HTcOx1pynFp4oSUBV7Ez0wh9zENi+SUzMQ=; b=MuCx3Li1skKvNbfT3Bh2Nv4wrur+rlN8OjgUh2/FltfET9S1TFMjgtuQWmPis37b4G 3NhbGrRBYWYTgzJKBwW/OrgQEek5i+vo7LLDN8YE616mmztZyeP1QulRFxRf6erpjPuM qDLX8H8ac0Ia6qUH+WaRklq/DXhenMmV3UxM6CyhGU97fn9DnhuxAkLAGovSvihOr+1I JLgcou7DY88L778Hj58up5v3zez4AHDlYyci5Puu0WJp+tAMGSStKjO3QYeeolqo5ljZ otmQZpcX5RT8OJorBqDx6VVYF8wgaBTFdtanSBHF216tbvTCiXD7/0hH6WRetjUO7UtL WLpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733994830; x=1734599630; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=R+NlZz6w0HTcOx1pynFp4oSUBV7Ez0wh9zENi+SUzMQ=; b=qbqyHgjPlhcXicZSK1BXuhMT1jakRCRTB2gNJeeCyN59CtZ7aWDAowF+OBNeKgRckW nUWCZnQ2UkYrxK9Nab0HjfI3oTJ2mZU9SJCkQ8LaziZEtlguEuWBNP08PY12NEyjo2+V tAOHJbPLCb2o+xBtitbNX4Dy5IBa1vsTe4b2F9PANNFT7LnwloIkq7RXWDJkvx7/vsNB x4lWXom6Aqxax5pUGwYijqR+nmUtdn2zqv0nh8NCThe7CeTdqTqM3pi3NmXOw/Y/g6+9 RoVM55OE/NkV4Xtgnp+EDu8GjgxJefyGx60m/crWcJpesCpplcbNn56EfH2+30iYjluH ZoPA== X-Gm-Message-State: AOJu0YzgnIuFRL2kd7coujcbnLvwc8eSBdbq7krmby2D6cpw3zjIKjC/ 9H12955gDROfk3pgOEJqlbE8bgZEy7eGNKg8HukfcEjHv8tR89Kk0tysgw== X-Gm-Gg: ASbGnct/B+rP6DdCvtRzbzTZ2LWi+Hne5xs8CZ9wiVs5wOJfAnw7nLDNcTPZSzv/3/S JHCsIna677Lv2SraVSvlU5HK2omw2+bLe65+sfrUzQnE7a99WNIGzzqSC4nsAOrFKvwiLiooDZR Jt7PW1xYLQFnn+fN6RzJzIc67wQ2MGAQ0GsI/kmp5eWaFbMXCeLAG5YNPorqp3Nx2vKDA2ERsdK g6UJnn4pyS/pxXCWqJJJZjGqi257Hxx+5Tq3NIcLPKuxlds+bJGHA8szdw= X-Google-Smtp-Source: AGHT+IGuk9aHNaAMxQs0+9YnGihF7yHZjUJAUFmZR2GOuOhig8j5D6vh6crKXOOaNdCXCAVdyLwYBw== X-Received: by 2002:a17:90b:3e89:b0:2ee:c059:7de3 with SMTP id 98e67ed59e1d1-2f127fe770cmr9084884a91.18.1733994830268; Thu, 12 Dec 2024 01:13:50 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, Gerd Hoffmann <kraxel@redhat.com>, Kevin Wolf <kwolf@redhat.com> Subject: [PATCH 05/11] usb/msd: Improve packet validation error logging Date: Thu, 12 Dec 2024 19:13:16 +1000 Message-ID: <20241212091323.1442995-6-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212091323.1442995-1-npiggin@gmail.com> References: <20241212091323.1442995-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::102e; envelope-from=npiggin@gmail.com; helo=mail-pj1-x102e.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=subscribe> Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1733994906264116600 Content-Type: text/plain; charset="utf-8" Errors in incoming USB MSD packet format or context would typically be guest software errors. Log these under guest errors. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- hw/usb/dev-storage.c | 53 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index c7c36ac80fa..af9eb7ea8a5 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -10,6 +10,7 @@ #include "qemu/osdep.h" #include "qapi/error.h" #include "qemu/error-report.h" +#include "qemu/log.h" #include "qemu/module.h" #include "qemu/option.h" #include "qemu/config-file.h" @@ -395,6 +396,36 @@ static void usb_msd_cancel_io(USBDevice *dev, USBPacke= t *p) } } =20 +static bool try_get_valid_cbw(USBPacket *p, struct usb_msd_cbw *cbw) +{ + uint32_t sig; + + if (p->iov.size !=3D 31) { + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CBW size %ld\n", + p->iov.size); + return false; + } + usb_packet_copy(p, cbw, 31); + sig =3D le32_to_cpu(cbw->sig); + if (sig !=3D 0x43425355) { + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CBW signature 0x%08x\= n", + sig); + return false; + } + + return true; +} + +static bool check_valid_csw(USBPacket *p) +{ + if (p->iov.size < 13) { + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CSW size %ld\n", + p->iov.size); + return false; + } + return true; +} + static void usb_msd_handle_data_out(USBDevice *dev, USBPacket *p) { MSDState *s =3D (MSDState *)dev; @@ -405,19 +436,13 @@ static void usb_msd_handle_data_out(USBDevice *dev, U= SBPacket *p) =20 switch (s->mode) { case USB_MSDM_CBW: - if (p->iov.size !=3D 31) { - error_report("usb-msd: Bad CBW size"); - goto fail; - } - usb_packet_copy(p, &cbw, 31); - if (le32_to_cpu(cbw.sig) !=3D 0x43425355) { - error_report("usb-msd: Bad signature %08x", - le32_to_cpu(cbw.sig)); + if (!try_get_valid_cbw(p, &cbw)) { goto fail; } scsi_dev =3D scsi_device_find(&s->bus, 0, 0, cbw.lun); if (scsi_dev =3D=3D NULL) { - error_report("usb-msd: Bad LUN %d", cbw.lun); + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CBW LUN %d\n", + cbw.lun); goto fail; } tag =3D le32_to_cpu(cbw.tag); @@ -489,9 +514,15 @@ static void usb_msd_handle_data_in(USBDevice *dev, USB= Packet *p) =20 switch (s->mode) { case USB_MSDM_DATAOUT: - if (s->data_len !=3D 0 || p->iov.size < 13) { + if (!check_valid_csw(p)) { + goto fail; + } + if (s->data_len !=3D 0) { + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: CSW received before " + "all data was sent\n"); goto fail; } + /* Waiting for SCSI write to complete. */ trace_usb_msd_packet_async(); s->packet =3D p; @@ -499,7 +530,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) break; =20 case USB_MSDM_CSW: - if (p->iov.size < 13) { + if (!check_valid_csw(p)) { goto fail; } =20 --=20 2.45.2 From nobody Sun Apr 27 02:50:56 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1733994913; cv=none; d=zohomail.com; s=zohoarc; b=DcgD+gNydlaj4ADaMDFg48Ro1LEyWJ/7LCYNjtZ9WrbEf8fv6mPYvkn2JHrOTUZ/FRGe7mZXFRgQC96Lz9wida19LQA5uIzSO2i7VeBXbP2mlQ37m3UeUXd2HyGamcWk0OD6Ss0In7Gn/9jFknDKdGJRiDubfzjhs/kiY5qg4FQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733994913; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=yTdRLETnDJrohYBMUvZokfWyJ2vN454iXatV/Zh1U68=; b=gks+fQAcAVs4hSJ1X+p93iRvVhO00HzFvuy8zRvis8Z08FKUdS3S4Uz3uFh5kJflASwPTQ8E4rUm2KmYJoH4lkWiGKemX5REITyfNs6aHftczXrfD4F1ntyygHGMKyyR0yxtAgXItQQKhLoxclcT6fVsZMVRZyAoOSGeaVd5ytQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733994913385386.2378570389759; Thu, 12 Dec 2024 01:15:13 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLfGk-0004Bw-8s; Thu, 12 Dec 2024 04:14:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGi-00049l-FP for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:14:00 -0500 Received: from mail-pg1-x536.google.com ([2607:f8b0:4864:20::536]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGd-0008RJ-Nv for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:14:00 -0500 Received: by mail-pg1-x536.google.com with SMTP id 41be03b00d2f7-7f46d5d1ad5so296547a12.3 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 01:13:55 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142d92e2csm787021a91.9.2024.12.12.01.13.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 01:13:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733994834; x=1734599634; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=yTdRLETnDJrohYBMUvZokfWyJ2vN454iXatV/Zh1U68=; b=YbF0RUeTlIjf4ASFKzHTuQgiXhv29/SJdxDRMDbMAORph6WHZ08sZA/JJPBzHaHd3r 1scnP/fAA5J/23f/n3ua4juEGno3ZEUmZkkSSmLlfMGSyd45BpMp0Pbyty1pq5XNZTrL rKmo0aHhiMMD6xUWpBLQOuJ2EPvuKK9VIaLfmbRQY85dgbB0/Z8RLTa61IxdsZuTsPkK uZnR7LXLLJq5WlDpWGaoVYUmsgI7x8zH+K6FVbSs0b65klN3h5fU5qX+yy3XPQo6Yqpi k0QkZ963x0vG042IAsO+I7xil1bPlSF0g5VY6iFWMFXr32BoPS8uM7DOY6c3F9tjsvAW 4osQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733994834; x=1734599634; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=yTdRLETnDJrohYBMUvZokfWyJ2vN454iXatV/Zh1U68=; b=wLK/00Np5XQczATfiiTy999t2hc8qyOqmxP2rul3t2rD47z330I77PJdjDOmyzOMU2 FD4+qSAkRAubtEEWnfP2CzRTieAaBvxAPUbfLBEa7B0yZqBQEa20RWqAf4+j0or3iX91 efT/e1JZ9UXX6Bh36y/u13paI/Lpa2+U9Ia3VrCAcTo5BJ+f/jvNz4jKwoDVgMg5W8wx v7BL5+u1TEwelj0VKVoIhY4C28QsdVM88C9r71hTa+x76u9Yv1voa4XOITP1Tby2h2J+ XIMWmJBqmAuIjuWhHcoXy+DujA0qVm41Xzrd5BtDQvuk9ZMFgfWkvTJ4EPt0ZQM4gL9p 9tVQ== X-Gm-Message-State: AOJu0YyX26a6O41zDijJIYGor8sKwErnlJylEBin4GONgoGGvZcpqWp1 ruyZApULgY9y7CJat9867eDaE0MbPijar1MTrulCoSXzHHOW0eXZ7snuYQ== X-Gm-Gg: ASbGncveg+rAuDltcL1VHvtgBZWcjLE6sbC+j2BuMgg0h8lVBCgm1NWhZIM23Ouc0e/ 4L/zUvDn0s7b9Y3kEOIUEobEQbmwdrzCPfWlYqO2MMX8bU9sQth0/VnlqGJhyGwXaakwgtBxnER 8R9CYsJAcT3MfuNG3tYrM5UAZB7bdUnjAKksNAALktYxjaiUoaxRggGXtikCufPNg/wDBrZBcDu fgOs7qaSAL1uBKI+NoxEN4R0h+YnJYsSPJUaSJdLTpghyB0Uh3Rc2a4pIY= X-Google-Smtp-Source: AGHT+IFVOJuRD7FHgGvirzgcMQ4JSI7ykWjx2o5xjq5fMLTgQ+BFboEdlT6hhn+FL1a5IWDvzZb/tA== X-Received: by 2002:a17:90b:2ec8:b0:2ea:b564:4b31 with SMTP id 98e67ed59e1d1-2f127fea997mr8744289a91.19.1733994833926; Thu, 12 Dec 2024 01:13:53 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, Gerd Hoffmann <kraxel@redhat.com>, Kevin Wolf <kwolf@redhat.com> Subject: [PATCH 06/11] usb/msd: Allow CBW packet size greater than 31 Date: Thu, 12 Dec 2024 19:13:17 +1000 Message-ID: <20241212091323.1442995-7-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212091323.1442995-1-npiggin@gmail.com> References: <20241212091323.1442995-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::536; envelope-from=npiggin@gmail.com; helo=mail-pg1-x536.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=subscribe> Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1733994914003116600 Content-Type: text/plain; charset="utf-8" The CBW structure is 31 bytes, so CBW DATAOUT packets must be at least 31 bytes. QEMU enforces exactly 31 bytes, but this is inconsistent with how it handles CSW packets (where it allows greater than or equal to 13 bytes) despite wording in the spec[*] being similar for both packet types: "shall end as a short packet with exactly 31 bytes transferred". [*] USB MSD Bulk-Only Transport 1.0 For consistency, and on the principle of being tolerant in accepting input, relax the CBW size check. Alternatively, both checks could be tightened to exact. Or a message could be printed warning of possible guest error if size is not exact, but still accept the packets. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- hw/usb/dev-storage.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index af9eb7ea8a5..064bb700cbc 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -400,7 +400,7 @@ static bool try_get_valid_cbw(USBPacket *p, struct usb_= msd_cbw *cbw) { uint32_t sig; =20 - if (p->iov.size !=3D 31) { + if (p->iov.size < 31) { qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: Bad CBW size %ld\n", p->iov.size); return false; --=20 2.45.2 From nobody Sun Apr 27 02:50:56 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1733994917; cv=none; d=zohomail.com; s=zohoarc; b=b0Me/PZCm9Kw6czqWmpPwi422KbNYGbkDn9zWiqAKTEs8ey6fmRQMa536eahs0KzDBvtklJuu9EXnuTQcQHuSh0rMQbe0cYqyL3Cz0ATQ5QfWaXvfdKCYGQPKAIaDSIgpMbWNwASrM7SlemiEJEWuZ2W3unyTFl1iL0fwgdesok= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733994917; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ruI2VEm52N1m+U4TsADLxrOxUekJ4XCSufFXN4VqY+o=; b=ABxzusB89AfK6FKTFXubBNlGVQK2jjSPelNixu8nHuzyb9uKf5PVvgeppIIHDyb2jZyVGVSy/OvNqbvMRRMAcl9w3PX1ZeyRyyfOWVSg+loqPllPIgYx0lMMg0KqAZxFTEOl/uaIMZnJaMX3NEy17OkJgOI/Y0i8ekyQhjmXH/Q= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733994917381439.1539443324225; Thu, 12 Dec 2024 01:15:17 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLfGk-0004Cs-Mn; Thu, 12 Dec 2024 04:14:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGi-0004AI-Uu for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:14:00 -0500 Received: from mail-pj1-x102d.google.com ([2607:f8b0:4864:20::102d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGg-0008RY-Ua for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:14:00 -0500 Received: by mail-pj1-x102d.google.com with SMTP id 98e67ed59e1d1-2ee74291415so235145a91.3 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 01:13:58 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142d92e2csm787021a91.9.2024.12.12.01.13.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 01:13:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733994837; x=1734599637; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ruI2VEm52N1m+U4TsADLxrOxUekJ4XCSufFXN4VqY+o=; b=P0TWr59xlOg6DI6VDV3bIT5MtKPlvsDixXFveJ/NNX4maMbbAlNlv14b+XuwmCWcz2 8cfzGviaPjXJJAySDZZxhuE0sn7CaultacKjb6Z1yP9OCBGIX9Tar8w9xGwWyB8ZdZN6 3C4pwd+89/EYxvy9huT1elo2/Jz453mu5KxK2GnqKHHBjQnbmudoqjrH1rw55EoFVI48 ZFvQDAubjb0Nk6KHQWGFXZMCBuoiVuGDJCEx3lBv6TWo3tuH13wRTV/K1toTnuWi13x+ C7oobB0oSSJgXtFAgV5HO9sdSBsxTL6ZO4iFpcNbihbgPNtgUHlYp8nSwJxy8NT4SS5F y3eQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733994837; x=1734599637; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ruI2VEm52N1m+U4TsADLxrOxUekJ4XCSufFXN4VqY+o=; b=htGQn0cPDSEHxbyal+xBnVuoKif5b28ARZE6Ny+WPmUG5gWJ30hZsc/9mpcDPsZy6m zTa1+DJKV3Gpl4VGcAfzYHbxahH5UyQQ/5e44u0FyGAvDAsNEuFlLO3I096XOxvnBtoo HOzhBgPwKwroIv/C1McRmIE/gaH3R1xcSUsA+E2YhDlfC+bltmAcMto5Pvan9OCOxjy1 kA1LynNgiexV9JvTgSQYTc/fa0lXMwjpgv4nKoXfCPH8TT+gwZLddmXZc7Ll12LN7z9R PgmPrk/0ggLvCjUZBoe0JzMdkpvED2q7kC4ZJ4bUVKX4tlryyq1kWfFDPvY3sqk/O2jr dlDg== X-Gm-Message-State: AOJu0Ywk3ToimEm1N7ZSz0IJTf4LMmlJozdcI+VbqvoC41HAxLJTE6Dm /68NrfZbn+7b8GneDzu7YXxdxxMwFAOoe2hthPzl4RUFywJF1mWsX9Q5NQ== X-Gm-Gg: ASbGncsNqAk55zUK+caDO4sXAbGv97nW+mPzIOFuXwbIKdnDH4Z6c80WI9SMiSvU7Ja tcHxMszSGpxTRIVLPlwDyQoksrVih3ZxvO3SOZS76lNdmw2V5Dw3fNt9puAq492gVYb3vaHEkLK 0NEhkZ8ZU0mhqYQGOOhGIn9WfApW17CHwbGCocONZ1pWfbJS5tvK+7VxFkOzrwkJkcLWWNWC+HM fqJYEv2QLSYkKvtOYGW3dGk4sCWcCgIYK+RGkI2E2qEyR/4c8imwvM141k= X-Google-Smtp-Source: AGHT+IEJu+I9QoecG2NkTNlLhwkGIWEdgXRubn8Ku/pP9wUfm3yOXPL6xkLiqfj+z24YIW6gI/l4ig== X-Received: by 2002:a17:90b:17cc:b0:2ee:7c02:8ef1 with SMTP id 98e67ed59e1d1-2f127fbcec5mr8792724a91.11.1733994837258; Thu, 12 Dec 2024 01:13:57 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, Gerd Hoffmann <kraxel@redhat.com>, Kevin Wolf <kwolf@redhat.com> Subject: [PATCH 07/11] usb/msd: Split async packet tracking into data and csw Date: Thu, 12 Dec 2024 19:13:18 +1000 Message-ID: <20241212091323.1442995-8-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212091323.1442995-1-npiggin@gmail.com> References: <20241212091323.1442995-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::102d; envelope-from=npiggin@gmail.com; helo=mail-pj1-x102d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=subscribe> Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1733994918371116600 Content-Type: text/plain; charset="utf-8" The async packet handling logic has places that infer whether the async packet is data or CSW, based on context. This is not wrong, it just makes the logic easier to follow if they are categorised when they are accepted. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- include/hw/usb/msd.h | 5 +- hw/usb/dev-storage.c | 121 +++++++++++++++++++++++++++---------------- 2 files changed, 79 insertions(+), 47 deletions(-) diff --git a/include/hw/usb/msd.h b/include/hw/usb/msd.h index f9fd862b529..a40d15f5def 100644 --- a/include/hw/usb/msd.h +++ b/include/hw/usb/msd.h @@ -33,8 +33,11 @@ struct MSDState { struct usb_msd_csw csw; SCSIRequest *req; SCSIBus bus; + /* For async completion. */ - USBPacket *packet; + USBPacket *data_packet; + USBPacket *csw_in_packet; + /* usb-storage only */ BlockConf conf; bool removable; diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 064bb700cbc..4e23537cd75 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -178,18 +178,33 @@ static const USBDesc desc =3D { .str =3D desc_strings, }; =20 -static void usb_msd_packet_complete(MSDState *s, int status) +static void usb_msd_data_packet_complete(MSDState *s, int status) { - USBPacket *p =3D s->packet; + USBPacket *p =3D s->data_packet; =20 /* - * Set s->packet to NULL before calling usb_packet_complete - * because another request may be issued before - * usb_packet_complete returns. + * Set s->data_packet to NULL before calling usb_packet_complete + * because another request may be issued before usb_packet_complete + * returns. */ trace_usb_msd_packet_complete(); + s->data_packet =3D NULL; + p->status =3D status; + usb_packet_complete(&s->dev, p); +} + +static void usb_msd_csw_packet_complete(MSDState *s, int status) +{ + USBPacket *p =3D s->csw_in_packet; + + /* + * Set s->csw_in_packet to NULL before calling usb_packet_complete + * because another request may be issued before usb_packet_complete + * returns. + */ + trace_usb_msd_packet_complete(); + s->csw_in_packet =3D NULL; p->status =3D status; - s->packet =3D NULL; usb_packet_complete(&s->dev, p); } =20 @@ -197,8 +212,12 @@ static void usb_msd_fatal_error(MSDState *s) { trace_usb_msd_fatal_error(); =20 - if (s->packet) { - usb_msd_packet_complete(s, USB_RET_STALL); + if (s->data_packet) { + usb_msd_data_packet_complete(s, USB_RET_STALL); + } + + if (s->csw_in_packet) { + usb_msd_csw_packet_complete(s, USB_RET_STALL); } =20 /* @@ -243,7 +262,7 @@ static void usb_msd_send_status(MSDState *s, USBPacket = *p) void usb_msd_transfer_data(SCSIRequest *req, uint32_t len) { MSDState *s =3D DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); - USBPacket *p =3D s->packet; + USBPacket *p =3D s->data_packet; =20 if ((s->mode =3D=3D USB_MSDM_DATAOUT) !=3D (req->cmd.mode =3D=3D SCSI_= XFER_TO_DEV)) { usb_msd_fatal_error(s); @@ -254,10 +273,10 @@ void usb_msd_transfer_data(SCSIRequest *req, uint32_t= len) s->scsi_off =3D 0; if (p) { usb_msd_copy_data(s, p); - p =3D s->packet; + p =3D s->data_packet; if (p && p->actual_length =3D=3D p->iov.size) { /* USB_RET_SUCCESS status clears previous ASYNC status */ - usb_msd_packet_complete(s, USB_RET_SUCCESS); + usb_msd_data_packet_complete(s, USB_RET_SUCCESS); } } } @@ -265,7 +284,7 @@ void usb_msd_transfer_data(SCSIRequest *req, uint32_t l= en) void usb_msd_command_complete(SCSIRequest *req, size_t resid) { MSDState *s =3D DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); - USBPacket *p =3D s->packet; + USBPacket *p =3D s->data_packet; =20 trace_usb_msd_cmd_complete(req->status, req->tag); =20 @@ -274,35 +293,37 @@ void usb_msd_command_complete(SCSIRequest *req, size_= t resid) s->csw.residue =3D cpu_to_le32(s->data_len); s->csw.status =3D req->status !=3D 0; =20 - if (s->packet) { - if (s->data_len =3D=3D 0 && s->mode =3D=3D USB_MSDM_DATAOUT) { - /* A deferred packet with no write data remaining must be - the status read packet. */ - usb_msd_send_status(s, p); - s->mode =3D USB_MSDM_CBW; - } else if (s->mode =3D=3D USB_MSDM_CSW) { - usb_msd_send_status(s, p); - s->mode =3D USB_MSDM_CBW; - } else { - if (s->data_len) { - int len =3D (p->iov.size - p->actual_length); - usb_packet_skip(p, len); - if (len > s->data_len) { - len =3D s->data_len; - } - s->data_len -=3D len; - } - if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; + scsi_req_unref(req); + s->req =3D NULL; + + if (p) { + g_assert(s->mode =3D=3D USB_MSDM_DATAIN || s->mode =3D=3D USB_MSDM= _DATAOUT); + if (s->data_len) { + int len =3D (p->iov.size - p->actual_length); + usb_packet_skip(p, len); + if (len > s->data_len) { + len =3D s->data_len; } + s->data_len -=3D len; + } + if (s->data_len =3D=3D 0) { + s->mode =3D USB_MSDM_CSW; } /* USB_RET_SUCCESS status clears previous ASYNC status */ - usb_msd_packet_complete(s, USB_RET_SUCCESS); + usb_msd_data_packet_complete(s, USB_RET_SUCCESS); } else if (s->data_len =3D=3D 0) { s->mode =3D USB_MSDM_CSW; } - scsi_req_unref(req); - s->req =3D NULL; + + if (s->mode =3D=3D USB_MSDM_CSW) { + p =3D s->csw_in_packet; + if (p) { + usb_msd_send_status(s, p); + s->mode =3D USB_MSDM_CBW; + /* USB_RET_SUCCESS status clears previous ASYNC status */ + usb_msd_csw_packet_complete(s, USB_RET_SUCCESS); + } + } } =20 void usb_msd_request_cancelled(SCSIRequest *req) @@ -332,8 +353,12 @@ void usb_msd_handle_reset(USBDevice *dev) } assert(s->req =3D=3D NULL); =20 - if (s->packet) { - usb_msd_packet_complete(s, USB_RET_STALL); + if (s->data_packet) { + usb_msd_data_packet_complete(s, USB_RET_STALL); + } + + if (s->csw_in_packet) { + usb_msd_csw_packet_complete(s, USB_RET_STALL); } =20 memset(&s->csw, 0, sizeof(s->csw)); @@ -388,11 +413,15 @@ static void usb_msd_cancel_io(USBDevice *dev, USBPack= et *p) { MSDState *s =3D USB_STORAGE_DEV(dev); =20 - assert(s->packet =3D=3D p); - s->packet =3D NULL; - - if (s->req) { - scsi_req_cancel(s->req); + if (p =3D=3D s->data_packet) { + s->data_packet =3D NULL; + if (s->req) { + scsi_req_cancel(s->req); + } + } else if (p =3D=3D s->csw_in_packet) { + s->csw_in_packet =3D NULL; + } else { + g_assert_not_reached(); } } =20 @@ -493,7 +522,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) } if (p->actual_length < p->iov.size) { trace_usb_msd_packet_async(); - s->packet =3D p; + s->data_packet =3D p; p->status =3D USB_RET_ASYNC; } break; @@ -525,7 +554,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) =20 /* Waiting for SCSI write to complete. */ trace_usb_msd_packet_async(); - s->packet =3D p; + s->csw_in_packet =3D p; p->status =3D USB_RET_ASYNC; break; =20 @@ -537,7 +566,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) if (s->req) { /* still in flight */ trace_usb_msd_packet_async(); - s->packet =3D p; + s->csw_in_packet =3D p; p->status =3D USB_RET_ASYNC; } else { usb_msd_send_status(s, p); @@ -565,7 +594,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) } if (p->actual_length < p->iov.size && s->mode =3D=3D USB_MSDM_DATA= IN) { trace_usb_msd_packet_async(); - s->packet =3D p; + s->data_packet =3D p; p->status =3D USB_RET_ASYNC; } break; --=20 2.45.2 From nobody Sun Apr 27 02:50:56 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1733994902; cv=none; d=zohomail.com; s=zohoarc; b=UImktPEkuZWeAlkLNfosZaUZBqqgGyYBUniirC/HJf+cYuGqPz1XL1YY+eWxWOkpd9AWK+JE2yDnr9oR8oKuuHNxGMrAPiiFlepo2B9MF+NbTnw7DiBvCWnxkm2IsKvD6ky31Uj7fUFhNzY7w0QKkRXGT1CRES2u2/b6g4+k7ig= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733994902; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=md9GySIJ3TCHpzC0bgJMV4Q1M309e6Yb0FYtaFc/bk4=; b=j6ez9c3WelOsQmEG+F6e2m1AZutSNgWRhExWmhNIyezMX6lUpzuVXwQXeMvZU+D8WwLKe3saYsNBH+eAl0/h7WAFZ0QVhZjWHc0763zcwuehH+sUuO7hahSj7pZX3crPDrMtIKoQ7/gkx6YOzQVNwGtuFk2t4E8YXCtD3uUOCas= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733994902944980.9653520531297; Thu, 12 Dec 2024 01:15:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLfGo-0004FU-Qr; Thu, 12 Dec 2024 04:14:06 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGm-0004EM-Eb for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:14:04 -0500 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGk-00006j-KE for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:14:03 -0500 Received: by mail-pl1-x62c.google.com with SMTP id d9443c01a7336-21145812538so3715315ad.0 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 01:14:02 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142d92e2csm787021a91.9.2024.12.12.01.13.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 01:14:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733994841; x=1734599641; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=md9GySIJ3TCHpzC0bgJMV4Q1M309e6Yb0FYtaFc/bk4=; b=TgqO2/fxEyqhmeEONUEchntgH78wA4jutKZyyZQI17GEOP79vLgRI1YFmuenygqSo5 ACVBxkeryyfpj2btMZdXGaMfEMovHoLt9NEwaf2l2pSamhwXWFcsyrb7Q/2+BHGLn+GV V/NiniaSy/bMwG/Ty5nVT4W/op853zgsR0xxu2Yy+u4z/BKoYPEDs+hgVekOWwCm+vU0 cwcB7rLQnqpenn3B1NxbZuz/9ht9M66Y1t/CY4QgGpnxi24F6rGOIWvCM3LmerQmMJI1 c7GLzAUjojgsOlqW1BQ/IGEz9RFOIJ6cyJhdnm+EqzCHo6LKRsXZYGiMP7SCvlJ9F5Su xECw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733994841; x=1734599641; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=md9GySIJ3TCHpzC0bgJMV4Q1M309e6Yb0FYtaFc/bk4=; b=lrf5kD4mTqZ3Cg4SbFqbevjk6WrkKFgX0KsJRLplkyrKtpKhEr9PfUw7097xpwDcYb TWOkf/9GVIK8E7aaoIM0Pgn2Y2PeiqwkeGLuCyNJOlLoitn0IDxKigyLapenpLzqoERr +Ez2KMATDjCyfaju07m/ALcx5RbrXvemAZT/L0mS2W3iusl6SIaYSOPQ3vxwdvXXtTX4 Wd1n68E7x5FdhHLaKipuXv1nV2Ulo3m9/ZI2EFT+7uSmyizMs04ZbHFimQBvvWb6cH6G T5+RSA0nvXsoBvrBisPGVUrAYbqEZrgKBpNPaqpdxSUDPzpW7M7yONxb/zsLf93/B93I x6BQ== X-Gm-Message-State: AOJu0YyODfzY610wffTTau2pWeDAso1Bz1lJFrypAq2Xn4gaVPocrxfV 0mp/iFqIL1Yx38YgHm+j/5yu+0G0HJBli0KThLww00ytuCcN1E61P5L+NQ== X-Gm-Gg: ASbGncs3V1bKfHyZUSWIZzmej95mu2WfPmN2AFOH0UR0BdzCTt7eLl8xG4sMSeFdxfj 6vcdmoAaiaiNWq4Lv+pQJCO5iJi874AjFwtMuRz3y2zcyFGmBRG6UpkvB9pwwtcKSUzJYD5YMeU oyvRyEdWB909gxYpMds5IrV1W2zQeARMUtnyGzEcGUSN02u0E2QXWJ/gNBDzFoJsTAg004lcPOU VfTnGmGKS0qbI36Cx3pIDFXkxN+1VKk97Z2LFYW4QKjewqUKumUjPu9LTY= X-Google-Smtp-Source: AGHT+IF+Oro7OkMLzh8csvIDMa/cw+yX5StFgD3DXFfEqsD7ncFzNCvbPmAT4HatWKaB3OO32nXjsw== X-Received: by 2002:a17:90b:1b0f:b0:2ee:d433:7c54 with SMTP id 98e67ed59e1d1-2f1392b94e8mr4675722a91.19.1733994840654; Thu, 12 Dec 2024 01:14:00 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, Gerd Hoffmann <kraxel@redhat.com>, Kevin Wolf <kwolf@redhat.com> Subject: [PATCH 08/11] usb/msd: Add some additional assertions Date: Thu, 12 Dec 2024 19:13:19 +1000 Message-ID: <20241212091323.1442995-9-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212091323.1442995-1-npiggin@gmail.com> References: <20241212091323.1442995-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62c; envelope-from=npiggin@gmail.com; helo=mail-pl1-x62c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=subscribe> Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1733994904145116600 Content-Type: text/plain; charset="utf-8" Add more assertions to help verify internal logic. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- hw/usb/dev-storage.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 4e23537cd75..c04cee0041b 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -264,13 +264,24 @@ void usb_msd_transfer_data(SCSIRequest *req, uint32_t= len) MSDState *s =3D DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); USBPacket *p =3D s->data_packet; =20 - if ((s->mode =3D=3D USB_MSDM_DATAOUT) !=3D (req->cmd.mode =3D=3D SCSI_= XFER_TO_DEV)) { - usb_msd_fatal_error(s); - return; + if (s->mode =3D=3D USB_MSDM_DATAIN) { + if (req->cmd.mode =3D=3D SCSI_XFER_TO_DEV) { + usb_msd_fatal_error(s); + return; + } + } else if (s->mode =3D=3D USB_MSDM_DATAOUT) { + if (req->cmd.mode !=3D SCSI_XFER_TO_DEV) { + usb_msd_fatal_error(s); + return; + } + } else { + g_assert_not_reached(); } =20 + assert(s->scsi_len =3D=3D 0); s->scsi_len =3D len; s->scsi_off =3D 0; + if (p) { usb_msd_copy_data(s, p); p =3D s->data_packet; @@ -288,6 +299,10 @@ void usb_msd_command_complete(SCSIRequest *req, size_t= resid) =20 trace_usb_msd_cmd_complete(req->status, req->tag); =20 + g_assert(s->req); + /* The CBW is what starts the SCSI request */ + g_assert(s->mode !=3D USB_MSDM_CBW); + s->csw.sig =3D cpu_to_le32(0x53425355); s->csw.tag =3D cpu_to_le32(req->tag); s->csw.residue =3D cpu_to_le32(s->data_len); @@ -486,7 +501,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) trace_usb_msd_cmd_submit(cbw.lun, tag, cbw.flags, cbw.cmd_len, s->data_len); assert(le32_to_cpu(s->csw.residue) =3D=3D 0); - s->scsi_len =3D 0; + assert(s->scsi_len =3D=3D 0); s->req =3D scsi_req_new(scsi_dev, tag, cbw.lun, cbw.cmd, cbw.cmd_len, NULL); if (s->commandlog) { --=20 2.45.2 From nobody Sun Apr 27 02:50:56 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1733994936; cv=none; d=zohomail.com; s=zohoarc; b=WMHTyvIwEZMlNlsLsM1wwuYESE+HdEQrxoU3HSquNKrKisiRvKJhAiAj/hqvYHTrBX9+AFD5C89aAyIktTG7+VOomQVGEw0nzXTr4ajteQtLMVavtiYPp6EpooQSntC29PsD6ulIXNB+UKQhIPo2zkdQcJsR0obVXDe5iVdaKXw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733994936; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=BOlrH6ZLpCP3n/tz6Nc3xjpVDR5OJln8PIzoRU0dHNg=; b=GACvbwPJYvJkvT/W0EQr63HGuKyQ0y+4q/WPhxoCL35rLt+hLnQD4IdrPkCWmCz9vrYQDxc6KuZ9ECT8xiKqslfZZJI+PC1s9FVEIFqaQC1ZLIy+7kIZjn+dxr/VAdu4LHCMUqj9dx0wS35/1/8JcNEi78X5A/zJe2UPk1S2PP8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733994936933952.2852784571135; Thu, 12 Dec 2024 01:15:36 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLfGs-0004G3-08; Thu, 12 Dec 2024 04:14:10 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGq-0004Fl-Cu for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:14:08 -0500 Received: from mail-pg1-x52c.google.com ([2607:f8b0:4864:20::52c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGo-0000Ht-KM for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:14:08 -0500 Received: by mail-pg1-x52c.google.com with SMTP id 41be03b00d2f7-7fdc6e04411so224784a12.2 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 01:14:06 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142d92e2csm787021a91.9.2024.12.12.01.14.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 01:14:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733994844; x=1734599644; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BOlrH6ZLpCP3n/tz6Nc3xjpVDR5OJln8PIzoRU0dHNg=; b=clc/kBSorKzRk6Ee1MyhmwUuRSIsAmEGIzFJO/594ErBF4es6qBiZYAaiors4VBMfB zQuOk707CW3kRb8fYenMi6ZtvXZl3qMC0GHLpqIKsB/2YxSEUZGT48Kwonz4sjK87RiC FV78gWVOoHEeupSrWO/O8BPscTe7Zxs4KQJ2j3tlZ6MPS/1oB/fuEFTMeBpqTSDQvMN1 sFMG4c15dQBTF8rJ0BLRPTnVxXCE9dKzav8zQQpEmpQBE7eGEzJfzaV5tZ0FK+nwCvru VInkw/nNVPZYCXP9mCTduulWFbciYyiTA/2aazX+SEpH9ycwG28WvOs6Vu7eN8/G01x3 3Z9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733994844; x=1734599644; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BOlrH6ZLpCP3n/tz6Nc3xjpVDR5OJln8PIzoRU0dHNg=; b=L1qeDFzu9m6l+KJo4bjKTHfRLkDulnY3byxtm5YkG8YhSMVVZShbu44MLaanf5kL0I vnfT16LGUbwFeC/l0Rg8IQ6Tk7TNGWyTzkzxUlHXyakk8LOD+2qjvjUuCUN4kAaJa7iZ gxng/5snqXz7OmOQlqgzDOrAjU1338iNARls0WTz8k21q+1MjoVKyhZLbSK472m49j5/ dDLzoL71mKLm6DCHoRjtda+qocfO6AV1AteXbchwbg3o3Uu9LmyG+53nQbnsrxh4g0wq eUGg//yb63SMN1eOHFGwjhLdae0r4a81DFGwxed0Aevj+Bz1h66xZqixU5hWIr3uKaQN x/PQ== X-Gm-Message-State: AOJu0YzcvAC3otkOL+mDR8J8Y4NBn2V+H57DwzMVZtCe/YF5w55O3Vel Lc9PNMcYQmN+9MiPCTavkvhZ72cO5/lTvSijX6IVe0aH6m8AUNYFQELsfg== X-Gm-Gg: ASbGncsh8gYGfwL8jpPOCG1Tojb3LO/Lf1xrVoZpH1QhiodwwutGe1feB9OBQwoPnVG u/D8zjIWbMsR4QVyWCsLfFFAvt1w5f9/Oa6IKzD64Cd4t24UalrqcY6Zn7A+aFam4nuufvtNFPq MlnNRBz7tbNJHLjrNtIAlGjziV56K7oPImWXIhlvhYdSzhXryjbaUH+HI7QYRCxNx4dQ/yZM+Nm uIa9N5Z55sv9C6D3OspSi8mECK4SHc/ewk+ikMzNJ8ZaHOTb/3vFU4WJP8= X-Google-Smtp-Source: AGHT+IEGWe1gSrOiQtxzXfbJcAMtGjgUmWxFUQ7L5PoZvEDFtSyE7CqmvW1Mq62Xf6iAdROo8QndvA== X-Received: by 2002:a17:90b:4d06:b0:2ee:c2df:5d30 with SMTP id 98e67ed59e1d1-2f12808c011mr8459895a91.26.1733994844338; Thu, 12 Dec 2024 01:14:04 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, Gerd Hoffmann <kraxel@redhat.com>, Kevin Wolf <kwolf@redhat.com> Subject: [PATCH 09/11] usb/msd: Rename mode to cbw_state, and tweak names Date: Thu, 12 Dec 2024 19:13:20 +1000 Message-ID: <20241212091323.1442995-10-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212091323.1442995-1-npiggin@gmail.com> References: <20241212091323.1442995-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::52c; envelope-from=npiggin@gmail.com; helo=mail-pg1-x52c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=subscribe> Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1733994938393116600 Content-Type: text/plain; charset="utf-8" This reflects a little better what it does, particularly with a subsequent change to relax the order packets are seen in. This field is not the general state of the MSD state machine, rather it follows packets that are completed as part of a CBW command. The difference is a bit subtle, so for a concrete example, the next change will permit the host to send a CSW packet before it sends the associated CBW packet. In that case the CSW packet will be tracked and the MSD state machine will move, but this mode / cbw_state field would remain unchanged (in the "expecting CBW" state), until the CBW packet arrives. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- include/hw/usb/msd.h | 12 +++++------ hw/usb/dev-storage.c | 50 +++++++++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/include/hw/usb/msd.h b/include/hw/usb/msd.h index a40d15f5def..c109544f632 100644 --- a/include/hw/usb/msd.h +++ b/include/hw/usb/msd.h @@ -10,11 +10,11 @@ #include "hw/usb.h" #include "hw/scsi/scsi.h" =20 -enum USBMSDMode { - USB_MSDM_CBW, /* Command Block. */ - USB_MSDM_DATAOUT, /* Transfer data to device. */ - USB_MSDM_DATAIN, /* Transfer data from device. */ - USB_MSDM_CSW /* Command Status. */ +enum USBMSDCBWState { + USB_MSD_CBW_NONE, /* Ready, waiting for CBW packet. */ + USB_MSD_CBW_DATAOUT, /* Expecting DATA-OUT (to device) packet */ + USB_MSD_CBW_DATAIN, /* Expecting DATA-IN (from device) packet */ + USB_MSD_CBW_CSW /* No more data, expecting CSW packet. */ }; =20 struct QEMU_PACKED usb_msd_csw { @@ -26,7 +26,7 @@ struct QEMU_PACKED usb_msd_csw { =20 struct MSDState { USBDevice dev; - enum USBMSDMode mode; + enum USBMSDCBWState cbw_state; uint32_t scsi_off; uint32_t scsi_len; uint32_t data_len; diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index c04cee0041b..801a5d0c680 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -264,12 +264,12 @@ void usb_msd_transfer_data(SCSIRequest *req, uint32_t= len) MSDState *s =3D DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); USBPacket *p =3D s->data_packet; =20 - if (s->mode =3D=3D USB_MSDM_DATAIN) { + if (s->cbw_state =3D=3D USB_MSD_CBW_DATAIN) { if (req->cmd.mode =3D=3D SCSI_XFER_TO_DEV) { usb_msd_fatal_error(s); return; } - } else if (s->mode =3D=3D USB_MSDM_DATAOUT) { + } else if (s->cbw_state =3D=3D USB_MSD_CBW_DATAOUT) { if (req->cmd.mode !=3D SCSI_XFER_TO_DEV) { usb_msd_fatal_error(s); return; @@ -301,7 +301,7 @@ void usb_msd_command_complete(SCSIRequest *req, size_t = resid) =20 g_assert(s->req); /* The CBW is what starts the SCSI request */ - g_assert(s->mode !=3D USB_MSDM_CBW); + g_assert(s->cbw_state !=3D USB_MSD_CBW_NONE); =20 s->csw.sig =3D cpu_to_le32(0x53425355); s->csw.tag =3D cpu_to_le32(req->tag); @@ -312,7 +312,8 @@ void usb_msd_command_complete(SCSIRequest *req, size_t = resid) s->req =3D NULL; =20 if (p) { - g_assert(s->mode =3D=3D USB_MSDM_DATAIN || s->mode =3D=3D USB_MSDM= _DATAOUT); + g_assert(s->cbw_state =3D=3D USB_MSD_CBW_DATAIN || + s->cbw_state =3D=3D USB_MSD_CBW_DATAOUT); if (s->data_len) { int len =3D (p->iov.size - p->actual_length); usb_packet_skip(p, len); @@ -322,19 +323,19 @@ void usb_msd_command_complete(SCSIRequest *req, size_= t resid) s->data_len -=3D len; } if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; + s->cbw_state =3D USB_MSD_CBW_CSW; } /* USB_RET_SUCCESS status clears previous ASYNC status */ usb_msd_data_packet_complete(s, USB_RET_SUCCESS); } else if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; + s->cbw_state =3D USB_MSD_CBW_CSW; } =20 - if (s->mode =3D=3D USB_MSDM_CSW) { + if (s->cbw_state =3D=3D USB_MSD_CBW_CSW) { p =3D s->csw_in_packet; if (p) { usb_msd_send_status(s, p); - s->mode =3D USB_MSDM_CBW; + s->cbw_state =3D USB_MSD_CBW_NONE; /* USB_RET_SUCCESS status clears previous ASYNC status */ usb_msd_csw_packet_complete(s, USB_RET_SUCCESS); } @@ -377,7 +378,7 @@ void usb_msd_handle_reset(USBDevice *dev) } =20 memset(&s->csw, 0, sizeof(s->csw)); - s->mode =3D USB_MSDM_CBW; + s->cbw_state =3D USB_MSD_CBW_NONE; =20 s->needs_reset =3D false; } @@ -478,8 +479,8 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) SCSIDevice *scsi_dev; int len; =20 - switch (s->mode) { - case USB_MSDM_CBW: + switch (s->cbw_state) { + case USB_MSD_CBW_NONE: if (!try_get_valid_cbw(p, &cbw)) { goto fail; } @@ -492,11 +493,11 @@ static void usb_msd_handle_data_out(USBDevice *dev, U= SBPacket *p) tag =3D le32_to_cpu(cbw.tag); s->data_len =3D le32_to_cpu(cbw.data_len); if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; + s->cbw_state =3D USB_MSD_CBW_CSW; } else if (cbw.flags & 0x80) { - s->mode =3D USB_MSDM_DATAIN; + s->cbw_state =3D USB_MSD_CBW_DATAIN; } else { - s->mode =3D USB_MSDM_DATAOUT; + s->cbw_state =3D USB_MSD_CBW_DATAOUT; } trace_usb_msd_cmd_submit(cbw.lun, tag, cbw.flags, cbw.cmd_len, s->data_len); @@ -513,7 +514,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) } break; =20 - case USB_MSDM_DATAOUT: + case USB_MSD_CBW_DATAOUT: trace_usb_msd_data_out(p->iov.size, s->data_len); if (p->iov.size > s->data_len) { goto fail; @@ -531,7 +532,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) } s->data_len -=3D len; if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; + s->cbw_state =3D USB_MSD_CBW_CSW; } } } @@ -556,8 +557,8 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) MSDState *s =3D (MSDState *)dev; int len; =20 - switch (s->mode) { - case USB_MSDM_DATAOUT: + switch (s->cbw_state) { + case USB_MSD_CBW_DATAOUT: if (!check_valid_csw(p)) { goto fail; } @@ -573,7 +574,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) p->status =3D USB_RET_ASYNC; break; =20 - case USB_MSDM_CSW: + case USB_MSD_CBW_CSW: if (!check_valid_csw(p)) { goto fail; } @@ -585,11 +586,11 @@ static void usb_msd_handle_data_in(USBDevice *dev, US= BPacket *p) p->status =3D USB_RET_ASYNC; } else { usb_msd_send_status(s, p); - s->mode =3D USB_MSDM_CBW; + s->cbw_state =3D USB_MSD_CBW_NONE; } break; =20 - case USB_MSDM_DATAIN: + case USB_MSD_CBW_DATAIN: trace_usb_msd_data_in(p->iov.size, s->data_len, s->scsi_len); if (s->scsi_len) { usb_msd_copy_data(s, p); @@ -603,11 +604,12 @@ static void usb_msd_handle_data_in(USBDevice *dev, US= BPacket *p) } s->data_len -=3D len; if (s->data_len =3D=3D 0) { - s->mode =3D USB_MSDM_CSW; + s->cbw_state =3D USB_MSD_CBW_CSW; } } } - if (p->actual_length < p->iov.size && s->mode =3D=3D USB_MSDM_DATA= IN) { + if (p->actual_length < p->iov.size && + s->cbw_state =3D=3D USB_MSD_CBW_DATAIN) { trace_usb_msd_packet_async(); s->data_packet =3D p; p->status =3D USB_RET_ASYNC; @@ -672,7 +674,7 @@ static const VMStateDescription vmstate_usb_msd =3D { .minimum_version_id =3D 1, .fields =3D (const VMStateField[]) { VMSTATE_USB_DEVICE(dev, MSDState), - VMSTATE_UINT32(mode, MSDState), + VMSTATE_UINT32(cbw_state, MSDState), VMSTATE_UINT32(scsi_len, MSDState), VMSTATE_UINT32(scsi_off, MSDState), VMSTATE_UINT32(data_len, MSDState), --=20 2.45.2 From nobody Sun Apr 27 02:50:56 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1733994918; cv=none; d=zohomail.com; s=zohoarc; b=b4bFf2Zh9KIrbFG0hWha+8IatRWsLVU6P88mePTUZPyyR1As08s4jSFUKhroRawJh6Dg0nzDFD8lzfKI5ud1iKZIXMQBV0vDIXCRGhPx4ieRtwql/+Syqz59SnX0qeDju0kyoE9bNQOXYT7m0GLZJp6+NNuRhHlMk7H0d9gUcfE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733994918; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=tF0Ruicy6t+7yxWOo7B7ymUvW6MQmJKs109VjhgmsiI=; b=MevNc0XMVyeiabVCY+yTHbWzKNDNoX3N1u4A1sFRaMgYWZJWO3IqB9CZSOJOKo5iq/EflbDRSvRFgz4lZoZPDoVSVhBcsvVpIOT42exvef/oi1g0XapQ6xUQD6mcdcXzRCG/NyjjWBnTNBQpo6hynLPv2ax/dSFR/sEjnpuHdi0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733994917895479.33425436343657; Thu, 12 Dec 2024 01:15:17 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLfGy-0004Kk-MV; Thu, 12 Dec 2024 04:14:16 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGu-0004IV-11 for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:14:14 -0500 Received: from mail-pg1-x532.google.com ([2607:f8b0:4864:20::532]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGs-0000R6-7e for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:14:11 -0500 Received: by mail-pg1-x532.google.com with SMTP id 41be03b00d2f7-7fd49d85f82so342207a12.3 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 01:14:09 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142d92e2csm787021a91.9.2024.12.12.01.14.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 01:14:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733994848; x=1734599648; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=tF0Ruicy6t+7yxWOo7B7ymUvW6MQmJKs109VjhgmsiI=; b=N92xlc8lxE14M+ayc1hHdCAc6XndBhacamMScETlsYCZfTGvPbI8aUX81VadUYPBF4 goS3YDg6p67twZGImT21qcTG74lUkzNcogLsQf2tqIghWS3xyt7HqLiVjXw9cqmGonWH sTK/yRz9aydrsXahN6frNL85He21ckzOdkhSqk2OOM8h4H5Gj2T9mZzqDXJHAUB9rh/C PO+LRGf9J4JDtMZyF1vLOC8nnQPmd+oHjNU/XY8Tl9McdpLRor1/wl/uQO9YPY/uUGXO W9aKLmLSwGzVxFEO4zVDlx5lCP/hSnSHU61i33TbxSm3E5wswrDpW6EeJvHp+TIH0jTp ShqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733994848; x=1734599648; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tF0Ruicy6t+7yxWOo7B7ymUvW6MQmJKs109VjhgmsiI=; b=u4U98PPdooDFQD+4BqswSmrpBDiR6fTriO49pCXDaG8uXBcr7PLsTkx0dkpE1Srpon +ulmjGWbJWun5/U4e3uXUngSGumYhZ/m/ZXSbJ23nL/DzV2ZiqgPHsW2dGxWv/5zRi6Z Jxwx/GN2eV/stjdHxAbQlJJbxQqFswO74DPe1FtxxVk5ur+IKpJkN3MwVY61UQqv9geS amiGU4E6hCQCliHDq0CUp6Ik38SHqFpSHuWyj048uOEJ3AvrRE0d2YOqDOhWjenrASmi jRa6IMRVZZ03Rwelxm1mQjFYmrEdWnLE+b5Ahby4USfKdbp6NyIACtL5PRRUSIk5MwFj 9Xxg== X-Gm-Message-State: AOJu0YwVx2LhTlhz6C4e/fF+N+Qi5NCZZVLTbUIMVINDsvqFb8hR9Rnv Urex2RVFF+sGeyQ1VxTGU8Z88tJq3QTIgzGmWQbUxxi+YymK5LTJGcsxtw== X-Gm-Gg: ASbGncu4q4XLPrGCXE5NgB6OpSlM883Rllq67eeJg3Upae3kN6r6mJwYl2WrSWMGORY lzbaHo6wHsNiEYsMzlkNK8zSXI5I4TcRV0iDaar6UF7U0vykYpHmqYPMynUSJMXf0swCknlCy7e UHm+qP0wUamKtoT/rCWxjwEVvVSd1fVeuztTeImkrsvXSi35bG1u+y8BJMOC0O2p+XOadzh17qy 8B5jJ1qURQlEb+uijMdTopizNjPI87qRdM0J+0mhTo/6lLdg7ZF8sUgqDo= X-Google-Smtp-Source: AGHT+IFkq1YqooqeTkMOPvAahcbQq8356HxnuTmwNCMg9oc1tm93g8RRSI7RsPbEIYEup+RtlVDYrg== X-Received: by 2002:a17:90b:3ecd:b0:2ea:7cd5:4ad6 with SMTP id 98e67ed59e1d1-2f1280e0a7fmr9149770a91.32.1733994848453; Thu, 12 Dec 2024 01:14:08 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, Gerd Hoffmann <kraxel@redhat.com>, Kevin Wolf <kwolf@redhat.com> Subject: [PATCH 10/11] usb/msd: Permit a DATA-IN or CSW packet before CBW packet Date: Thu, 12 Dec 2024 19:13:21 +1000 Message-ID: <20241212091323.1442995-11-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212091323.1442995-1-npiggin@gmail.com> References: <20241212091323.1442995-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::532; envelope-from=npiggin@gmail.com; helo=mail-pg1-x532.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=subscribe> Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1733994920140116600 Content-Type: text/plain; charset="utf-8" The USB MSD protocol has 3 packets that make up a command, and only one command may be active at any time. - CBW to start a command (that contains a SCSI request). - DATA (IN or OUT) to request data transfer between host and SCSI layer. - CSW to return status and complete the command. DATA is omitted if the request has no data. The QEMU MSD model requires these packets to arrive in this order, CBW, DATA, CSW. This is the way the state machine is generally described in the MSD spec, and this must be how most USB stacks operate. Except AIX. Universal Serial Bus Mass Storage Class Bulk-Only Transport 1.0 contains one word in one sentence that permits the relaxed ordering: 3.3 Host/Device Packet Transfer Order The host shall send the CBW before the associated Data-Out, and the device shall send Data-In after the associated CBW and before the associated CSW. The host may request Data-In or CSW before sending the associated CBW. Complicating matters, DATA-IN and CSW are both input packets that arrive in the same manner, so before a CBW it is impossible to determine if an IN packet is for data or CSW. So permit "unusually-ordered" packets by tracking them as an "unknown" packet until the CBW arrives, then they are categorized into a DATA or CSW packet. It is not clear whether the spec permits multiple such packets before the CBW. This implementation permits only one, which seems to be enough for AIX. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- include/hw/usb/msd.h | 1 + hw/usb/dev-storage.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/include/hw/usb/msd.h b/include/hw/usb/msd.h index c109544f632..2ed3664b31d 100644 --- a/include/hw/usb/msd.h +++ b/include/hw/usb/msd.h @@ -37,6 +37,7 @@ struct MSDState { /* For async completion. */ USBPacket *data_packet; USBPacket *csw_in_packet; + USBPacket *unknown_in_packet; =20 /* usb-storage only */ BlockConf conf; diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 801a5d0c680..bc7e007e4fa 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -436,6 +436,8 @@ static void usb_msd_cancel_io(USBDevice *dev, USBPacket= *p) } } else if (p =3D=3D s->csw_in_packet) { s->csw_in_packet =3D NULL; + } else if (p =3D=3D s->unknown_in_packet) { + s->unknown_in_packet =3D NULL; } else { g_assert_not_reached(); } @@ -499,6 +501,19 @@ static void usb_msd_handle_data_out(USBDevice *dev, US= BPacket *p) } else { s->cbw_state =3D USB_MSD_CBW_DATAOUT; } + if (s->unknown_in_packet) { + if (s->cbw_state =3D=3D USB_MSD_CBW_DATAIN) { + /* Must be a DATAIN packet */ + s->data_packet =3D s->unknown_in_packet; + } else { + /* Must be the CSW packet */ + if (!check_valid_csw(s->unknown_in_packet)) { + goto fail; + } + s->csw_in_packet =3D s->unknown_in_packet; + } + s->unknown_in_packet =3D NULL; + } trace_usb_msd_cmd_submit(cbw.lun, tag, cbw.flags, cbw.cmd_len, s->data_len); assert(le32_to_cpu(s->csw.residue) =3D=3D 0); @@ -516,6 +531,11 @@ static void usb_msd_handle_data_out(USBDevice *dev, US= BPacket *p) =20 case USB_MSD_CBW_DATAOUT: trace_usb_msd_data_out(p->iov.size, s->data_len); + if (s->unknown_in_packet) { + error_report("usb-msd: unknown_in_packet in DATAOUT state"); + goto fail; + } + if (p->iov.size > s->data_len) { goto fail; } @@ -558,7 +578,22 @@ static void usb_msd_handle_data_in(USBDevice *dev, USB= Packet *p) int len; =20 switch (s->cbw_state) { + case USB_MSD_CBW_NONE: + if (s->unknown_in_packet) { + qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: second IN packet was" + "received before CBW\n"); + goto fail; + } + trace_usb_msd_packet_async(); + s->unknown_in_packet =3D p; + p->status =3D USB_RET_ASYNC; + break; + case USB_MSD_CBW_DATAOUT: + if (s->unknown_in_packet) { + error_report("usb-msd: unknown_in_packet in DATAOUT state"); + goto fail; + } if (!check_valid_csw(p)) { goto fail; } @@ -575,6 +610,10 @@ static void usb_msd_handle_data_in(USBDevice *dev, USB= Packet *p) break; =20 case USB_MSD_CBW_CSW: + if (s->unknown_in_packet) { + error_report("usb-msd: unknown_in_packet in DATAOUT state"); + goto fail; + } if (!check_valid_csw(p)) { goto fail; } @@ -592,6 +631,10 @@ static void usb_msd_handle_data_in(USBDevice *dev, USB= Packet *p) =20 case USB_MSD_CBW_DATAIN: trace_usb_msd_data_in(p->iov.size, s->data_len, s->scsi_len); + if (s->unknown_in_packet) { + error_report("usb-msd: unknown_in_packet in DATAIN state"); + goto fail; + } if (s->scsi_len) { usb_msd_copy_data(s, p); } --=20 2.45.2 From nobody Sun Apr 27 02:50:56 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1733994902; cv=none; d=zohomail.com; s=zohoarc; b=EVm79yHouGko7c0MAKKRlUGO3f2FH+DnvCO8fCTaFTS9Xe5m1j60fbgrZTxvxPnWV3fiQ8xJhStAhkr0xAMGsgtkD0EWvTywGCIlxRTgmfCRXeMUZNeAusHlIkCjF0SIs27Bu4wcDPFIwog5ev/1C9/zDo1vK2RjgX4jijonbgo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733994902; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=37LVw+vHgUcPiUejiyK7XkngH4mx+WuVuLhZ2YEEAj0=; b=PXBlCE0jqHt6cZrqCIge2hZS5+QLBtUzYdDm/vC93wEe6bQZx2u3xhTX5qlOQei93g4Rmj5Cs1OavASbyLw9cXP0nO+pa5ZzC9ty4MrFfegY66joWgvCtcw6eM93Mxn8Yrrg5IEp4EsPp1lVbyRsHRkbcAOrR8/8OrtkUksiYp4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from=<npiggin@gmail.com> (p=none dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733994902474128.8893033515293; Thu, 12 Dec 2024 01:15:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1tLfH1-0004V9-M4; Thu, 12 Dec 2024 04:14:19 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGy-0004Op-W5 for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:14:17 -0500 Received: from mail-pj1-x102f.google.com ([2607:f8b0:4864:20::102f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <npiggin@gmail.com>) id 1tLfGv-0000RV-SK for qemu-devel@nongnu.org; Thu, 12 Dec 2024 04:14:16 -0500 Received: by mail-pj1-x102f.google.com with SMTP id 98e67ed59e1d1-2ee8e8e29f6so287479a91.0 for <qemu-devel@nongnu.org>; Thu, 12 Dec 2024 01:14:13 -0800 (PST) Received: from wheely.local0.net ([1.146.48.169]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142d92e2csm787021a91.9.2024.12.12.01.14.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Dec 2024 01:14:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733994852; x=1734599652; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=37LVw+vHgUcPiUejiyK7XkngH4mx+WuVuLhZ2YEEAj0=; b=YWWcVzT4ZyCyMSVVZ5DUZkz88sDx0IHbl+JvaIn/pt1zNB0X1AOAyaoyZ//nhT0g9V xusyvz1ncKuSzbNZ89tH0w3f/0bLiC/plRlh5ZmZdcqrBBlFJA0vaqb44TilRm0xmzfD pL4p0EDHVgPv0iJl869KOpRrsBPjdzWJ28v6oCaSQm2O16C/0PZPDYuDq56qIq/yG/y8 tF3SaYF0ZJfMiZFxXF5wUII3QzsxU5PF8Umamb/rGUS0lxERRr0exGfYw+vq6Mc51xIE 9PDF7oBmUPWOt2CAGx7C4z93b2eY1s+UmF6BeWwgoXBMUuGzLAUnv+zM0o65bgUgRcvs Ztfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733994852; x=1734599652; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=37LVw+vHgUcPiUejiyK7XkngH4mx+WuVuLhZ2YEEAj0=; b=jpE8e22n5ambLFeLK35J9eDUBV7GJIoQAJ8QBj1t7qJiabOsFR8ENUIK3MD5HJUljn Gq71H4b0Cg4g4iHuhOegGk+ovKYOfzvd0IVkPXoHb+WqLBkkJj40UOz3m+1fl2A4uAJZ skUpsO19B7d6yCCGt11vmwZxz0UIdP3cRLveVS46DmgkKzQmMTMaH9u6T6khI/CUl6IU aYoNXLFSSn87+jp7PhR32Gbejvj3aRI1rgLhivwSnwCVLAL0WfWiAMKIwijzEe6VteTd jyv/2tqGx07DGbivsdcJMQ1GfT6LkxjFwdJci+EqNZeyecz73oiCFHswQmKAiHIBo/7x XSUQ== X-Gm-Message-State: AOJu0Yyd3t4J3D1wG1FORHdr0jVXj61/gBLpUzKEadlMn4usiL4sXKfM SekwBX4gp5OPKRTmm/wyzaxlgDmYk6atb6G4JrnfS0D9k2ZPhPrNmXiizg== X-Gm-Gg: ASbGncuISNJUGKGEFMic8ivq5nab/ohGbMC6T2RwGjBgBycDrzIRb5LRx2tOfUzr7hn HPFibUNZZ1IXwI1wqCtxg7vNKpNdcc6PFip95tYj7eBwdsOEbRjH9PWKZWYbWonuSYT051PG050 TZ/6xudCL61i9H9DgzojLKmuiBCA+sbv45nFsmXRzDb+jYPP6hSCSiKG8Q1SJi8LtDE0bGAQv7C knIQjfqiceX+dXSb6BYt8LY6lrgFwdN79wa/71xdWTRgMl6pThKaEcy99o= X-Google-Smtp-Source: AGHT+IGjN3w5jWJrH09oy7RQQpY3nxz+dMZlq6+lGB8JWHV+WsBDcK8bX/s3oonWZDE8C/0Kpc0DDg== X-Received: by 2002:a17:90b:3c0c:b0:2ea:63e8:f24 with SMTP id 98e67ed59e1d1-2f128044c21mr8536957a91.36.1733994851803; Thu, 12 Dec 2024 01:14:11 -0800 (PST) From: Nicholas Piggin <npiggin@gmail.com> To: qemu-devel@nongnu.org Cc: Nicholas Piggin <npiggin@gmail.com>, Gerd Hoffmann <kraxel@redhat.com>, Kevin Wolf <kwolf@redhat.com> Subject: [PATCH 11/11] usb/msd: Add more tracing Date: Thu, 12 Dec 2024 19:13:22 +1000 Message-ID: <20241212091323.1442995-12-npiggin@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241212091323.1442995-1-npiggin@gmail.com> References: <20241212091323.1442995-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::102f; envelope-from=npiggin@gmail.com; helo=mail-pj1-x102f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=subscribe> Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1733994904182116600 Content-Type: text/plain; charset="utf-8" Add tracing for more received packet types, cbw_state changes, and some more SCSI callbacks. These were useful in debugging relaxed packet ordering support. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- hw/usb/dev-storage.c | 23 +++++++++++++++++++++-- hw/usb/trace-events | 9 ++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index bc7e007e4fa..ea3f885a10c 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -187,7 +187,7 @@ static void usb_msd_data_packet_complete(MSDState *s, i= nt status) * because another request may be issued before usb_packet_complete * returns. */ - trace_usb_msd_packet_complete(); + trace_usb_msd_data_packet_complete(); s->data_packet =3D NULL; p->status =3D status; usb_packet_complete(&s->dev, p); @@ -202,7 +202,7 @@ static void usb_msd_csw_packet_complete(MSDState *s, in= t status) * because another request may be issued before usb_packet_complete * returns. */ - trace_usb_msd_packet_complete(); + trace_usb_msd_csw_packet_complete(); s->csw_in_packet =3D NULL; p->status =3D status; usb_packet_complete(&s->dev, p); @@ -231,7 +231,11 @@ static void usb_msd_fatal_error(MSDState *s) static void usb_msd_copy_data(MSDState *s, USBPacket *p) { uint32_t len; + len =3D p->iov.size - p->actual_length; + + trace_usb_msd_copy_data(s->req->tag, len); + if (len > s->scsi_len) len =3D s->scsi_len; usb_packet_copy(p, scsi_req_get_buf(s->req) + s->scsi_off, len); @@ -264,6 +268,8 @@ void usb_msd_transfer_data(SCSIRequest *req, uint32_t l= en) MSDState *s =3D DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); USBPacket *p =3D s->data_packet; =20 + trace_usb_msd_transfer_data(req->tag, len); + if (s->cbw_state =3D=3D USB_MSD_CBW_DATAIN) { if (req->cmd.mode =3D=3D SCSI_XFER_TO_DEV) { usb_msd_fatal_error(s); @@ -324,11 +330,13 @@ void usb_msd_command_complete(SCSIRequest *req, size_= t resid) } if (s->data_len =3D=3D 0) { s->cbw_state =3D USB_MSD_CBW_CSW; + trace_usb_msd_cbw_state(s->cbw_state); } /* USB_RET_SUCCESS status clears previous ASYNC status */ usb_msd_data_packet_complete(s, USB_RET_SUCCESS); } else if (s->data_len =3D=3D 0) { s->cbw_state =3D USB_MSD_CBW_CSW; + trace_usb_msd_cbw_state(s->cbw_state); } =20 if (s->cbw_state =3D=3D USB_MSD_CBW_CSW) { @@ -336,6 +344,7 @@ void usb_msd_command_complete(SCSIRequest *req, size_t = resid) if (p) { usb_msd_send_status(s, p); s->cbw_state =3D USB_MSD_CBW_NONE; + trace_usb_msd_cbw_state(s->cbw_state); /* USB_RET_SUCCESS status clears previous ASYNC status */ usb_msd_csw_packet_complete(s, USB_RET_SUCCESS); } @@ -379,6 +388,7 @@ void usb_msd_handle_reset(USBDevice *dev) =20 memset(&s->csw, 0, sizeof(s->csw)); s->cbw_state =3D USB_MSD_CBW_NONE; + trace_usb_msd_cbw_state(s->cbw_state); =20 s->needs_reset =3D false; } @@ -429,6 +439,8 @@ static void usb_msd_cancel_io(USBDevice *dev, USBPacket= *p) { MSDState *s =3D USB_STORAGE_DEV(dev); =20 + trace_usb_msd_cancel_io(); + if (p =3D=3D s->data_packet) { s->data_packet =3D NULL; if (s->req) { @@ -516,6 +528,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) } trace_usb_msd_cmd_submit(cbw.lun, tag, cbw.flags, cbw.cmd_len, s->data_len); + trace_usb_msd_cbw_state(s->cbw_state); assert(le32_to_cpu(s->csw.residue) =3D=3D 0); assert(s->scsi_len =3D=3D 0); s->req =3D scsi_req_new(scsi_dev, tag, cbw.lun, @@ -553,6 +566,7 @@ static void usb_msd_handle_data_out(USBDevice *dev, USB= Packet *p) s->data_len -=3D len; if (s->data_len =3D=3D 0) { s->cbw_state =3D USB_MSD_CBW_CSW; + trace_usb_msd_cbw_state(s->cbw_state); } } } @@ -579,6 +593,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) =20 switch (s->cbw_state) { case USB_MSD_CBW_NONE: + trace_usb_msd_unknown_in(p->iov.size); if (s->unknown_in_packet) { qemu_log_mask(LOG_GUEST_ERROR, "usb-msd: second IN packet was" "received before CBW\n"); @@ -590,6 +605,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) break; =20 case USB_MSD_CBW_DATAOUT: + trace_usb_msd_csw_in(); if (s->unknown_in_packet) { error_report("usb-msd: unknown_in_packet in DATAOUT state"); goto fail; @@ -610,6 +626,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) break; =20 case USB_MSD_CBW_CSW: + trace_usb_msd_csw_in(); if (s->unknown_in_packet) { error_report("usb-msd: unknown_in_packet in DATAOUT state"); goto fail; @@ -626,6 +643,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) } else { usb_msd_send_status(s, p); s->cbw_state =3D USB_MSD_CBW_NONE; + trace_usb_msd_cbw_state(s->cbw_state); } break; =20 @@ -648,6 +666,7 @@ static void usb_msd_handle_data_in(USBDevice *dev, USBP= acket *p) s->data_len -=3D len; if (s->data_len =3D=3D 0) { s->cbw_state =3D USB_MSD_CBW_CSW; + trace_usb_msd_cbw_state(s->cbw_state); } } } diff --git a/hw/usb/trace-events b/hw/usb/trace-events index dd04f14add1..688f7ba0b3d 100644 --- a/hw/usb/trace-events +++ b/hw/usb/trace-events @@ -264,12 +264,19 @@ usb_msd_maxlun(unsigned maxlun) "%d" usb_msd_send_status(unsigned status, unsigned tag, size_t size) "status %d= , tag 0x%x, len %zd" usb_msd_data_in(unsigned packet, unsigned remaining, unsigned total) "%d/%= d (scsi %d)" usb_msd_data_out(unsigned packet, unsigned remaining) "%d/%d" +usb_msd_unknown_in(unsigned packet) "%d" +usb_msd_csw_in(void) "" usb_msd_packet_async(void) "" -usb_msd_packet_complete(void) "" +usb_msd_data_packet_complete(void) "" +usb_msd_csw_packet_complete(void) "" usb_msd_cmd_submit(unsigned lun, unsigned tag, unsigned flags, unsigned le= n, unsigned data_len) "lun %u, tag 0x%x, flags 0x%08x, len %d, data-len %d" usb_msd_cmd_complete(unsigned status, unsigned tag) "status %d, tag 0x%x" +usb_msd_copy_data(unsigned tag, unsigned len) "tag 0x%x len %d" +usb_msd_transfer_data(unsigned tag, unsigned len) "tag 0x%x len %d" usb_msd_cmd_cancel(unsigned tag) "tag 0x%x" +usb_msd_cancel_io(void) "" usb_msd_fatal_error(void) "" +usb_msd_cbw_state(unsigned cbw_state) "cbw-state %d" =20 # dev-uas.c usb_uas_reset(int addr) "dev %d" --=20 2.45.2