From nobody Mon Sep 28 02:07:45 2026 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=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785399335; cv=none; d=zohomail.com; s=zohoarc; b=kKe5F84kIkcPzf63HqNUKKXQzOkASZHldquMRdoYT8e3W/5ZPBrZsGcbsJRfgUiIhXra4qj30WmfMR6CzKNKGK1zSpS3S215lNC9dOU6P16cYgmAywqD889SpXNvGLGnx5Q4s5TX9wSEFfe2o4pxoA2r9kLhluHz6IH2qgfzV2g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785399335; 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=wXiU7ti5qahm2uu10xmoUW4yWwkxyZQGn0PKpqZCris=; b=hjcoqOtPLVTvjR4SpFUlkNHeJD0U3Q9qTX+V1rzJPDX1zgtZazV3LM14rPP5BfORKRH70wa9vCdJnun3YgQfKUpukqurP/wWAkyFXICml2x5PPo/T8+QVsWv3p6/cScb3u8C1RjKrYUycqlUegTZAHXqfJbpvsmBo1BE6vwaXlE= 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= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785399335620367.0483480046323; Thu, 30 Jul 2026 01:15:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wpLta-00074o-PS; Thu, 30 Jul 2026 04:13:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wpLtY-00073j-7f for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:36 -0400 Received: from mail-ej1-x62b.google.com ([2a00:1450:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wpLtW-00017e-DJ for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:35 -0400 Received: by mail-ej1-x62b.google.com with SMTP id a640c23a62f3a-c15d3cd51b2so233682066b.3 for ; Thu, 30 Jul 2026 01:13:30 -0700 (PDT) Received: from athena ([2a06:5b06:b600:300:871f:1fb4:356b:23d9]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c1fa857c8e1sm38373466b.19.2026.07.30.01.13.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 01:13:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785399209; x=1786004009; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=wXiU7ti5qahm2uu10xmoUW4yWwkxyZQGn0PKpqZCris=; b=suBYjEzTXNT3xp0FjUL0or6LynSQZCNFzpAWMZt3o9suFrKAokzfgfWnthcFTj8Teo bj8xwMRT31v3nsGVxWk0Tg3bVG5lYxLqaULjbIAANNq4GNsOILEsTT5WPkTVi02tMulY El2+HMG11cp8jkS2jF196WyfCainCGq/dNNH3gcPxDmrnT6kHp17rbc+ztNCne2TUyfA gh/OFIaNeBZIeiH/i7CE1FyEgyvtu8Qi7Wp2G2LGJLTaZOxUVdTZG6ywIKHt/qtkKVbX TDwICCbmGVI/vbCIXkFCkmOYHnwGGKZWi2GeqBhqSlqNiaNxGfEkc8DGHyzWVSdga8+J +Xyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785399209; x=1786004009; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=wXiU7ti5qahm2uu10xmoUW4yWwkxyZQGn0PKpqZCris=; b=OpH2ms2jj2L7KKdOlcAnLBap4nZoKD6nH4HA2aEq8jLiCopd2vnQn+ut4WXf82bVfk kb4PcXzdnnFY0vmmGS2Gwu9kaeuKfu0HryBAoBoe1rlqaR5W0JKJu0/NDGV+BzrLiH+0 ce0E8mPcdGySynC8A8vWCEYydQMAFu9/id61XxCE3kI8iPOh/anFrVtS5VVykHB8ZfnQ KNgm57HjIY08sr9pO+VcveegI2y1aKguijeWXnUVbKqdZ5tFRXQz/QqrQy/ArfcdtzQJ lOSAtEkS6OJThI82Po/Qn9Wrzu9Olf02K9bir207l/By8kJYADXZ/kG8nMorl2/LMz1Q jhKA== X-Forwarded-Encrypted: i=1; AHgh+RobCPzB+tmCZRqaPxG1NHTMtGy8T/grOYlQnpxUDF/5gpIt0rep93cVh+3LxRErvixcRnJoN9c2XfR3@nongnu.org X-Gm-Message-State: AOJu0YxFPSgtZG35OBxVXrWFWencO736ZzdW0KIH1fkPjHmQI7ZAVS81 Fye3ZEUirPd3ayMQM25ibPehbz7POCP1++VmfxKg0Q/K018D5YqV2KKYqmJ3L0zo7C4= X-Gm-Gg: AR+sD11nPXjnUEZWL7gYwSIfbM9sg3Nsmx9CEAjaOaM7RdqdxI6cyFbcYBUIhqDu03+ OixN+fmnTf85VR/urw8o+r2i0KzxEsLbIpNLGPAyYmzc9OVh0w9RotU2yy95GMrQBE9xepEukYr 7OSXPHqu6V1g+N3FH6G5QqN54nt+SP5tvghIjwATUaUXpeivec9zlcjznHO00lsabqLHK+Amfsd yInh7IywIX7tX9QGO765s8S3IyU0rIqwev0Y9XFnVmjaCRa3poKRm5LIX6iwfXUyELolkNvm5uG jWkcMyQUNB07LvWboJqR9qN9S/eGFTuXnjqLpvGm6EuyP/dgk9jh0DWgiT3j5ZurfwQVUImmD2B 8vBk3JRN4GV5tmyCzBHUNTqrf3CkKNmu1TEVcEkKaSuDtjt/T1SEXAfPw/YHmdyjYI+RkzSqV2Y FnL79IiVUjj5RkFh8JSVNB9V60Pu6LCjFCtVhGyND+14NFeRdB7w== X-Received: by 2002:a17:907:97d4:b0:c15:edb7:a74d with SMTP id a640c23a62f3a-c1fa53ed69cmr83867366b.12.1785399209062; Thu, 30 Jul 2026 01:13:29 -0700 (PDT) From: "Denis V. Lunev" To: qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: den@openvz.org, Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 1/8] MAINTAINERS: add myself to IDE maintainers Date: Thu, 30 Jul 2026 10:13:17 +0200 Message-ID: <20260730081325.1816193-2-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260730081325.1816193-1-den@openvz.org> References: <20260730081325.1816193-1-den@openvz.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::62b; envelope-from=den@openvz.org; helo=mail-ej1-x62b.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, 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 development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 @openvz.org) X-ZM-MESSAGEID: 1785399337338158500 Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- MAINTAINERS | 1 + 1 file changed, 1 insertion(+) diff --git a/MAINTAINERS b/MAINTAINERS index 902db77218..4628793dde 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2160,6 +2160,7 @@ F: docs/specs/edu.rst =20 IDE M: John Snow +M: Denis V. Lunev L: qemu-block@nongnu.org S: Odd Fixes F: include/hw/ide/ --=20 2.53.0 From nobody Mon Sep 28 02:07:45 2026 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=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785399323; cv=none; d=zohomail.com; s=zohoarc; b=Nw6NDiAWrRpkHLHw47udsxeNuA0lT7gj4LmkpyCOxJcZvoujgnwzmY3HFzzvYoxHfXLT95ev3DC+QJ9wc15IyK4nmjdR5gTOrMB1AEgF2MSle9Qa8xaEAESFfIW8phcvHd0jm9dP+nX/EAN6f7JHpkH5oYtOQKL+pDSHhk1TJAg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785399323; 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=yQ95Hp3xG7blxC3k2gZtENUvUyl9KF6zkriWUqkC8Bg=; b=EIbbc6xVIS06nWngYLCBC0jXU1ovOuEA3vyf5nk5zGsix3L/KeJzzQIrGtZG+XpG8o7NQSXnRy0rf412Ellx4xCAsEzSLnqGcRPXpWXRnLKmwC33iQiH3fWorOnwxUyDzEGyC/k664hCP8M9EhyJTysD4R+W9enMFxQJqAP9CQg= 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= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785399323624973.4317199770124; Thu, 30 Jul 2026 01:15:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wpLtc-00076T-MY; Thu, 30 Jul 2026 04:13:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wpLtZ-00073z-L1 for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:38 -0400 Received: from mail-ej1-x632.google.com ([2a00:1450:4864:20::632]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wpLtW-00017n-DF for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:37 -0400 Received: by mail-ej1-x632.google.com with SMTP id a640c23a62f3a-c1600d040e4so70843266b.1 for ; Thu, 30 Jul 2026 01:13:31 -0700 (PDT) Received: from athena ([2a06:5b06:b600:300:871f:1fb4:356b:23d9]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c1fa857c8e1sm38373466b.19.2026.07.30.01.13.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 01:13:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785399210; x=1786004010; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=yQ95Hp3xG7blxC3k2gZtENUvUyl9KF6zkriWUqkC8Bg=; b=bSZ1ARtTyv0qcN3w3OwNgNaK97Vbf5EmmV6vET4oqfHpPIzUUCtU7dHGBrg1AYJRn3 VxiZeiunoF83YYdmiwxqXmuYX0ZrsqdEzyCymiRt5zACffPlChrCictV/oMUlLz+Uup2 n5mm8UjV0yE3m1vSsFZmfKNdXgvxcGXt9Y8JKQ4RUaap2SRB3XiZ40+MkzJINHX0/tYJ lX+ovNR1vhEdL3uL6vK85nv+voCU7jnwWnPlGQ8xOYa7aRR5eQmuFmAfQAq2Ezo30UC2 STf2hByLAJjJQ7oqQuxuW5k4TILrIt1kyk/zAxCGoStIIFj6899FDmOvFroulh/XYMOY Q2Yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785399210; x=1786004010; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=yQ95Hp3xG7blxC3k2gZtENUvUyl9KF6zkriWUqkC8Bg=; b=PbaFPHszqeRFOFXoG+pt8/diAOo7f/yGEBOiJ/ubNlT4WbO1F8i/7vpt98TFQDqlyr 2dDyd7Sn6KqHzFhvySFihP1kXErx0HZ6sVU83OgMDNtGsIMYWpMu1AxjePNRtXEpRO5R vzZyQEmWk2ixL8VYLPxPDDQB6FmnQAt4Mgbu6TNWq6KNhVf2Jut0zpcsIaxLpO39BeIw nX12Emwjm5NXw4eT9ncAZFUMN9GrlPmfXlWDnJOYPtLPNgHtx4tMJe0ChphMusqbVuwX HBBAt6bCGIS34ijMJhbzGviBwBFkV0Fy6bxy9qlFIUilm93XodkXrX/dGN8ebZD9qbxV CX1Q== X-Forwarded-Encrypted: i=1; AHgh+Rp+X4um+Mou179IGGk54hMPM5ycEzeHcR3dAsiG01n3rhbdCTq0sE4DLmU07EbwDfAiopSOIJ8Gi2pE@nongnu.org X-Gm-Message-State: AOJu0YzaRMs5FVpzGdmVx/RlwtxmTmzN72qzTqDWNvdG9iQGZ2YSbUta xNkzEYkw5vkCSQv2fdd9PXsLXpWzFP0bwW8pGt9qSBzgSWum76BMJl13+qYg+ff/ja0= X-Gm-Gg: AR+sD10akUXL1QE/DQwuc6MTs/PkYvpRDGAhDSflf+dW+Lnlf9NkZdcJpYEqaQjiPGm J52mtyh5Od76CwxwLJO5I4f6ehEUajmJdTDSuxg5ddD1qHgqQHEvP+j//afQjaAge9HHDqh4qR+ IXAJew6JJa/gvrdYQDk39eKySgGP4J4+us7tzBbHJ+hNziKf9l/XfJ3AX+2lxdlA7xegkECdbGf nUcswvEokz3ulVfPaMkZa34HKBNT/OmUArDqqMoFlXCon7w5gvzzFD7SIi5OQbwpETRDPOs1m77 P1q9Wi2xMxRLxCXMKrPjQ4FRjmjUcw0g1ySTR0jrVKLIDi1Kkq1p98rBt0OO16U+O1Uabt4s81L rv5vgEnweiOaBmIz78LPaZEMj0jhmRZgsAOaq/W4n0J5dybPXvf/lU74+FVRITOlQTw3cr0oODZ TYmCpx/5D8r4NiubkOflP80bT11u/BtdF8siIXFxxgIkCz7RmIlA== X-Received: by 2002:a17:907:a60b:b0:c1f:e5f:4d2d with SMTP id a640c23a62f3a-c1fad038c03mr57940266b.19.1785399210078; Thu, 30 Jul 2026 01:13:30 -0700 (PDT) From: "Denis V. Lunev" To: qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: den@openvz.org, Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 2/8] tests/qtest/ide-test: parametrize the ATAPI CD-ROM read test Date: Thu, 30 Jul 2026 10:13:18 +0200 Message-ID: <20260730081325.1816193-3-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260730081325.1816193-1-den@openvz.org> References: <20260730081325.1816193-1-den@openvz.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::632; envelope-from=den@openvz.org; helo=mail-ej1-x632.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, 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 development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 @openvz.org) X-ZM-MESSAGEID: 1785399325313158500 cdrom_pio_impl() and test_cdrom_dma() duplicate the same image setup and data-integrity check around two different transfer mechanisms. Fold them into a single cdrom_read_impl(nblocks, flags) helper, with a CDROM_PIO/CDROM_DMA flag selecting the transfer, so further read coverage can be added once for both paths. No functional change: /ide/cdrom/pio, pio_large and dma run exactly as before. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/ide-test.c | 146 +++++++++++++++++++---------------------- 1 file changed, 68 insertions(+), 78 deletions(-) diff --git a/tests/qtest/ide-test.c b/tests/qtest/ide-test.c index 721e78170b..0fcfd0688c 100644 --- a/tests/qtest/ide-test.c +++ b/tests/qtest/ide-test.c @@ -982,6 +982,7 @@ static void send_scsi_cdb_read10(QPCIDevice *dev, QPCIB= ar ide_bar, } } =20 + static void nsleep(QTestState *qts, int64_t nsecs) { const struct timespec val =3D { .tv_nsec =3D nsecs }; @@ -1034,8 +1035,12 @@ static void ide_wait_intr(QTestState *qts, int irq) g_assert_not_reached(); } =20 -static void cdrom_pio_impl(int nblocks) +#define CDROM_PIO 0 +#define CDROM_DMA (1 << 0) + +static void cdrom_read_impl(int nblocks, unsigned flags) { + bool dma =3D flags & CDROM_DMA; QTestState *qts; QPCIDevice *dev; QPCIBar bmdma_bar, ide_bar; @@ -1063,57 +1068,75 @@ static void cdrom_pio_impl(int nblocks) dev =3D get_pci_device(qts, &bmdma_bar, &ide_bar); qtest_irq_intercept_in(qts, "ioapic"); =20 - /* PACKET command on device 0 */ - qpci_io_writeb(dev, ide_bar, reg_device, 0); - qpci_io_writeb(dev, ide_bar, reg_lba_middle, BYTE_COUNT_LIMIT & 0xFF); - qpci_io_writeb(dev, ide_bar, reg_lba_high, (BYTE_COUNT_LIMIT >> 8 & 0x= FF)); - qpci_io_writeb(dev, ide_bar, reg_command, CMD_PACKET); - /* HP0: Check_Status_A State */ - nsleep(qts, 400); - data =3D ide_wait_clear(qts, BSY); - /* HP1: Send_Packet State */ - assert_bit_set(data, DRQ | DRDY); - assert_bit_clear(data, ERR | DF | BSY); - - /* SCSI CDB (READ10) -- read n*2048 bytes from block 0 */ - send_scsi_cdb_read10(dev, ide_bar, 0, nblocks); - - /* Read data back: occurs in bursts of 'BYTE_COUNT_LIMIT' bytes. - * If BYTE_COUNT_LIMIT is odd, we transfer BYTE_COUNT_LIMIT - 1 bytes. - * We allow an odd limit only when the remaining transfer size is - * less than BYTE_COUNT_LIMIT. However, SCSI's read10 command can only - * request n blocks, so our request size is always even. - * For this reason, we assume there is never a hanging byte to fetch. = */ - g_assert(!(rxsize & 1)); - limit =3D BYTE_COUNT_LIMIT & ~1; - for (i =3D 0; i < DIV_ROUND_UP(rxsize, limit); i++) { - size_t offset =3D i * (limit / 2); - size_t rem =3D (rxsize / 2) - offset; - - /* HP3: INTRQ_Wait */ - ide_wait_intr(qts, IDE_PRIMARY_IRQ); + if (dma) { + uintptr_t guest_buf =3D guest_alloc(&guest_malloc, rxsize); + PrdtEntry prdt[1]; + + prdt[0].addr =3D cpu_to_le32(guest_buf); + prdt[0].size =3D cpu_to_le32(rxsize | PRDT_EOT); =20 - /* HP2: Check_Status_B (and clear IRQ) */ + send_dma_request_dev(qts, dev, bmdma_bar, ide_bar, CMD_PACKET, 0, + nblocks, prdt, ARRAY_SIZE(prdt), + send_scsi_cdb_read10); + + qtest_memread(qts, guest_buf, rx, rxsize); + } else { + /* PACKET command on device 0 */ + qpci_io_writeb(dev, ide_bar, reg_device, 0); + qpci_io_writeb(dev, ide_bar, reg_lba_middle, BYTE_COUNT_LIMIT & 0x= FF); + qpci_io_writeb(dev, ide_bar, reg_lba_high, + (BYTE_COUNT_LIMIT >> 8 & 0xFF)); + qpci_io_writeb(dev, ide_bar, reg_command, CMD_PACKET); + /* HP0: Check_Status_A State */ + nsleep(qts, 400); data =3D ide_wait_clear(qts, BSY); + /* HP1: Send_Packet State */ assert_bit_set(data, DRQ | DRDY); assert_bit_clear(data, ERR | DF | BSY); =20 - /* HP4: Transfer_Data */ - for (j =3D 0; j < MIN((limit / 2), rem); j++) { - rx[offset + j] =3D cpu_to_le16(qpci_io_readw(dev, ide_bar, - reg_data)); + /* SCSI CDB (READ10) -- read n*2048 bytes from block 0 */ + send_scsi_cdb_read10(dev, ide_bar, 0, nblocks); + + /* + * Read data back: occurs in bursts of 'BYTE_COUNT_LIMIT' bytes. + * If BYTE_COUNT_LIMIT is odd, we transfer BYTE_COUNT_LIMIT - 1 by= tes. + * We allow an odd limit only when the remaining transfer size is + * less than BYTE_COUNT_LIMIT. However, SCSI's read10 command can = only + * request n blocks, so our request size is always even. + * For this reason, we assume there is never a hanging byte to fet= ch. + */ + g_assert(!(rxsize & 1)); + limit =3D BYTE_COUNT_LIMIT & ~1; + for (i =3D 0; i < DIV_ROUND_UP(rxsize, limit); i++) { + size_t offset =3D i * (limit / 2); + size_t rem =3D (rxsize / 2) - offset; + + /* HP3: INTRQ_Wait */ + ide_wait_intr(qts, IDE_PRIMARY_IRQ); + + /* HP2: Check_Status_B (and clear IRQ) */ + data =3D ide_wait_clear(qts, BSY); + assert_bit_set(data, DRQ | DRDY); + assert_bit_clear(data, ERR | DF | BSY); + + /* HP4: Transfer_Data */ + for (j =3D 0; j < MIN((limit / 2), rem); j++) { + rx[offset + j] =3D cpu_to_le16(qpci_io_readw(dev, ide_bar, + reg_data)); + } } - } =20 - /* Check for final completion IRQ */ - ide_wait_intr(qts, IDE_PRIMARY_IRQ); + /* Check for final completion IRQ */ + ide_wait_intr(qts, IDE_PRIMARY_IRQ); =20 - /* Sanity check final state */ - data =3D ide_wait_clear(qts, DRQ); - assert_bit_set(data, DRDY); - assert_bit_clear(data, DRQ | ERR | DF | BSY); + /* Sanity check final state */ + data =3D ide_wait_clear(qts, DRQ); + assert_bit_set(data, DRDY); + assert_bit_clear(data, DRQ | ERR | DF | BSY); + } =20 g_assert_cmpint(memcmp(pattern, rx, rxsize), =3D=3D, 0); + g_free(pattern); g_free(rx); test_bmdma_teardown(qts); @@ -1122,51 +1145,18 @@ static void cdrom_pio_impl(int nblocks) =20 static void test_cdrom_pio(void) { - cdrom_pio_impl(1); + cdrom_read_impl(1, CDROM_PIO); } =20 static void test_cdrom_pio_large(void) { /* Test a few loops of the PIO DRQ mechanism. */ - cdrom_pio_impl(BYTE_COUNT_LIMIT * 4 / ATAPI_BLOCK_SIZE); + cdrom_read_impl(BYTE_COUNT_LIMIT * 4 / ATAPI_BLOCK_SIZE, CDROM_PIO); } =20 - static void test_cdrom_dma(void) { - QTestState *qts; - static const size_t len =3D ATAPI_BLOCK_SIZE; - size_t ret; - char *pattern =3D g_malloc(ATAPI_BLOCK_SIZE * 16); - char *rx =3D g_malloc0(len); - uintptr_t guest_buf; - PrdtEntry prdt[1]; - FILE *fh; - - qts =3D ide_test_start( - "-drive if=3Dnone,file=3D%s,media=3Dcdrom,format=3Draw,id=3Dsr= 0,index=3D0 " - "-device ide-cd,drive=3Dsr0,bus=3Dide.0", tmp_path[0]); - qtest_irq_intercept_in(qts, "ioapic"); - - guest_buf =3D guest_alloc(&guest_malloc, len); - prdt[0].addr =3D cpu_to_le32(guest_buf); - prdt[0].size =3D cpu_to_le32(len | PRDT_EOT); - - generate_pattern(pattern, ATAPI_BLOCK_SIZE * 16, ATAPI_BLOCK_SIZE); - fh =3D fopen(tmp_path[0], "wb+"); - ret =3D fwrite(pattern, ATAPI_BLOCK_SIZE, 16, fh); - g_assert_cmpint(ret, =3D=3D, 16); - fclose(fh); - - send_dma_request(qts, CMD_PACKET, 0, 1, prdt, 1, send_scsi_cdb_read10); - - /* Read back data from guest memory into local qtest memory */ - qtest_memread(qts, guest_buf, rx, len); - g_assert_cmpint(memcmp(pattern, rx, len), =3D=3D, 0); - - g_free(pattern); - g_free(rx); - test_bmdma_teardown(qts); + cdrom_read_impl(1, CDROM_DMA); } =20 int main(int argc, char **argv) --=20 2.53.0 From nobody Mon Sep 28 02:07:45 2026 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=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785399293; cv=none; d=zohomail.com; s=zohoarc; b=IW2HDOmWUTywG/PUZfNgzpXyphsN9Wxixi8CnejrG7gDhYK64uXdSQuyoMmS4uOaTjftD0Yxh9gqHGVfqwbf/t4Z54wRpBXtorFRHb7aqW5vRW4QQMs+jtUIzqFTKC2BjbKC/B+inaSdWA0u0+ZoXG5rQ/Oa30bRmFuh8TXF95k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785399293; 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=/tnwXOj7t/cEFP1sOccYZtkZUzB7jHG24UF0J+549AY=; b=XGBapowGPCcJieLJ8rQTxWMpGalo8kfwB2e92Qvwk+jghBDnbZDg/mHlY9OdPi8KZJkeOwvW+2fEHHNB5krvbkINuv1EtkqCNYafx0lPvP7DK8MhLV209nAyLZ7bAuy4hEqvVrmJtvwUDGyFghGdBE9Q7S8bjcFCX5Q1WFCw9GU= 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= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785399293428872.2120616639265; Thu, 30 Jul 2026 01:14:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wpLte-00077s-Hj; Thu, 30 Jul 2026 04:13:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wpLtZ-000740-M3 for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:38 -0400 Received: from mail-ej1-x634.google.com ([2a00:1450:4864:20::634]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wpLtW-00017t-Dt for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:37 -0400 Received: by mail-ej1-x634.google.com with SMTP id a640c23a62f3a-c1f5208b38dso347419966b.0 for ; Thu, 30 Jul 2026 01:13:32 -0700 (PDT) Received: from athena ([2a06:5b06:b600:300:871f:1fb4:356b:23d9]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c1fa857c8e1sm38373466b.19.2026.07.30.01.13.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 01:13:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785399211; x=1786004011; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=/tnwXOj7t/cEFP1sOccYZtkZUzB7jHG24UF0J+549AY=; b=EY526k9M9ytdaYss+uvIlWOtDLwjmLI+JF8I8wR6Ts4ViUKzLoeFPV4jTSAnRJlYPD 21Lno+cOungxNt7EuxV3EporYl/vRXhXVb6tMf2B4Ys6+8BHI4RBBNIctdqvpLnckxsJ 0PMcaKC7AEWcClblmZAc6RonTr9G5VrapKDLMgJukpR4Atnrc1i5NXtYhki8VklovALK XeyfaCrmOQX/bU+iiENFcj1Q++qmtHlMZnbd/klYXQ4YN2I4bnZksVkmN3sHS7jh9rbS eF9aTP24ZynMpih/07hdcGd2THMTM7nElzwRNCsldPNFsrp/96eHcj+bdXZNvGWOxLoR q2Cw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785399211; x=1786004011; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=/tnwXOj7t/cEFP1sOccYZtkZUzB7jHG24UF0J+549AY=; b=dZ5aQbuVTl2HRXnTLviy4abVspYE2PXIupxvnlxIcejbqeUf3CQPucSkOmmF6d1BDl ghZG7GNeHoKU4G/PmvcZGbHjMwbMa6sSsQaCxuXZK+wbpVMGTKus4DW7K0O8S/9ChinW dU6K6wCTRTexfP/CpACFNtPIIxbM2AtwgS9DrUAO9TI+rLac3JIbjn+x0jaPvCiYShRF +sx7W7CNoaoUaNowDRRANrq2PmiDfUA/dlx6D4mpsh4L0DqfRPTrAHnHxYUY60gTZB32 hdAmVtOIxtQd+hOZn0NbBteUWwDrJJiPVzvd0JY4uPzQTCVkRcqWHQoH2xe9dw/GGoq0 t1Tg== X-Forwarded-Encrypted: i=1; AHgh+RoI9bNixJVprSSMXaAVLw+4MRNz63Zgim2JMO/7F9hpjGHiv5kYrx3OE7pH1rN/K38lVD6fHz23tdje@nongnu.org X-Gm-Message-State: AOJu0Yw//pV4MBRCTLwMYDIW1lwPn5PsmD1gojGBy1fD7Be8q+vDGPSr NFduxmvgMkCRGbSr/TUX3QDewwDEspUVhu+eoiMMU78Lhfj5M2jg7rhhYiERBa5iwrg= X-Gm-Gg: AR+sD10BuTBzUaR5lTcspcX3UX0eMEqKXnMvR/el4Z9zsVDQgASfMPfc4Mt2TNGxSDm 5p9dhuIm171tgsqFsXRnOqtZFvAXPASzS0M6QVmJ7olSipmxZ1OJR9Xp0l57dt/GRJ2UWOYGW1a JxuWu2uOAU9tpuvr1mnc81aCF1OPsH+6F3qjj9uN1t2DCcuD5Up03LpGAB5e75f0vsC1UZPSDrN Psdp2Gc6widMyEuN/JosVTQdrCBYKTDtW0ItzYUPpWc5kkvKu7MbJZ0i0m3Pdb5XhR1wY45Cyoo wwGEKKoA9KUL2zeovT4XH56QZktz+0NG2haQ/3GDoyftDmaJL7mKe82D/IJeWaJ2c9itnNXCvbp RDLMtb8DwDTvtqSSOH9zkdBzY0D44wpeIyQlVjfNCyBh3WpZLCge3I4Rmb+Anf6PH8OMGhxK56L 21fPasgoW9Lijny4t5MKLlFatg8rHfLbUZZXqTF2bkB4Bhzl+d0Q== X-Received: by 2002:a17:907:802:b0:c16:5f28:4575 with SMTP id a640c23a62f3a-c1fa58706f1mr77845666b.31.1785399211000; Thu, 30 Jul 2026 01:13:31 -0700 (PDT) From: "Denis V. Lunev" To: qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: den@openvz.org, Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 3/8] tests/qtest/ide-test: add a multi-sector ATAPI DMA read test Date: Thu, 30 Jul 2026 10:13:19 +0200 Message-ID: <20260730081325.1816193-4-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260730081325.1816193-1-den@openvz.org> References: <20260730081325.1816193-1-den@openvz.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::634; envelope-from=den@openvz.org; helo=mail-ej1-x634.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, 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 development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 @openvz.org) X-ZM-MESSAGEID: 1785399295064158500 test_cdrom_pio_large() already exercises a multi-sector PIO read. Add the DMA counterpart through the same cdrom_read_impl() helper so the multi-block ATAPI DMA read path gets equivalent coverage. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/ide-test.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/qtest/ide-test.c b/tests/qtest/ide-test.c index 0fcfd0688c..2c674edf15 100644 --- a/tests/qtest/ide-test.c +++ b/tests/qtest/ide-test.c @@ -1159,6 +1159,11 @@ static void test_cdrom_dma(void) cdrom_read_impl(1, CDROM_DMA); } =20 +static void test_cdrom_dma_large(void) +{ + cdrom_read_impl(BYTE_COUNT_LIMIT * 4 / ATAPI_BLOCK_SIZE, CDROM_DMA); +} + int main(int argc, char **argv) { const char *base; @@ -1218,6 +1223,7 @@ int main(int argc, char **argv) qtest_add_func("/ide/cdrom/pio", test_cdrom_pio); qtest_add_func("/ide/cdrom/pio_large", test_cdrom_pio_large); qtest_add_func("/ide/cdrom/dma", test_cdrom_dma); + qtest_add_func("/ide/cdrom/dma_large", test_cdrom_dma_large); =20 ret =3D g_test_run(); =20 --=20 2.53.0 From nobody Mon Sep 28 02:07:45 2026 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=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785399266; cv=none; d=zohomail.com; s=zohoarc; b=RE+c4abPFsA5wP/MuwUni1aX08JWiwPYNkPl1c7vVIHVUA1ruPTHPUbQCMcRS6TS+Ck6/ljub1VWW3891kHBke7mBdo/AW/xOm4pTjhHEk3leJToZSN0930kOHj3T6O5nVwkKxTlnV/aMIsxX4c/VZWwZB2hZmA02tKdvmY/aNk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785399266; 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=fpQgSBzrn5OM98BFEFDTyUmHy0CoJsRx+U07A91OmgI=; b=MFRlhdxW3fJHGz4z9VBccC8Vv7NhXm0XZr1Kx+3cGuwgTDWMjLN+7syN/a24avWENefngaQNqUhRhKQSCXjPDQFGZhH8ObAaFZBHzPOXi9Mh9WRma+Ng5QjCvTrIg+dpDQRAnzrIyDKMRIH2lB3Hk0a2grxQIhsoYkafynWx6NA= 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= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785399266673366.19557599833433; Thu, 30 Jul 2026 01:14:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wpLtb-00076A-Tk; Thu, 30 Jul 2026 04:13:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wpLtZ-000742-NF for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:38 -0400 Received: from mail-ed1-x533.google.com ([2a00:1450:4864:20::533]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wpLtW-000184-De for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:37 -0400 Received: by mail-ed1-x533.google.com with SMTP id 4fb4d7f45d1cf-69ffb48d599so2922812a12.2 for ; Thu, 30 Jul 2026 01:13:33 -0700 (PDT) Received: from athena ([2a06:5b06:b600:300:871f:1fb4:356b:23d9]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c1fa857c8e1sm38373466b.19.2026.07.30.01.13.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 01:13:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785399212; x=1786004012; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=fpQgSBzrn5OM98BFEFDTyUmHy0CoJsRx+U07A91OmgI=; b=hwlqlwAI49aWbVV8C7fTtkk1VWImiYPf5xTpSIcFcgvnNqMBjAOfneSUUTqnNJN4Y9 hJh5dFi6ciGzmFlWxAIA8wcVKwAUSAw9clUyyW1/6f7r6vqfqxsEXcYX6BoEMjYQw/Qx B5tofjcFDofWMKfbjelBDj4pFkAcytvidjZbtNT9aSw5TKE3uf3lC8XYntrb9ZmC0Em+ F09oYGuv9YxhYsaA2Z8UV5gzh0Fu/ZYfXTZRQVsN4WyxG47BXzMGWgtVI8feU9R+dWnT 44fx3zJ3yplq47PBADd1q5cY0T7DfRI4asddLP2mciuaEueTE73xtvjp3xdecO85l9Um g4QQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785399212; x=1786004012; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=fpQgSBzrn5OM98BFEFDTyUmHy0CoJsRx+U07A91OmgI=; b=a8kdThOX4dcRX+V3CA2LHAW8XWkV0DaT14bV9oJtbGHiKODNuN2nX4hqAAhMeKkLFI WMHD0Huw2sF9wX/IvrwRHXUsxPeRpDcq8/fULzSnm24dkURg6IDO4wB8l3DETgYv5OcZ UKbunJNwv9+RpstuI26a6LcuVfjysszz4J+GKbO999aCMZ9Y0T807umwd+RBm2+SD7qM b7gtftPRYwOjUKwJMYBRsPAcnIfLW8M0+7xGNtiG+xgCvR+HVHwGlgw9Vrfco4Uhq/fe 7wXa4u4bELl1WIqxFKc95/KFDJ/eVoNT0MHXWANOrNfu0CWqLXcJQlJkRyNm8khmKQk9 HanA== X-Forwarded-Encrypted: i=1; AHgh+RoRvszMH8JFUKuuvXEYj5HvuOkyChotWJxfEp+hhhlTar3m40TX5moichM9nglCLN4JQ1fHMb5XQvMH@nongnu.org X-Gm-Message-State: AOJu0YzJmkvGARzRhCLFk3tu9+n904HAAy7yn3BBn5zFXvKnip43dXGO jFgbnMBsaCayax1XZqhph+lDmWz4lA23pQm9SA/1MQPEJQfvqiotA+/UA7/8AzAj3Ek= X-Gm-Gg: AR+sD11Wf7rWCtODglJYQF4tQQUSr18faSy3xRfJ6v4Nr8VxOdu/CjFjmEZ9bxRRg3l hCmmSxkyCdDHe65frhqdKyI1u3G12HWrGKiAXulvJP/p3h2axBLHeEL9RyIAIAAtt2zdPFO7plU 2ljb2Ofm8swfpDji4tUAFvimamtqLM76ozl1BQChTyKfYoiiZ9nQFPxAkYN9R1gEgmd5Yza1Hg8 MOek5/YBhNZTG0z1fdE2RQlOGgy2y+cwl7ccUWRO849cpH3QyjMD1XKVOnYrzzwqOV6TnTflGSH qtAhoB90FgueeMSmDmC4aHIg9auJfO7KkxUjZM5/DfhztPTMBGqf+x/EmaG/deaX9BThV2UR8Jy lTsDEIsISlTYsU71rRLPoigwCm3LK14EecScKAEb4gq6k8sfPGfZ02i/QoxkL2QnXgr/B0wfODH QqhUl3oBb5NHUsZWZN6rGgVaxvcyCiaPha2IfACdoLPPQFQ53xDA== X-Received: by 2002:a05:6938:a08c:10b0:c12:40c2:9d09 with SMTP id a640c23a62f3a-c1fa55be9d5mr55349166b.12.1785399211979; Thu, 30 Jul 2026 01:13:31 -0700 (PDT) From: "Denis V. Lunev" To: qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: den@openvz.org, Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 4/8] tests/qtest/ide-test: cover raw (2352-byte) ATAPI CD reads Date: Thu, 30 Jul 2026 10:13:20 +0200 Message-ID: <20260730081325.1816193-5-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260730081325.1816193-1-den@openvz.org> References: <20260730081325.1816193-1-den@openvz.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::533; envelope-from=den@openvz.org; helo=mail-ed1-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, 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 development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 @openvz.org) X-ZM-MESSAGEID: 1785399269331158500 READ CD with the field-selector set to 0xf8 returns full 2352-byte raw sectors (sync + header + 2048 data + EDC/ECC), driving the ATAPI raw read path that READ10 never touches. Add a send_scsi_cdb_read_cd() helper and a CDROM_RAW flag to cdrom_read_impl(), then exercise both PIO and DMA. The PIO case uses a byte-count limit spanning several raw sectors so the device must rebuffer mid-burst, and each sector's 2048-byte payload is verified at its in-sector offset. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/ide-test.c | 75 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/tests/qtest/ide-test.c b/tests/qtest/ide-test.c index 2c674edf15..b36b0f8875 100644 --- a/tests/qtest/ide-test.c +++ b/tests/qtest/ide-test.c @@ -48,6 +48,10 @@ =20 #define ATAPI_BLOCK_SIZE 2048 =20 +/* Raw READ CD sector: 12 sync + 4 header + 2048 data + 288 EDC/ECC. */ +#define ATAPI_RAW_SIZE 2352 +#define ATAPI_RAW_DATA 16 + /* How many bytes to receive via ATAPI PIO at one time. * Must be less than 0xFFFF. */ #define BYTE_COUNT_LIMIT 5120 @@ -982,6 +986,40 @@ static void send_scsi_cdb_read10(QPCIDevice *dev, QPCI= Bar ide_bar, } } =20 +typedef struct ReadCDCDB { + uint8_t opcode; + uint8_t sector_type; + uint32_t lba; + uint8_t length[3]; + uint8_t main_channel; + uint8_t sub_channel; + uint8_t control; +} __attribute__((__packed__)) ReadCDCDB; + +static void send_scsi_cdb_read_cd(QPCIDevice *dev, QPCIBar ide_bar, + uint64_t lba, int nblocks) +{ + ReadCDCDB pkt =3D { }; + int i; + + g_assert_cmpint(lba, <=3D, UINT32_MAX); + g_assert_cmpint(nblocks, >=3D, 0); + g_assert_cmpint(nblocks, <=3D, 0xffffff); + + /* Construct SCSI CDB packet */ + pkt.opcode =3D 0xbe; + pkt.lba =3D cpu_to_be32(lba); + pkt.length[0] =3D (nblocks >> 16) & 0xff; + pkt.length[1] =3D (nblocks >> 8) & 0xff; + pkt.length[2] =3D nblocks & 0xff; + pkt.main_channel =3D 0xf8; /* sync + headers + user data + EDC/ECC: 23= 52 */ + + /* Send Packet */ + for (i =3D 0; i < sizeof(ReadCDCDB) / 2; i++) { + qpci_io_writew(dev, ide_bar, reg_data, + le16_to_cpu(((uint16_t *)&pkt)[i])); + } +} =20 static void nsleep(QTestState *qts, int64_t nsecs) { @@ -1037,10 +1075,12 @@ static void ide_wait_intr(QTestState *qts, int irq) =20 #define CDROM_PIO 0 #define CDROM_DMA (1 << 0) +#define CDROM_RAW (1 << 1) =20 static void cdrom_read_impl(int nblocks, unsigned flags) { bool dma =3D flags & CDROM_DMA; + bool raw =3D flags & CDROM_RAW; QTestState *qts; QPCIDevice *dev; QPCIBar bmdma_bar, ide_bar; @@ -1048,8 +1088,11 @@ static void cdrom_read_impl(int nblocks, unsigned fl= ags) int patt_blocks =3D MAX(16, nblocks); size_t patt_len =3D ATAPI_BLOCK_SIZE * patt_blocks; char *pattern =3D g_malloc(patt_len); - size_t rxsize =3D ATAPI_BLOCK_SIZE * nblocks; + unsigned xfer =3D raw ? ATAPI_RAW_SIZE : ATAPI_BLOCK_SIZE; + size_t rxsize =3D xfer * nblocks; uint16_t *rx =3D g_malloc0(rxsize); + void (*send_cdb)(QPCIDevice *, QPCIBar, uint64_t, int) =3D + raw ? send_scsi_cdb_read_cd : send_scsi_cdb_read10; int i, j; uint8_t data; uint16_t limit; @@ -1076,8 +1119,7 @@ static void cdrom_read_impl(int nblocks, unsigned fla= gs) prdt[0].size =3D cpu_to_le32(rxsize | PRDT_EOT); =20 send_dma_request_dev(qts, dev, bmdma_bar, ide_bar, CMD_PACKET, 0, - nblocks, prdt, ARRAY_SIZE(prdt), - send_scsi_cdb_read10); + nblocks, prdt, ARRAY_SIZE(prdt), send_cdb); =20 qtest_memread(qts, guest_buf, rx, rxsize); } else { @@ -1094,8 +1136,7 @@ static void cdrom_read_impl(int nblocks, unsigned fla= gs) assert_bit_set(data, DRQ | DRDY); assert_bit_clear(data, ERR | DF | BSY); =20 - /* SCSI CDB (READ10) -- read n*2048 bytes from block 0 */ - send_scsi_cdb_read10(dev, ide_bar, 0, nblocks); + send_cdb(dev, ide_bar, 0, nblocks); =20 /* * Read data back: occurs in bursts of 'BYTE_COUNT_LIMIT' bytes. @@ -1135,7 +1176,17 @@ static void cdrom_read_impl(int nblocks, unsigned fl= ags) assert_bit_clear(data, DRQ | ERR | DF | BSY); } =20 - g_assert_cmpint(memcmp(pattern, rx, rxsize), =3D=3D, 0); + if (raw) { + /* The 2048-byte payload of each raw sector sits past its header. = */ + for (i =3D 0; i < nblocks; i++) { + uint8_t *sec =3D (uint8_t *)rx + i * ATAPI_RAW_SIZE + ATAPI_RA= W_DATA; + + g_assert_cmpint(memcmp(sec, pattern + i * ATAPI_BLOCK_SIZE, + ATAPI_BLOCK_SIZE), =3D=3D, 0); + } + } else { + g_assert_cmpint(memcmp(pattern, rx, rxsize), =3D=3D, 0); + } =20 g_free(pattern); g_free(rx); @@ -1164,6 +1215,16 @@ static void test_cdrom_dma_large(void) cdrom_read_impl(BYTE_COUNT_LIMIT * 4 / ATAPI_BLOCK_SIZE, CDROM_DMA); } =20 +static void test_cdrom_pio_raw(void) +{ + cdrom_read_impl(4, CDROM_RAW); +} + +static void test_cdrom_dma_raw(void) +{ + cdrom_read_impl(4, CDROM_DMA | CDROM_RAW); +} + int main(int argc, char **argv) { const char *base; @@ -1224,6 +1285,8 @@ int main(int argc, char **argv) qtest_add_func("/ide/cdrom/pio_large", test_cdrom_pio_large); qtest_add_func("/ide/cdrom/dma", test_cdrom_dma); qtest_add_func("/ide/cdrom/dma_large", test_cdrom_dma_large); + qtest_add_func("/ide/cdrom/pio_raw", test_cdrom_pio_raw); + qtest_add_func("/ide/cdrom/dma_raw", test_cdrom_dma_raw); =20 ret =3D g_test_run(); =20 --=20 2.53.0 From nobody Mon Sep 28 02:07:45 2026 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=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785399310; cv=none; d=zohomail.com; s=zohoarc; b=lnkNQja/MC8K773d8MQOs9W2J+LHsQ0FD5AfBCd/llsrk1Ou4fyM3DaYtDw5uvgxSWA2Xqf5B5eHbRgg4EENc4K2jJq+7R+poFI+uHLYCTtUWSJLc5v74qjPwt264/4qPvR3r7MLwQorKxynF1PhgTRV7QJVN3z3YDmnuuCFZe8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785399310; 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=agLMlyUmxtwx6g/99v7O2aIN4trfNG9SmIE8yPzBwqA=; b=bLsKHjPOSSCdVdNNJfdznTGI1kiIRIZbBrZ+vfr+/MziMruw9xlXo+ygo04urtvaRWbKQXb6vuJsxl9sh7DL0QT5rczcLUU7yzPvGWI51ZKTp++YruVtRNPm3ohDtYDpiXh9ygXxbAS9NXyhInyU3vuFWWlIfPq8PBRXYbSpMdA= 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= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785399310539415.06228335345406; Thu, 30 Jul 2026 01:15:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wpLtc-00076W-Lh; Thu, 30 Jul 2026 04:13:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wpLta-00074s-TC for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:38 -0400 Received: from mail-ej1-x634.google.com ([2a00:1450:4864:20::634]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wpLtW-00018B-LO for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:38 -0400 Received: by mail-ej1-x634.google.com with SMTP id a640c23a62f3a-c15ba3a2b4bso219008166b.1 for ; Thu, 30 Jul 2026 01:13:34 -0700 (PDT) Received: from athena ([2a06:5b06:b600:300:871f:1fb4:356b:23d9]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c1fa857c8e1sm38373466b.19.2026.07.30.01.13.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 01:13:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785399213; x=1786004013; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=agLMlyUmxtwx6g/99v7O2aIN4trfNG9SmIE8yPzBwqA=; b=p+dhMsHSP3ibnhb6dzPeMFVBD3RCDETjVV9ej1JYzqBQsJTaxzSTlie/uOjeWiYZzP CZnkMWVUtIaCbW5U5rl5lg9ZerRGFFjhy05nFwGl2bldVqt8JAR1D32e7yy2CxZGD0CM m9vHLxwV912+2xNk8CS39ytKduNXnWoCIR3GyiCi0OB5ga8M6BWAtA/qzD0ZtDx5WOVe IPDaBrw9hwvPzMBh+rNBncbAXs+NrLv+Dzafkpgmj/YMwbkjXAEQdYznwjMxckkL0dXS DhYaf8dc+o/WwzDv7YDrL0uyvdN+jni4d4uonOvQVVXsD6wZDb4EVwoUSCx+Slh0Zc/o 4NqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785399213; x=1786004013; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=agLMlyUmxtwx6g/99v7O2aIN4trfNG9SmIE8yPzBwqA=; b=XHTfZD1HBtRg3yfk8RxUtmi4x+INmZM56g1JfW9gYTBYwaqIW79x3gd0TNxl0pY2xR Lm/piKNvkVAyRmBJUe6/9To+6AkB7cO63E3MJRClXbN951+MCjl2gr5NT2nqCXWtJf6U CERELrH0WC2otHaUnXf/MvxHV12cQX1DMlp1jtHv3n1HZ3VVmVIfmNyDap0UPQkPmSOB PKBIaNqJQUU0vfKeXlAKEB2V8J39ffLMm6xGgxZhbhYhE+grCYC80r2PhR+SCKW6N444 R9sJyigGy9CAr3FApcH/xUtQxaalqcFVMNTBwOI8pTzCx8H3pPJqIoo7I1pueby/JCW4 S/RA== X-Forwarded-Encrypted: i=1; AHgh+Rrofdl8s72wB+bBA+ER3TGIIP7qxoeC6qBIb7Nsw3TQ0lTarSeYonOua+t0bLr0hrtSL4+0yHHbnpwy@nongnu.org X-Gm-Message-State: AOJu0YzMLBvTPvfWgswm9oph02YFj4b2muvj4BVTZ3g6zXc50r47vLhW v7rnWfYqY+eTI5im53Ywozr7JUCMDHGWChgEcg5yu/7m7poMAueYli998dSR7N0zdQ4= X-Gm-Gg: AR+sD10vtKRxcTuynoYG8CcIbilOfLx+MfPSuoPGpztERcQq8ecbaPqKlJz9dwOAX6m Jky4oNSCBCAAibC0ph/pOrQt5cHldCouyCXkhbzzNYVZMG09lZKbBX85X87KTgsCr1+N6ZPspBw Mgqz7GeYhniXxkIOT9tUUzNjjVdCI3nWuWLGbJF2r13jEy2QnW0+UGGGL99QuFk4NSHAp6Oljaj mA4XmMUNRn1lx/ceYk5WEtBLJXp0xk/y7Q9bFJOmzpyd7nqURJThg1enmMTvpStUg9BgPuon5C5 ujhg0+NAE4i85rSvUbRQst7Sa6fNIuJsNiR6C3nv/8Dh1CKi3WF9xL9iAPDrHO8YLSSmz/RVmBw FGKo+x7CqLl+1IyWoeB1qaDlw9Iq3q0RKEH+xX8F7zZg87MiUZxE0ojIbdTQwhxWwjC18Fqacmo 6lyz86/MDUxe2evDCMVqk48EDTSJ5nEbMEZt330M5fYnIFv1qC18G7m0zy8YKq X-Received: by 2002:a17:906:9fc7:b0:c1b:66a5:e8f0 with SMTP id a640c23a62f3a-c1fa56985b8mr89990266b.4.1785399212980; Thu, 30 Jul 2026 01:13:32 -0700 (PDT) From: "Denis V. Lunev" To: qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: den@openvz.org, Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 5/8] tests/qtest/libqos/ahci: support raw (2352-byte) READ CD Date: Thu, 30 Jul 2026 10:13:21 +0200 Message-ID: <20260730081325.1816193-6-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260730081325.1816193-1-den@openvz.org> References: <20260730081325.1816193-1-den@openvz.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::634; envelope-from=den@openvz.org; helo=mail-ej1-x634.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, 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 development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 @openvz.org) X-ZM-MESSAGEID: 1785399311156158500 ahci_exec() always builds ATAPI commands with a 2048-byte logical sector size, so it cannot drive a READ CD that returns full 2352-byte raw sectors. Add an atapi_raw option that sets the READ CD field-selector to 0xf8 and the command's sector size to 2352 before the transfer is sized, so the derived block count stays correct while the buffer and byte counts cover the raw sectors. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/libqos/ahci.c | 5 +++++ tests/qtest/libqos/ahci.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/tests/qtest/libqos/ahci.c b/tests/qtest/libqos/ahci.c index 0621a6c477..e3019a1eca 100644 --- a/tests/qtest/libqos/ahci.c +++ b/tests/qtest/libqos/ahci.c @@ -707,6 +707,11 @@ void ahci_exec(AHCIQState *ahci, uint8_t port, if (opts->atapi) { uint16_t bcl =3D opts->set_bcl ? opts->bcl : ATAPI_SECTOR_SIZE; cmd =3D ahci_atapi_command_create(op, bcl, opts->atapi_dma); + if (opts->atapi_raw) { + /* request full 2352-byte raw sectors; sector_size must match = */ + cmd->atapi_cmd[9] =3D 0xf8; + cmd->sector_size =3D ATAPI_RAW_SECTOR_SIZE; + } } else { cmd =3D ahci_command_create(op); } diff --git a/tests/qtest/libqos/ahci.h b/tests/qtest/libqos/ahci.h index a0487a1557..2a48a7523d 100644 --- a/tests/qtest/libqos/ahci.h +++ b/tests/qtest/libqos/ahci.h @@ -242,6 +242,7 @@ =20 #define AHCI_SECTOR_SIZE (512) #define ATAPI_SECTOR_SIZE (2048) +#define ATAPI_RAW_SECTOR_SIZE (2352) =20 #define AHCI_SIGNATURE_CDROM (0xeb140101) #define AHCI_SIGNATURE_DISK (0x00000101) @@ -485,6 +486,7 @@ typedef struct AHCIOpts { uint64_t buffer; /* Pointer to source or destination guest buffer */ bool atapi; /* ATAPI command? */ bool atapi_dma; /* Use DMA for ATAPI? */ + bool atapi_raw; /* READ CD returning 2352-byte raw sectors */ bool error; int (*pre_cb)(AHCIQState*, AHCICommand*, const struct AHCIOpts *); int (*mid_cb)(AHCIQState*, AHCICommand*, const struct AHCIOpts *); --=20 2.53.0 From nobody Mon Sep 28 02:07:45 2026 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=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785399330; cv=none; d=zohomail.com; s=zohoarc; b=a8wiubmTzPL1jV1rmq1Lmax4/b17NL+6mvRxHhBw+wJa74zcoirLLOxTxiJJOt5tna3TZvdJmFMlxaKuqVQkMHNhZEX9fnNmO4pnb7IxaQTVqR1TeGEPrmr8I59TSINGtLE+4T7jlRq7/MSjjk5+SR7ZgqLMbe3Ra3+3tPU8xSg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785399330; 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=0oNDH01FbQte7UkYHPhvNcB6113WA9wPSR1l+l/ks+A=; b=TSCNnSmQTX4qbN+lpbYZwmBDI1zR51cRyX5BLT3cQ7Lh2IIoPkD8huB8LUkVv/1JDTb+FEnqUwqi55FoIzqPHGkc1QtpXLkX6fHvVoNiNZeXammr+fkuGisteTxMhN2oTm0rRIF0LBqwRVfi4IYYmeCalrIrQQtKLihleS+iHpM= 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= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785399330439440.0895768051963; Thu, 30 Jul 2026 01:15:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wpLtg-00079Q-Am; Thu, 30 Jul 2026 04:13:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wpLtc-00076G-6M for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:40 -0400 Received: from mail-ed1-x529.google.com ([2a00:1450:4864:20::529]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wpLtY-00018I-0G for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:39 -0400 Received: by mail-ed1-x529.google.com with SMTP id 4fb4d7f45d1cf-698acd36d67so3258144a12.0 for ; Thu, 30 Jul 2026 01:13:35 -0700 (PDT) Received: from athena ([2a06:5b06:b600:300:871f:1fb4:356b:23d9]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c1fa857c8e1sm38373466b.19.2026.07.30.01.13.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 01:13:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785399214; x=1786004014; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=0oNDH01FbQte7UkYHPhvNcB6113WA9wPSR1l+l/ks+A=; b=eO8GmMuRaMnN76J0Fny3Ltjkx6jjYYUTsSbudwjDu0MqqmvMqKYf2ITtHxi8Qh/cEQ DJmP9UXqmenTwjeSYIUdRxf2lGemhy47zhMrGNGBrBqoOvClbcD6rZHK974nHNRL04gi 4Wk91at2GICgurCcZBPLUQiRmWa8uYr/iS3b/lPpoYL7gSsIGltpl3SsdZNx7QsxbBEJ 2A7jSmXKTlk0cMY2eirhLJKJJcgDjcWpiiDybpyud47bTEXRHxugq+Ss3qfJ4EQ0WkgI 4GDawFK8/oE2IpJqDMu79PMLbxHBXf7Vp9uxWe+4LBCMckfmNVBQmTkjwZQMI2HDjikz au8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785399214; x=1786004014; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=0oNDH01FbQte7UkYHPhvNcB6113WA9wPSR1l+l/ks+A=; b=FzTSxXBdcazsqeFw/qI+YJejYtnOaUkfPAEs/yQGU9n129FsJwFrw0N6vS6G/YkTNU XJoWweeK/4wyDTuk939MDIs0v9FTF4lsPbwRHkmg3dxSJ8zI3InwtG/RY49u5m0Ki2V9 wMNmMcfUjXoiA1/MO/qHOcMXfgVhLPV8bkJQP/vcvX+FOkLOWQfrI3qpbAOD+vgbuKDh m0zHj2eHXyvQjEEb3sNKuCyUJ85oSCmDiwh4EBm+9MncMP5OZYaB5gndt3R/KEChRpg8 9pUvZz1Hlh8sVlRp5NoCYrJUdqTh/ltts0NNlJpnZLpEUOQpZHiU/q0s6tHqWjbgNee8 jFtw== X-Forwarded-Encrypted: i=1; AHgh+RoSnP/1rrgXzWcwmQEDP70HpjHOW+0+Lo5PHMT54A9foNbJ0xnYUEi1/CHeLK0pYWdqo/lxTmzbUsBC@nongnu.org X-Gm-Message-State: AOJu0Yzg2fSN4l4dv6QtqEy430MHEh76YbT1cxAYChBVsPW7S99qd+5s bfXQFmGjDQPmCQUKI/NnQZddELmvWgr1OJ4j4cGz+I2Z8TMQemwLl9qW9d0kiZW0IfQ= X-Gm-Gg: AR+sD10LXjbJ1xoLQT+B3/cAh8XaW9OGH65Bzf8zpPPujBGoeS91kwR8YySENhlxM2c Z53dHk8C0ewsVg8YJwENtVPpz6bL+KaNLjA6dCHfUNPFQmHIzXcwbUJ1Pu0ACnXUjRHUaZA+XAC 5QmHfeW7aGGEqHI/HaKs4KE3318d1GFFaUAtwsN4k8fO2vXkGAjrWOX2xrKkat+7J8jFwijChYK lDrBNdGyDNeh5OyGC3mB0r9rnIEztSIHHvF2567iYQH2lMn24dW4384uc/KkJn0l0e2+d6NpnKm TdUoKUeqVmN64YF9k59bpqpfNk9/DdtTrQj5Pj6zMAAWhNQwjyayFJHMv6nrLwnFw6QyxmX93ix zSMbcxuFSIREHXczDX+h/Nze47VfKQhNpaFcu17l4NfoCiX4rrM3rElgkvME79AtTpiZH/L3xYh VcCVJawW2KbnPPSdfc2BXrv4mhxaIsAbaDRiYg9HqryB0qXze3Sw== X-Received: by 2002:a17:907:3cc3:b0:c19:481f:8a93 with SMTP id a640c23a62f3a-c1fa5afa634mr76989366b.49.1785399214099; Thu, 30 Jul 2026 01:13:34 -0700 (PDT) From: "Denis V. Lunev" To: qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: den@openvz.org, Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 6/8] tests/qtest/ahci: cover raw (2352-byte) ATAPI CD reads Date: Thu, 30 Jul 2026 10:13:22 +0200 Message-ID: <20260730081325.1816193-7-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260730081325.1816193-1-den@openvz.org> References: <20260730081325.1816193-1-den@openvz.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::529; envelope-from=den@openvz.org; helo=mail-ed1-x529.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, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 @openvz.org) X-ZM-MESSAGEID: 1785399331333158500 Add /ahci/cdrom/{pio,dma}/raw: read several sectors with READ CD in raw mode (atapi_raw), so the ATAPI 2352-byte unpack path is exercised through the AHCI delivery, which IDE coverage does not reach. Each sector's 2048-byte payload is verified at its in-sector offset. The PIO case uses a byte-count limit of one raw sector per DRQ burst: libqos asserts a one-sector PIO transfer, and the multi-sector unpack loop is already covered by the IDE raw test. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/ahci-test.c | 68 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/tests/qtest/ahci-test.c b/tests/qtest/ahci-test.c index 44799eea15..58bc04b3ef 100644 --- a/tests/qtest/ahci-test.c +++ b/tests/qtest/ahci-test.c @@ -1565,6 +1565,31 @@ static int ahci_cb_cmp_buff(AHCIQState *ahci, AHCICo= mmand *cmd, return 0; } =20 +static int ahci_cb_cmp_raw(AHCIQState *ahci, AHCICommand *cmd, + const AHCIOpts *opts) +{ + unsigned char *tx =3D opts->opaque; + unsigned char *rx; + unsigned i, nsectors; + + if (!opts->size) { + return 0; + } + + nsectors =3D opts->size / ATAPI_RAW_SECTOR_SIZE; + rx =3D g_malloc0(opts->size); + qtest_bufread(ahci->parent->qts, opts->buffer, rx, opts->size); + /* Each raw sector carries its 2048-byte payload past a 16-byte header= . */ + for (i =3D 0; i < nsectors; i++) { + g_assert_cmphex(memcmp(rx + i * ATAPI_RAW_SECTOR_SIZE + 16, + tx + i * ATAPI_SECTOR_SIZE, + ATAPI_SECTOR_SIZE), =3D=3D, 0); + } + g_free(rx); + + return 0; +} + static void ahci_test_cdrom(int nsectors, bool dma, uint8_t cmd, bool override_bcl, uint16_t bcl) { @@ -1625,6 +1650,47 @@ static void test_cdrom_pio_multi(void) ahci_test_cdrom_read10(3, false); } =20 +static void ahci_test_cdrom_raw(int nsectors, bool dma) +{ + AHCIQState *ahci; + unsigned char *tx; + char *iso; + int fd; + AHCIOpts opts =3D { + .size =3D (uint64_t)ATAPI_RAW_SECTOR_SIZE * nsectors, + .atapi =3D true, + .atapi_dma =3D dma, + .atapi_raw =3D true, + .set_bcl =3D true, + .bcl =3D ATAPI_RAW_SECTOR_SIZE, /* one raw sector per DRQ burst */ + .post_cb =3D ahci_cb_cmp_raw, + }; + uint64_t iso_size =3D (uint64_t)ATAPI_SECTOR_SIZE * (nsectors + 1); + + fd =3D prepare_iso(iso_size, &tx, &iso); + opts.opaque =3D tx; + + ahci =3D ahci_boot_and_enable("-drive if=3Dnone,id=3Ddrive0,file=3D%s,= format=3Draw " + "-M q35 " + "-device ide-cd,drive=3Ddrive0 ", iso); + + ahci_exec(ahci, ahci_port_select(ahci), CMD_ATAPI_READ_CD, &opts); + + g_free(tx); + ahci_shutdown(ahci); + remove_iso(fd, iso); +} + +static void test_cdrom_dma_raw(void) +{ + ahci_test_cdrom_raw(3, true); +} + +static void test_cdrom_pio_raw(void) +{ + ahci_test_cdrom_raw(3, false); +} + /* * Regression test: a buffered ATAPI read completing after a command * engine restart must not dereference the cleared cur_cmd. Cover both @@ -2100,8 +2166,10 @@ int main(int argc, char **argv) =20 qtest_add_func("/ahci/cdrom/dma/single", test_cdrom_dma); qtest_add_func("/ahci/cdrom/dma/multi", test_cdrom_dma_multi); + qtest_add_func("/ahci/cdrom/dma/raw", test_cdrom_dma_raw); qtest_add_func("/ahci/cdrom/pio/single", test_cdrom_pio); qtest_add_func("/ahci/cdrom/pio/multi", test_cdrom_pio_multi); + qtest_add_func("/ahci/cdrom/pio/raw", test_cdrom_pio_raw); =20 qtest_add_func("/ahci/cdrom/pio/bcl", test_atapi_bcl); qtest_add_func("/ahci/cdrom/eject", test_atapi_tray); --=20 2.53.0 From nobody Mon Sep 28 02:07:45 2026 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=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785399288; cv=none; d=zohomail.com; s=zohoarc; b=LK+8fZdRlESp8oeOvsBB4shc6g5o/XzkT8c1gPwJI02hDOFbmoBLOo5DK9TPtrjZseSPvHWUWR7jCrLldaEDpRfEDRgQXeV5r8JBsULaClYaztU913wXgC30orEM089gNXCJxZqvDe9mAfO6/1jC+PAIP1JO1yuAAeTRddEb7dE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785399288; 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=qVItmy4f/C2z27f9ZFHpOg432dejiRYIjmnW1fhYMUs=; b=Pydo4ru0KEScQqH17BKIxVcUt4MIivoxvnz3EBeWGCj/hVFeDljgboN6Y1MBnG/yzgB+OESp0wir2yfi14r+jhosYSgjOs+HgwfL33Kajj3L5sChpuPkpi97AiV5ZhjokRas5KAjEuxaIT6SWxvkchSKHbnZQtffEFoEq5JJpAw= 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= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 178539928809627.45076807805458; Thu, 30 Jul 2026 01:14:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wpLtg-0007AB-NX; Thu, 30 Jul 2026 04:13:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wpLtc-00076a-N1 for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:40 -0400 Received: from mail-ej1-x62c.google.com ([2a00:1450:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wpLtZ-00018V-CL for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:40 -0400 Received: by mail-ej1-x62c.google.com with SMTP id a640c23a62f3a-c1600d040e4so70851966b.1 for ; Thu, 30 Jul 2026 01:13:36 -0700 (PDT) Received: from athena ([2a06:5b06:b600:300:871f:1fb4:356b:23d9]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c1fa857c8e1sm38373466b.19.2026.07.30.01.13.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 01:13:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785399215; x=1786004015; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=qVItmy4f/C2z27f9ZFHpOg432dejiRYIjmnW1fhYMUs=; b=baQMLfp3TgcOhbBNSvFbnw29281pZN05FQFcwJ5TPJ8v3ivqp01vkmBeioDWxljySJ j6GaP1J6mp1lzjzFLTsGQiVmLOK+eiyw4YEy/fkGP8DAg7z+TUcv+V7Y27MCKsP8Dfos tHCRo73SYzH59BQu/1M3UJXokaBl25Iz7fgr8Lz0dwojA5JSh4dDeRTVK7tj8NIF5qw0 Je4eRY5krEbkUyCRhj4Fm8Jjsje4pp6ViixiFLLLrJeQbkzDvO6X0bvJsH3gqkqJsMHh KAXQSh+hQTtQB4fdYsms/zi28Mmpoaez9/IDiE2g67OVsoZnuekUuDjqBk+f0Xa27i7x o7xA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785399215; x=1786004015; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=qVItmy4f/C2z27f9ZFHpOg432dejiRYIjmnW1fhYMUs=; b=TlJ8PMv90iYmvJxJR2Q7MedyZl03N3b3JhzbGyGkQ5BATWPGMVPvjaZddF2I0kzNDS 42NM3hG/wk9fRwYeAJf9b9htJAYld1snZ3xu2pSgtUqCsa2wRYzUpktSFoYXWUXZtD5u rAW40OK95i97rWPUr32b0WScZDaBbb+HdGaH7WDpUgYsxLcB80z6DXhArpBurFHTEgGJ 22UePuF5LXDPnEsP+LrCHN0Qifol3+/N68GQjjvA0dPtGLRU7FeWjtSWR0Y8e0j87xlb pkciMw6AdVW4e2y4lbH5Z/XPeykJOEJ8cEgmgYftPE69tD/uCSuPICHMerPbALNc/fHJ 9iPQ== X-Forwarded-Encrypted: i=1; AHgh+RpWBgszKrbd1Vp9mVKQcMczTxQ6WeJmLlxDQqUZzHBeS9BsKU8gs7zxTSBMLhorJ3MVsiWxB6D5VEQC@nongnu.org X-Gm-Message-State: AOJu0YxV2LUOKonjecM+M+M/7GPbusfm1vUKvMaxshlfsewP+seHwN3q MnfJab3G5K/K05XhOtSnExDNGBjWPMOUcMn7u/HuXbZmSxRI1/CEICJwuFc2vvieh1g= X-Gm-Gg: AR+sD137arwpcefzA4HRMuF7IfADqYiW7RjgNVw2rzmYftJOiU4C7FL18b/jrvkSOJs uXBy128WbtjRUPg6YRtzpu1n+W/mtgshyy+u0xkt8+NKr/5DGwYNTCTP1Clt49LbJXebAnIb8R2 zVlun69tQwwlLLzt1Iq2L7Lvu3TngcsXJfluddTyuQDkdeUgwC4RLT5QtW4ioz5W3I+rVApKJIZ NOpXl92kIWzXurUI8jrOG0Fop5zIiEHtReJ1RcSuIYLVu2iVshXXNd+1ieXQwE2vFCZO60um3SX V+u94HqmKKLLmcse75cW9EdQDp93QKkM/OSKALndyQm+XPb3g3O06Gt2CW8JVBM62cSLRzR06K4 1hqXZP5adyl1S2rP9AH6kCTTOL/Iekw/qY4AHLyry4vuXcmnuarLg/94eWZtLhz2ce21OAUdltO Jni6oKvKOec2eWwE6QLmJsT1I05l6Ps147W1BBAwKf0OIKMYYAX+DlFuErECcb X-Received: by 2002:a17:907:1983:b0:c16:785:cfb6 with SMTP id a640c23a62f3a-c1facb3a5c1mr65713366b.3.1785399215167; Thu, 30 Jul 2026 01:13:35 -0700 (PDT) From: "Denis V. Lunev" To: qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: den@openvz.org, Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 7/8] hw/ide/atapi: read the whole elementary transfer asynchronously Date: Thu, 30 Jul 2026 10:13:23 +0200 Message-ID: <20260730081325.1816193-8-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260730081325.1816193-1-den@openvz.org> References: <20260730081325.1816193-1-den@openvz.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::62c; envelope-from=den@openvz.org; helo=mail-ej1-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, 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 development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 @openvz.org) X-ZM-MESSAGEID: 1785399289228158500 An ATAPI PIO read whose byte-count limit spans more than one CD sector must fetch the later sectors of a DRQ burst from inside the completion of the first, asynchronous read. cd_read_sector_sync() did this with a synchronous blk_pread(), which runs blk_wait_while_drained() before issuing the request. If a drain is in progress when that completion runs -- as happens when a guest reset reaches virtio_blk_stop_ioeventfd() -> bdrv_drain_all_begin() while an ATAPI read is in flight on the same QEMU -- the nested read is queued until the drained section ends while the outer completion still holds blk->in_flight. bdrv_drain_all_begin() then waits forever for that in_flight count to drop: the main loop is wedged in the drain with the BQL held, and every other QMP/monitor operation blocks behind it. Read the whole elementary transfer in a single asynchronous request up front instead, so no read is ever issued in the middle of a burst. cd_read_sector() now reads all the sectors a burst spans (the raw 2352-byte case is unpacked in place on completion) and cd_read_sector_sync() is removed. The DMA path already batched its reads and is unchanged. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- hw/ide/atapi.c | 180 +++++++++++++++++++++++-------------------------- 1 file changed, 84 insertions(+), 96 deletions(-) diff --git a/hw/ide/atapi.c b/hw/ide/atapi.c index a42b748521..0ea149ad8c 100644 --- a/hw/ide/atapi.c +++ b/hw/ide/atapi.c @@ -88,46 +88,14 @@ static void cd_data_to_raw(uint8_t *buf, int lba) memset(buf, 0, 288); } =20 -static int -cd_read_sector_sync(IDEState *s) -{ - int ret; - block_acct_start(blk_get_stats(s->blk), &s->acct, - ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ); - - trace_cd_read_sector_sync(s->lba); - - switch (s->cd_sector_size) { - case 2048: - ret =3D blk_pread(s->blk, (int64_t)s->lba << ATAPI_SECTOR_BITS, - ATAPI_SECTOR_SIZE, s->io_buffer, 0); - break; - case 2352: - ret =3D blk_pread(s->blk, (int64_t)s->lba << ATAPI_SECTOR_BITS, - ATAPI_SECTOR_SIZE, s->io_buffer + 16, 0); - if (ret >=3D 0) { - cd_data_to_raw(s->io_buffer, s->lba); - } - break; - default: - block_acct_invalid(blk_get_stats(s->blk), BLOCK_ACCT_READ); - return -EIO; - } - - if (ret < 0) { - block_acct_failed(blk_get_stats(s->blk), &s->acct); - } else { - block_acct_done(blk_get_stats(s->blk), &s->acct); - s->lba++; - s->io_buffer_index =3D 0; - } - - return ret; -} - static void cd_read_sector_cb(void *opaque, int ret) { IDEState *s =3D opaque; + int et =3D s->elementary_transfer_size; + int skip =3D s->io_buffer_index; + int nsec =3D DIV_ROUND_UP(skip + et, s->cd_sector_size); + uint8_t *buf; + int i; =20 trace_cd_read_sector_cb(s->lba, ret); =20 @@ -140,34 +108,64 @@ static void cd_read_sector_cb(void *opaque, int ret) block_acct_done(blk_get_stats(s->blk), &s->acct); =20 if (s->cd_sector_size =3D=3D 2352) { - cd_data_to_raw(s->io_buffer, s->lba); + /* unpack back-to-front so a sector never clobbers an unmoved one = */ + for (i =3D nsec - 1; i >=3D 0; i--) { + memmove(s->io_buffer + i * 2352 + 16, s->io_buffer + i * 2048, + ATAPI_SECTOR_SIZE); + cd_data_to_raw(s->io_buffer + i * 2352, s->lba + i); + } } =20 - s->lba++; - s->io_buffer_index =3D 0; s->status &=3D ~BUSY_STAT; =20 - ide_atapi_cmd_reply_end(s); + s->nsector =3D (s->nsector & ~7) | ATAPI_INT_REASON_IO; + s->lcyl =3D et & 0xff; + s->hcyl =3D (et >> 8) & 0xff; + ide_bus_set_irq(s->bus); + + /* a boundary sector shared with the next burst is re-read there */ + buf =3D s->io_buffer + skip; + s->packet_transfer_size -=3D et; + s->lba +=3D (skip + et) / s->cd_sector_size; + s->io_buffer_index =3D (skip + et) % s->cd_sector_size; + s->elementary_transfer_size =3D 0; + + if (ide_transfer_start_norecurse(s, buf, et, ide_atapi_cmd_reply_end))= { + ide_atapi_cmd_reply_end(s); + } } =20 +/* + * Read the whole elementary transfer (one DRQ burst) in a single async + * request. No read is issued mid-burst, so unlike the old synchronous + * rebuffer it cannot deadlock against a concurrent drain. + */ static int cd_read_sector(IDEState *s) { - void *buf; + int et =3D s->elementary_transfer_size; + int skip =3D s->io_buffer_index; + int nsec =3D DIV_ROUND_UP(skip + et, s->cd_sector_size); =20 if (s->cd_sector_size !=3D 2048 && s->cd_sector_size !=3D 2352) { block_acct_invalid(blk_get_stats(s->blk), BLOCK_ACCT_READ); return -EINVAL; } =20 - buf =3D (s->cd_sector_size =3D=3D 2352) ? s->io_buffer + 16 : s->io_bu= ffer; - qemu_iovec_init_buf(&s->qiov, buf, ATAPI_SECTOR_SIZE); + /* a burst is bounded by the byte count limit, so it fits io_buffer */ + assert(nsec * s->cd_sector_size <=3D s->io_buffer_total_len); + + /* + * Read the payload packed at the front of io_buffer; the 2352 raw cas= e is + * unpacked into place on completion. + */ + qemu_iovec_init_buf(&s->qiov, s->io_buffer, nsec * ATAPI_SECTOR_SIZE); =20 trace_cd_read_sector(s->lba); =20 block_acct_start(blk_get_stats(s->blk), &s->acct, - ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ); + nsec * ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ); =20 - ide_buffered_readv(s, (int64_t)s->lba << 2, &s->qiov, 4, + ide_buffered_readv(s, (int64_t)s->lba << 2, &s->qiov, nsec * 4, cd_read_sector_cb, s); =20 s->status |=3D BUSY_STAT; @@ -222,59 +220,49 @@ static uint16_t atapi_byte_count_limit(IDEState *s) void ide_atapi_cmd_reply_end(IDEState *s) { int byte_count_limit, size, ret; - while (s->packet_transfer_size > 0) { - trace_ide_atapi_cmd_reply_end(s, s->packet_transfer_size, - s->elementary_transfer_size, - s->io_buffer_index); - - /* see if a new sector must be read */ - if (s->lba !=3D -1 && s->io_buffer_index >=3D s->cd_sector_size) { - if (!s->elementary_transfer_size) { - ret =3D cd_read_sector(s); - if (ret < 0) { - ide_atapi_io_error(s, ret); - } - return; - } else { - /* rebuffering within an elementary transfer is - * only possible with a sync request because we - * end up with a race condition otherwise */ - ret =3D cd_read_sector_sync(s); - if (ret < 0) { - ide_atapi_io_error(s, ret); - return; - } + + trace_ide_atapi_cmd_reply_end(s, s->packet_transfer_size, + s->elementary_transfer_size, + s->io_buffer_index); + + if (s->lba !=3D -1 && s->packet_transfer_size > 0) { + byte_count_limit =3D atapi_byte_count_limit(s); + trace_ide_atapi_cmd_reply_end_bcl(s, byte_count_limit); + size =3D s->packet_transfer_size; + if (size > byte_count_limit) { + /* byte count limit must be even if this case */ + if (byte_count_limit & 1) { + byte_count_limit--; } + size =3D byte_count_limit; } - if (s->elementary_transfer_size > 0) { - /* there are some data left to transmit in this elementary - transfer */ - size =3D s->cd_sector_size - s->io_buffer_index; - if (size > s->elementary_transfer_size) - size =3D s->elementary_transfer_size; - } else { - /* a new transfer is needed */ - s->nsector =3D (s->nsector & ~7) | ATAPI_INT_REASON_IO; - ide_bus_set_irq(s->bus); - byte_count_limit =3D atapi_byte_count_limit(s); - trace_ide_atapi_cmd_reply_end_bcl(s, byte_count_limit); - size =3D s->packet_transfer_size; - if (size > byte_count_limit) { - /* byte count limit must be even if this case */ - if (byte_count_limit & 1) - byte_count_limit--; - size =3D byte_count_limit; - } - s->lcyl =3D size & 0xff; - s->hcyl =3D size >> 8; - s->elementary_transfer_size =3D size; - /* we cannot transmit more than one sector at a time */ - if (s->lba !=3D -1) { - if (size > (s->cd_sector_size - s->io_buffer_index)) - size =3D (s->cd_sector_size - s->io_buffer_index); + s->elementary_transfer_size =3D size; + ret =3D cd_read_sector(s); + if (ret < 0) { + ide_atapi_io_error(s, ret); + } + return; + } + + while (s->packet_transfer_size > 0) { + /* a new transfer is needed */ + s->nsector =3D (s->nsector & ~7) | ATAPI_INT_REASON_IO; + ide_bus_set_irq(s->bus); + byte_count_limit =3D atapi_byte_count_limit(s); + trace_ide_atapi_cmd_reply_end_bcl(s, byte_count_limit); + size =3D s->packet_transfer_size; + if (size > byte_count_limit) { + /* byte count limit must be even if this case */ + if (byte_count_limit & 1) { + byte_count_limit--; } - trace_ide_atapi_cmd_reply_end_new(s, s->status); + size =3D byte_count_limit; } + s->lcyl =3D size & 0xff; + s->hcyl =3D size >> 8; + s->elementary_transfer_size =3D size; + trace_ide_atapi_cmd_reply_end_new(s, s->status); + s->packet_transfer_size -=3D size; s->elementary_transfer_size -=3D size; s->io_buffer_index +=3D size; @@ -329,7 +317,7 @@ static void ide_atapi_cmd_read_pio(IDEState *s, int lba= , int nb_sectors, s->lba =3D lba; s->packet_transfer_size =3D nb_sectors * sector_size; s->elementary_transfer_size =3D 0; - s->io_buffer_index =3D sector_size; + s->io_buffer_index =3D 0; s->cd_sector_size =3D sector_size; =20 ide_atapi_cmd_reply_end(s); --=20 2.53.0 From nobody Mon Sep 28 02:07:45 2026 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=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785399266; cv=none; d=zohomail.com; s=zohoarc; b=dFkUjXEML12cCH+zXaI8WIit7Sr053RQtcxUzHSaOEVG82skOtHD7eQRGe84F7yP0RQj0lRHBb1JDCc8Q+fCZgLsFbAffNxwWWpboEV71Um7hLW/oj7LYmzu5F0qhfnd3F+Ie+lK9ivlj/CSg+yln0nwidz9I0r+ImmPn4lY5jo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785399266; 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=OtCL941QaxVDzOMEP5QDrXt6XcRnskNWRDsBxWp3Og4=; b=QT/HG7V01/lC9IKAIYDPsbPoCqffnK3iCIrTm8394MTHlHFE4Fb/av68jLsRSxb+gzJpcfgS+SC4XYxwfH0NL6A6Uw8epqg1PXuZHA60PNPxsV7uSYOs0nGys6/R52fD6+r7MqatecI9OXGGGMAZYLkijrNdenFZu8BzkIBNEFs= 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= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785399266835891.3500069400867; Thu, 30 Jul 2026 01:14:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wpLtf-000796-O5; Thu, 30 Jul 2026 04:13:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wpLtd-00077A-0Z for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:42 -0400 Received: from mail-ej1-x630.google.com ([2a00:1450:4864:20::630]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wpLta-00018p-5i for qemu-devel@nongnu.org; Thu, 30 Jul 2026 04:13:40 -0400 Received: by mail-ej1-x630.google.com with SMTP id a640c23a62f3a-c1600d040e4so70852766b.1 for ; Thu, 30 Jul 2026 01:13:37 -0700 (PDT) Received: from athena ([2a06:5b06:b600:300:871f:1fb4:356b:23d9]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c1fa857c8e1sm38373466b.19.2026.07.30.01.13.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 01:13:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785399216; x=1786004016; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=OtCL941QaxVDzOMEP5QDrXt6XcRnskNWRDsBxWp3Og4=; b=R/UWGDLVM3pmtWiemiQ1osrSiMwOw1B+5qpW7FDwC6SVn8vQ2g+bI+B5k4zM2+wRKB 5hYD/qFRUpetj4cDbhqNrY6hdzxFWzA+dgItRXDsg3OJ2291KVQFwvbZoMpYIpWXZ+7h DBGv1dTqYX95nQTaNu586vlC8CmVm8NC0feCAD7ncrLLz1/i+Kkx02czd0NeLv7WW0RB LUnrpCfZianM5RB/A0317+RPpUPz+TZZR9tMaR7yWLcp5drqvIFndiy1XsqkVJb34Uif EsZU9OVAWx0pevWQUabPcbNTGsPuGzmbOOqwApkgExZHEMlyWKYyQpnOlshY7L1kwEX0 3MIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785399216; x=1786004016; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=OtCL941QaxVDzOMEP5QDrXt6XcRnskNWRDsBxWp3Og4=; b=B03P1aSEaAknFb9TLcR9jUVpE5IHLl85vtZQy/UInaX4QfybLs9mbTsnYO9UddVC1v /dTDVZjBgyaaYTO+1dOD4kf0zxPTTw/bUh3GElGeIXoWz8eS5Qn4LT9qxvnjoHMSdA8T dhf5YSiQpjTW8yVeW5Vxw/s75r1N2pdYl8+cuzUAPJciODyJGd8kStT1mlnjYdGiu0+o WRmKRa0L1t/jELDfFY1gXALcY0zaE0B+r+b5c5zw9agvNeIrY4KDstYKblFkSBuycwvA tXjLRVsIJoknabbfAhXrpRyvgnVZSQ/Ls+HWtQ7s2KLEhvm9W/HJe1MXZxCDW6WGGioy bNPw== X-Forwarded-Encrypted: i=1; AHgh+Rq8jtFTsBAnLJIWs1YM4q25nn9s65ir/iijYOFWNU7+YEJIJMxsQXBjyIQdrIRsVWptEzzFZzkcI9qI@nongnu.org X-Gm-Message-State: AOJu0YzHBKkWly+8Ecpx7MEMHlv/18BbC+dql3CUPKUoPHcekYMCLXyS RBKFhh6d995XARc92T5zHe+CQIcyu5v7DeVkdubiF8sjJhWHLGFMGl3nQhiI/JzFXwQ= X-Gm-Gg: AR+sD10XOvpFj6zYJUDKRZyaUPlFCChLFijbsMe7I/bFstieULNodNoTFPzeD96R4Oa 2tsB7PksbQeK63LlJ2MJyiFuRPEZ6aVY8jt+0HnPmZuMmg3DZdtAkz9q9b9FIqC7Wrocrtn04+L 6BLBJngth9n04TZ2DUZvNHfR4etpil3Zu2r7U6epoYcPr/ex+W4kX17ua+cUmV1oA7qCKJZP7+x qcoMVz4xG0hFuW85ikSbeHAWrOr0K+ejA1iNCUP8nkhZrpI+5hPo4W/I8UkhBm/aqBVK1MxnK+L fBGA7Y4OjeVgTxgr+97l64mNGRv/zRKzNI9rJEYTvzfyFMXgzh3AApAc7yX1sSFb2X7ZsoWiefF STCdrHcdLjA6uFLtPbi1mkDKowyjd6G7wSuPHnsia8AGxdp1mIyLb+h7ZtrWsmycax+W84uHW/O VPBpeVCzrPgadVJWoXpJ6sNOjsuzbSma5cZ/Q5nf2p106NaFjFyA== X-Received: by 2002:a17:907:d649:b0:c15:ee17:47a with SMTP id a640c23a62f3a-c1fad03e323mr56630066b.15.1785399216198; Thu, 30 Jul 2026 01:13:36 -0700 (PDT) From: "Denis V. Lunev" To: qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: den@openvz.org, Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 8/8] tests/qtest/ahci: regression test for ATAPI read vs. drain Date: Thu, 30 Jul 2026 10:13:24 +0200 Message-ID: <20260730081325.1816193-9-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260730081325.1816193-1-den@openvz.org> References: <20260730081325.1816193-1-den@openvz.org> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::630; envelope-from=den@openvz.org; helo=mail-ej1-x630.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, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 @openvz.org) X-ZM-MESSAGEID: 1785399269310158500 Add /ahci/cdrom/drain/{pio,dma}: issue a multi-sector ATAPI read whose byte-count limit spans two sectors so the device must rebuffer in the middle of the DRQ burst, hold the backend read in flight with a blkdebug delay, and fire x-blockdev-set-iothread -- which runs bdrv_drain_all_begin() exactly like a guest reset does through virtio_blk_stop_ioeventfd(). On the unfixed PIO path the nested sector fetch is queued behind the drain and the main loop wedges, so the test hangs. The DMA variant never rebuffers and serves as a sanity twin. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/ahci-test.c | 66 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/tests/qtest/ahci-test.c b/tests/qtest/ahci-test.c index 58bc04b3ef..71d23fe56a 100644 --- a/tests/qtest/ahci-test.c +++ b/tests/qtest/ahci-test.c @@ -1754,6 +1754,70 @@ static void test_atapi_engine_restart_dma(void) test_atapi_engine_restart_in_flight(true); } =20 +/* + * Regression test: a multi-sector ATAPI read fetches its later sectors fr= om + * inside the first read's completion; a concurrent drain (as a guest reset + * triggers via bdrv_drain_all_begin) must not wedge on that nested read. + * blkdebug keeps the read in flight across x-blockdev-set-iothread. + */ +static void test_atapi_drain_in_flight(bool dma) +{ + AHCIQState *ahci; + AHCICommand *cmd; + unsigned char *tx; + char *iso; + int fd; + uint8_t port; + uint64_t buffer; + uint16_t bcl =3D ATAPI_SECTOR_SIZE * 2; + uint64_t iso_size =3D (uint64_t)ATAPI_SECTOR_SIZE * 3; + + fd =3D prepare_iso(iso_size, &tx, &iso); + + /* 1s read delay: a wide margin so the drain starts before it complete= s */ + ahci =3D ahci_boot_and_enable( + "-blockdev driver=3Dfile,node-name=3Dfile0,filename=3D%s,read-only= =3Don " + "-blockdev driver=3Dblkdebug,node-name=3Dcd0,image=3Dfile0,read-on= ly=3Don," + "inject-error.0.event=3Dnone,inject-error.0.iotype=3Dread," + "inject-error.0.errno=3D0,inject-error.0.delay-ns=3D1000000000 " + "-M q35 " + "-device ide-cd,drive=3Dcd0 ", iso); + port =3D ahci_port_select(ahci); + + buffer =3D ahci_alloc(ahci, bcl); + qtest_memset(ahci->parent->qts, buffer, 0x00, bcl); + + cmd =3D ahci_atapi_command_create(CMD_ATAPI_READ_10, bcl, dma); + ahci_command_adjust(cmd, 0, buffer, bcl, 0); + ahci_command_commit(ahci, cmd, port); + ahci_command_issue_async(ahci, cmd); + + /* Drain (all nodes) while the delayed read is still in flight. */ + qtest_qmp_assert_success(ahci->parent->qts, + "{ 'execute': 'x-blockdev-set-iothread'," + " 'arguments': { 'node-name': 'cd0', 'iothread': null," + " 'force': true } }"); + + /* Round-trip through the device to confirm qemu is still alive. */ + ahci_px_rreg(ahci, port, AHCI_PX_TFD); + + ahci_command_free(cmd); + ahci_free(ahci, buffer); + g_free(tx); + ahci_shutdown(ahci); + remove_iso(fd, iso); +} + +static void test_atapi_drain_pio(void) +{ + test_atapi_drain_in_flight(false); +} + +static void test_atapi_drain_dma(void) +{ + test_atapi_drain_in_flight(true); +} + /* Regression test: Test that a READ_CD command with a BCL of 0 but a size= of 0 * completes as a NOP instead of erroring out. */ static void test_atapi_bcl(void) @@ -2177,6 +2241,8 @@ int main(int argc, char **argv) test_atapi_engine_restart_pio); qtest_add_func("/ahci/cdrom/engine_restart/dma", test_atapi_engine_restart_dma); + qtest_add_func("/ahci/cdrom/drain/pio", test_atapi_drain_pio); + qtest_add_func("/ahci/cdrom/drain/dma", test_atapi_drain_dma); =20 ret =3D g_test_run(); =20 --=20 2.53.0