From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122304; cv=none; d=zohomail.com; s=zohoarc; b=m7G+RF7LWP6lZr94RSyaUi7AJDcHkpT2v/PcUz8EbTvMvVMWYw2SpUaRu/SvC/1509mTTuYBBSRCFd3nB3aP3BzG23fW0q9k8+eoIX/eQDX2JyjshkH0nuNBgBr62MhcjWlxRoE+9JuLBHtzzZffZCiD43k7vGjjOik6cSWAwpY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122304; 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=0248QfacYiMKCWli9VtdEqCb2gJFtHLHI24SeBPyYDU=; b=DLdCenAqQIgcpYkD/Mvq/CGiCLDGMlFCBCwLQR0+2OzLSSnlCLh3el1C3nLXUBQF/ls+g53p4DBuhi0TFu2cH6e9j1XKF1YuRAOhut11jNzxufL7iQZlNS8Sm6U2HUTg2JQMLrJ7RV+2ScV8oRiiTkMddoO2UfwWI3cgVtBOG+Y= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122304456413.81263460686216; Mon, 9 Mar 2026 22:58:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq4U-0006qj-Fm; Tue, 10 Mar 2026 01:56:00 -0400 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 ) id 1vzq4G-0006oP-5V for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:55:45 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq4D-0006DV-H8 for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:55:43 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-94-ZIBevucRPqa2x-kjomZoEw-1; Tue, 10 Mar 2026 01:55:39 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id EFBBF1800464; Tue, 10 Mar 2026 05:55:37 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 69C201956095; Tue, 10 Mar 2026 05:55:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122140; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0248QfacYiMKCWli9VtdEqCb2gJFtHLHI24SeBPyYDU=; b=TceqtXYxt8+EDMM9Tcf8bc+06bjwy8+3yKOdrdMbz12tqGIxkhnOEK4FAvcfULnwhXqhoA CQKn5sPUlEZQqX0Efc1iCPsiLM9425aMna8x1ONrcK5PR/Y8rK4Hl/IubRLc5deyyqS/bh Np18lSFkIsb3TTA5llgj/IxVvFLyv40= X-MC-Unique: ZIBevucRPqa2x-kjomZoEw-1 X-Mimecast-MFC-AGG-ID: ZIBevucRPqa2x-kjomZoEw_1773122138 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Subject: [PULL 01/25] tests/qemu-iotests: Mark 182 as Linux-only Date: Tue, 10 Mar 2026 06:55:06 +0100 Message-ID: <20260310055530.8893-2-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122305837158500 From: Thomas Huth Running test 182 on FreeBSD fails with this error message in the output: +warning: File lock requested but OFD locking syscall is unavailable, fall= ing back to POSIX file locks +Due to the implementation, locks can be lost unexpectedly. OFD locks seem to be only available on Linux, so let's mark this test as Linux-only to silence the failure. Reviewed-by: Daniel P. Berrang=C3=A9 Signed-off-by: Thomas Huth Message-ID: <20260113141744.97469-1-thuth@redhat.com> --- tests/qemu-iotests/182 | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/qemu-iotests/182 b/tests/qemu-iotests/182 index bbd1132b052..af5eeb599c1 100755 --- a/tests/qemu-iotests/182 +++ b/tests/qemu-iotests/182 @@ -43,6 +43,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 =20 _supported_fmt qcow2 _supported_proto file +_supported_os Linux =20 size=3D32M =20 --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122177; cv=none; d=zohomail.com; s=zohoarc; b=l41lK3k/Fx3bDP76w1KNaMTkjx1cMWKXF12BKMIt3gaCRJbSRB4zzs/4Mko5z15s3NAO5iHzVnpS6bW0wKl93zg45xHaWg7amlzgqXQBp+Leoxu7MgPM0s6n6etjGRjP1HRvFvquJCDlnmI0BPdB6KMFGFu7dWYHADbpjCzq79I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122177; 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=ZUu5qrJSIssAmGyNSYtvnGrAmeDWc2z+Ox2jRk9tDwg=; b=Dw1Iwl2D/Ey3wpzkdqhazrhiG0kkSCKeCNDflwS7AuiWGPkAeJxPmSL+9EQ1koBYgqTy2W18ZZ8wv6SoGMl/mqX9zkq6aBaNXDDxMqWLwh4YWP9JwQCfziYLna5Nl3liT7fWkI1errqfc7oIswp6KflFPVitXRGlYpZb4WfZxgk= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177312217764379.38945639085227; Mon, 9 Mar 2026 22:56:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq4S-0006pS-T1; Tue, 10 Mar 2026 01:55:57 -0400 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 ) id 1vzq4H-0006oT-MW for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:55:45 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq4G-0006Dk-CK for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:55:45 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-635-Zbu_sayIMF6gkyrlf_ZiVw-1; Tue, 10 Mar 2026 01:55:42 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 0F64E180034E; Tue, 10 Mar 2026 05:55:41 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 027BB1956095; Tue, 10 Mar 2026 05:55:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122143; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZUu5qrJSIssAmGyNSYtvnGrAmeDWc2z+Ox2jRk9tDwg=; b=b/Byv0g3b3ojgdoNRcsZhdWVvciaycrxv3RmlHTYKUwJiWAlikQqQsO/Sk+NPGzlw3aO7A LMsvyWTGsc4MhsKnHvs3SuXanOzAUy2JQmEwoakFmDK72rZQo6f9VCKDEYHR037MqUrg5E gjczA/StCvrAsligJ6VeE/mqxO81E2U= X-MC-Unique: Zbu_sayIMF6gkyrlf_ZiVw-1 X-Mimecast-MFC-AGG-ID: Zbu_sayIMF6gkyrlf_ZiVw_1773122141 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org Subject: [PULL 02/25] tests/functional: Don't try to run functional tests on Windows Date: Tue, 10 Mar 2026 06:55:07 +0100 Message-ID: <20260310055530.8893-3-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.129.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122179392158500 Content-Type: text/plain; charset="utf-8" From: Thomas Huth They just don't work there yet, so don't try to run them there (these need some development work from a Windows wizard first). Signed-off-by: Thomas Huth Message-ID: <20260216103924.39493-1-thuth@redhat.com> --- tests/functional/meson.build | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/functional/meson.build b/tests/functional/meson.build index b979cff2b97..9bec5a07516 100644 --- a/tests/functional/meson.build +++ b/tests/functional/meson.build @@ -4,8 +4,9 @@ # (e.g. tests that fetch assets from the internet) should be put into # the 'thorough' category instead. =20 -# Most tests run too slow with TCI enabled, so skip the functional tests t= here -if get_option('tcg_interpreter') +# Most tests run too slow with TCI enabled, and they haven't been adapted +# to Windows yet, so skip the functional tests in these environments +if get_option('tcg_interpreter') or host_os =3D=3D 'windows' subdir_done() endif =20 --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122214; cv=none; d=zohomail.com; s=zohoarc; b=j6ZYSYfqYpPQuHvd8HWbxa47rinixVy8ZTUYpGnclyP/LvPFpNe4Li7XwSv2wL1ZoVOg91PferdPlgekqNWMyhsnktUJOgX4Ws0aqX3xYFAOrZ7wfwiSTf1/a8HJ4+ZkddB+nKyuWOh/9p2TVv+/3qSM2Go9noKTHheqPdd3eGM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122214; 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=+KXRaJiDAkoIl8DyFh2lNCPL1Jetdk1ohZihoYYyEHw=; b=S2NbzNIKGiVwVmOQICsBzL6bJCvkNbTvczTJB8KnF4ZlnJD509Bl4i89RXHGq+asW/5bInqBLpJIhZXNVaAh4w9LH7iK20tpx4VB0EyuE9x0GWJ2SYbN3RE/DhWqyw+xKR6l/VjD+bj22suJkUyfbmgtuoKu1f1YBJPT9MuNTGo= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122214268225.72551170161375; Mon, 9 Mar 2026 22:56:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq4i-0006wE-N2; Tue, 10 Mar 2026 01:56:14 -0400 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 ) id 1vzq4O-0006pJ-Ko for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:55:53 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq4K-0006EA-Js for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:55:51 -0400 Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-607-HrxZAwSFPga4OhYzeVHn-w-1; Tue, 10 Mar 2026 01:55:45 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 61D9C195608A; Tue, 10 Mar 2026 05:55:44 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 1F76A1956095; Tue, 10 Mar 2026 05:55:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122147; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+KXRaJiDAkoIl8DyFh2lNCPL1Jetdk1ohZihoYYyEHw=; b=cxC/ofSD8qTN1otan7mcLTemgIp2zByadktx5RczYTXpxRIIELA6x39Qwpc+juUqgKO9qR q4JEey8Or9wO+8sILrH8trQQtjOmxW4FNUJ9EdFfRJ6vflozFU4tU3/jyXzwg9rZMkue+u bM9ke7SvofN/vcMlLOTus9CoXyTMaaE= X-MC-Unique: HrxZAwSFPga4OhYzeVHn-w-1 X-Mimecast-MFC-AGG-ID: HrxZAwSFPga4OhYzeVHn-w_1773122144 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Reinoud Zandijk Subject: [PULL 03/25] tests/functional/ppc/test_40: Fix the URL of the NetBSD-7.1.2-prep.iso asset Date: Tue, 10 Mar 2026 06:55:08 +0100 Message-ID: <20260310055530.8893-4-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.129.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122216289158500 Content-Type: text/plain; charset="utf-8" From: Thomas Huth We now need a slightly different URL to be able to download this asset. Suggested-by: Reinoud Zandijk Signed-off-by: Thomas Huth Message-ID: <20260212143843.287090-1-thuth@redhat.com> --- tests/functional/ppc/test_40p.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/ppc/test_40p.py b/tests/functional/ppc/test_4= 0p.py index 614972a7eb3..ed272147f6e 100755 --- a/tests/functional/ppc/test_40p.py +++ b/tests/functional/ppc/test_40p.py @@ -27,7 +27,7 @@ class IbmPrep40pMachine(QemuSystemTest): 'f86236e9d01b3f0dd0f5d3b8d5bbd40c68e78b4db560a108358f5ad58e636619') ASSET_NETBSD71 =3D Asset( ('https://archive.netbsd.org/pub/NetBSD-archive/' - 'NetBSD-7.1.2/iso/NetBSD-7.1.2-prep.iso'), + 'NetBSD-7.1.2/iso/NetBSD-7.1.2-prep.iso?key=3DNetBSD'), 'cc7cb290b06aaa839362deb7bd9f417ac5015557db24088508330f76c3f825ec') =20 # 12H0455 PPS Firmware Licensed Materials --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122182; cv=none; d=zohomail.com; s=zohoarc; b=i9UUGS6sIWkxzNL+/vRzzKwguGEBQsDardevAvzKfKb21nVrSed/eyGxCGXjcAGTEFVCEsssylMw+zELNmrhylQhX6P20IaGPTb8fmgjjyC7TNUxEVrqquDnvjVVjDZ8G6qBGNilOLvsWMhROHSO0Ue7B0jDkmPft+rBDHQU2RA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122182; 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=a1Vm1eHYlS+Lm527ZjKRZGb4bqL0Ij/7r3TdhZBCcgw=; b=UlZKukpQNcI/N/WP2WO9pTeWsPUDmjxaci6kNXCB/ERZ59vNsDuT3J84KOH3p3XTbh0rVClCiW5ZgJb7VjdpoQSJGbRrPQft95BjJELDkTB53pitIchyUh7QYbAjZ+4Iug3FWd5/SStQTcq396LdozZV8AtPjWaiBMv8vEdA0MQ= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177312218241355.088864005192136; Mon, 9 Mar 2026 22:56:22 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq4Z-0006rT-5p; Tue, 10 Mar 2026 01:56:03 -0400 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 ) id 1vzq4T-0006q7-2L for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:55:57 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq4P-0006EV-TW for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:55:56 -0400 Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-632-gGhzzpaxPG280DfBI2tNsA-1; Tue, 10 Mar 2026 01:55:49 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id F19D41956080; Tue, 10 Mar 2026 05:55:47 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 6D3661955D87; Tue, 10 Mar 2026 05:55:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122152; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=a1Vm1eHYlS+Lm527ZjKRZGb4bqL0Ij/7r3TdhZBCcgw=; b=V8MJKXVJnLDTyWP2tlOkZ+qH2N0tGH4CeZQllLlHQyo0aaGKsiPCTshAWJPs/UsirB2vhS 6PBivOLqalnnFotM3VxgwnVcJX2TQb3Mh2mfSJqWOeFiEQUnie/xIT0aFWSIIk34pmPGk2 kT1N8rSWucavMUar9LdzMgWmbHYtPs4= X-MC-Unique: gGhzzpaxPG280DfBI2tNsA-1 X-Mimecast-MFC-AGG-ID: gGhzzpaxPG280DfBI2tNsA_1773122148 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Pierrick Bouvier Subject: [PULL 04/25] tests/functional/x86_64: Disable memlock test for asan builds Date: Tue, 10 Mar 2026 06:55:09 +0100 Message-ID: <20260310055530.8893-5-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122183650158500 Content-Type: text/plain; charset="utf-8" From: Peter Maydell The address-sanitizer intercepts mlock() and makes it a no-op, because it interacts badly with the sanitizer's own use of large amounts of memory. This means that our 'memlock' test will always fail, because it checks via /proc for whether the QEMU process really locked some pages. Don't add the test when QEMU is built with asan. Suggested-by: Pierrick Bouvier Signed-off-by: Peter Maydell Reviewed-by: Thomas Huth Reviewed-by: Pierrick Bouvier Message-ID: <20260309104545.1550888-1-peter.maydell@linaro.org> Signed-off-by: Thomas Huth --- tests/functional/x86_64/meson.build | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/functional/x86_64/meson.build b/tests/functional/x86_64/= meson.build index 05e4914c772..1ed10ad6c29 100644 --- a/tests/functional/x86_64/meson.build +++ b/tests/functional/x86_64/meson.build @@ -14,13 +14,20 @@ tests_x86_64_system_quick =3D [ 'cpu_model_versions', 'cpu_queries', 'mem_addr_space', - 'memlock', 'migration', 'pc_cpu_hotplug_props', 'virtio_version', 'vmstate', ] =20 +# The address-sanitizer makes mlock() a no-op because it +# interacts badly with the sanitizer; this means the memlock +# test (which checks via /proc for whether pages were locked) +# will always fail on a sanitizer build, so don't run it. +if not get_option('asan') + tests_x86_64_system_quick +=3D [ 'memlock' ] +endif + tests_x86_64_system_thorough =3D [ 'acpi_bits', 'hotplug_blk', --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122350; cv=none; d=zohomail.com; s=zohoarc; b=kMN5z019e47IAnhYT5LoBxk/YCk3t8XawwQYeA1gN4lNYaUdwdFr2z6EouABXtoWtePIIM0Qh2hR3d2S2nV66U0pIlhMXS4ZTZsskvIiO1pmohUe93FbP6Jzv7Haly8hAmGqZ+wQW4pMkvUtw7PNksV/Jxvayc5bZ/6vvaYbKog= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122350; 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=Ogs4bblocaNqheSCLppOzU8NIefv2Fut+glTYtwfS/U=; b=DDTF8fuUmDVAN3BqDBojA4xmNqe/0wIm8xgtGdJ0EJuGhMzB/Yqs/br5e8NuBnj2X4Vrvm4WTkyiBGl4sq/+9aOciITcJiPgLgwRBz/eY0Pst6A4zdq+YB9TTgJoT3pV3l/5Ptc6HEQ3KCY6ur2/Yp7hTKXoY+kqvDKGFvpBrPY= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122350670918.4051265666908; Mon, 9 Mar 2026 22:59:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq4i-0006vt-Fn; Tue, 10 Mar 2026 01:56:12 -0400 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 ) id 1vzq4V-0006qo-7L for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:00 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq4S-0006Ed-0C for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:55:57 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-532-CXCNTeXaPqy_3kqen-tr-g-1; Tue, 10 Mar 2026 01:55:53 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 8F86A195608F; Tue, 10 Mar 2026 05:55:52 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id EFC9D1956095; Tue, 10 Mar 2026 05:55:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122155; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Ogs4bblocaNqheSCLppOzU8NIefv2Fut+glTYtwfS/U=; b=XA0vd0TsSaNYHky1NynEjjAPzryFWE/klsJ+sQVxJkx6vShS2kaklrAJxi+1gv27q1d+GF 9A6qPJj6oSj0P4q3HB8NR92RJHqE31IgixIOlpN0sdE+FRs+MZaF7AUIKak7PFw2lisQYE yMR/MDmzyCZEd+qRt6wyvmxaL/tMfuI= X-MC-Unique: CXCNTeXaPqy_3kqen-tr-g-1 X-Mimecast-MFC-AGG-ID: CXCNTeXaPqy_3kqen-tr-g_1773122152 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Peter Xu , Fabiano Rosas Subject: [PULL 05/25] tests/functional/migration: Use socket_dir Date: Tue, 10 Mar 2026 06:55:10 +0100 Message-ID: <20260310055530.8893-6-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122352032158500 From: Fabiano Rosas Use QemuBaseTest.socket_dir instead of calling tempfile directly so all tests have consistent directory prefixes. Suggested-by: Daniel P. Berrang=C3=A9 Reviewed-by: Peter Xu Reviewed-by: Thomas Huth Signed-off-by: Fabiano Rosas Message-ID: <20260303173320.10942-2-farosas@suse.de> Signed-off-by: Thomas Huth --- tests/functional/migration.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/functional/migration.py b/tests/functional/migration.py index 2bfb1f77901..0aa873edbaa 100644 --- a/tests/functional/migration.py +++ b/tests/functional/migration.py @@ -11,7 +11,6 @@ # This work is licensed under the terms of the GNU GPL, version 2 or # later. See the COPYING file in the top-level directory. =20 -import tempfile import time =20 from qemu_test import QemuSystemTest, which @@ -65,9 +64,8 @@ def migration_with_tcp_localhost(self): self.do_migrate(dest_uri) =20 def migration_with_unix(self): - with tempfile.TemporaryDirectory(prefix=3D'socket_') as socket_pat= h: - dest_uri =3D 'unix:%s/qemu-test.sock' % socket_path - self.do_migrate(dest_uri) + dest_uri =3D 'unix:%s/migration.sock' % self.socket_dir().name + self.do_migrate(dest_uri) =20 def migration_with_exec(self): if not which('ncat'): --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122279; cv=none; d=zohomail.com; s=zohoarc; b=ilhzmt9sSYR99EMxWOh1i5KCyoAkeGZUFCnLmAWCHSNM5a822s3sx7GxytL0jT1kV/gqh3QeVutqHYq+xhopxcXVOTFHDbJfBUUr7M/MgdPS0hfrhg31saCh1jJSBhKsUzMWb/4rmcO/bPmgmPjKnd968NFDq1tRnnbZD3GzRws= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122279; 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=XaWwTX4e79UezDU8mp0dRH44XdWgzzkEfNy7x/XOvU8=; b=bU0UEQz0C4uo28J1HdRGOowy3bJutGpatnDOwF4+1pb/Mpxp8U+MaDxC8h3IStBL5vwYb3Yf9Mr6Cabm75YDHNA2TkWvwuizZSBQpTlhb8+UsHFgv3YxL+6ykgQBEkic81YOY/lqZWchSB57Rk9eXFVyjK8lHcdKfVmOvdvkzmA= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122279518202.48243784600731; Mon, 9 Mar 2026 22:57:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq4o-0006zU-Dj; Tue, 10 Mar 2026 01:56:18 -0400 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 ) id 1vzq4b-0006rp-HT for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:07 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq4X-0006F0-P2 for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:03 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-321-10kEJElFMsm8wY5K6WDDag-1; Tue, 10 Mar 2026 01:55:57 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2816F1956089; Tue, 10 Mar 2026 05:55:56 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 6C0861956095; Tue, 10 Mar 2026 05:55:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122160; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XaWwTX4e79UezDU8mp0dRH44XdWgzzkEfNy7x/XOvU8=; b=Rzwm8j2el022kM9zbLxAu+FfKfFxrLGIGTzqnsvTOMVjGuMgo0BWHiHLhiTM4rz/9zik8/ /x3ma/imcP1qEg4genfpAMa3hCXGxg7bJoshYaG8bQlatQyxhm0ju30en/inggELvG0FOq 67z4ANto1ypD4c5qlk5Z4avROuJBfdM= X-MC-Unique: 10kEJElFMsm8wY5K6WDDag-1 X-Mimecast-MFC-AGG-ID: 10kEJElFMsm8wY5K6WDDag_1773122156 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Peter Xu , Fabiano Rosas Subject: [PULL 06/25] tests/functional/migration: Add migrate_vms Date: Tue, 10 Mar 2026 06:55:11 +0100 Message-ID: <20260310055530.8893-7-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.129.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122279769158500 Content-Type: text/plain; charset="utf-8" From: Fabiano Rosas Add a migration helper to MigrationTest that uses the migrate-incoming QMP command and takes the already instantiated VMs. The -incoming 'defer' command line option is preferred way instead of the -incoming URI syntax that's currently used. Suggested-by: Peter Xu Reviewed-by: Thomas Huth Reviewed-by: Peter Xu Signed-off-by: Fabiano Rosas Message-ID: <20260303173320.10942-3-farosas@suse.de> Signed-off-by: Thomas Huth --- tests/functional/migration.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/functional/migration.py b/tests/functional/migration.py index 0aa873edbaa..3362e5c743e 100644 --- a/tests/functional/migration.py +++ b/tests/functional/migration.py @@ -40,6 +40,11 @@ def assert_migration(self, src_vm, dst_vm): self.assertEqual(dst_vm.cmd('query-status')['status'], 'running') self.assertEqual(src_vm.cmd('query-status')['status'],'postmigrate= ') =20 + def migrate_vms(self, dst_uri, src_uri, dst_vm, src_vm): + dst_vm.qmp('migrate-incoming', uri=3Ddst_uri) + src_vm.qmp('migrate', uri=3Dsrc_uri) + self.assert_migration(src_vm, dst_vm) + def do_migrate(self, dest_uri, src_uri=3DNone): dest_vm =3D self.get_vm('-incoming', dest_uri, name=3D"dest-qemu") dest_vm.add_args('-nodefaults') --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122363; cv=none; d=zohomail.com; s=zohoarc; b=irtaNbO7b00FX1anTHy2Vpaw/iUxnjwAKOK+JbgPBCc6pkIPmW3FdSQ5zHHDMmcyW4QgnzBIkZXC9+ZCxUT07TdE1ZkxdJBLkr0zkZiNLPLWe8Jv4QHILQPnMwg/4fD/1CBeVrrvbbrSsHLYB+ovhnE/8W+AYtX9SAmna810lm8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122363; 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=yjGM9UUH+1EYmRPXqlMYoKPm/B/kdCrnlHuVtWSiLV4=; b=SBNaX1BH/ZIoe/SLTyfT6timCtnx6aiTU0JDMdbDDBlwH0VOlKaCKOzG11zYxe+MJkEM5s7Ry1sFybx6bgFZVhLMncvxEvkrcAxcJ8TBMhw6FyMhAbOVioz8cOlouzRUQWOzRg/7h8bsL3wMjfKGN8TrDK44pgKj+LpXPgKFaUU= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122363758537.7694295777181; Mon, 9 Mar 2026 22:59:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq4q-00075F-4Y; Tue, 10 Mar 2026 01:56:20 -0400 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 ) id 1vzq4g-0006u0-IK for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:12 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq4d-0006Fe-8I for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:09 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-471-iZm52N5-Nfqk3-xYQl1xlQ-1; Tue, 10 Mar 2026 01:56:01 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 5AD7F180035D; Tue, 10 Mar 2026 05:56:00 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 2C8051956095; Tue, 10 Mar 2026 05:55:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122166; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yjGM9UUH+1EYmRPXqlMYoKPm/B/kdCrnlHuVtWSiLV4=; b=NFnQU2HNqyCAC/H1+vHi7maFH/TW9ExzpfDwMMpYv1LXT20AYVQUZkgeSxz1ptEUJBpCsN 1f2zcPUd7/Us1D5klAzcrPPC8BmEgwhDGjw8jCDbfeXJvjKBc/R70CSA4JZIaozQFCh5MZ WWRnHfJOPQnHkj/HXMwOh+vts3Uu3r4= X-MC-Unique: iZm52N5-Nfqk3-xYQl1xlQ-1 X-Mimecast-MFC-AGG-ID: iZm52N5-Nfqk3-xYQl1xlQ_1773122160 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Peter Xu , Fabiano Rosas Subject: [PULL 07/25] tests/functional/migration: Use the migrate_vms helper Date: Tue, 10 Mar 2026 06:55:12 +0100 Message-ID: <20260310055530.8893-8-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.129.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122364075158500 Content-Type: text/plain; charset="utf-8" From: Fabiano Rosas Change do_migrate() to call the migrate_vms() helper and provide it with the two VMs already created. Rename do_migrate -> migrate and adjust the callers. While here, standardize on the "src" and "dst" names. Reviewed-by: Thomas Huth Reviewed-by: Peter Xu Signed-off-by: Fabiano Rosas Message-ID: <20260303173320.10942-4-farosas@suse.de> Signed-off-by: Thomas Huth --- tests/functional/migration.py | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/tests/functional/migration.py b/tests/functional/migration.py index 3362e5c743e..49347a30bbf 100644 --- a/tests/functional/migration.py +++ b/tests/functional/migration.py @@ -45,17 +45,19 @@ def migrate_vms(self, dst_uri, src_uri, dst_vm, src_vm): src_vm.qmp('migrate', uri=3Dsrc_uri) self.assert_migration(src_vm, dst_vm) =20 - def do_migrate(self, dest_uri, src_uri=3DNone): - dest_vm =3D self.get_vm('-incoming', dest_uri, name=3D"dest-qemu") - dest_vm.add_args('-nodefaults') - dest_vm.launch() + def migrate(self, dst_uri, src_uri=3DNone): + dst_vm =3D self.get_vm('-incoming', 'defer', name=3D"dst-qemu") + dst_vm.add_args('-nodefaults') + dst_vm.launch() + + src_vm =3D self.get_vm(name=3D"src-qemu") + src_vm.add_args('-nodefaults') + src_vm.launch() + if src_uri is None: - src_uri =3D dest_uri - source_vm =3D self.get_vm(name=3D"source-qemu") - source_vm.add_args('-nodefaults') - source_vm.launch() - source_vm.qmp('migrate', uri=3Dsrc_uri) - self.assert_migration(source_vm, dest_vm) + src_uri =3D dst_uri + + self.migrate_vms(dst_uri, src_uri, dst_vm, src_vm) =20 def _get_free_port(self, ports): port =3D ports.find_free_port() @@ -65,18 +67,18 @@ def _get_free_port(self, ports): =20 def migration_with_tcp_localhost(self): with Ports() as ports: - dest_uri =3D 'tcp:localhost:%u' % self._get_free_port(ports) - self.do_migrate(dest_uri) + dst_uri =3D 'tcp:localhost:%u' % self._get_free_port(ports) + self.migrate(dst_uri) =20 def migration_with_unix(self): - dest_uri =3D 'unix:%s/migration.sock' % self.socket_dir().name - self.do_migrate(dest_uri) + dst_uri =3D 'unix:%s/migration.sock' % self.socket_dir().name + self.migrate(dst_uri) =20 def migration_with_exec(self): if not which('ncat'): self.skipTest('ncat is not available') with Ports() as ports: free_port =3D self._get_free_port(ports) - dest_uri =3D 'exec:ncat -l localhost %u' % free_port + dst_uri =3D 'exec:ncat -l localhost %u' % free_port src_uri =3D 'exec:ncat localhost %u' % free_port - self.do_migrate(dest_uri, src_uri) + self.migrate(dst_uri, src_uri) --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122198; cv=none; d=zohomail.com; s=zohoarc; b=dopbkwzMQxb+Tm7suscAucRScqBGqlGcIuphditYKMB8iIwwvOdkoLQe8E8UxennuP5EXqyXV1MXvD+0F5GBe82o0ne1P0h9Gy/ClpgwbXDk0ECCnbwk4aqJTXyAId4udRhSBnYYGMg6RGKjMiZy/aAKwVd/l+wHXEl2JYH+NTY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122198; 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=8111Z95vjiNS3KH7D0G5EqTmKVt2OguTKCPAtweNU4A=; b=flPx+gtIcsX8YdN9yZOTlGehb3QqBPfZxSXj2o2AIbBKPYI+NmAM/y12MSYesk8axnTOxMWhOtb6YYOrOS64io+5V3mFIF4KFYfafE6fX3AK5TzM08rsq1DClOWn3Cox1j8GoHxniek5gN0UorDLnxo6Iili69wSQ8MqqhO32og= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122198977864.7110060527746; Mon, 9 Mar 2026 22:56:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq4p-000723-44; Tue, 10 Mar 2026 01:56:19 -0400 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 ) id 1vzq4i-0006vy-GG for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:12 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq4g-0006Fn-AY for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:11 -0400 Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-624-TA2DeI9UMe-EcdhVirfCwQ-1; Tue, 10 Mar 2026 01:56:06 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id D69DF1955DE2; Tue, 10 Mar 2026 05:56:04 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 407561955D87; Tue, 10 Mar 2026 05:56:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122168; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8111Z95vjiNS3KH7D0G5EqTmKVt2OguTKCPAtweNU4A=; b=dpvBVxp3+Ik6KS4x9t4NSVERelWJ7lLQ4+RJPXT9na1pDCeo0Z+yyFT3qrjY9UC2c5MJpN E7p+6fepiuqBI+FZob90V9qVeszrwa+GMjutEcvDWBXPUOMeX3fR/JttlzjpCek0c2XNzc cHRcfyQDZSviuNnDepZBVNoIrQkTl3g= X-MC-Unique: TA2DeI9UMe-EcdhVirfCwQ-1 X-Mimecast-MFC-AGG-ID: TA2DeI9UMe-EcdhVirfCwQ_1773122165 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Aditya Gupta , Fabiano Rosas , Peter Xu Subject: [PULL 08/25] tests/functional/ppc64/pseries: Remove custom migration routine Date: Tue, 10 Mar 2026 06:55:13 +0100 Message-ID: <20260310055530.8893-9-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122201842154100 Content-Type: text/plain; charset="utf-8" From: Fabiano Rosas Don't implement a custom migration routine at PpcMigrationTest and instead reuse the generic one from MigrationTest. This removes the dependency of PpcMigrationTest from PseriesMachine. Having one test import another causes unittest code to instantiate the imported test, resulting in the setup and teardown methods being invoked for the imported test class, even if no test from that class will be executed. If run in parallel, the extra setup/teardown methods that result from importing can race with the ones from the actual test being executed and cause the following error: File "/tests/functional/qemu_test/testcase.py", line 238, in tearD= own shutil.rmtree(self.workdir) ... FileNotFoundError: [Errno 2] No such file or directory: '/build/tests/functional/ppc64/.../test_migration_with_exec/scratc= h' The PseriesMachine class is changed to inherit from MigrationTest so both the migration routines and the class attributes of PseriesMachine can be accessed without the need to instantiate another object. Fixes: f4e34d0fd5 ("tests/functional: Add a OS level migration test for pse= ries") Reported-by: Aditya Gupta Reviewed-by: Thomas Huth Signed-off-by: Fabiano Rosas Reviewed-by: Peter Xu Tested-by: Aditya Gupta Message-ID: <20260303173320.10942-5-farosas@suse.de> [thuth: Remove superfluous ";" as suggested by Aditya] Signed-off-by: Thomas Huth --- tests/functional/migration.py | 5 +++++ tests/functional/ppc64/test_migration.py | 11 ----------- tests/functional/ppc64/test_pseries.py | 10 +++++----- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/tests/functional/migration.py b/tests/functional/migration.py index 49347a30bbf..e995328e833 100644 --- a/tests/functional/migration.py +++ b/tests/functional/migration.py @@ -65,6 +65,11 @@ def _get_free_port(self, ports): self.skipTest('Failed to find a free port') return port =20 + def migration_with_tcp_localhost_vms(self, dst_vm, src_vm): + with Ports() as ports: + uri =3D 'tcp:localhost:%u' % self._get_free_port(ports) + self.migrate_vms(uri, uri, dst_vm, src_vm) + def migration_with_tcp_localhost(self): with Ports() as ports: dst_uri =3D 'tcp:localhost:%u' % self._get_free_port(ports) diff --git a/tests/functional/ppc64/test_migration.py b/tests/functional/pp= c64/test_migration.py index a3b819680bc..7d49ee175bb 100755 --- a/tests/functional/ppc64/test_migration.py +++ b/tests/functional/ppc64/test_migration.py @@ -22,17 +22,6 @@ def test_migration_with_exec(self): self.set_machine('mac99') self.migration_with_exec() =20 - def do_migrate_ppc64_linux(self, source_vm, dest_vm): - with Ports() as ports: - port =3D ports.find_free_port() - if port is None: - self.skipTest('Failed to find a free port') - uri =3D 'tcp:localhost:%u' % port - - dest_vm.qmp('migrate-incoming', uri=3Duri) - source_vm.qmp('migrate', uri=3Duri) - self.assert_migration(source_vm, dest_vm) - =20 if __name__ =3D=3D '__main__': MigrationTest.main() diff --git a/tests/functional/ppc64/test_pseries.py b/tests/functional/ppc6= 4/test_pseries.py index b45763c3050..cb6d25dc816 100755 --- a/tests/functional/ppc64/test_pseries.py +++ b/tests/functional/ppc64/test_pseries.py @@ -7,11 +7,11 @@ # This work is licensed under the terms of the GNU GPL, version 2 or # later. See the COPYING file in the top-level directory. =20 -from qemu_test import QemuSystemTest, Asset +from qemu_test import Asset from qemu_test import wait_for_console_pattern -from test_migration import PpcMigrationTest +from migration import MigrationTest =20 -class PseriesMachine(QemuSystemTest): +class PseriesMachine(MigrationTest): =20 timeout =3D 90 KERNEL_COMMON_COMMAND_LINE =3D 'printk.time=3D0 console=3Dhvc0 ' @@ -116,11 +116,11 @@ def test_ppc64_linux_migration(self): wait_for_console_pattern(self, console_pattern, self.panic_message, vm=3Dsource_vm) =20 - PpcMigrationTest().do_migrate_ppc64_linux(source_vm, dest_vm); + self.migration_with_tcp_localhost_vms(dest_vm, source_vm) =20 # ensure the boot proceeds after migration wait_for_console_pattern(self, self.good_message, self.panic_messa= ge, vm=3Ddest_vm) =20 if __name__ =3D=3D '__main__': - QemuSystemTest.main() + MigrationTest.main() --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122287; cv=none; d=zohomail.com; s=zohoarc; b=HkfT6M8/CmYgS2SQq5q24teIk1ffkpPJsmTdkIaeNtpdG9djrsqHwtz4BUMdCCFR9PFdJAP6HLv7iZOSmbxzPcW3sUFf0gIwQ73zjvSBVQk2l3ICu4x87R4XK3KmzloS8O0fjeQMaXLuwR+ciFdVbKFDrJbLIUPaOcBCBZqp6Cs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122287; 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=XxNM4HxmyRO4tl1AAMVyqRynDOBYCCwt8hKcbfgbSwA=; b=J1aw7WfmGmwEnwTO17elMxt0lrwkyDUOQ92K8eS1iZCxExM10OTHJBjJVpyShKwF1+HdmWsenE4iefjQ/LZzczSree80+9X5ocofcK8knSP84dc1jLXqKTvwT+6kgatTipeIzyIKWmmhidQx50aVVgvJDGBz6Nd1Jv269lDT4wA= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122287728548.1399963980577; Mon, 9 Mar 2026 22:58:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq4s-00076P-F6; Tue, 10 Mar 2026 01:56:22 -0400 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 ) id 1vzq4m-0006xY-Bv for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:18 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq4k-0006GJ-JI for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:15 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-192-YVYWn2JpNgm4SiCmA_K8Tw-1; Tue, 10 Mar 2026 01:56:10 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 50B5A18005B2; Tue, 10 Mar 2026 05:56:09 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id A37A21956095; Tue, 10 Mar 2026 05:56:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122174; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XxNM4HxmyRO4tl1AAMVyqRynDOBYCCwt8hKcbfgbSwA=; b=R37F4SxAjzGBxFh+LeCwce48I9ApEZIczZsuRkvQ9usQghgrtSG6kWIiz72boJwfOOzoPx ZK0Kr18pIn52oxztM0gs8GrUcj0FLcX7pl11in03ClakCcUK93EE6t7wmiQEMDzkIYTFkR q9MC8FsdAHxVCMiBju5nMS/sD3sO9RQ= X-MC-Unique: YVYWn2JpNgm4SiCmA_K8Tw-1 X-Mimecast-MFC-AGG-ID: YVYWn2JpNgm4SiCmA_K8Tw_1773122169 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Eric Farman , Farhan Ali , Jared Rossi Subject: [PULL 09/25] pc-bios/s390-ccw: Fix misattributed function prototypes Date: Tue, 10 Mar 2026 06:55:14 +0100 Message-ID: <20260310055530.8893-10-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122288692154100 Content-Type: text/plain; charset="utf-8" From: Jared Rossi The virtio-blkdev functions are incorrectly listed in s390-ccw.h as belongi= ng to virtio.c. Additionally, virtio_load_direct() has an unused subchan_id argu= ment. Remove the unused argument and move the prototypes to virtio.h so that they= are independent from the CCW bus. Reviewed-by: Thomas Huth Reviewed-by: Eric Farman Reviewed-by: Farhan Ali Signed-off-by: Jared Rossi Message-ID: <20260309003601.242634-2-jrossi@linux.ibm.com> Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/s390-ccw.h | 4 ---- pc-bios/s390-ccw/virtio.h | 7 +++++++ pc-bios/s390-ccw/bootmap.c | 2 +- pc-bios/s390-ccw/virtio-blkdev.c | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index b1dc35cdedf..47ea66bd4d1 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -67,11 +67,7 @@ void sclp_get_loadparm_ascii(char *loadparm); int sclp_read(char *str, size_t count); =20 /* virtio.c */ -unsigned long virtio_load_direct(unsigned long rec_list1, unsigned long re= c_list2, - unsigned long subchan_id, void *load_addr= ); bool virtio_is_supported(SubChannelId schid); -int virtio_blk_setup_device(SubChannelId schid); -int virtio_read(unsigned long sector, void *load_addr); =20 /* bootmap.c */ void zipl_load(void); diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h index 5c5e808a500..597bd423586 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -277,7 +277,14 @@ int virtio_run(VDev *vdev, int vqid, VirtioCmd *cmd); int virtio_reset(VDev *vdev); int virtio_setup_ccw(VDev *vdev); =20 +/* virtio-net.c */ int virtio_net_init(void *mac_addr); void virtio_net_deinit(void); =20 +/* virtio-blkdev.c */ +int virtio_blk_setup_device(SubChannelId schid); +int virtio_read(unsigned long sector, void *load_addr); +unsigned long virtio_load_direct(unsigned long rec_list1, unsigned long re= c_list2, + void *load_addr); + #endif /* VIRTIO_H */ diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 0f8baa01985..420ee32eff8 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -662,7 +662,7 @@ static int zipl_load_segment(ComponentEntry *entry) */ break; } - address =3D virtio_load_direct(cur_desc[0], cur_desc[1], 0, + address =3D virtio_load_direct(cur_desc[0], cur_desc[1], (void *)address); if (!address) { puts("zIPL load segment failed"); diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blk= dev.c index 7b2d1e20f4d..4b819dd80fb 100644 --- a/pc-bios/s390-ccw/virtio-blkdev.c +++ b/pc-bios/s390-ccw/virtio-blkdev.c @@ -64,7 +64,7 @@ int virtio_read_many(unsigned long sector, void *load_add= r, int sec_num) } =20 unsigned long virtio_load_direct(unsigned long rec_list1, unsigned long re= c_list2, - unsigned long subchan_id, void *load_addr) + void *load_addr) { u8 status; int sec =3D rec_list1; --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122309; cv=none; d=zohomail.com; s=zohoarc; b=HI35yOfBpJ71LDQeym0w+sN2re3whclJErsSybl8FhVFophamJEVqKYDm4UkkMaLO9cWlT3JGY7niIRr9imOWggSaYgbeNISo8f2SoB/s7zYnatlhpOvN904F/LCMVbk1Q7hcUuhvGYgSg4DMyR7ayINscx0tgjtzPREBUbmUns= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122309; 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=YKUDv+C4AC+5FOzoo+6Mo8xYxvLGt2HVce4C3xeF4R4=; b=K7otIMCmXO0HABFPbP8V1EoIsdoIROGNdoA5iG3ufIw7gLA6DAjyaO4pQGkFWC4vLQup8maQ6GCoJVOWBpI2KJY+UcHD26XklrcOgsLmFIdYiwEqDwVWF3yvO3oS2HlfGVFwwKfMmuNuZ5NAXU4L5FqWFzphai8PBPwbaQgEoTE= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122309894598.9602624384937; Mon, 9 Mar 2026 22:58:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq4s-000761-Dk; Tue, 10 Mar 2026 01:56:22 -0400 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 ) id 1vzq4p-00074C-EK for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:19 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq4n-0006Gc-VQ for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:19 -0400 Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-306-T4BmmDTONhq59xSzFFr_gw-1; Tue, 10 Mar 2026 01:56:14 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 8D49E195609F; Tue, 10 Mar 2026 05:56:13 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 362351956095; Tue, 10 Mar 2026 05:56:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122177; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YKUDv+C4AC+5FOzoo+6Mo8xYxvLGt2HVce4C3xeF4R4=; b=K/tBJzSFva2mTjh5Kp/F7wafHS20xjfM8eEa6t7kfQ/0Krmcym6dHPx5S7ptz32vjaNFgX SNzzMT7nlMewEIwqIfbNx/daJnsE0px+N7uTOee6S/synxl7bcpZcBgrmw8KTglsKqbDQH RdNgXZC3DaCK4GOUadB+z+35xvf2WF8= X-MC-Unique: T4BmmDTONhq59xSzFFr_gw-1 X-Mimecast-MFC-AGG-ID: T4BmmDTONhq59xSzFFr_gw_1773122173 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Eric Farman , Farhan Ali , Jared Rossi Subject: [PULL 10/25] pc-bios/s390-ccw: Remove redundant vring schid attribute Date: Tue, 10 Mar 2026 06:55:15 +0100 Message-ID: <20260310055530.8893-11-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122311051154100 Content-Type: text/plain; charset="utf-8" From: Jared Rossi The schid is already stored as an attribute of the VDev itself and any other instances are copies of this same value. To avoid CCW specific attributes = in the VRing let's just access the existing VDev schid attribute as needed. Reviewed-by: Thomas Huth Reviewed-by: Eric Farman Reviewed-by: Farhan Ali Signed-off-by: Jared Rossi Message-ID: <20260309003601.242634-3-jrossi@linux.ibm.com> Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/virtio.h | 3 +-- pc-bios/s390-ccw/virtio-blkdev.c | 2 +- pc-bios/s390-ccw/virtio-net.c | 2 +- pc-bios/s390-ccw/virtio.c | 9 ++++----- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h index 597bd423586..06ba4e45aca 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -103,7 +103,6 @@ struct VRing { VRingDesc *desc; VRingAvail *avail; VRingUsed *used; - SubChannelId schid; long cookie; int id; }; @@ -269,7 +268,7 @@ struct VirtioCmd { typedef struct VirtioCmd VirtioCmd; =20 bool vring_notify(VRing *vr); -int drain_irqs(SubChannelId schid); +int drain_irqs(void); void vring_send_buf(VRing *vr, void *p, int len, int flags); int vr_poll(VRing *vr); int vring_wait_reply(void); diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blk= dev.c index 4b819dd80fb..019c2718b18 100644 --- a/pc-bios/s390-ccw/virtio-blkdev.c +++ b/pc-bios/s390-ccw/virtio-blkdev.c @@ -42,7 +42,7 @@ static int virtio_blk_read_many(VDev *vdev, unsigned long= sector, void *load_add /* Now we can tell the host to read */ vring_wait_reply(); =20 - if (drain_irqs(vr->schid)) { + if (drain_irqs()) { /* Well, whatever status is supposed to contain... */ status =3D 1; } diff --git a/pc-bios/s390-ccw/virtio-net.c b/pc-bios/s390-ccw/virtio-net.c index 301445bf978..7eb08500695 100644 --- a/pc-bios/s390-ccw/virtio-net.c +++ b/pc-bios/s390-ccw/virtio-net.c @@ -88,7 +88,7 @@ int send(int fd, const void *buf, int len, int flags) while (!vr_poll(txvq)) { yield(); } - if (drain_irqs(txvq->schid)) { + if (drain_irqs()) { puts("send: drain irqs failed"); return -1; } diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index cd6c99c7e32..f384a990dcc 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -72,14 +72,14 @@ static long virtio_notify(SubChannelId schid, int vq_id= x, long cookie) * Virtio functions * ***********************************************/ =20 -int drain_irqs(SubChannelId schid) +int drain_irqs(void) { Irb irb =3D {}; int r =3D 0; =20 while (1) { /* FIXME: make use of TPI, for that enable subchannel and isc */ - if (tsch(schid, &irb)) { + if (tsch(vdev.schid, &irb)) { /* Might want to differentiate error codes later on. */ if (irb.scsw.cstat) { r =3D -EIO; @@ -134,7 +134,7 @@ static void vring_init(VRing *vr, VqInfo *info) =20 bool vring_notify(VRing *vr) { - vr->cookie =3D virtio_notify(vr->schid, vr->id, vr->cookie); + vr->cookie =3D virtio_notify(vdev.schid, vr->id, vr->cookie); return vr->cookie >=3D 0; } =20 @@ -211,7 +211,7 @@ int virtio_run(VDev *vdev, int vqid, VirtioCmd *cmd) } while (cmd[i++].flags & VRING_DESC_F_NEXT); =20 vring_wait_reply(); - if (drain_irqs(vr->schid)) { + if (drain_irqs()) { return -1; } return 0; @@ -316,7 +316,6 @@ int virtio_setup_ccw(VDev *vdev) } info.num =3D config.num; vring_init(&vdev->vrings[i], &info); - vdev->vrings[i].schid =3D vdev->schid; if (run_ccw(vdev, CCW_CMD_SET_VQ, &info, sizeof(info), false)) { puts("Cannot set VQ info"); return -EIO; --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122214; cv=none; d=zohomail.com; s=zohoarc; b=YfHzRPecGNWbd3NT7qx5a9Q/vf6R7P2BTeb8rW2jV2GunlJI2Rkpovvl/TpFWpy4rmZiZmqu81sPkT4OXAwUtxy9BlS0UV/k+grLSNIO34ImVxtyauL8lVhXF88+624OToeUxKqNrV62ja/n5LpwxJhTIanErlGi4nE72snJiNI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122214; 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=ftpatxVcTbaPWqBv0oP7QiODJ+3FEudFxTlI69xOzzU=; b=PTV8sQWcLlnVq8BZl3gmAgaLBQcTUfHCkd4+3DyBrbPzLLM6twb3PrzN6lx3T5Ho1yGBy7SmtcAbSGmcMDqnpPV/it7DZwHXbrRO0BUAAbmBmrgKh4vouvVtWfNftxcea/OrvDlDaTuoQEzqbH0t2UGg6RpwlzyNPtXAPEV7zFI= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122214073891.4654913722637; Mon, 9 Mar 2026 22:56:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq4w-0007DK-Pj; Tue, 10 Mar 2026 01:56:26 -0400 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 ) id 1vzq4u-0007CK-J8 for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:24 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq4q-0006H1-Qr for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:23 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-376-_O_fCW9vM72NGWFaK5yOzw-1; Tue, 10 Mar 2026 01:56:18 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 675AB180049D; Tue, 10 Mar 2026 05:56:17 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 8E2011955D87; Tue, 10 Mar 2026 05:56:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122180; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ftpatxVcTbaPWqBv0oP7QiODJ+3FEudFxTlI69xOzzU=; b=QBXIli4rGbiQi3RJS3QriTKJqd8vOPRPZsNRvi93mww9joUAyr4Ysz4HaAqte9U2zUlsoN RduvpicD0vNpGnKsNKLGjXdT9x+xECzo4grzyzRKSmxG4K09VqbpV4Ji2gSr+KqK/Hby/d 3BW+OMTy2L+M7oNAOh51HTgMbz+2esU= X-MC-Unique: _O_fCW9vM72NGWFaK5yOzw-1 X-Mimecast-MFC-AGG-ID: _O_fCW9vM72NGWFaK5yOzw_1773122177 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Eric Farman , Jared Rossi Subject: [PULL 11/25] pc-bios/s390-ccw: Always reset virtio device on failed boot attempt Date: Tue, 10 Mar 2026 06:55:16 +0100 Message-ID: <20260310055530.8893-12-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122215571154100 Content-Type: text/plain; charset="utf-8" From: Jared Rossi The virtio spec necessitates that live virtqueues must not be altered. Res= et the failed device so that the queues are not live before we attempt to boot= any fallback devices. Reviewed-by: Thomas Huth Reviewed-by: Eric Farman Signed-off-by: Jared Rossi Message-ID: <20260309003601.242634-4-jrossi@linux.ibm.com> Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 76bf743900c..8e2c99bee13 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -277,7 +277,8 @@ static void ipl_boot_device(void) break; case CU_TYPE_VIRTIO: if (virtio_setup() =3D=3D 0) { - zipl_load(); + zipl_load(); /* only return on error */ + virtio_reset(virtio_get_device()); } break; default: --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122274; cv=none; d=zohomail.com; s=zohoarc; b=msShI5CnJoLQijRargWm0mfmPjyrj7hGKAiGvKTk0Hon1sspCyJ7MM095BMXimAGpl/xQuAlDPqWTe1MtGe2rVk4w4IBHY29N0HpXCe8nFnBJxSPTuzItthKivQj6PJXSND6d9P9571ReE4bHcKqJjzRlI8/jqguNVdE/M9yJBc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122274; 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=wlFFomUU0KYOnMpq3yQ4LmNW3UDXKMKW6eMP4G4s9Gk=; b=JImo1li8gvNflAnhyuF7JQuqbWHtRjZ30iLYhMmKWteDbDAphlj2Qu5OmEOqGDW2lIHIZwXqpRMZB/k287uhgUzjB03WvXkyLzDY8hM2RpF6hgTfoEKhfg26HhRXxbuhy0u5rihrMt43Ag41ic7+6zE/AKBt2o+qZ8An6EmXJzo= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122274415390.13689040274164; Mon, 9 Mar 2026 22:57:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq4y-0007E5-1E; Tue, 10 Mar 2026 01:56:28 -0400 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 ) id 1vzq4w-0007DL-P7 for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:26 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq4u-0006HF-PK for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:26 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-587-OSp7BOFENh6WsBLNbSC97g-1; Tue, 10 Mar 2026 01:56:21 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id B7C8C19560A3; Tue, 10 Mar 2026 05:56:20 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 651AC1956095; Tue, 10 Mar 2026 05:56:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122184; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wlFFomUU0KYOnMpq3yQ4LmNW3UDXKMKW6eMP4G4s9Gk=; b=f/J2XnxHkGTa2xsbvFAtVuRLIUq5FKgt4oaumCsyYq8fcbg54w+eQsbJBfoIh6XMgeMdj5 t84Eyr+pox0cQyJhHT3T3J1nEdBrv8xbwYDN9ypIJlR+ynbPF+sLQUYKvtRYKCGPIGuOGw BI0QzcfC7H7RgiKB+D5StlRCf4M8pE8= X-MC-Unique: OSp7BOFENh6WsBLNbSC97g-1 X-Mimecast-MFC-AGG-ID: OSp7BOFENh6WsBLNbSC97g_1773122180 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Jared Rossi Subject: [PULL 12/25] s390x: Remove duplicate definitions of IPL types Date: Tue, 10 Mar 2026 06:55:17 +0100 Message-ID: <20260310055530.8893-13-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.129.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122280907158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Remove the duplicate definitions from hw/s390x/ipl.h and pc-bios/s390-ccw/i= plb.h and add a shared definition. The new definition is an enum to enforce defa= ult handling in switches. Because the IPL type is determined by the IPLB, and because an IPLB is not strictly necessary, the IPL type is set to a default value if not otherwise specified. A default IPL type is required so future functionality may add IPL new bus and/or device types that dictate specific behavior during IPL. Reviewed-by: Thomas Huth Signed-off-by: Jared Rossi Message-ID: <20260309003601.242634-5-jrossi@linux.ibm.com> Signed-off-by: Thomas Huth --- hw/s390x/ipl.h | 5 ----- include/hw/s390x/ipl/qipl.h | 10 ++++++++++ pc-bios/s390-ccw/iplb.h | 4 ---- pc-bios/s390-ccw/virtio.h | 1 + pc-bios/s390-ccw/main.c | 14 ++++++++++---- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h index 086e57681c2..c542d30ce2d 100644 --- a/hw/s390x/ipl.h +++ b/hw/s390x/ipl.h @@ -103,11 +103,6 @@ QEMU_BUILD_BUG_MSG(offsetof(S390IPLState, iplb) & 3, "= alignment of iplb wrong"); #define DIAG308_PV_STORE 9 #define DIAG308_PV_START 10 =20 -#define S390_IPL_TYPE_FCP 0x00 -#define S390_IPL_TYPE_CCW 0x02 -#define S390_IPL_TYPE_PV 0x05 -#define S390_IPL_TYPE_QEMU_SCSI 0xff - #define S390_IPLB_HEADER_LEN 8 #define S390_IPLB_MIN_PV_LEN 148 #define S390_IPLB_MIN_CCW_LEN 200 diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index 6824391111c..6dc12dd859f 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -20,6 +20,16 @@ #define LOADPARM_LEN 8 #define NO_LOADPARM "\0\0\0\0\0\0\0\0" =20 +enum S390IplType { + S390_IPL_TYPE_FCP =3D 0x00, + S390_IPL_TYPE_CCW =3D 0x02, + S390_IPL_TYPE_PV =3D 0x05, + S390_IPL_TYPE_QEMU_SCSI =3D 0xff +}; +typedef enum S390IplType S390IplType; + +#define QEMU_DEFAULT_IPL S390_IPL_TYPE_CCW + /* * The QEMU IPL Parameters will be stored at absolute address * 204 (0xcc) which means it is 32-bit word aligned but not diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h index 08f259ff319..926e8eed5d4 100644 --- a/pc-bios/s390-ccw/iplb.h +++ b/pc-bios/s390-ccw/iplb.h @@ -23,10 +23,6 @@ extern QemuIplParameters qipl; extern IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE))); extern bool have_iplb; =20 -#define S390_IPL_TYPE_FCP 0x00 -#define S390_IPL_TYPE_CCW 0x02 -#define S390_IPL_TYPE_QEMU_SCSI 0xff - static inline bool manage_iplb(IplParameterBlock *iplb, bool store) { register unsigned long addr asm("0") =3D (unsigned long) iplb; diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h index 06ba4e45aca..391d6ff2f7f 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -238,6 +238,7 @@ struct VDev { VirtioGDN guessed_disk_nature; SubChannelId schid; SenseId senseid; + S390IplType ipl_type; union { VirtioBlkConfig blk; VirtioScsiConfig scsi; diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 8e2c99bee13..2e9261904fa 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -149,7 +149,7 @@ static bool find_subch(int dev_no) return false; } =20 -static void menu_setup(void) +static void menu_setup(VDev *vdev) { if (memcmp(loadparm_str, LOADPARM_PROMPT, LOADPARM_LEN) =3D=3D 0) { menu_set_parms(QIPL_FLAG_BM_OPTS_CMD, 0); @@ -162,11 +162,13 @@ static void menu_setup(void) return; } =20 - switch (iplb.pbt) { + switch (vdev->ipl_type) { case S390_IPL_TYPE_CCW: case S390_IPL_TYPE_QEMU_SCSI: menu_set_parms(qipl.qipl_flags & BOOT_MENU_FLAG_MASK, qipl.boot_menu_timeout); + /* fall through */ + default: return; } } @@ -190,6 +192,7 @@ static void css_setup(void) static void boot_setup(void) { char lpmsg[] =3D "LOADPARM=3D[________]\n"; + VDev *vdev =3D virtio_get_device(); =20 if (have_iplb && memcmp(iplb.loadparm, NO_LOADPARM, LOADPARM_LEN) !=3D= 0) { ebcdic_to_ascii((char *) iplb.loadparm, loadparm_str, LOADPARM_LEN= ); @@ -198,7 +201,10 @@ static void boot_setup(void) } =20 if (have_iplb) { - menu_setup(); + vdev->ipl_type =3D iplb.pbt; + menu_setup(vdev); + } else { + vdev->ipl_type =3D QEMU_DEFAULT_IPL; } =20 memcpy(lpmsg + 10, loadparm_str, 8); @@ -216,7 +222,7 @@ static bool find_boot_device(void) VDev *vdev =3D virtio_get_device(); bool found =3D false; =20 - switch (iplb.pbt) { + switch (vdev->ipl_type) { case S390_IPL_TYPE_CCW: vdev->scsi_device_selected =3D false; debug_print_int("device no. ", iplb.ccw.devno); --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122206; cv=none; d=zohomail.com; s=zohoarc; b=FR/akHyfUbWBNiTwrR5Mzd50XUEWiDplh7l2PSIoquOu+udselT1mQfzoYEe2FNLtdnVpyddRMwGgEGxnZu5pdJ0rcSjtC2yMhqqWe0KhlkfEx1Yf1o74SO/8ehytzTZZKOStX8h9xnA0Ge1lHer9mjy0O+M6ww6AWttg5Fx4Lg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122206; 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=GzRlD3koEkgv0kcLtoseIS7ngMhyZRhlcGARDho+TsY=; b=P4NqN53hZs3MdMT7jrZXMvTIQeYKoXvO2YPGtxFSnWwTRBrvJJ45W3K0VnF7SRXN2MLOCD2yqVEughSO25bubWqWqce/wjlu/U7vgKnSRwHVx3U/5473ecFutVMDXEw0gWQbhpPZ7f7Qi3RVjRpJH09eqaiR6Lzy+ArApWzhlmY= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122206721641.0596523984431; Mon, 9 Mar 2026 22:56:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq5B-0007bX-5t; Tue, 10 Mar 2026 01:56:43 -0400 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 ) id 1vzq54-0007Ph-Dj for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:35 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq52-0006Hp-Ox for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:34 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-253-A1v8LBoONmqhUHPa1McOZg-1; Tue, 10 Mar 2026 01:56:25 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id CD8B0180034E; Tue, 10 Mar 2026 05:56:24 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id B59731955D87; Tue, 10 Mar 2026 05:56:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122192; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GzRlD3koEkgv0kcLtoseIS7ngMhyZRhlcGARDho+TsY=; b=VOTpHhanCciM5JJnnhv9MRdP5BaV3Ju4XY1jfIF/DcQykIddHfLGGAt2FHOFT22UCPha9S m3XDXAsPCa6EXKBbdWoEieVvz0jT5bAeFUaahE5eCCRK/p4QSc4b+bxrayl1pRSzVuLgQP AlilfTyxbgmp2Hq7e6gwyTLx5hEbIkw= X-MC-Unique: A1v8LBoONmqhUHPa1McOZg-1 X-Mimecast-MFC-AGG-ID: A1v8LBoONmqhUHPa1McOZg_1773122184 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Farhan Ali , Jared Rossi Subject: [PULL 13/25] pc-bios/s390-ccw: Store device type independent of sense data Date: Tue, 10 Mar 2026 06:55:18 +0100 Message-ID: <20260310055530.8893-14-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.129.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122209510154100 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Store the device type (e.g. block) directly as an attribute of the VDev rat= her than assume all devices can be identified by accessing CCW specific sense d= ata. Reviewed-by: Thomas Huth Reviewed-by: Farhan Ali Signed-off-by: Jared Rossi Message-ID: <20260309003601.242634-6-jrossi@linux.ibm.com> Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/virtio.h | 1 + pc-bios/s390-ccw/main.c | 2 +- pc-bios/s390-ccw/virtio-blkdev.c | 39 +++++++++++++++++++------------- pc-bios/s390-ccw/virtio.c | 11 ++++++--- 4 files changed, 33 insertions(+), 20 deletions(-) diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h index 391d6ff2f7f..39b507b2219 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -239,6 +239,7 @@ struct VDev { SubChannelId schid; SenseId senseid; S390IplType ipl_type; + VirtioDevType dev_type; union { VirtioBlkConfig blk; VirtioScsiConfig scsi; diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 2e9261904fa..64bde497103 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -251,7 +251,7 @@ static int virtio_setup(void) vdev->is_cdrom =3D false; int ret; =20 - switch (vdev->senseid.cu_model) { + switch (vdev->dev_type) { case VIRTIO_ID_NET: puts("Network boot device detected"); return 0; diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blk= dev.c index 019c2718b18..9cc40e9108d 100644 --- a/pc-bios/s390-ccw/virtio-blkdev.c +++ b/pc-bios/s390-ccw/virtio-blkdev.c @@ -53,14 +53,14 @@ int virtio_read_many(unsigned long sector, void *load_a= ddr, int sec_num) { VDev *vdev =3D virtio_get_device(); =20 - switch (vdev->senseid.cu_model) { + switch (vdev->dev_type) { case VIRTIO_ID_BLOCK: return virtio_blk_read_many(vdev, sector, load_addr, sec_num); case VIRTIO_ID_SCSI: return virtio_scsi_read_many(vdev, sector, load_addr, sec_num); + default: + return -1; } - - return -1; } =20 unsigned long virtio_load_direct(unsigned long rec_list1, unsigned long re= c_list2, @@ -119,7 +119,7 @@ void virtio_assume_iso9660(void) { VDev *vdev =3D virtio_get_device(); =20 - switch (vdev->senseid.cu_model) { + switch (vdev->dev_type) { case VIRTIO_ID_BLOCK: vdev->guessed_disk_nature =3D VIRTIO_GDN_SCSI; vdev->config.blk.blk_size =3D VIRTIO_ISO_BLOCK_SIZE; @@ -129,6 +129,8 @@ void virtio_assume_iso9660(void) case VIRTIO_ID_SCSI: vdev->scsi_block_size =3D VIRTIO_ISO_BLOCK_SIZE; break; + default: + return; } } =20 @@ -139,13 +141,15 @@ void virtio_assume_eckd(void) vdev->guessed_disk_nature =3D VIRTIO_GDN_DASD; vdev->blk_factor =3D 1; vdev->config.blk.physical_block_exp =3D 0; - switch (vdev->senseid.cu_model) { + switch (vdev->dev_type) { case VIRTIO_ID_BLOCK: vdev->config.blk.blk_size =3D VIRTIO_DASD_DEFAULT_BLOCK_SIZE; break; case VIRTIO_ID_SCSI: vdev->config.blk.blk_size =3D vdev->scsi_block_size; break; + default: + break; } vdev->config.blk.geometry.heads =3D 15; vdev->config.blk.geometry.sectors =3D @@ -162,50 +166,52 @@ bool virtio_ipl_disk_is_valid(void) return true; } =20 - return (vdev->senseid.cu_model =3D=3D VIRTIO_ID_BLOCK || - vdev->senseid.cu_model =3D=3D VIRTIO_ID_SCSI) && - blksize >=3D 512 && blksize <=3D 4096; + return (vdev->dev_type =3D=3D VIRTIO_ID_BLOCK || vdev->dev_type =3D=3D= VIRTIO_ID_SCSI) + && blksize >=3D 512 && blksize <=3D 4096; } =20 int virtio_get_block_size(void) { VDev *vdev =3D virtio_get_device(); =20 - switch (vdev->senseid.cu_model) { + switch (vdev->dev_type) { case VIRTIO_ID_BLOCK: return vdev->config.blk.blk_size; case VIRTIO_ID_SCSI: return vdev->scsi_block_size; + default: + return 0; } - return 0; } =20 uint8_t virtio_get_heads(void) { VDev *vdev =3D virtio_get_device(); =20 - switch (vdev->senseid.cu_model) { + switch (vdev->dev_type) { case VIRTIO_ID_BLOCK: return vdev->config.blk.geometry.heads; case VIRTIO_ID_SCSI: return vdev->guessed_disk_nature =3D=3D VIRTIO_GDN_DASD ? vdev->config.blk.geometry.heads : 255; + default: + return 0; } - return 0; } =20 uint8_t virtio_get_sectors(void) { VDev *vdev =3D virtio_get_device(); =20 - switch (vdev->senseid.cu_model) { + switch (vdev->dev_type) { case VIRTIO_ID_BLOCK: return vdev->config.blk.geometry.sectors; case VIRTIO_ID_SCSI: return vdev->guessed_disk_nature =3D=3D VIRTIO_GDN_DASD ? vdev->config.blk.geometry.sectors : 63; + default: + return 0; } - return 0; } =20 uint64_t virtio_get_blocks(void) @@ -213,13 +219,14 @@ uint64_t virtio_get_blocks(void) VDev *vdev =3D virtio_get_device(); const uint64_t factor =3D virtio_get_block_size() / VIRTIO_SECTOR_SIZE; =20 - switch (vdev->senseid.cu_model) { + switch (vdev->dev_type) { case VIRTIO_ID_BLOCK: return vdev->config.blk.capacity / factor; case VIRTIO_ID_SCSI: return vdev->scsi_last_block / factor; + default: + return 0; } - return 0; } =20 int virtio_blk_setup_device(SubChannelId schid) diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index f384a990dcc..5dd407d5c9b 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -41,7 +41,7 @@ VDev *virtio_get_device(void) =20 VirtioDevType virtio_get_device_type(void) { - return vdev.senseid.cu_model; + return vdev.dev_type; } =20 /* virtio spec v1.0 para 4.3.3.2 */ @@ -248,7 +248,7 @@ int virtio_setup_ccw(VDev *vdev) return -EIO; } =20 - switch (vdev->senseid.cu_model) { + switch (vdev->dev_type) { case VIRTIO_ID_NET: vdev->nr_vqs =3D 2; vdev->cmd_vr_idx =3D 0; @@ -346,12 +346,17 @@ bool virtio_is_supported(SubChannelId schid) true)) { return false; } + + vdev.dev_type =3D vdev.senseid.cu_model; + if (vdev.senseid.cu_type =3D=3D 0x3832) { - switch (vdev.senseid.cu_model) { + switch (vdev.dev_type) { case VIRTIO_ID_BLOCK: case VIRTIO_ID_SCSI: case VIRTIO_ID_NET: return true; + default: + return false; } } return false; --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122281; cv=none; d=zohomail.com; s=zohoarc; b=Gz384kvZunz2dvMCABynMJBd6WrEzzmJvUrR84llTXeOFipQ+akAPOy0ILljCnvj9PLDYI+Kom1GKEoQrpz8MT7p9hwm1vhMgvrr0vSyIChLCEVOm+Xlx9I9/RAbp4VtirP3X6y+HpGRuPjfGnSp84NaL6SoDLH7fMWM1Rgzq/g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122281; 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=HXGNzHxfp7OfEEquk/AV/OYBc9XJTNdGZ4Ue2dXBgms=; b=LQYi9Y/xjZEK9C4Zitho+jp5GUISH9Z3qHPmkC+HgDx5v1Fejtfxz5UODVIfKIQrqmQySrwuKD+cEmGQ9i2IRodSGzyro7v7ilfOOsEfhNrzKeXSbbDNISoy/FOAt0H9IGoZWRvX8vHl9mtAFS+0OykIr8/6eJmjkismng0L7wo= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122281836880.5535818100515; Mon, 9 Mar 2026 22:58:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq5J-0008AH-04; Tue, 10 Mar 2026 01:56:49 -0400 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 ) id 1vzq59-0007Zs-TU for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:41 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq57-0006I4-5Y for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:39 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-261-wNFbpv8uPrmKC2F6tISJxg-1; Tue, 10 Mar 2026 01:56:31 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2E36818005B8; Tue, 10 Mar 2026 05:56:29 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id CBAA21956095; Tue, 10 Mar 2026 05:56:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122195; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HXGNzHxfp7OfEEquk/AV/OYBc9XJTNdGZ4Ue2dXBgms=; b=GLCCDWrKpbK5E7kqeLBudUfV8hLzoDRFZiuaDxF13WWsgwHBMIzzMAGXJ70566lS+s+aQe Y2sdRrjAunTYUs15EBKSiNqmdJ6tJM4B1PHa/Kh1IVQm8PioHHMLmLzkKO7ep2wAzHS7am m3FdBe1hd1LzI/PZanBNI32zfUHjpS8= X-MC-Unique: wNFbpv8uPrmKC2F6tISJxg-1 X-Mimecast-MFC-AGG-ID: wNFbpv8uPrmKC2F6tISJxg_1773122189 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Eric Farman , Jared Rossi Subject: [PULL 14/25] pc-bios/s390-ccw: Split virtio-ccw and generic virtio Date: Tue, 10 Mar 2026 06:55:19 +0100 Message-ID: <20260310055530.8893-15-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.129.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122283896158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Separate the CCW specific virtio routines and create generic wrappers for e= asier reuse of existing virtio functions with non-CCW devices. Reviewed-by: Thomas Huth Reviewed-by: Eric Farman Signed-off-by: Jared Rossi Message-ID: <20260309003601.242634-7-jrossi@linux.ibm.com> [thuth: Use SPDX license identifier in virtio-ccw.c] Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/s390-ccw.h | 3 - pc-bios/s390-ccw/virtio-ccw.h | 24 ++++ pc-bios/s390-ccw/virtio-scsi.h | 2 +- pc-bios/s390-ccw/virtio.h | 5 +- pc-bios/s390-ccw/main.c | 8 +- pc-bios/s390-ccw/netmain.c | 2 +- pc-bios/s390-ccw/virtio-blkdev.c | 15 +- pc-bios/s390-ccw/virtio-ccw.c | 239 +++++++++++++++++++++++++++++++ pc-bios/s390-ccw/virtio-net.c | 3 +- pc-bios/s390-ccw/virtio-scsi.c | 8 +- pc-bios/s390-ccw/virtio.c | 239 ++++++------------------------- pc-bios/s390-ccw/Makefile | 3 +- 12 files changed, 330 insertions(+), 221 deletions(-) create mode 100644 pc-bios/s390-ccw/virtio-ccw.h create mode 100644 pc-bios/s390-ccw/virtio-ccw.c diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index 47ea66bd4d1..ccd68ff0a4b 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -66,9 +66,6 @@ void sclp_setup(void); void sclp_get_loadparm_ascii(char *loadparm); int sclp_read(char *str, size_t count); =20 -/* virtio.c */ -bool virtio_is_supported(SubChannelId schid); - /* bootmap.c */ void zipl_load(void); =20 diff --git a/pc-bios/s390-ccw/virtio-ccw.h b/pc-bios/s390-ccw/virtio-ccw.h new file mode 100644 index 00000000000..a506767eaa8 --- /dev/null +++ b/pc-bios/s390-ccw/virtio-ccw.h @@ -0,0 +1,24 @@ +/* + * Virtio definitions for CCW devices + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef VIRTIO_CCW_H +#define VIRTIO_CCW_H + +/* main.c */ +extern SubChannelId blk_schid; + +/* virtio-ccw.c */ +int drain_irqs_ccw(SubChannelId schid); +bool virtio_ccw_is_supported(VDev *vdev); +int virtio_ccw_run(VDev *vdev, int vqid, VirtioCmd *cmd); +long virtio_ccw_notify(SubChannelId schid, int vq_idx, long cookie); +int virtio_ccw_setup(VDev *vdev); +int virtio_ccw_reset(VDev *vdev); + +#endif diff --git a/pc-bios/s390-ccw/virtio-scsi.h b/pc-bios/s390-ccw/virtio-scsi.h index c5612e16a26..070f24b7e5a 100644 --- a/pc-bios/s390-ccw/virtio-scsi.h +++ b/pc-bios/s390-ccw/virtio-scsi.h @@ -69,6 +69,6 @@ static inline bool virtio_scsi_response_ok(const VirtioSc= siCmdResp *r) =20 int virtio_scsi_read_many(VDev *vdev, unsigned long sector, void *load_addr, int sec_n= um); -int virtio_scsi_setup_device(SubChannelId schid); +int virtio_scsi_setup_device(VDev *vdev); =20 #endif /* VIRTIO_SCSI_H */ diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h index 39b507b2219..c3cb5a6ee3b 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -108,6 +108,7 @@ struct VRing { }; typedef struct VRing VRing; =20 +char *virtio_get_ring_area(int ring_num); =20 /*********************************************** * Virtio block * @@ -269,6 +270,8 @@ struct VirtioCmd { }; typedef struct VirtioCmd VirtioCmd; =20 +void vring_init(VRing *vr, VqInfo *info); +bool virtio_is_supported(VDev *vdev); bool vring_notify(VRing *vr); int drain_irqs(void); void vring_send_buf(VRing *vr, void *p, int len, int flags); @@ -283,7 +286,7 @@ int virtio_net_init(void *mac_addr); void virtio_net_deinit(void); =20 /* virtio-blkdev.c */ -int virtio_blk_setup_device(SubChannelId schid); +int virtio_blk_setup_device(VDev *vdev); int virtio_read(unsigned long sector, void *load_addr); unsigned long virtio_load_direct(unsigned long rec_list1, unsigned long re= c_list2, void *load_addr); diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 64bde497103..32154c5db8d 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -71,6 +71,7 @@ static int is_dev_possibly_bootable(int dev_no, int sch_n= o) bool is_virtio; Schib schib; int r; + VDev *vdev =3D virtio_get_device(); =20 blk_schid.sch_no =3D sch_no; r =3D stsch_err(blk_schid, &schib); @@ -91,7 +92,8 @@ static int is_dev_possibly_bootable(int dev_no, int sch_n= o) * Note: we always have to run virtio_is_supported() here to make * sure that the vdev.senseid data gets pre-initialized correctly */ - is_virtio =3D virtio_is_supported(blk_schid); + vdev->schid =3D blk_schid; + is_virtio =3D virtio_is_supported(vdev); =20 /* No specific devno given, just return whether the device is possibly= bootable */ if (dev_no < 0) { @@ -256,10 +258,10 @@ static int virtio_setup(void) puts("Network boot device detected"); return 0; case VIRTIO_ID_BLOCK: - ret =3D virtio_blk_setup_device(blk_schid); + ret =3D virtio_blk_setup_device(vdev); break; case VIRTIO_ID_SCSI: - ret =3D virtio_scsi_setup_device(blk_schid); + ret =3D virtio_scsi_setup_device(vdev); break; default: puts("\n! No IPL device available !\n"); diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c index a9521dff416..651cedf6efa 100644 --- a/pc-bios/s390-ccw/netmain.c +++ b/pc-bios/s390-ccw/netmain.c @@ -500,7 +500,7 @@ static bool find_net_dev(Schib *schib, int dev_no) continue; } enable_subchannel(net_schid); - if (!virtio_is_supported(net_schid)) { + if (!virtio_is_supported(virtio_get_device())) { continue; } if (virtio_get_device_type() !=3D VIRTIO_ID_NET) { diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blk= dev.c index 9cc40e9108d..9722b6970f1 100644 --- a/pc-bios/s390-ccw/virtio-blkdev.c +++ b/pc-bios/s390-ccw/virtio-blkdev.c @@ -12,6 +12,7 @@ #include "s390-ccw.h" #include "virtio.h" #include "virtio-scsi.h" +#include "virtio-ccw.h" =20 #define VIRTIO_BLK_F_GEOMETRY (1 << 4) #define VIRTIO_BLK_F_BLK_SIZE (1 << 6) @@ -229,15 +230,17 @@ uint64_t virtio_get_blocks(void) } } =20 -int virtio_blk_setup_device(SubChannelId schid) +int virtio_blk_setup_device(VDev *vdev) { - VDev *vdev =3D virtio_get_device(); - vdev->guest_features[0] =3D VIRTIO_BLK_F_GEOMETRY | VIRTIO_BLK_F_BLK_S= IZE; - vdev->schid =3D schid; - virtio_setup_ccw(vdev); =20 puts("Using virtio-blk."); =20 - return 0; + switch (vdev->ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return virtio_ccw_setup(vdev); + default: + return 1; + } } diff --git a/pc-bios/s390-ccw/virtio-ccw.c b/pc-bios/s390-ccw/virtio-ccw.c new file mode 100644 index 00000000000..5cb2158ed20 --- /dev/null +++ b/pc-bios/s390-ccw/virtio-ccw.c @@ -0,0 +1,239 @@ +/* + * Virtio functionality for CCW devices + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright (c) 2013 Alexander Graf + * Copyright 2025 IBM Corp. + * + * Author(s): Jared Rossi + */ + +#include +#include "s390-ccw.h" +#include "cio.h" +#include "virtio.h" +#include "virtio-ccw.h" +#include "virtio-scsi.h" +#include "bswap.h" +#include "helper.h" +#include "s390-time.h" + +/* virtio spec v1.0 para 4.3.3.2 */ +static long kvm_hypercall(unsigned long nr, unsigned long param1, + unsigned long param2, unsigned long param3) +{ + register unsigned long r_nr asm("1") =3D nr; + register unsigned long r_param1 asm("2") =3D param1; + register unsigned long r_param2 asm("3") =3D param2; + register unsigned long r_param3 asm("4") =3D param3; + register long retval asm("2"); + + asm volatile ("diag %%r2,%%r4,0x500" + : "=3Dd" (retval) + : "d" (r_nr), "0" (r_param1), "r"(r_param2), "d"(r_param= 3) + : "memory", "cc"); + + return retval; +} + +static int run_ccw(VDev *vdev, int cmd, void *ptr, int len, bool sli) +{ + Ccw1 ccw =3D {}; + + ccw.cmd_code =3D cmd; + ccw.cda =3D (long)ptr; + ccw.count =3D len; + + if (sli) { + ccw.flags |=3D CCW_FLAG_SLI; + } + + return do_cio(vdev->schid, vdev->senseid.cu_type, ptr2u32(&ccw), CCW_F= MT1); +} + +bool virtio_ccw_is_supported(VDev *vdev) +{ + memset(&vdev->senseid, 0, sizeof(vdev->senseid)); + + /* + * Run sense id command. + * The size of the senseid data differs between devices (notably, + * between virtio devices and dasds), so specify the largest possible + * size and suppress the incorrect length indication for smaller sizes. + */ + if (run_ccw(vdev, CCW_CMD_SENSE_ID, &vdev->senseid, sizeof(vdev->sense= id), + true)) { + return false; + } + + vdev->dev_type =3D vdev->senseid.cu_model; + + if (vdev->senseid.cu_type =3D=3D 0x3832) { + switch (vdev->dev_type) { + case VIRTIO_ID_BLOCK: + case VIRTIO_ID_SCSI: + case VIRTIO_ID_NET: + return true; + default: + return false; + } + } + return false; +} + +int drain_irqs_ccw(SubChannelId schid) +{ + Irb irb =3D {}; + int r =3D 0; + + while (1) { + /* FIXME: make use of TPI, for that enable subchannel and isc */ + if (tsch(schid, &irb)) { + /* Might want to differentiate error codes later on. */ + if (irb.scsw.cstat) { + r =3D -EIO; + } else if (irb.scsw.dstat !=3D 0xc) { + r =3D -EIO; + } + return r; + } + } +} + +long virtio_ccw_notify(SubChannelId schid, int vq_idx, long cookie) +{ + return kvm_hypercall(KVM_S390_VIRTIO_CCW_NOTIFY, *(u32 *)&schid, + vq_idx, cookie); +} + +int virtio_ccw_run(VDev *vdev, int vqid, VirtioCmd *cmd) +{ + VRing *vr =3D &vdev->vrings[vqid]; + int i =3D 0; + + do { + vring_send_buf(vr, cmd[i].data, cmd[i].size, + cmd[i].flags | (i ? VRING_HIDDEN_IS_CHAIN : 0)); + } while (cmd[i++].flags & VRING_DESC_F_NEXT); + + vring_wait_reply(); + if (drain_irqs()) { + return -1; + } + return 0; +} + +int virtio_ccw_reset(VDev *vdev) +{ + return run_ccw(vdev, CCW_CMD_VDEV_RESET, NULL, 0, false); +} + +int virtio_ccw_setup(VDev *vdev) +{ + int i, cfg_size =3D 0; + uint8_t status; + struct VirtioFeatureDesc { + uint32_t features; + uint8_t index; + } __attribute__((packed)) feats; + + if (!virtio_ccw_is_supported(vdev)) { + puts("Virtio unsupported for this device ID"); + return -ENODEV; + } + /* device ID has been established now */ + + vdev->config.blk.blk_size =3D 0; /* mark "illegal" - setup started... = */ + vdev->guessed_disk_nature =3D VIRTIO_GDN_NONE; + + virtio_reset(vdev); + + status =3D VIRTIO_CONFIG_S_ACKNOWLEDGE; + if (run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false= )) { + puts("Could not write ACKNOWLEDGE status to host"); + return -EIO; + } + + switch (vdev->dev_type) { + case VIRTIO_ID_NET: + vdev->nr_vqs =3D 2; + vdev->cmd_vr_idx =3D 0; + cfg_size =3D sizeof(vdev->config.net); + break; + case VIRTIO_ID_BLOCK: + vdev->nr_vqs =3D 1; + vdev->cmd_vr_idx =3D 0; + cfg_size =3D sizeof(vdev->config.blk); + break; + case VIRTIO_ID_SCSI: + vdev->nr_vqs =3D 3; + vdev->cmd_vr_idx =3D VR_REQUEST; + cfg_size =3D sizeof(vdev->config.scsi); + break; + default: + puts("Unsupported virtio device"); + return -ENODEV; + } + + status |=3D VIRTIO_CONFIG_S_DRIVER; + if (run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false= )) { + puts("Could not write DRIVER status to host"); + return -EIO; + } + + /* Feature negotiation */ + for (i =3D 0; i < ARRAY_SIZE(vdev->guest_features); i++) { + feats.features =3D 0; + feats.index =3D i; + if (run_ccw(vdev, CCW_CMD_READ_FEAT, &feats, sizeof(feats), false)= ) { + puts("Could not get features bits"); + return -EIO; + } + + vdev->guest_features[i] &=3D bswap32(feats.features); + feats.features =3D bswap32(vdev->guest_features[i]); + if (run_ccw(vdev, CCW_CMD_WRITE_FEAT, &feats, sizeof(feats), false= )) { + puts("Could not set features bits"); + return -EIO; + } + } + + if (run_ccw(vdev, CCW_CMD_READ_CONF, &vdev->config, cfg_size, false)) { + puts("Could not get virtio device configuration"); + return -EIO; + } + + for (i =3D 0; i < vdev->nr_vqs; i++) { + VqInfo info =3D { + .queue =3D (unsigned long long) virtio_get_ring_area(i), + .align =3D KVM_S390_VIRTIO_RING_ALIGN, + .index =3D i, + .num =3D 0, + }; + VqConfig config =3D { + .index =3D i, + .num =3D 0, + }; + + if (run_ccw(vdev, CCW_CMD_READ_VQ_CONF, &config, sizeof(config), + false)) { + puts("Could not get virtio device VQ config"); + return -EIO; + } + info.num =3D config.num; + vring_init(&vdev->vrings[i], &info); + if (run_ccw(vdev, CCW_CMD_SET_VQ, &info, sizeof(info), false)) { + puts("Cannot set VQ info"); + return -EIO; + } + } + + status |=3D VIRTIO_CONFIG_S_DRIVER_OK; + if (run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false= )) { + puts("Could not write DRIVER_OK status to host"); + return -EIO; + } + + return 0; +} diff --git a/pc-bios/s390-ccw/virtio-net.c b/pc-bios/s390-ccw/virtio-net.c index 7eb08500695..f58f7ffc55b 100644 --- a/pc-bios/s390-ccw/virtio-net.c +++ b/pc-bios/s390-ccw/virtio-net.c @@ -19,6 +19,7 @@ #include #include "s390-ccw.h" #include "virtio.h" +#include "virtio-ccw.h" #include "s390-time.h" #include "helper.h" =20 @@ -54,7 +55,7 @@ int virtio_net_init(void *mac_addr) rx_last_idx =3D 0; =20 vdev->guest_features[0] =3D VIRTIO_NET_F_MAC_BIT; - virtio_setup_ccw(vdev); + virtio_ccw_setup(vdev); =20 if (!(vdev->guest_features[0] & VIRTIO_NET_F_MAC_BIT)) { puts("virtio-net device does not support the MAC address feature"); diff --git a/pc-bios/s390-ccw/virtio-scsi.c b/pc-bios/s390-ccw/virtio-scsi.c index 71db75ce7b4..9ea00c6fe67 100644 --- a/pc-bios/s390-ccw/virtio-scsi.c +++ b/pc-bios/s390-ccw/virtio-scsi.c @@ -15,6 +15,7 @@ #include "virtio.h" #include "scsi.h" #include "virtio-scsi.h" +#include "virtio-ccw.h" #include "s390-time.h" #include "helper.h" =20 @@ -476,12 +477,9 @@ static int virtio_scsi_setup(VDev *vdev) return 0; } =20 -int virtio_scsi_setup_device(SubChannelId schid) +int virtio_scsi_setup_device(VDev *vdev) { - VDev *vdev =3D virtio_get_device(); - - vdev->schid =3D schid; - virtio_setup_ccw(vdev); + virtio_ccw_setup(vdev); =20 if (vdev->config.scsi.sense_size !=3D VIRTIO_SCSI_SENSE_SIZE) { puts("Config: sense size mismatch"); diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index 5dd407d5c9b..956b34ff33a 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -2,6 +2,9 @@ * Virtio driver bits * * Copyright (c) 2013 Alexander Graf + * Copyright 2025 IBM Corp. + * + * Author(s): Jared Rossi * * This work is licensed under the terms of the GNU GPL, version 2 or (at * your option) any later version. See the COPYING file in the top-level @@ -13,6 +16,7 @@ #include "cio.h" #include "virtio.h" #include "virtio-scsi.h" +#include "virtio-ccw.h" #include "bswap.h" #include "helper.h" #include "s390-time.h" @@ -44,28 +48,9 @@ VirtioDevType virtio_get_device_type(void) return vdev.dev_type; } =20 -/* virtio spec v1.0 para 4.3.3.2 */ -static long kvm_hypercall(unsigned long nr, unsigned long param1, - unsigned long param2, unsigned long param3) +char *virtio_get_ring_area(int ring_num) { - register unsigned long r_nr asm("1") =3D nr; - register unsigned long r_param1 asm("2") =3D param1; - register unsigned long r_param2 asm("3") =3D param2; - register unsigned long r_param3 asm("4") =3D param3; - register long retval asm("2"); - - asm volatile ("diag %%r2,%%r4,0x500" - : "=3Dd" (retval) - : "d" (r_nr), "0" (r_param1), "r"(r_param2), "d"(r_param= 3) - : "memory", "cc"); - - return retval; -} - -static long virtio_notify(SubChannelId schid, int vq_idx, long cookie) -{ - return kvm_hypercall(KVM_S390_VIRTIO_CCW_NOTIFY, *(u32 *)&schid, - vq_idx, cookie); + return ring_area + ring_num * VIRTIO_RING_SIZE; } =20 /*********************************************** @@ -74,39 +59,27 @@ static long virtio_notify(SubChannelId schid, int vq_id= x, long cookie) =20 int drain_irqs(void) { - Irb irb =3D {}; - int r =3D 0; - - while (1) { - /* FIXME: make use of TPI, for that enable subchannel and isc */ - if (tsch(vdev.schid, &irb)) { - /* Might want to differentiate error codes later on. */ - if (irb.scsw.cstat) { - r =3D -EIO; - } else if (irb.scsw.dstat !=3D 0xc) { - r =3D -EIO; - } - return r; - } + switch (vdev.ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return drain_irqs_ccw(vdev.schid); + default: + return 0; } } =20 -static int run_ccw(VDev *vdev, int cmd, void *ptr, int len, bool sli) +int virtio_run(VDev *vdev, int vqid, VirtioCmd *cmd) { - Ccw1 ccw =3D {}; - - ccw.cmd_code =3D cmd; - ccw.cda =3D (long)ptr; - ccw.count =3D len; - - if (sli) { - ccw.flags |=3D CCW_FLAG_SLI; + switch (vdev->ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return virtio_ccw_run(vdev, vqid, cmd); + default: + return -1; } - - return do_cio(vdev->schid, vdev->senseid.cu_type, ptr2u32(&ccw), CCW_F= MT1); } =20 -static void vring_init(VRing *vr, VqInfo *info) +void vring_init(VRing *vr, VqInfo *info) { void *p =3D (void *) info->queue; =20 @@ -134,7 +107,15 @@ static void vring_init(VRing *vr, VqInfo *info) =20 bool vring_notify(VRing *vr) { - vr->cookie =3D virtio_notify(vdev.schid, vr->id, vr->cookie); + switch (vdev.ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + vr->cookie =3D virtio_ccw_notify(vdev.schid, vr->id, vr->cookie); + break; + default: + return 1; + } + return vr->cookie >=3D 0; } =20 @@ -200,164 +181,24 @@ int vring_wait_reply(void) return 1; } =20 -int virtio_run(VDev *vdev, int vqid, VirtioCmd *cmd) -{ - VRing *vr =3D &vdev->vrings[vqid]; - int i =3D 0; - - do { - vring_send_buf(vr, cmd[i].data, cmd[i].size, - cmd[i].flags | (i ? VRING_HIDDEN_IS_CHAIN : 0)); - } while (cmd[i++].flags & VRING_DESC_F_NEXT); - - vring_wait_reply(); - if (drain_irqs()) { - return -1; - } - return 0; -} - int virtio_reset(VDev *vdev) { - return run_ccw(vdev, CCW_CMD_VDEV_RESET, NULL, 0, false); -} - -int virtio_setup_ccw(VDev *vdev) -{ - int i, cfg_size =3D 0; - uint8_t status; - struct VirtioFeatureDesc { - uint32_t features; - uint8_t index; - } __attribute__((packed)) feats; - - if (!virtio_is_supported(vdev->schid)) { - puts("Virtio unsupported for this device ID"); - return -ENODEV; - } - /* device ID has been established now */ - - vdev->config.blk.blk_size =3D 0; /* mark "illegal" - setup started... = */ - vdev->guessed_disk_nature =3D VIRTIO_GDN_NONE; - - virtio_reset(vdev); - - status =3D VIRTIO_CONFIG_S_ACKNOWLEDGE; - if (run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false= )) { - puts("Could not write ACKNOWLEDGE status to host"); - return -EIO; - } - - switch (vdev->dev_type) { - case VIRTIO_ID_NET: - vdev->nr_vqs =3D 2; - vdev->cmd_vr_idx =3D 0; - cfg_size =3D sizeof(vdev->config.net); - break; - case VIRTIO_ID_BLOCK: - vdev->nr_vqs =3D 1; - vdev->cmd_vr_idx =3D 0; - cfg_size =3D sizeof(vdev->config.blk); - break; - case VIRTIO_ID_SCSI: - vdev->nr_vqs =3D 3; - vdev->cmd_vr_idx =3D VR_REQUEST; - cfg_size =3D sizeof(vdev->config.scsi); - break; + switch (vdev->ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return virtio_ccw_reset(vdev); default: - puts("Unsupported virtio device"); - return -ENODEV; - } - - status |=3D VIRTIO_CONFIG_S_DRIVER; - if (run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false= )) { - puts("Could not write DRIVER status to host"); - return -EIO; - } - - /* Feature negotiation */ - for (i =3D 0; i < ARRAY_SIZE(vdev->guest_features); i++) { - feats.features =3D 0; - feats.index =3D i; - if (run_ccw(vdev, CCW_CMD_READ_FEAT, &feats, sizeof(feats), false)= ) { - puts("Could not get features bits"); - return -EIO; - } - - vdev->guest_features[i] &=3D bswap32(feats.features); - feats.features =3D bswap32(vdev->guest_features[i]); - if (run_ccw(vdev, CCW_CMD_WRITE_FEAT, &feats, sizeof(feats), false= )) { - puts("Could not set features bits"); - return -EIO; - } - } - - if (run_ccw(vdev, CCW_CMD_READ_CONF, &vdev->config, cfg_size, false)) { - puts("Could not get virtio device configuration"); - return -EIO; - } - - for (i =3D 0; i < vdev->nr_vqs; i++) { - VqInfo info =3D { - .queue =3D (unsigned long long) ring_area + (i * VIRTIO_RING_S= IZE), - .align =3D KVM_S390_VIRTIO_RING_ALIGN, - .index =3D i, - .num =3D 0, - }; - VqConfig config =3D { - .index =3D i, - .num =3D 0, - }; - - if (run_ccw(vdev, CCW_CMD_READ_VQ_CONF, &config, sizeof(config), - false)) { - puts("Could not get virtio device VQ config"); - return -EIO; - } - info.num =3D config.num; - vring_init(&vdev->vrings[i], &info); - if (run_ccw(vdev, CCW_CMD_SET_VQ, &info, sizeof(info), false)) { - puts("Cannot set VQ info"); - return -EIO; - } - } - - status |=3D VIRTIO_CONFIG_S_DRIVER_OK; - if (run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false= )) { - puts("Could not write DRIVER_OK status to host"); - return -EIO; + return -1; } - - return 0; } =20 -bool virtio_is_supported(SubChannelId schid) +bool virtio_is_supported(VDev *vdev) { - vdev.schid =3D schid; - memset(&vdev.senseid, 0, sizeof(vdev.senseid)); - - /* - * Run sense id command. - * The size of the senseid data differs between devices (notably, - * between virtio devices and dasds), so specify the largest possible - * size and suppress the incorrect length indication for smaller sizes. - */ - if (run_ccw(&vdev, CCW_CMD_SENSE_ID, &vdev.senseid, sizeof(vdev.sensei= d), - true)) { + switch (vdev->ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return virtio_ccw_is_supported(vdev); + default: return false; } - - vdev.dev_type =3D vdev.senseid.cu_model; - - if (vdev.senseid.cu_type =3D=3D 0x3832) { - switch (vdev.dev_type) { - case VIRTIO_ID_BLOCK: - case VIRTIO_ID_SCSI: - case VIRTIO_ID_NET: - return true; - default: - return false; - } - } - return false; } diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index a0f24c94a87..259cff09db6 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -34,7 +34,8 @@ QEMU_DGFLAGS =3D -MMD -MP -MT $@ -MF $(@D)/$(*F).d .PHONY : all clean build-all distclean =20 OBJECTS =3D start.o main.o bootmap.o jump2ipl.o sclp.o menu.o netmain.o \ - virtio.o virtio-net.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o + virtio.o virtio-net.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o \ + virtio-ccw.o =20 SLOF_DIR :=3D $(SRC_PATH)/../../roms/SLOF =20 --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122353; cv=none; d=zohomail.com; s=zohoarc; b=atl4Z597hWtAp2AoT69945X2/MF1yzCmNH/sNEOTWuOfpxDHQrKgHIx7jkvPRF1sSZ4jx33InKrKtz6KRje+T6PjdsHZW3LYetTLypi6cCztV1ktgQ2s4RUwobEHvX7TVE/pfTSzkR531E8g9ifVWtHOPak3X9dkzv7vEVKDIj8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122353; 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=OCoy6OQYtHfUDEcCV0LoVq1e8ZXCcHkuvHBUQYyJXgo=; b=AN1Hq8kpd+M0fOgOFt6Ts6dLsesb5Zwv9q+FezBtlUjjOiThqRt7ukULyp8141kZUlqhVxYffSes3K5wtH3W5B53p3Q4OECuAzbmEiLpYfY/xIcnDdBEjc1XDi0PIZBdBNWYksGz0SjbZBHazdy51pUv+k4dKGIv2jB0PmTnKEw= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122353220736.7629510594315; Mon, 9 Mar 2026 22:59:13 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq5H-0007yz-5O; Tue, 10 Mar 2026 01:56:47 -0400 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 ) id 1vzq5B-0007dE-53 for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:41 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq59-0006IH-It for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:40 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-232-bgKijGGGMYi9jfOnM6_Bug-1; Tue, 10 Mar 2026 01:56:34 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 4A56518005B0; Tue, 10 Mar 2026 05:56:33 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 316111956095; Tue, 10 Mar 2026 05:56:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122199; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OCoy6OQYtHfUDEcCV0LoVq1e8ZXCcHkuvHBUQYyJXgo=; b=WfqVPDaB+uEYkWdJOni5MyUXpS+UInoH11Cu5xuEmS2VnFHGTRP04PYI7AC76Q2QO1aXUD hca+tFChX5o80zWqTYDL4Q6Pa5dXuPZlNJ69lHuIz5vhk4MTnZ38ci/EDazleHx8be4BCY cDICYGqcxSzDEBG2peZhccF/60iPEsc= X-MC-Unique: bgKijGGGMYi9jfOnM6_Bug-1 X-Mimecast-MFC-AGG-ID: bgKijGGGMYi9jfOnM6_Bug_1773122193 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Eric Farman , Matthew Rosato , Jared Rossi Subject: [PULL 15/25] include/hw/s390x: Move CLP definitions for easier BIOS access Date: Tue, 10 Mar 2026 06:55:20 +0100 Message-ID: <20260310055530.8893-16-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122354061158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Move the s390-pci-clp definitions into the "ipl" sub-directory, which is vi= sible to the s390-bios. This allows the bios to reuse the architected definition= s and prevents code duplication. Reviewed-by: Thomas Huth Reviewed-by: Eric Farman Reviewed-by: Matthew Rosato Signed-off-by: Jared Rossi Message-ID: <20260309003601.242634-8-jrossi@linux.ibm.com> Signed-off-by: Thomas Huth --- MAINTAINERS | 1 + include/hw/s390x/{ =3D> ipl}/s390-pci-clp.h | 0 include/hw/s390x/s390-pci-bus.h | 2 +- hw/s390x/s390-pci-vfio.c | 2 +- 4 files changed, 3 insertions(+), 2 deletions(-) rename include/hw/s390x/{ =3D> ipl}/s390-pci-clp.h (100%) diff --git a/MAINTAINERS b/MAINTAINERS index f6d43a41431..9d1614fd7e9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1882,6 +1882,7 @@ R: Eric Farman S: Supported F: hw/s390x/s390-pci* F: include/hw/s390x/s390-pci* +F: include/hw/s390x/ipl/s390-pci* F: util/s390x_pci_mmio.c L: qemu-s390x@nongnu.org =20 diff --git a/include/hw/s390x/s390-pci-clp.h b/include/hw/s390x/ipl/s390-pc= i-clp.h similarity index 100% rename from include/hw/s390x/s390-pci-clp.h rename to include/hw/s390x/ipl/s390-pci-clp.h diff --git a/include/hw/s390x/s390-pci-bus.h b/include/hw/s390x/s390-pci-bu= s.h index 04944d4fed7..f643e130579 100644 --- a/include/hw/s390x/s390-pci-bus.h +++ b/include/hw/s390x/s390-pci-bus.h @@ -19,7 +19,7 @@ #include "hw/s390x/sclp.h" #include "hw/s390x/s390_flic.h" #include "hw/s390x/css.h" -#include "hw/s390x/s390-pci-clp.h" +#include "hw/s390x/ipl/s390-pci-clp.h" #include "qom/object.h" =20 #define TYPE_S390_PCI_HOST_BRIDGE "s390-pcihost" diff --git a/hw/s390x/s390-pci-vfio.c b/hw/s390x/s390-pci-vfio.c index 9e31029d7ac..8ce44dbecce 100644 --- a/hw/s390x/s390-pci-vfio.c +++ b/hw/s390x/s390-pci-vfio.c @@ -17,7 +17,7 @@ =20 #include "trace.h" #include "hw/s390x/s390-pci-bus.h" -#include "hw/s390x/s390-pci-clp.h" +#include "hw/s390x/ipl/s390-pci-clp.h" #include "hw/s390x/s390-pci-vfio.h" #include "hw/vfio/pci.h" #include "hw/vfio/vfio-container-legacy.h" --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122267; cv=none; d=zohomail.com; s=zohoarc; b=IsJEMZ+Jags+EIeiUPxg3Q3c3pbjJS8AsAnbAQdE3Vhq0ezNrJvQkoFfIsc5B2od59fFsIhx+wle8FTbpl83bl67lGS6TIoHs3p6nioE1zc5VyDi+0Fbcxim9I4WrZforTODob3r+bP5ZdoE+w3T0JwQ9xcM6V3MEAmWzWOkV/w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122267; 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=8Yktb1u31mYLs3o8YNegAd+y8GFLdK0i/ysiRwsBnDw=; b=M+8agJp5kl0TaktSC0V17k9yDiFWXQumB9rirud6hKsqXUapvNgSHbBJbI5H1LuwtJYG0XUV+QfIcNWkzuQE2u9rBUa9Edf0vSIXn+iQQ0nNAIqu0OnEZ2qvW7j21adO75kX9MV3QNKHZDyOYPfV1R0KhDcFSQWBOdh+GIz2iaY= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122267484718.0669457594238; Mon, 9 Mar 2026 22:57:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq5K-0008IX-58; Tue, 10 Mar 2026 01:56:50 -0400 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 ) id 1vzq5F-0007r3-7J for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:45 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq5C-0006In-8x for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:44 -0400 Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-44-GoBdcmQ-MGilJYPueumVYA-1; Tue, 10 Mar 2026 01:56:39 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2460F19560A7; Tue, 10 Mar 2026 05:56:38 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 4752E1956095; Tue, 10 Mar 2026 05:56:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122201; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8Yktb1u31mYLs3o8YNegAd+y8GFLdK0i/ysiRwsBnDw=; b=I5L5b5WTPRuQ4pr9yNRjH/AHYKj7FM1uujC1kXohqcoWQ5gf4zU1+BQf7oIOy+N8UWwtt+ doOAgIAxS8e2L62YJ8QFL1NGgu6A2Hzv2fKaot0KDha9ymW8hw4ptD10B1YDxK7B7hv3BA v1rqb/AFoO6Lv6vB5Hu67SHOoJi3Ngk= X-MC-Unique: GoBdcmQ-MGilJYPueumVYA-1 X-Mimecast-MFC-AGG-ID: GoBdcmQ-MGilJYPueumVYA_1773122198 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Eric Farman , Jared Rossi , Matthew Rosato , Farhan Ali Subject: [PULL 16/25] pc-bios/s390-ccw: Introduce CLP Architecture Date: Tue, 10 Mar 2026 06:55:21 +0100 Message-ID: <20260310055530.8893-17-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122269787158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Call Logical Processor (CLP) Architecture is used for managing PCI function= s on s390x. Define and include the structures and routines needed to interact wi= th PCI devices during IPL. Reviewed-by: Eric Farman Signed-off-by: Jared Rossi Reviewed-by: Matthew Rosato Reviewed-by: Farhan Ali Message-ID: <20260309003601.242634-9-jrossi@linux.ibm.com> [thuth: fix a typo in one of the comments] Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/clp.h | 24 ++++++++++ pc-bios/s390-ccw/clp.c | 99 +++++++++++++++++++++++++++++++++++++++ pc-bios/s390-ccw/Makefile | 2 +- 3 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 pc-bios/s390-ccw/clp.h create mode 100644 pc-bios/s390-ccw/clp.c diff --git a/pc-bios/s390-ccw/clp.h b/pc-bios/s390-ccw/clp.h new file mode 100644 index 00000000000..1ac2f8c177f --- /dev/null +++ b/pc-bios/s390-ccw/clp.h @@ -0,0 +1,24 @@ +/* + * Call Logical Processor (CLP) architecture definitions + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef CLP_H +#define CLP_H + +#ifndef QEMU_PACKED +#define QEMU_PACKED __attribute__((packed)) +#endif + +#include +#include + +int clp_pci(void *data); +int find_pci_function(uint32_t fid, ClpFhListEntry *entry); +int enable_pci_function(uint32_t *fhandle); + +#endif diff --git a/pc-bios/s390-ccw/clp.c b/pc-bios/s390-ccw/clp.c new file mode 100644 index 00000000000..ca9565d8ded --- /dev/null +++ b/pc-bios/s390-ccw/clp.c @@ -0,0 +1,99 @@ +/* + * Call Logical Processor (CLP) architecture + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "clp.h" +#include +#include + +int clp_pci(void *data) +{ + struct { uint8_t _[CLP_BLK_SIZE]; } *req =3D data; + int cc =3D 3; + + asm volatile ( + " .insn rrf,0xb9a00000,0,%[req],0,2\n" + " ipm %[cc]\n" + " srl %[cc],28\n" + : [cc] "+d" (cc), "+m" (*req) + : [req] "a" (req) + : "cc"); + if (cc) { + printf("CLP returned with non-zero condition code %d\n", cc); + } + return cc; +} + +/* + * Get the PCI function entry for a given function ID + * Return 0 on success, 1 if the FID is not found, or a negative RC on err= or + */ +int find_pci_function(uint32_t fid, ClpFhListEntry *entry) +{ + int count =3D 0; + int limit =3D PCI_MAX_FUNCTIONS; + ClpReqRspListPci rrb; + + rrb.request.hdr.len =3D sizeof(ClpReqListPci); + rrb.request.hdr.cmd =3D 0x02; + rrb.request.resume_token =3D 0; + rrb.response.hdr.len =3D sizeof(ClpRspListPci); + + do { + if (clp_pci(&rrb) || rrb.response.hdr.rsp !=3D 0x0010) { + puts("Failed to list PCI functions"); + return -1; + } + + /* Resume token set when max entries are returned */ + if (rrb.response.resume_token) { + count =3D CLP_FH_LIST_NR_ENTRIES; + rrb.request.resume_token =3D rrb.response.resume_token; + } else { + count =3D (rrb.response.hdr.len - 32) / sizeof(ClpFhListEntry); + } + + limit -=3D count; + + for (int i =3D 0; i < count; i++) { + if (rrb.response.fh_list[i].fid =3D=3D fid) { + memcpy(entry, &rrb.response.fh_list[i], sizeof(ClpFhListEn= try)); + return 0; + } + } + + } while (rrb.request.resume_token && limit > 0); + + puts("No function entry found for FID!"); + + return 1; +} + +/* + * Enable the PCI function associated with a given handle + * Return 0 on success or a negative RC on error + */ +int enable_pci_function(uint32_t *fhandle) +{ + ClpReqRspSetPci rrb; + + rrb.request.hdr.len =3D sizeof(ClpReqSetPci); + rrb.request.hdr.cmd =3D 0x05; + rrb.request.fh =3D *fhandle; + rrb.request.oc =3D 0; + rrb.request.ndas =3D 1; + rrb.response.hdr.len =3D sizeof(ClpRspSetPci); + + if (clp_pci(&rrb) || rrb.response.hdr.rsp !=3D 0x0010) { + puts("Failed to enable PCI function"); + return -1; + } + + *fhandle =3D rrb.response.fh; + return 0; +} diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index 259cff09db6..9c29548f849 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -35,7 +35,7 @@ QEMU_DGFLAGS =3D -MMD -MP -MT $@ -MF $(@D)/$(*F).d =20 OBJECTS =3D start.o main.o bootmap.o jump2ipl.o sclp.o menu.o netmain.o \ virtio.o virtio-net.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o \ - virtio-ccw.o + virtio-ccw.o clp.o =20 SLOF_DIR :=3D $(SRC_PATH)/../../roms/SLOF =20 --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122360; cv=none; d=zohomail.com; s=zohoarc; b=XtDo3r4D9l9I32+oCbdOs1fO0QifD83tKuA0tTgNgbIPmDpJWCR+zbvjmj4xqPDahCZrC6NOGGH2B3Z8eoZQ/EX7ccm532Y7EF+wOCRe6wVRF9Vxh1lv08VbHikzDXQkaFFNsxZL+wPlsdrm9oW0AlT2iZh5w0IXM7M1j498Wg0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122360; 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=Jom5EJvT7LgkAx4Ap5azKCpZXCiV3zJ7vOSGvCN+Nh8=; b=aqLri9AY8oE+lYcj9MVGSROgWLm2pIoPEP1bAuUHk7Y+T7llXOuBjlux8NGJ/cW+tpgCqoxG+p4ttqog9Nz9FpeAn6oS5m1Rh4awTUvUSIvUySDEARGWKkzM7rXcQcyOag3ZJfAu2WH/VeJkZcrzUaVBhPnv5QEkVZ60U+v4eQg= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122360632969.22286296112; Mon, 9 Mar 2026 22:59:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq5P-0000Mv-Ab; Tue, 10 Mar 2026 01:56:55 -0400 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 ) id 1vzq5H-000840-JT for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:47 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq5G-0006JL-7c for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:47 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-148-yozpV5VyN4SFxT7xSO3WTA-1; Tue, 10 Mar 2026 01:56:43 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 3DBAA180035D; Tue, 10 Mar 2026 05:56:42 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 277571955D71; Tue, 10 Mar 2026 05:56:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122204; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Jom5EJvT7LgkAx4Ap5azKCpZXCiV3zJ7vOSGvCN+Nh8=; b=PvWYWmNYKgkQ5k6bNvgzEvkr42A7EOO5uM5UoxtaI7U2/5hAE8FY1ZWnoGpta0D1vCEIJT 1WQc04zJ6ueqpBd/Un6umb6G7+MjFk+58AfjGxVPv3+cfI7uwVrbnnUWFZN/wLtsey4it7 wGgBLpJOjl7mMrEDrsKIPd2uch2PZns= X-MC-Unique: yozpV5VyN4SFxT7xSO3WTA-1 X-Mimecast-MFC-AGG-ID: yozpV5VyN4SFxT7xSO3WTA_1773122202 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Eric Farman , Jared Rossi Subject: [PULL 17/25] s390x: Add definitions for PCI IPL type Date: Tue, 10 Mar 2026 06:55:22 +0100 Message-ID: <20260310055530.8893-18-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122363803154100 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Define a new PBT code and IPLB layout in preparation for supporting PCI dev= ice IPL on s390x. Reviewed-by: Thomas Huth Reviewed-by: Eric Farman Signed-off-by: Jared Rossi Message-ID: <20260309003601.242634-10-jrossi@linux.ibm.com> Signed-off-by: Thomas Huth --- include/hw/s390x/ipl/qipl.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index 6dc12dd859f..8d3c83a80bd 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -23,6 +23,7 @@ enum S390IplType { S390_IPL_TYPE_FCP =3D 0x00, S390_IPL_TYPE_CCW =3D 0x02, + S390_IPL_TYPE_PCI =3D 0x04, S390_IPL_TYPE_PV =3D 0x05, S390_IPL_TYPE_QEMU_SCSI =3D 0xff }; @@ -108,6 +109,14 @@ struct IplBlockQemuScsi { } QEMU_PACKED; typedef struct IplBlockQemuScsi IplBlockQemuScsi; =20 +struct IplBlockPci { + uint32_t reserved0[76]; + uint8_t opt; + uint8_t reserved1[3]; + uint32_t fid; +} QEMU_PACKED; +typedef struct IplBlockPci IplBlockPci; + union IplParameterBlock { struct { uint32_t len; @@ -123,6 +132,7 @@ union IplParameterBlock { IplBlockFcp fcp; IPLBlockPV pv; IplBlockQemuScsi scsi; + IplBlockPci pci; }; } QEMU_PACKED; struct { --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122283; cv=none; d=zohomail.com; s=zohoarc; b=WWaDaOLQCbpsK3HZyMWpg7WHDh7aSNudPneIyYPk7UJ4uCbnMuKFZE1SGLaLnfflnQFPqSnIuIURvDLtLnrgcOQk1rAwMyqukjaoH1fSwW7uwWSutAvunCY0ezNZ/63c2vXq7/P99qz7fajN16W8beGx7AXYpBgngwoLK0Y52PE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122283; 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=OY51g9+eUvj1djQZBkWHLh3VByefHAuAYmIFtE21EwQ=; b=oKeOFkH5xaHeCD2mspjNi6KMUvJem6n2KIFjrSid4NF1mqO/lxdWql/sQng+3U0mpVFjcwi7cCIV0mUQ13SS5nxxl9cQUH+WjexYzaN2/lc27SVJG4FoJtlCGjQbbYDp62BBFyFO5Mh/2ZUGQAXchU8eExu65a7tTPvW5BHT7c4= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122283352205.22219903556527; Mon, 9 Mar 2026 22:58:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq5R-0000WF-5K; Tue, 10 Mar 2026 01:56:57 -0400 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 ) id 1vzq5O-0000MU-5t for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:54 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq5L-0006KI-UI for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:53 -0400 Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-398-u_pXyqVnOra0kGGWHYgyjQ-1; Tue, 10 Mar 2026 01:56:47 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 56A53195608E; Tue, 10 Mar 2026 05:56:46 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 3BA021956095; Tue, 10 Mar 2026 05:56:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122211; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OY51g9+eUvj1djQZBkWHLh3VByefHAuAYmIFtE21EwQ=; b=FaSmuhglm1EI0etBsw+GBCInFAqwbc7YA1z+MWvIWovQ/FoOmH4/1Mk8mYl7/qdDhkLGT7 Ke2lNAi/xvHh/eHKe+ajB/Wr5i665dacDP25vfC8L2AfSvlc63Uc12vaieMA/8FPw07NUf /qkOy4rS1B+fj7WZeGNRFPT4nfWqFrk= X-MC-Unique: u_pXyqVnOra0kGGWHYgyjQ-1 X-Mimecast-MFC-AGG-ID: u_pXyqVnOra0kGGWHYgyjQ_1773122206 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Jared Rossi , Matthew Rosato , Farhan Ali Subject: [PULL 18/25] pc-bios/s390-ccw: Introduce PCI device Date: Tue, 10 Mar 2026 06:55:23 +0100 Message-ID: <20260310055530.8893-19-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122284667154100 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Define selected s390x PCI instructions. Signed-off-by: Jared Rossi Reviewed-by: Matthew Rosato Acked-by: Thomas Huth Message-ID: <20260309003601.242634-11-jrossi@linux.ibm.com> Reviewed-by: Farhan Ali [thuth: Remove unused defines as suggested by Farhan] Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/pci.h | 36 ++++++++++++ pc-bios/s390-ccw/pci.c | 118 ++++++++++++++++++++++++++++++++++++++ pc-bios/s390-ccw/Makefile | 2 +- 3 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 pc-bios/s390-ccw/pci.h create mode 100644 pc-bios/s390-ccw/pci.c diff --git a/pc-bios/s390-ccw/pci.h b/pc-bios/s390-ccw/pci.h new file mode 100644 index 00000000000..968635eff11 --- /dev/null +++ b/pc-bios/s390-ccw/pci.h @@ -0,0 +1,36 @@ +/* + * s390x PCI definitions + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef PCI_H +#define PCI_H + +#include +#include +#include "clp.h" + +#define ZPCI_CREATE_REQ(handle, space, len) \ + ((uint64_t) handle << 32 | space << 16 | len) + +union register_pair { + unsigned __int128 pair; + struct { + unsigned long even; + unsigned long odd; + }; +}; + +#define PCI_CFGBAR 0xF /* Base Address Register for config sp= ace */ +#define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list ent= ry */ + +int pci_write(uint32_t fhandle, uint64_t offset, uint8_t pcias, uint64_t d= ata, + uint8_t len); +int pci_read(uint32_t fhandle, uint64_t offset, uint8_t pcias, void *buf, + uint8_t len); + +#endif diff --git a/pc-bios/s390-ccw/pci.c b/pc-bios/s390-ccw/pci.c new file mode 100644 index 00000000000..247070e5f07 --- /dev/null +++ b/pc-bios/s390-ccw/pci.c @@ -0,0 +1,118 @@ +/* + * s390x PCI functionality + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "clp.h" +#include "pci.h" +#include "bswap.h" +#include +#include + +/* PCI load */ +static inline int pcilg(uint64_t *data, uint64_t req, uint64_t offset, + uint8_t *status) +{ + union register_pair req_off =3D {.even =3D req, .odd =3D offset}; + int cc =3D -1; + uint64_t __data; + + asm volatile ( + " .insn rre,0xb9d20000,%[data],%[req_off]\n" + " ipm %[cc]\n" + " srl %[cc],28\n" + : [cc] "+d" (cc), [data] "=3Dd" (__data), + [req_off] "+d" (req_off.pair) :: "cc"); + *status =3D req_off.even >> 24 & 0xff; + *data =3D __data; + return cc; +} + +/* PCI store */ +static inline int pcistg(uint64_t data, uint64_t req, uint64_t offset, + uint8_t *status) +{ + union register_pair req_off =3D {.even =3D req, .odd =3D offset}; + int cc =3D -1; + + asm volatile ( + " .insn rre,0xb9d00000,%[data],%[req_off]\n" + " ipm %[cc]\n" + " srl %[cc],28\n" + : [cc] "+d" (cc), [req_off] "+d" (req_off.pair) + : [data] "d" (data) + : "cc"); + *status =3D req_off.even >> 24 & 0xff; + return cc; +} + +int pci_write(uint32_t fhandle, uint64_t offset, uint8_t pcias, uint64_t d= ata, + uint8_t len) +{ + + uint64_t req =3D ZPCI_CREATE_REQ(fhandle, pcias, len); + uint8_t status; + int rc; + + /* len must be non-zero power of 2 with a maximum of 8 bytes per write= */ + switch (len) { + case 1: + case 2: + case 4: + case 8: + rc =3D pcistg(data, req, offset, &status); + break; + default: + return -1; + } + + /* Error condition detected */ + if (rc !=3D 0) { + printf("PCI store failed with status condition %d, return code %d\= n", + status, rc); + return -1; + } + + return 0; +} + +int pci_read(uint32_t fhandle, uint64_t offset, uint8_t pcias, void *buf, + uint8_t len) +{ + uint64_t req, data; + uint8_t status; + int rc; + + req =3D ZPCI_CREATE_REQ(fhandle, pcias, len); + rc =3D pcilg(&data, req, offset, &status); + + /* Error condition detected */ + if (rc !=3D 0) { + printf("PCI load failed with status condition %d, return code %d\n= ", + status, rc); + return -1; + } + + switch (len) { + case 1: + *(uint8_t *)buf =3D data; + break; + case 2: + *(uint16_t *)buf =3D data; + break; + case 4: + *(uint32_t *)buf =3D data; + break; + case 8: + *(uint64_t *)buf =3D data; + break; + default: + return -1; + } + + return 0; +} diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index 9c29548f849..a62fc9d7660 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -35,7 +35,7 @@ QEMU_DGFLAGS =3D -MMD -MP -MT $@ -MF $(@D)/$(*F).d =20 OBJECTS =3D start.o main.o bootmap.o jump2ipl.o sclp.o menu.o netmain.o \ virtio.o virtio-net.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o \ - virtio-ccw.o clp.o + virtio-ccw.o clp.o pci.o =20 SLOF_DIR :=3D $(SRC_PATH)/../../roms/SLOF =20 --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122346; cv=none; d=zohomail.com; s=zohoarc; b=kzU6pKUhwA16vaNt3rxHu1BQxelUNadDa4egNZuZvQjQj+DKc3kqd7kmvhX85Pl+NOGVNNAWMJ+39uOA+jXRXx5pCoShdLu71QsVsKAA6Lwu5trIpL5VRswt1AmZahzUsdP31PEi4Ll7t6cabiMjQm1L1e2/Unp1WQfrdFjKzv4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122346; 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=W49tLWZeK0fa6fnZpgeNI0/1hwcNlmoVnADl5S7pXy8=; b=e/zys4GQTBImv2e0sbuDvTGV8xZmCa5xblxhtVumRnFVNsiKBjpMave5Q4lkUc4irKDwDotTaKJEaI/4/IT3jgVWlxTsEvJC9SRnL0NveavA008ROM/BBDoSzspFPhuwBk7qxbXL3KwUigWGPRsaQyGdrgUU+bDVuXJZ58HlqoM= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122346852859.9297596980279; Mon, 9 Mar 2026 22:59:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq5Z-0000e1-Fi; Tue, 10 Mar 2026 01:57:05 -0400 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 ) id 1vzq5Q-0000Vf-UN for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:57 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq5O-0006Ki-Pb for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:56:56 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-657-QhA4qYqrOByyRYXCDbTXtg-1; Tue, 10 Mar 2026 01:56:52 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id ABD8F18002D1; Tue, 10 Mar 2026 05:56:50 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 538E01956095; Tue, 10 Mar 2026 05:56:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122213; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W49tLWZeK0fa6fnZpgeNI0/1hwcNlmoVnADl5S7pXy8=; b=OiCV7IGmVbEsURHik2kl0+N2qfw+q1fUgXGtxU06TFzURQO/WNd01xfknKjWFYONFZ6fvY IQNr7pQhqEJADqpO55jmWHciCSnP+6GFlLNMnN9GflSNpL+ESdqEf81nryAG+XPqAk5lwJ kL8aVT6l040N4B9+pYwaXI45IpN8xVY= X-MC-Unique: QhA4qYqrOByyRYXCDbTXtg-1 X-Mimecast-MFC-AGG-ID: QhA4qYqrOByyRYXCDbTXtg_1773122210 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Jared Rossi , Matthew Rosato , Eric Farman Subject: [PULL 19/25] pc-bios/s390-ccw: Introduce virtio-pci functions Date: Tue, 10 Mar 2026 06:55:24 +0100 Message-ID: <20260310055530.8893-20-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.129.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122349759154100 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Define common functionality for interacting with virtio-pci devices. Signed-off-by: Jared Rossi Acked-by: Matthew Rosato Reviewed-by: Thomas Huth Reviewed-by: Eric Farman Message-ID: <20260309003601.242634-12-jrossi@linux.ibm.com> Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/virtio-pci.h | 80 ++++++++++++++++ pc-bios/s390-ccw/virtio.h | 3 + pc-bios/s390-ccw/virtio-pci.c | 167 ++++++++++++++++++++++++++++++++++ pc-bios/s390-ccw/Makefile | 2 +- 4 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 pc-bios/s390-ccw/virtio-pci.h create mode 100644 pc-bios/s390-ccw/virtio-pci.c diff --git a/pc-bios/s390-ccw/virtio-pci.h b/pc-bios/s390-ccw/virtio-pci.h new file mode 100644 index 00000000000..54c524f6986 --- /dev/null +++ b/pc-bios/s390-ccw/virtio-pci.h @@ -0,0 +1,80 @@ +/* + * Definitions for virtio-pci + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef VIRTIO_PCI_H +#define VIRTIO_PCI_H + +/* Common configuration */ +#define VPCI_CAP_COMMON_CFG 1 +/* Notifications */ +#define VPCI_CAP_NOTIFY_CFG 2 +/* ISR access */ +#define VPCI_CAP_ISR_CFG 3 +/* Device specific configuration */ +#define VPCI_CAP_DEVICE_CFG 4 +/* PCI configuration access */ +#define VPCI_CAP_PCI_CFG 5 +/* Additional shared memory capability */ +#define VPCI_CAP_SHARED_MEMORY_CFG 8 +/* PCI vendor data configuration */ +#define VPCI_CAP_VENDOR_CFG 9 + +/* Offsets within capability header */ +#define VPCI_CAP_VNDR 0 +#define VPCI_CAP_NEXT 1 +#define VPCI_CAP_LEN 2 +#define VPCI_CAP_CFG_TYPE 3 +#define VPCI_CAP_BAR 4 +#define VPCI_CAP_OFFSET 8 +#define VPCI_CAP_LENGTH 12 + +#define VPCI_N_CAP_MULT 16 /* Notify multiplier, VPCI_CAP_NOTIFY_CFG only = */ + +/* Common Area Offsets for virtio-pci queue */ +#define VPCI_C_OFFSET_DFSELECT 0 +#define VPCI_C_OFFSET_DF 4 +#define VPCI_C_OFFSET_GFSELECT 8 +#define VPCI_C_OFFSET_GF 12 +#define VPCI_C_COMMON_NUMQ 18 +#define VPCI_C_OFFSET_STATUS 20 +#define VPCI_C_OFFSET_Q_SELECT 22 +#define VPCI_C_OFFSET_Q_SIZE 24 +#define VPCI_C_OFFSET_Q_ENABLE 28 +#define VPCI_C_OFFSET_Q_NOFF 30 +#define VPCI_C_OFFSET_Q_DESCLO 32 +#define VPCI_C_OFFSET_Q_DESCHI 36 +#define VPCI_C_OFFSET_Q_AVAILLO 40 +#define VPCI_C_OFFSET_Q_AVAILHI 44 +#define VPCI_C_OFFSET_Q_USEDLO 48 +#define VPCI_C_OFFSET_Q_USEDHI 52 + +#define VIRTIO_F_VERSION_1 1 /* Feature bit 32 */ + +struct VirtioPciCap { + uint8_t bar; /* Which PCIAS it's in */ + uint32_t off; /* Offset within bar */ +}; +typedef struct VirtioPciCap VirtioPciCap; + +void virtio_pci_id2type(VDev *vdev, uint16_t device_id); +int virtio_pci_reset(VDev *vdev); +long virtio_pci_notify(int vq_id); + +int vpci_read_flex(uint64_t offset, uint8_t pcias, void *buf, int len); +int vpci_read_bswap64(uint64_t offset, uint8_t pcias, uint64_t *buf); +int vpci_read_bswap32(uint64_t offset, uint8_t pcias, uint32_t *buf); +int vpci_read_bswap16(uint64_t offset, uint8_t pcias, uint16_t *buf); +int vpci_read_byte(uint64_t offset, uint8_t pcias, uint8_t *buf); + +int vpci_bswap64_write(uint64_t offset, uint8_t pcias, uint64_t data); +int vpci_bswap32_write(uint64_t offset, uint8_t pcias, uint32_t data); +int vpci_bswap16_write(uint64_t offset, uint8_t pcias, uint16_t data); +int vpci_write_byte(uint64_t offset, uint8_t pcias, uint8_t data); + +#endif diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h index c3cb5a6ee3b..1ef64675f4a 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -18,6 +18,8 @@ #define VIRTIO_CONFIG_S_DRIVER 2 /* Driver has used its parts of the config, and is happy */ #define VIRTIO_CONFIG_S_DRIVER_OK 4 +/* Feature negotiation complete */ +#define VIRTIO_CONFIG_S_FEATURES_OK 8 /* We've given up on this device. */ #define VIRTIO_CONFIG_S_FAILED 0x80 =20 @@ -255,6 +257,7 @@ struct VDev { uint8_t scsi_dev_heads; bool scsi_device_selected; ScsiDevice selected_scsi_device; + uint32_t pci_fh; uint32_t max_transfer; uint32_t guest_features[2]; }; diff --git a/pc-bios/s390-ccw/virtio-pci.c b/pc-bios/s390-ccw/virtio-pci.c new file mode 100644 index 00000000000..f6ce7ec7661 --- /dev/null +++ b/pc-bios/s390-ccw/virtio-pci.c @@ -0,0 +1,167 @@ +/* + * Functionality for virtio-pci + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "clp.h" +#include "pci.h" +#include "helper.h" +#include "virtio.h" +#include "bswap.h" +#include "virtio-pci.h" +#include "s390-time.h" +#include + +/* Variable offsets used for reads/writes to modern memory regions */ +VirtioPciCap c_cap; /* Common capabilities */ +VirtioPciCap d_cap; /* Device capabilities */ +VirtioPciCap n_cap; /* Notify capabilities */ +uint32_t notify_mult; +uint16_t q_notify_offset; + +static int virtio_pci_set_status(uint8_t status) +{ + int rc =3D vpci_write_byte(c_cap.off + VPCI_C_OFFSET_STATUS, c_cap.bar= , status); + if (rc) { + puts("Failed to write virtio-pci status"); + return -EIO; + } + + return 0; +} + +static int virtio_pci_get_status(uint8_t *status) +{ + int rc =3D vpci_read_byte(c_cap.off + VPCI_C_OFFSET_STATUS, c_cap.bar,= status); + if (rc) { + puts("Failed to read virtio-pci status"); + return -EIO; + } + + return 0; +} + +/* virtio spec v1.3 section 4.1.2.1 */ +void virtio_pci_id2type(VDev *vdev, uint16_t device_id) +{ + switch (device_id) { + case 0x1042: + case 0x1001: + vdev->dev_type =3D VIRTIO_ID_BLOCK; + break; + default: + vdev->dev_type =3D 0; + } +} + +int virtio_pci_reset(VDev *vdev) +{ + int rc; + uint8_t status =3D 0; + + rc =3D virtio_pci_set_status(status); + rc |=3D virtio_pci_get_status(&status); + + if (rc || status) { + puts("Failed to reset virtio-pci device"); + return 1; + } + + return 0; +} + +long virtio_pci_notify(int vq_id) +{ + uint32_t offset =3D n_cap.off + notify_mult * q_notify_offset; + return vpci_bswap16_write(offset, n_cap.bar, (uint16_t) vq_id); +} + +/* + * Wrappers to byte swap common data sizes then write + */ +int vpci_write_byte(uint64_t offset, uint8_t pcias, uint8_t data) +{ + return pci_write(virtio_get_device()->pci_fh, offset, pcias, (uint64_t= ) data, 1); +} + +int vpci_bswap16_write(uint64_t offset, uint8_t pcias, uint16_t data) +{ + uint64_t le_data =3D bswap16(data); + return pci_write(virtio_get_device()->pci_fh, offset, pcias, le_data, = 2); +} + +int vpci_bswap32_write(uint64_t offset, uint8_t pcias, uint32_t data) +{ + uint64_t le_data =3D bswap32(data); + return pci_write(virtio_get_device()->pci_fh, offset, pcias, le_data, = 4); +} + +int vpci_bswap64_write(uint64_t offset, uint8_t pcias, uint64_t data) +{ + uint64_t le_data =3D bswap64(data); + return pci_write(virtio_get_device()->pci_fh, offset, pcias, le_data, = 8); +} + +/* + * Wrappers to read common data sizes then byte swap + */ +int vpci_read_byte(uint64_t offset, uint8_t pcias, uint8_t *buf) +{ + return pci_read(virtio_get_device()->pci_fh, offset, pcias, buf, 1); +} + +int vpci_read_bswap16(uint64_t offset, uint8_t pcias, uint16_t *buf) +{ + int rc =3D pci_read(virtio_get_device()->pci_fh, offset, pcias, buf, 2= ); + *buf =3D bswap16(*buf); + return rc; +} + +int vpci_read_bswap32(uint64_t offset, uint8_t pcias, uint32_t *buf) +{ + int rc =3D pci_read(virtio_get_device()->pci_fh, offset, pcias, buf, 4= ); + *buf =3D bswap32(*buf); + return rc; +} + +int vpci_read_bswap64(uint64_t offset, uint8_t pcias, uint64_t *buf) +{ + int rc =3D pci_read(virtio_get_device()->pci_fh, offset, pcias, buf, 8= ); + *buf =3D bswap64(*buf); + return rc; +} + +/* + * Read to an arbitrary length buffer without byte swapping + */ +int vpci_read_flex(uint64_t offset, uint8_t pcias, void *buf, int len) +{ + uint8_t readlen; + int rc; + int remaining =3D len; + + /* Read bytes in powers of 2, up to a maximum of 8 bytes per read */ + while (remaining) { + for (int i =3D 3; i >=3D 0; i--) { + readlen =3D 1 << i; + if (remaining >=3D readlen) { + break; + } + } + + rc =3D pci_read(virtio_get_device()->pci_fh, offset, pcias, buf, r= eadlen); + if (rc) { + return -1; + } + + remaining -=3D readlen; + buf +=3D readlen; + offset +=3D readlen; + } + + return 0; +} diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index a62fc9d7660..3e5dfb64d5d 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -35,7 +35,7 @@ QEMU_DGFLAGS =3D -MMD -MP -MT $@ -MF $(@D)/$(*F).d =20 OBJECTS =3D start.o main.o bootmap.o jump2ipl.o sclp.o menu.o netmain.o \ virtio.o virtio-net.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o \ - virtio-ccw.o clp.o pci.o + virtio-ccw.o clp.o pci.o virtio-pci.o =20 SLOF_DIR :=3D $(SRC_PATH)/../../roms/SLOF =20 --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122374; cv=none; d=zohomail.com; s=zohoarc; b=gQchMkDSnqy3+0zXejptrhQcgf+T4eDlZzd6+72gL5eYW5dxowabPMz5klo4gRp/SKpoHlDI29nKH1EuSWLBYMOV5QG9WzFCd7oXsxhVZVwDWdtDjN+hsB6VmI/LeOKEZAxosCHQUyqTJM78gHliijUkjn2mu6+LxfFzNlKs+2U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122374; 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=VVj3v0zwtz5DARnu08b2c2+bJ8jCNZ9REaW+V9xzxbo=; b=ERddF8RVhQpEjOLELglz8A0JZzlTltLySBYTOIUy2hMx08Yd1SK8xlVzX5+lWghfgAow7YaruD82mhnZMxHVMkEqDQcW23UjdyThigfPqKHPSSaiT3t0nWs2/YHdU2XK0S7qxMcrZQOevOmg50mwAdHJQwfdcok9+m1YXi8USfE= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177312237421023.525234954390157; Mon, 9 Mar 2026 22:59:34 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq5q-00013V-I2; Tue, 10 Mar 2026 01:57:22 -0400 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 ) id 1vzq5Z-0000oa-Ml for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:57:06 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq5U-0006LD-VL for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:57:03 -0400 Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-74-G-HNLQw1MROZ5yL6sH_m_w-1; Tue, 10 Mar 2026 01:56:54 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 4278619541A7; Tue, 10 Mar 2026 05:56:53 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id AB49B1955D87; Tue, 10 Mar 2026 05:56:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122220; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VVj3v0zwtz5DARnu08b2c2+bJ8jCNZ9REaW+V9xzxbo=; b=hgd7VcAcdYpFs2QWlXOuVNH3m8ny1Q0RK8rXuX3LaLhyXn086HPW4gCpR1SPoTRzk6/8mT DSYTK2NPvvKSLefWYR2auvFAd9ZzUyQXkJS7IBxi9sdi5yfyAQXyP/4NXwkr/oNv+dgVxG rOmPlyOW+x8+2zBbpb6Uzi3xYK/cdSg= X-MC-Unique: G-HNLQw1MROZ5yL6sH_m_w-1 X-Mimecast-MFC-AGG-ID: G-HNLQw1MROZ5yL6sH_m_w_1773122213 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Eric Farman , Jared Rossi Subject: [PULL 20/25] pc-bios/s390-ccw: Add support for virtio-blk-pci IPL Date: Tue, 10 Mar 2026 06:55:25 +0100 Message-ID: <20260310055530.8893-21-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122376277158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Add little-endian virt-queue configuration and support for virtio-blk-pci I= PL devices. Reviewed-by: Eric Farman Signed-off-by: Jared Rossi Message-ID: <20260309003601.242634-13-jrossi@linux.ibm.com> [thuth: Fix coding style error & spelling warning reported by checkpatch.pl] Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/pci.h | 3 + pc-bios/s390-ccw/virtio-pci.h | 2 + pc-bios/s390-ccw/virtio.h | 1 + pc-bios/s390-ccw/main.c | 61 ++++++- pc-bios/s390-ccw/virtio-blkdev.c | 18 +++ pc-bios/s390-ccw/virtio-pci.c | 266 +++++++++++++++++++++++++++++++ pc-bios/s390-ccw/virtio.c | 54 ++++++- 7 files changed, 400 insertions(+), 5 deletions(-) diff --git a/pc-bios/s390-ccw/pci.h b/pc-bios/s390-ccw/pci.h index 968635eff11..b9eb86b2e67 100644 --- a/pc-bios/s390-ccw/pci.h +++ b/pc-bios/s390-ccw/pci.h @@ -26,8 +26,11 @@ union register_pair { }; =20 #define PCI_CFGBAR 0xF /* Base Address Register for config sp= ace */ +#define PCI_CMD_REG 0x4 /* Offset of command register */ #define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list ent= ry */ =20 +#define PCI_BUS_MASTER_MASK 0x0020 /* LE bit 3 of 16 bit register */ + int pci_write(uint32_t fhandle, uint64_t offset, uint8_t pcias, uint64_t d= ata, uint8_t len); int pci_read(uint32_t fhandle, uint64_t offset, uint8_t pcias, void *buf, diff --git a/pc-bios/s390-ccw/virtio-pci.h b/pc-bios/s390-ccw/virtio-pci.h index 54c524f6986..90d07cb9a76 100644 --- a/pc-bios/s390-ccw/virtio-pci.h +++ b/pc-bios/s390-ccw/virtio-pci.h @@ -65,6 +65,8 @@ typedef struct VirtioPciCap VirtioPciCap; void virtio_pci_id2type(VDev *vdev, uint16_t device_id); int virtio_pci_reset(VDev *vdev); long virtio_pci_notify(int vq_id); +int virtio_pci_setup(VDev *vdev); +int virtio_pci_setup_device(void); =20 int vpci_read_flex(uint64_t offset, uint8_t pcias, void *buf, int len); int vpci_read_bswap64(uint64_t offset, uint8_t pcias, uint64_t *buf); diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h index 1ef64675f4a..d32a4830cad 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -273,6 +273,7 @@ struct VirtioCmd { }; typedef struct VirtioCmd VirtioCmd; =20 +bool be_ipl(void); void vring_init(VRing *vr, VqInfo *info); bool virtio_is_supported(VDev *vdev); bool vring_notify(VRing *vr); diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 32154c5db8d..26287cfd811 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -18,6 +18,8 @@ #include "virtio.h" #include "virtio-scsi.h" #include "dasd-ipl.h" +#include "clp.h" +#include "virtio-pci.h" =20 static SubChannelId blk_schid =3D { .one =3D 1 }; static char loadparm_str[LOADPARM_LEN + 1]; @@ -151,6 +153,21 @@ static bool find_subch(int dev_no) return false; } =20 +static bool find_fid(uint32_t fid) +{ + ClpFhListEntry entry; + VDev *vdev =3D virtio_get_device(); + + if (find_pci_function(fid, &entry)) { + return false; + } + + vdev->pci_fh =3D entry.fh; + virtio_pci_id2type(vdev, entry.device_id); + + return vdev->dev_type !=3D 0; +} + static void menu_setup(VDev *vdev) { if (memcmp(loadparm_str, LOADPARM_PROMPT, LOADPARM_LEN) =3D=3D 0) { @@ -240,6 +257,9 @@ static bool find_boot_device(void) blk_schid.ssid =3D iplb.scsi.ssid & 0x3; found =3D find_subch(iplb.scsi.devno); break; + case S390_IPL_TYPE_PCI: + found =3D find_fid(iplb.pci.fid); + break; default: puts("Unsupported IPLB"); } @@ -276,7 +296,7 @@ static int virtio_setup(void) return ret; } =20 -static void ipl_boot_device(void) +static void ipl_ccw_device(void) { switch (cutype) { case CU_TYPE_DASD_3990: @@ -290,7 +310,44 @@ static void ipl_boot_device(void) } break; default: - printf("Attempting to boot from unexpected device type 0x%X\n", cu= type); + printf("Cannot boot CCW device with cu type 0x%X\n", cutype); + } +} + +static void ipl_pci_device(void) +{ + VDev *vdev =3D virtio_get_device(); + vdev->is_cdrom =3D false; + vdev->scsi_device_selected =3D false; + + if (virtio_pci_setup_device()) { + return; + } + + switch (vdev->dev_type) { + case VIRTIO_ID_BLOCK: + if (virtio_setup() =3D=3D 0) { + zipl_load(); /* only return on error */ + virtio_reset(virtio_get_device()); + } + break; + default: + printf("Cannot boot PCI device type 0x%X\n", vdev->dev_type); + } +} + +static void ipl_boot_device(void) +{ + switch (virtio_get_device()->ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + ipl_ccw_device(); + break; + case S390_IPL_TYPE_PCI: + ipl_pci_device(); + break; + default: + puts("Unrecognized IPL type!"); } } =20 diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blk= dev.c index 9722b6970f1..98b6cec3a09 100644 --- a/pc-bios/s390-ccw/virtio-blkdev.c +++ b/pc-bios/s390-ccw/virtio-blkdev.c @@ -13,10 +13,22 @@ #include "virtio.h" #include "virtio-scsi.h" #include "virtio-ccw.h" +#include "virtio-pci.h" +#include "bswap.h" =20 #define VIRTIO_BLK_F_GEOMETRY (1 << 4) #define VIRTIO_BLK_F_BLK_SIZE (1 << 6) =20 +/* + * Format header for little endian IPL + */ +static void fmt_blk_hdr_le(VirtioBlkOuthdr *hdr) +{ + hdr->type =3D bswap32(hdr->type); + hdr->ioprio =3D bswap32(hdr->ioprio); + hdr->sector =3D bswap64(hdr->sector); +} + static int virtio_blk_read_many(VDev *vdev, unsigned long sector, void *lo= ad_addr, int sec_num) { @@ -29,6 +41,10 @@ static int virtio_blk_read_many(VDev *vdev, unsigned lon= g sector, void *load_add out_hdr.ioprio =3D 99; out_hdr.sector =3D virtio_sector_adjust(sector); =20 + if (!be_ipl()) { + fmt_blk_hdr_le(&out_hdr); + } + vring_send_buf(vr, &out_hdr, sizeof(out_hdr), VRING_DESC_F_NEXT); =20 /* This is where we want to receive data */ @@ -240,6 +256,8 @@ int virtio_blk_setup_device(VDev *vdev) case S390_IPL_TYPE_QEMU_SCSI: case S390_IPL_TYPE_CCW: return virtio_ccw_setup(vdev); + case S390_IPL_TYPE_PCI: + return virtio_pci_setup(vdev); default: return 1; } diff --git a/pc-bios/s390-ccw/virtio-pci.c b/pc-bios/s390-ccw/virtio-pci.c index f6ce7ec7661..53bdb52e76a 100644 --- a/pc-bios/s390-ccw/virtio-pci.c +++ b/pc-bios/s390-ccw/virtio-pci.c @@ -165,3 +165,269 @@ int vpci_read_flex(uint64_t offset, uint8_t pcias, vo= id *buf, int len) =20 return 0; } + +static int vpci_set_selected_vq(uint16_t queue_num) +{ + return vpci_bswap16_write(c_cap.off + VPCI_C_OFFSET_Q_SELECT, c_cap.ba= r, queue_num); +} + +static int vpci_set_queue_enable(uint16_t enabled) +{ + return vpci_bswap16_write(c_cap.off + VPCI_C_OFFSET_Q_ENABLE, c_cap.ba= r, enabled); +} + +static int set_pci_vq_addr(uint64_t config_off, void *addr) +{ + return vpci_bswap64_write(c_cap.off + config_off, c_cap.bar, (uint64_t= ) addr); +} + +static int virtio_pci_get_blk_config(void) +{ + VirtioBlkConfig *cfg =3D &virtio_get_device()->config.blk; + int rc =3D vpci_read_flex(d_cap.off, d_cap.bar, cfg, sizeof(VirtioBlkC= onfig)); + + /* single byte fields are not touched */ + cfg->capacity =3D bswap64(cfg->capacity); + cfg->size_max =3D bswap32(cfg->size_max); + cfg->seg_max =3D bswap32(cfg->seg_max); + + cfg->geometry.cylinders =3D bswap16(cfg->geometry.cylinders); + + cfg->blk_size =3D bswap32(cfg->blk_size); + cfg->min_io_size =3D bswap16(cfg->min_io_size); + cfg->opt_io_size =3D bswap32(cfg->opt_io_size); + + return rc; +} + +static int virtio_pci_negotiate(void) +{ + int i, rc; + VDev *vdev =3D virtio_get_device(); + struct VirtioFeatureDesc { + uint32_t features; + uint8_t index; + } __attribute__((packed)) feats; + + for (i =3D 0; i < ARRAY_SIZE(vdev->guest_features); i++) { + feats.features =3D 0; + feats.index =3D i; + + rc =3D vpci_bswap32_write(c_cap.off + VPCI_C_OFFSET_DFSELECT, c_ca= p.bar, + feats.index); + rc |=3D vpci_read_flex(c_cap.off + VPCI_C_OFFSET_DF, c_cap.bar, &f= eats, 4); + + vdev->guest_features[i] &=3D bswap32(feats.features); + feats.features =3D vdev->guest_features[i]; + + + rc |=3D vpci_bswap32_write(c_cap.off + VPCI_C_OFFSET_GFSELECT, c_c= ap.bar, + feats.index); + rc |=3D vpci_bswap32_write(c_cap.off + VPCI_C_OFFSET_GF, c_cap.bar, + feats.features); + } + + return rc; +} + +/* + * Find the position of the capability config within PCI configuration + * space for a given cfg type. Return the position if found, otherwise 0. + */ +static uint8_t virtio_pci_find_cap_pos(uint8_t cfg_type) +{ + uint8_t next, cfg; + int rc; + + rc =3D vpci_read_byte(PCI_CAPABILITY_LIST, PCI_CFGBAR, &next); + rc |=3D vpci_read_byte(next + 3, PCI_CFGBAR, &cfg); + + while (!rc && (cfg !=3D cfg_type) && next) { + rc =3D vpci_read_byte(next + 1, PCI_CFGBAR, &next); + rc |=3D vpci_read_byte(next + 3, PCI_CFGBAR, &cfg); + } + + return rc ? 0 : next; +} + +/* + * Read PCI configuration space to find the offset of the Common, Device, = and + * Notification memory regions within the modern memory space. + * Returns 0 if success, 1 if a capability could not be located, or a + * negative RC if the configuration read failed. + */ +static int virtio_pci_read_pci_cap_config(void) +{ + uint8_t pos; + int rc; + + /* Common capabilities */ + pos =3D virtio_pci_find_cap_pos(VPCI_CAP_COMMON_CFG); + if (!pos) { + puts("Failed to locate PCI common configuration"); + return 1; + } + + rc =3D vpci_read_byte(pos + VPCI_CAP_BAR, PCI_CFGBAR, &c_cap.bar); + if (rc || vpci_read_bswap32(pos + VPCI_CAP_OFFSET, PCI_CFGBAR, &c_cap.= off)) { + puts("Failed to read PCI common configuration"); + return -EIO; + } + + /* Device capabilities */ + pos =3D virtio_pci_find_cap_pos(VPCI_CAP_DEVICE_CFG); + if (!pos) { + puts("Failed to locate PCI device configuration"); + return 1; + } + + rc =3D vpci_read_byte(pos + VPCI_CAP_BAR, PCI_CFGBAR, &d_cap.bar); + if (rc || vpci_read_bswap32(pos + VPCI_CAP_OFFSET, PCI_CFGBAR, &d_cap.= off)) { + puts("Failed to read PCI device configuration"); + return -EIO; + } + + /* Notification capabilities */ + pos =3D virtio_pci_find_cap_pos(VPCI_CAP_NOTIFY_CFG); + if (!pos) { + puts("Failed to locate PCI notification configuration"); + return 1; + } + + rc =3D vpci_read_byte(pos + VPCI_CAP_BAR, PCI_CFGBAR, &n_cap.bar); + if (rc || vpci_read_bswap32(pos + VPCI_CAP_OFFSET, PCI_CFGBAR, &n_cap.= off)) { + puts("Failed to read PCI notification configuration"); + return -EIO; + } + + rc =3D vpci_read_bswap32(pos + VPCI_N_CAP_MULT, PCI_CFGBAR, ¬ify_mu= lt); + if (rc || vpci_read_bswap16(c_cap.off + VPCI_C_OFFSET_Q_NOFF, c_cap.ba= r, + &q_notify_offset)) { + puts("Failed to read notification queue configuration"); + return -EIO; + } + + return 0; +} + +static int enable_pci_bus_master(void) +{ + uint16_t cmd_reg; + + if (vpci_read_bswap16(PCI_CMD_REG, PCI_CFGBAR, &cmd_reg)) { + puts("Failed to read PCI command register"); + return -EIO; + } + + if (vpci_bswap16_write(PCI_CMD_REG, PCI_CFGBAR, cmd_reg | PCI_BUS_MAST= ER_MASK)) { + puts("Failed to enable PCI bus mastering"); + return -EIO; + } + + return 0; +} + +int virtio_pci_setup(VDev *vdev) +{ + VRing *vr; + int rc; + uint8_t status; + uint16_t vq_size; + int i =3D 0; + + vdev->guessed_disk_nature =3D VIRTIO_GDN_NONE; + vdev->cmd_vr_idx =3D 0; + + if (virtio_pci_read_pci_cap_config()) { + puts("Invalid virtio PCI capabilities"); + return -EIO; + } + + if (enable_pci_bus_master()) { + return -EIO; + } + + if (virtio_reset(vdev)) { + return -EIO; + } + + status =3D VIRTIO_CONFIG_S_ACKNOWLEDGE; + if (virtio_pci_set_status(status)) { + puts("Virtio-pci device Failed to ACKNOWLEDGE"); + return -EIO; + } + + vdev->guest_features[1] =3D VIRTIO_F_VERSION_1; + if (virtio_pci_negotiate()) { + panic("Virtio feature negotiation failed!"); + } + + switch (vdev->dev_type) { + case VIRTIO_ID_BLOCK: + vdev->nr_vqs =3D 1; + vdev->cmd_vr_idx =3D 0; + virtio_pci_get_blk_config(); + break; + default: + puts("Unsupported virtio device"); + return -ENODEV; + } + + status |=3D VIRTIO_CONFIG_S_DRIVER; + rc =3D virtio_pci_set_status(status); + if (rc) { + puts("Set status failed"); + return -EIO; + } + + if (vpci_read_bswap16(VPCI_C_OFFSET_Q_SIZE, c_cap.bar, &vq_size)) { + puts("Failed to read virt-queue configuration"); + return -EIO; + } + + /* Configure virt-queues for pci */ + for (i =3D 0; i < vdev->nr_vqs; i++) { + VqInfo info =3D { + .queue =3D (unsigned long long) virtio_get_ring_area(i), + .align =3D KVM_S390_VIRTIO_RING_ALIGN, + .index =3D i, + .num =3D vq_size, + }; + + vr =3D &vdev->vrings[i]; + vring_init(vr, &info); + + if (vpci_set_selected_vq(vr->id)) { + puts("Failed to set selected virt-queue"); + return -EIO; + } + + rc =3D set_pci_vq_addr(VPCI_C_OFFSET_Q_DESCLO, vr->desc); + rc |=3D set_pci_vq_addr(VPCI_C_OFFSET_Q_AVAILLO, vr->avail); + rc |=3D set_pci_vq_addr(VPCI_C_OFFSET_Q_USEDLO, vr->used); + if (rc) { + puts("Failed to configure virt-queue address"); + return -EIO; + } + + if (vpci_set_queue_enable(true)) { + puts("Failed to set virt-queue enabled"); + return -EIO; + } + } + + status |=3D VIRTIO_CONFIG_S_FEATURES_OK | VIRTIO_CONFIG_S_DRIVER_OK; + return virtio_pci_set_status(status); +} + +int virtio_pci_setup_device(void) +{ + VDev *vdev =3D virtio_get_device(); + + if (enable_pci_function(&vdev->pci_fh)) { + puts("Failed to enable PCI function"); + return -ENODEV; + } + + return 0; +} diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index 956b34ff33a..390b55c7b92 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -17,6 +17,7 @@ #include "virtio.h" #include "virtio-scsi.h" #include "virtio-ccw.h" +#include "virtio-pci.h" #include "bswap.h" #include "helper.h" #include "s390-time.h" @@ -96,7 +97,7 @@ void vring_init(VRing *vr, VqInfo *info) vr->avail->idx =3D 0; =20 /* We're running with interrupts off anyways, so don't bother */ - vr->used->flags =3D VRING_USED_F_NO_NOTIFY; + vr->used->flags =3D be_ipl() ? VRING_USED_F_NO_NOTIFY : bswap16(VRING_= USED_F_NO_NOTIFY); vr->used->idx =3D 0; vr->used_idx =3D 0; vr->next_idx =3D 0; @@ -112,6 +113,8 @@ bool vring_notify(VRing *vr) case S390_IPL_TYPE_CCW: vr->cookie =3D virtio_ccw_notify(vdev.schid, vr->id, vr->cookie); break; + case S390_IPL_TYPE_PCI: + vr->cookie =3D virtio_pci_notify(vr->id); default: return 1; } @@ -119,11 +122,45 @@ bool vring_notify(VRing *vr) return vr->cookie >=3D 0; } =20 +/* + * Get endienness of the IPL type + * Return true for s390x native big-endian + */ +bool be_ipl(void) +{ + switch (virtio_get_device()->ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return true; + case S390_IPL_TYPE_PCI: + return false; + default: + return true; + } +} + +/* + * Format the virtio ring descriptor endianness + * Return the available index increment in the appropriate endianness + */ +static void vr_bswap_descriptor(VRingDesc *desc) +{ + desc->addr =3D bswap64(desc->addr); + desc->len =3D bswap32(desc->len); + desc->flags =3D bswap16(desc->flags); + desc->next =3D bswap16(desc->next); +} + void vring_send_buf(VRing *vr, void *p, int len, int flags) { + if (!be_ipl()) { + vr->avail->idx =3D bswap16(vr->avail->idx); + } + /* For follow-up chains we need to keep the first entry point */ if (!(flags & VRING_HIDDEN_IS_CHAIN)) { - vr->avail->ring[vr->avail->idx % vr->num] =3D vr->next_idx; + vr->avail->ring[vr->avail->idx % vr->num] =3D be_ipl() ? vr->next_= idx : + bswap16(vr-= >next_idx); } =20 vr->desc[vr->next_idx].addr =3D (unsigned long)p; @@ -131,12 +168,21 @@ void vring_send_buf(VRing *vr, void *p, int len, int = flags) vr->desc[vr->next_idx].flags =3D flags & ~VRING_HIDDEN_IS_CHAIN; vr->desc[vr->next_idx].next =3D vr->next_idx; vr->desc[vr->next_idx].next++; + + if (!be_ipl()) { + vr_bswap_descriptor(&vr->desc[vr->next_idx]); + } + vr->next_idx++; =20 /* Chains only have a single ID */ if (!(flags & VRING_DESC_F_NEXT)) { vr->avail->idx++; } + + if (!be_ipl()) { + vr->avail->idx =3D bswap16(vr->avail->idx); + } } =20 int vr_poll(VRing *vr) @@ -147,7 +193,7 @@ int vr_poll(VRing *vr) return 0; } =20 - vr->used_idx =3D vr->used->idx; + vr->used_idx =3D vr->used->idx; /* Endianness is preserved */ vr->next_idx =3D 0; vr->desc[0].len =3D 0; vr->desc[0].flags =3D 0; @@ -187,6 +233,8 @@ int virtio_reset(VDev *vdev) case S390_IPL_TYPE_QEMU_SCSI: case S390_IPL_TYPE_CCW: return virtio_ccw_reset(vdev); + case S390_IPL_TYPE_PCI: + return virtio_pci_reset(vdev); default: return -1; } --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122411; cv=none; d=zohomail.com; s=zohoarc; b=WCBcWHvIXZ7NDPlYM2leYn0KMW+IdPocXqCJQybeeo0kGIh+qDht3nUBVVg6ZIsL7jFlwsZW0AvhAYntVBXMdJeJDJXuxWg0Kx+SBr+qDDGbWfcmiwF4XFHypvPH5ObC88PByqGHzHzYxUKDjTICZyTn5TX1Hn1wRVxT7A/neYk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122411; 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=7HFTSQSGTDzITAOxJjwZ6A8S8EXuNQDFAnJqDDfwx/M=; b=Q4Zv6FPySJkh1krNVOsokahZGP98BLV48MV0i51/rqNp4PsmBoxZse3aaWiSzgsZ300E+os7E+0TnBiq9xQ8olLOUlSLV8ro0kbccXHgH8n3VTwjDtytE0ChU4LQhcpvdZLd8b/aDjqMrvd95kK3aO9K9HW7G7n2OP6ryjksQtE= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122411729862.4608890068902; Mon, 9 Mar 2026 23:00:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq62-0001Fw-LP; Tue, 10 Mar 2026 01:57:36 -0400 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 ) id 1vzq5Z-0000ob-Ne for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:57:07 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq5X-0006LO-7v for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:57:05 -0400 Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-50-oAGewyd3MhWex9koD4Bikw-1; Tue, 10 Mar 2026 01:56:57 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id CD1A719560AE; Tue, 10 Mar 2026 05:56:55 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 007811956095; Tue, 10 Mar 2026 05:56:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122221; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7HFTSQSGTDzITAOxJjwZ6A8S8EXuNQDFAnJqDDfwx/M=; b=NIXO+X3MlDaBtBK36OGtHZ3BPfgBvq4iNmh10A5SIlnfSzN28JOdPjJditvYDxd0bzGuEC iTUCVZJrZac12HFXSQXGIrtKZQd787YT1593GGBs0NOYSHzgNeSdM719Xj3SxdD3r5bsT/ c/by+iwVtgZdcoa5y0PpZ/ASO4ARGzY= X-MC-Unique: oAGewyd3MhWex9koD4Bikw-1 X-Mimecast-MFC-AGG-ID: oAGewyd3MhWex9koD4Bikw_1773122215 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Eric Farman , Jared Rossi Subject: [PULL 21/25] s390x: Build IPLB for virtio-pci devices Date: Tue, 10 Mar 2026 06:55:26 +0100 Message-ID: <20260310055530.8893-22-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122412423158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Search for a corresponding S390PCIBusDevice and build an IPLB if a device h= as been indexed for boot but does not identify as a CCW device, PCI devices are not yet included in boot probing (they must have a boot ind= ex). Reviewed-by: Thomas Huth Reviewed-by: Eric Farman Signed-off-by: Jared Rossi Message-ID: <20260309003601.242634-14-jrossi@linux.ibm.com> [thuth: Fix endianness issue when running on a little endian host] Signed-off-by: Thomas Huth --- hw/s390x/ipl.h | 3 ++ include/hw/s390x/s390-pci-bus.h | 2 ++ hw/s390x/ipl.c | 56 ++++++++++++++++++++++++++++++--- hw/s390x/s390-pci-bus.c | 3 +- 4 files changed, 57 insertions(+), 7 deletions(-) diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h index c542d30ce2d..403cd08450d 100644 --- a/hw/s390x/ipl.h +++ b/hw/s390x/ipl.h @@ -107,6 +107,7 @@ QEMU_BUILD_BUG_MSG(offsetof(S390IPLState, iplb) & 3, "a= lignment of iplb wrong"); #define S390_IPLB_MIN_PV_LEN 148 #define S390_IPLB_MIN_CCW_LEN 200 #define S390_IPLB_MIN_FCP_LEN 384 +#define S390_IPLB_MIN_PCI_LEN 376 #define S390_IPLB_MIN_QEMU_SCSI_LEN 200 =20 static inline bool iplb_valid_len(IplParameterBlock *iplb) @@ -179,6 +180,8 @@ static inline bool iplb_valid(IplParameterBlock *iplb) return len >=3D S390_IPLB_MIN_FCP_LEN; case S390_IPL_TYPE_CCW: return len >=3D S390_IPLB_MIN_CCW_LEN; + case S390_IPL_TYPE_PCI: + return len >=3D S390_IPLB_MIN_PCI_LEN; case S390_IPL_TYPE_QEMU_SCSI: default: return false; diff --git a/include/hw/s390x/s390-pci-bus.h b/include/hw/s390x/s390-pci-bu= s.h index f643e130579..9228523ce8e 100644 --- a/include/hw/s390x/s390-pci-bus.h +++ b/include/hw/s390x/s390-pci-bus.h @@ -402,6 +402,8 @@ S390PCIBusDevice *s390_pci_find_dev_by_fh(S390pciState = *s, uint32_t fh); S390PCIBusDevice *s390_pci_find_dev_by_fid(S390pciState *s, uint32_t fid); S390PCIBusDevice *s390_pci_find_dev_by_target(S390pciState *s, const char *target); +S390PCIBusDevice *s390_pci_find_dev_by_pci(S390pciState *s, + PCIDevice *pci_dev); S390PCIBusDevice *s390_pci_find_next_avail_dev(S390pciState *s, S390PCIBusDevice *pbdev); void s390_pci_ism_reset(void); diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index d34adb55220..7e09a8cf80d 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -28,6 +28,8 @@ #include "hw/s390x/ebcdic.h" #include "hw/scsi/scsi.h" #include "hw/virtio/virtio-net.h" +#include "hw/virtio/virtio-pci.h" +#include "hw/s390x/s390-pci-bus.h" #include "exec/cpu-common.h" #include "ipl.h" #include "qemu/error-report.h" @@ -340,7 +342,8 @@ static void s390_ipl_set_boot_menu(S390IPLState *ipl) ipl->qipl.boot_menu_timeout =3D cpu_to_be32(splash_time); } =20 -#define CCW_DEVTYPE_NONE 0x00 +#define S390_DEVTYPE_NONE 0x00 + #define CCW_DEVTYPE_VIRTIO 0x01 #define CCW_DEVTYPE_VIRTIO_NET 0x02 #define CCW_DEVTYPE_SCSI 0x03 @@ -349,7 +352,7 @@ static void s390_ipl_set_boot_menu(S390IPLState *ipl) static CcwDevice *s390_get_ccw_device(DeviceState *dev_st, int *devtype) { CcwDevice *ccw_dev =3D NULL; - int tmp_dt =3D CCW_DEVTYPE_NONE; + int tmp_dt =3D S390_DEVTYPE_NONE; =20 if (dev_st) { VirtIONet *virtio_net_dev =3D (VirtIONet *) @@ -396,6 +399,31 @@ static CcwDevice *s390_get_ccw_device(DeviceState *dev= _st, int *devtype) return ccw_dev; } =20 +#define PCI_DEVTYPE_VIRTIO 0x05 + +static S390PCIBusDevice *s390_get_pci_device(DeviceState *dev_st, int *dev= type) +{ + S390PCIBusDevice *pbdev =3D NULL; + int tmp_dt =3D S390_DEVTYPE_NONE; + + if (dev_st) { + PCIDevice *pci_dev =3D (PCIDevice *) + object_dynamic_cast(OBJECT(qdev_get_parent_bus(dev_st)->parent= ), + TYPE_VIRTIO_PCI); + if (pci_dev) { + pbdev =3D s390_pci_find_dev_by_pci(s390_get_phb(), pci_dev); + if (pbdev) { + tmp_dt =3D PCI_DEVTYPE_VIRTIO; + } + } + } + if (devtype) { + *devtype =3D tmp_dt; + } + + return pbdev; +} + static uint64_t s390_ipl_map_iplb_chain(IplParameterBlock *iplb_chain) { S390IPLState *ipl =3D get_ipl_device(); @@ -428,14 +456,12 @@ void s390_ipl_convert_loadparm(char *ascii_lp, uint8_= t *ebcdic_lp) static bool s390_build_iplb(DeviceState *dev_st, IplParameterBlock *iplb) { CcwDevice *ccw_dev =3D NULL; + S390PCIBusDevice *pbdev =3D NULL; SCSIDevice *sd; int devtype; uint8_t *lp; g_autofree void *scsi_lp =3D NULL; =20 - /* - * Currently allow IPL only from CCW devices. - */ ccw_dev =3D s390_get_ccw_device(dev_st, &devtype); if (ccw_dev) { lp =3D ccw_dev->loadparm; @@ -485,6 +511,26 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPa= rameterBlock *iplb) return true; } =20 + pbdev =3D s390_get_pci_device(dev_st, &devtype); + if (pbdev) { + switch (devtype) { + case PCI_DEVTYPE_VIRTIO: + iplb->len =3D cpu_to_be32(S390_IPLB_MIN_PCI_LEN); + iplb->pbt =3D S390_IPL_TYPE_PCI; + iplb->pci.fid =3D cpu_to_be32(pbdev->fid); + break; + default: + return false; + } + + /* Per-device loadparm not yet supported for non-ccw IPL */ + lp =3D S390_CCW_MACHINE(qdev_get_machine())->loadparm; + s390_ipl_convert_loadparm((char *)lp, iplb->loadparm); + iplb->flags |=3D DIAG308_FLAGS_LP_VALID; + + return true; + } + return false; } =20 diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c index 3166b91c461..4de7b587e8a 100644 --- a/hw/s390x/s390-pci-bus.c +++ b/hw/s390x/s390-pci-bus.c @@ -250,8 +250,7 @@ S390PCIBusDevice *s390_pci_find_dev_by_target(S390pciSt= ate *s, return NULL; } =20 -static S390PCIBusDevice *s390_pci_find_dev_by_pci(S390pciState *s, - PCIDevice *pci_dev) +S390PCIBusDevice *s390_pci_find_dev_by_pci(S390pciState *s, PCIDevice *pci= _dev) { S390PCIBusDevice *pbdev; =20 --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122310; cv=none; d=zohomail.com; s=zohoarc; b=l5BPMgBEBDBr43kNvkgo6Z36OgGj0cYb7pQP65VVodFDSlM/E6N6OtHgwLXuf+jutGhrSCtqDIMxbrf46Gdr95sCvvN7nQzE8+AD+GFFDahV0nok+zdD6nxAAUphCDOOtx3i/xUlkIdBTWY+9lfMeFUzCFKTc9pFj5E6s5fLSNE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122310; 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=EFTM6x/HkKccer2jVaVlp2BBiwHHgfzvPHNZdcz7q1M=; b=NVfjFTcUqD57WxHD9GUQe+azQc2RW6r9hsxKEbC6d7Anwh3UqhCKHiezvVNd13hYG/h2bmS7J3jVey5jeCdoSQ/LDJkHpkGWiWFSLldJc77BvH9Eaiuc/dRgCehrSYerLagihFfO8ecMuZayOpnjvSXgnpS9tU/DGOlGKiZwfC4= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122310575979.8270922075208; Mon, 9 Mar 2026 22:58:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq67-0001Yv-8C; Tue, 10 Mar 2026 01:57:39 -0400 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 ) id 1vzq5b-0000rz-Ko for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:57:09 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq5X-0006LV-Pp for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:57:06 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-558-zoitBFP_PfGD4agU6YLv-Q-1; Tue, 10 Mar 2026 01:56:59 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 9A7FA18005B2; Tue, 10 Mar 2026 05:56:58 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id CAC191956095; Tue, 10 Mar 2026 05:56:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122222; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=EFTM6x/HkKccer2jVaVlp2BBiwHHgfzvPHNZdcz7q1M=; b=anwdZdyn5FX++DqudtyfH+34tWTbJI/IUDEEMLtsWF4/AMQR+UtkOWtndeAFNhnuuidp23 QbT1kHgAj/JMYxk0XM6LSXnRhddReKdrLbJvIZyJzrOhssOHAR6LaxIIotVrm8l3r09mjw mWdDMZD27XlMsVLZsfDPN4XgSJxe5Jg= X-MC-Unique: zoitBFP_PfGD4agU6YLv-Q-1 X-Mimecast-MFC-AGG-ID: zoitBFP_PfGD4agU6YLv-Q_1773122218 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Jared Rossi Subject: [PULL 22/25] hw: Add "loadparm" property to virtio block PCI devices booting on s390x Date: Tue, 10 Mar 2026 06:55:27 +0100 Message-ID: <20260310055530.8893-23-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122313101154100 Content-Type: text/plain; charset="utf-8" From: Jared Rossi The loadparm is required on s390x to pass the information to the boot loader such as which kernel should be started or whether the boot menu should be s= hown. Because PCI devices do not naturally allocate space for this, the property = is added on an architecture specific basis for supported device types. Reviewed-by: Thomas Huth Signed-off-by: Jared Rossi Message-ID: <20260309003601.242634-15-jrossi@linux.ibm.com> Signed-off-by: Thomas Huth --- include/hw/pci/pci.h | 1 + include/hw/pci/pci_device.h | 3 +++ hw/pci/pci.c | 38 +++++++++++++++++++++++++++++++++++++ hw/s390x/ipl.c | 11 +++++++++-- hw/virtio/virtio-blk-pci.c | 1 + 5 files changed, 52 insertions(+), 2 deletions(-) diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index 64141e92fec..5b179091dee 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -380,6 +380,7 @@ const char *pci_root_bus_path(PCIDevice *dev); bool pci_bus_bypass_iommu(PCIBus *bus); PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn); int pci_qdev_find_device(const char *id, PCIDevice **pdev); +void pci_qdev_property_add_specifics(DeviceClass *dc); void pci_bus_get_w64_range(PCIBus *bus, Range *range); =20 void pci_device_deassert_intx(PCIDevice *dev); diff --git a/include/hw/pci/pci_device.h b/include/hw/pci/pci_device.h index 88ccea50113..5cac6e16886 100644 --- a/include/hw/pci/pci_device.h +++ b/include/hw/pci/pci_device.h @@ -62,6 +62,9 @@ struct PCIDevice { bool partially_hotplugged; bool enabled; =20 + /* only for s390x */ + char *loadparm; + /* PCI config space */ uint8_t *config; =20 diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 6399ebd41cb..2c3657d00de 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -36,6 +36,7 @@ #include "migration/qemu-file-types.h" #include "migration/vmstate.h" #include "net/net.h" +#include "system/arch_init.h" #include "system/numa.h" #include "system/runstate.h" #include "system/system.h" @@ -2843,6 +2844,43 @@ int pci_qdev_find_device(const char *id, PCIDevice *= *pdev) return rc; } =20 +static char *pci_qdev_property_get_loadparm(Object *obj, Error **errp) +{ + return g_strdup(PCI_DEVICE(obj)->loadparm); +} + +static void pci_qdev_property_set_loadparm(Object *obj, const char *value, + Error **errp) +{ + void *lp_str; + + if (object_property_get_int(obj, "bootindex", NULL) < 0) { + error_setg(errp, "'loadparm' is only valid for boot devices"); + return; + } + + lp_str =3D g_malloc0(strlen(value) + 1); + if (!qdev_prop_sanitize_s390x_loadparm(lp_str, value, errp)) { + g_free(lp_str); + return; + } + PCI_DEVICE(obj)->loadparm =3D lp_str; +} + +void pci_qdev_property_add_specifics(DeviceClass *dc) +{ + ObjectClass *oc =3D OBJECT_CLASS(dc); + + /* The loadparm property is only supported on s390x */ + if (target_s390x()) { + object_class_property_add_str(oc, "loadparm", + pci_qdev_property_get_loadparm, + pci_qdev_property_set_loadparm); + object_class_property_set_description(oc, "loadparm", + "load parameter (s390x only)= "); + } +} + MemoryRegion *pci_address_space(PCIDevice *dev) { return pci_get_bus(dev)->address_space_mem; diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 7e09a8cf80d..1babcd2b7dd 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -461,6 +461,7 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPar= ameterBlock *iplb) int devtype; uint8_t *lp; g_autofree void *scsi_lp =3D NULL; + g_autofree void *pci_lp =3D NULL; =20 ccw_dev =3D s390_get_ccw_device(dev_st, &devtype); if (ccw_dev) { @@ -513,6 +514,14 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPa= rameterBlock *iplb) =20 pbdev =3D s390_get_pci_device(dev_st, &devtype); if (pbdev) { + pci_lp =3D object_property_get_str(OBJECT(pbdev->pdev), "loadparm"= , NULL); + if (pci_lp && strlen(pci_lp) > 0) { + lp =3D pci_lp; + } else { + /* Use machine loadparm as a place holder if PCI LP is unset */ + lp =3D S390_CCW_MACHINE(qdev_get_machine())->loadparm; + } + switch (devtype) { case PCI_DEVTYPE_VIRTIO: iplb->len =3D cpu_to_be32(S390_IPLB_MIN_PCI_LEN); @@ -523,8 +532,6 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPar= ameterBlock *iplb) return false; } =20 - /* Per-device loadparm not yet supported for non-ccw IPL */ - lp =3D S390_CCW_MACHINE(qdev_get_machine())->loadparm; s390_ipl_convert_loadparm((char *)lp, iplb->loadparm); iplb->flags |=3D DIAG308_FLAGS_LP_VALID; =20 diff --git a/hw/virtio/virtio-blk-pci.c b/hw/virtio/virtio-blk-pci.c index 64a434c81b5..3eecc23a657 100644 --- a/hw/virtio/virtio-blk-pci.c +++ b/hw/virtio/virtio-blk-pci.c @@ -71,6 +71,7 @@ static void virtio_blk_pci_class_init(ObjectClass *klass,= const void *data) =20 set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); device_class_set_props(dc, virtio_blk_pci_properties); + pci_qdev_property_add_specifics(dc); k->realize =3D virtio_blk_pci_realize; pcidev_k->vendor_id =3D PCI_VENDOR_ID_REDHAT_QUMRANET; pcidev_k->device_id =3D PCI_DEVICE_ID_VIRTIO_BLOCK; --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122279; cv=none; d=zohomail.com; s=zohoarc; b=fnPTH+49P0L4n2VUT2nD3VtUwgIdthBgiqxTswz1MvKsbRXRbrEeaHINcod1g64DOh2g+iiXaJ7o1WyI3dkefQcrH4hJhv2rKvrj02r+vYRtQU8gF73YshRKJzTgrySmQkI7e0Zu6ab/uJv7GG1qSpjucVdoa1gIMZt6q5tQqIo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122279; 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=5Nbrqw68lllSDIPSOXOWfbSDtPYzuGPzAQR2zVrL3w0=; b=MTaOP5HLxgSrNFe+bor6L6Mc8IgaQkENEIQGJdW/2/qFIDNmyxnC4hlyVPN7Sl9o+iATYoAaleH1zXVEH0nZhqZJOl9txEGUI30lNFaWNTXSLyFViniInWUHcgxQMlqnxrKpluJPZiYiMAgYSLTlPKwbGDTH+XBnJQFc4j2RwYo= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122279375824.0604604112094; Mon, 9 Mar 2026 22:57:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq64-0001I1-IS; Tue, 10 Mar 2026 01:57:37 -0400 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 ) id 1vzq5d-0000t3-IV for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:57:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq5b-0006M1-Cj for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:57:08 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-155-BArj1VUAOxuaKOtgGe_jqg-1; Tue, 10 Mar 2026 01:57:02 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id B0D09180034F; Tue, 10 Mar 2026 05:57:01 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 9CD5D1955D87; Tue, 10 Mar 2026 05:56:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122226; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5Nbrqw68lllSDIPSOXOWfbSDtPYzuGPzAQR2zVrL3w0=; b=MH7HHxRVVROo5tA0K9Pk8KTI9ADm0PPs/zgaYgU43VQYuZ5h5hoNyryDoJdPAg5Misomr0 SkrU90aOZgs3To9q0P5db+907TU6HOPGQUSLS6sUwQGoDPiSz8Rb9UJETmvAjE5dI5La3E mQs35b1v8X34S+GAiMgY7pmIiGa5a7Q= X-MC-Unique: BArj1VUAOxuaKOtgGe_jqg-1 X-Mimecast-MFC-AGG-ID: BArj1VUAOxuaKOtgGe_jqg_1773122221 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Jared Rossi Subject: [PULL 23/25] tests/qtest: Add s390x PCI boot test to cdrom-test.c Date: Tue, 10 Mar 2026 06:55:28 +0100 Message-ID: <20260310055530.8893-24-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.129.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122279763158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Add a rudimentary test for s390x IPL to verify that a guest may boot using virtio-blk-pci device. Reviewed-by: Thomas Huth Signed-off-by: Jared Rossi Message-ID: <20260309003601.242634-16-jrossi@linux.ibm.com> Signed-off-by: Thomas Huth --- tests/qtest/cdrom-test.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/qtest/cdrom-test.c b/tests/qtest/cdrom-test.c index 56e2d283a9d..a65854d2bc5 100644 --- a/tests/qtest/cdrom-test.c +++ b/tests/qtest/cdrom-test.c @@ -246,6 +246,13 @@ static void add_s390x_tests(void) "-drive if=3Dnone,id=3Dd2,media=3Dcdrom,file= =3D", test_cdboot); } + if (qtest_has_device("virtio-blk-pci")) { + qtest_add_data_func("cdrom/boot/pci-bus-with-bootindex", + "-device virtio-scsi -device virtio-serial " + "-device virtio-blk-pci,drive=3Dd1,bootindex= =3D1 " + "-drive if=3Dnone,id=3Dd1,media=3Dcdrom,file= =3D", + test_cdboot); + } } =20 int main(int argc, char **argv) --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122417; cv=none; d=zohomail.com; s=zohoarc; b=EKaz+q/t1IshbwERiyhUCxaW2AtF8GXXIC1A/dVDkMoUM8LBvAWgAw1ukiD7wE6fUBJ2FqoEyg9KbgpEtQ4lgyLhj/W/gOpVLP6D0B9LqWto4WprbtMjnrrSGkpSq5fynMZxnUgJ9lta9V40A2qGK8FTye03jVTUIer6jqLVPmI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122417; 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=60UgrVo6Hzx9RlCFMM7bh5XcXcJpuiQZ08J0En/TgF8=; b=SHm1XT8gvxohwAYXn2dRCo4PdFyxUl4IQeq/d8nv1gAizXyEzESuPB7hb2ZMj79RNWEvjS23XFRPPHcpC3mVEFi/c0NEk3LMBw6MtdKxwGfqI+T677A+Tx9U3FaQrLwJEOmYhZLJOq7ECuel4fnXIs+9yXSdYxiKO8Sk7kfDgmU= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122417707271.3461579461549; Mon, 9 Mar 2026 23:00:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq6N-0002Jd-Ca; Tue, 10 Mar 2026 01:57:55 -0400 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 ) id 1vzq5l-00013F-LP for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:57:20 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq5h-0006MU-60 for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:57:15 -0400 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-584-J0br5LovOdS__GafBgfu2Q-1; Tue, 10 Mar 2026 01:57:06 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 4747918005B4; Tue, 10 Mar 2026 05:57:05 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id ABE2F1956095; Tue, 10 Mar 2026 05:57:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122230; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=60UgrVo6Hzx9RlCFMM7bh5XcXcJpuiQZ08J0En/TgF8=; b=Jgw8jOV1kkLTtoQhb7ifSwXo2W+S4lSAmCzLKtg9KuLg8DvVdZQ6fTj0Ff4IZIREN+d6ui YHY+4eSzd1fZy0VedgpcXiU7GJ2Km56nS2EOcbsYfBwng9VIv2IixlJsri7U/4qDr0bPjA /WduVK7xqOLDezITx7WBmwJC5/CXJsc= X-MC-Unique: J0br5LovOdS__GafBgfu2Q-1 X-Mimecast-MFC-AGG-ID: J0br5LovOdS__GafBgfu2Q_1773122225 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org, Farhan Ali Subject: [PULL 24/25] pc-bios/s390-ccw: Fix compiler warning when compiling with DEBUG enabled Date: Tue, 10 Mar 2026 06:55:29 +0100 Message-ID: <20260310055530.8893-25-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122418586158500 Content-Type: text/plain; charset="utf-8" From: Thomas Huth When compiling with DEBUG=3D1, there is currently a compiler warning: pc-bios/s390-ccw: Compiling main.o In file included from /home/thuth/devel/qemu/pc-bios/s390-ccw/main.c:14: In file included from /home/thuth/devel/qemu/pc-bios/s390-ccw/helper.h:16: /home/thuth/devel/qemu/pc-bios/s390-ccw/s390-ccw.h:122:31: warning: format= specifies type 'unsigned int' but the argument has type 'u64' (aka 'unsigned long l= ong') [-Wformat] 122 | printf("%s 0x%X\n", desc, addr); | ~~ ^~~~ | %llX 1 warning generated. Fix it by using the right format string here. Message-ID: <20260306203645.28232-1-thuth@redhat.com> Reviewed-by: Farhan Ali Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/s390-ccw.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index ccd68ff0a4b..1e1f71775ec 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -112,7 +112,7 @@ static inline void fill_hex_val(char *out, void *ptr, u= nsigned size) static inline void debug_print_int(const char *desc, u64 addr) { #ifdef DEBUG - printf("%s 0x%X\n", desc, addr); + printf("%s 0x%llx\n", desc, addr); #endif } =20 --=20 2.53.0 From nobody Sat Apr 11 19:53:12 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773122351; cv=none; d=zohomail.com; s=zohoarc; b=gBF/MVKL3f5BKWc+MeJ1ghFrmIPRbyQJIC+fLjdCSIqcMkhmtNPgCXxGgwj+aqd+x9cT3E2dtzNF24Af5D7U5WEJ87AQW2hqHFfxmK9Lf7fc1j5s1UgVS00KFkFp1kKS5hJ/BWTEax0HH+AmsUyCTZnflEK6rabgCQ4vg/h8Swc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773122351; 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=dnXy2UF9/yaHJlOUs6FDmT7R2QkD3c5kHKcbSV1yClo=; b=BwWfshkGNW9l5wffwfX7oHT64kL1g8x2e2PzNTMve5S07p3diVZGIg6+0bdF1JNQSk075gkgdG9K1Nyb1fYocSOQJQNo+MlcSIzahMo5komLsPeYlwj2qve9smX/KTI59X1ngKsF3RDdbuDBGIfDtv9YzHHOl3zJJirlX9/azwA= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773122351126217.04459399824748; Mon, 9 Mar 2026 22:59:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vzq6P-0002Ui-2B; Tue, 10 Mar 2026 01:57:57 -0400 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 ) id 1vzq5o-00017P-Gy for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:57:22 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vzq5i-0006Mi-Ja for qemu-devel@nongnu.org; Tue, 10 Mar 2026 01:57:20 -0400 Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-318-tPT-H5xnO-KdI6ka94J7GQ-1; Tue, 10 Mar 2026 01:57:10 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id D5F61180034E; Tue, 10 Mar 2026 05:57:08 +0000 (UTC) Received: from thuth-p1g4.redhat.com (unknown [10.44.32.69]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 47CDC1956095; Tue, 10 Mar 2026 05:57:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773122232; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=dnXy2UF9/yaHJlOUs6FDmT7R2QkD3c5kHKcbSV1yClo=; b=RzANCOZW4WScwRVNoZ2kTq+fKqRQJ63pQHL5NRIxI4ju3LEPYAfuykWoyM/wH9+6zWo31C g8ttty/j6sgZUB+9Cz999AcYwtSuc9VG7LJTsAgu1lJ2ZubeZ5iABjRpGoBO8Erc1Z9i2H MTNV2uzVrgwi2IRerZpQI3bkgropjFc= X-MC-Unique: tPT-H5xnO-KdI6ka94J7GQ-1 X-Mimecast-MFC-AGG-ID: tPT-H5xnO-KdI6ka94J7GQ_1773122229 From: Thomas Huth To: Peter Maydell Cc: qemu-devel@nongnu.org Subject: [PULL 25/25] pc-bios/s390-ccw.img: Update the s390 bios blog with the latest changes Date: Tue, 10 Mar 2026 06:55:30 +0100 Message-ID: <20260310055530.8893-26-thuth@redhat.com> In-Reply-To: <20260310055530.8893-1-thuth@redhat.com> References: <20260310055530.8893-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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 @redhat.com) X-ZM-MESSAGEID: 1773122353684154100 Content-Type: text/plain; charset="utf-8" From: Thomas Huth - Make sure the reset virtio devices on failed boot attempts - Add support for booting via virtio-blk-pci Signed-off-by: Thomas Huth --- pc-bios/s390-ccw.img | Bin 87824 -> 95992 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img index ff60978d28c59a3d9ee706e48ff268aad6476ddc..48ac78c894592b655062fcf9513= acc39d917f176 100644 GIT binary patch literal 95992 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 P{y^P4+6Ge6_2K^mU6)D| literal 87824 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%0AxAWlE`)rh?!A3Z0!B^C@~pH{Utwi@3fr%9j3 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 --=20 2.53.0