From nobody Sat Sep 26 20:00:15 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021433; cv=none; d=zohomail.com; s=zohoarc; b=jDcpfhQ3Aw7oIDvuv7NJyv0UO8QJSdDQA9JFwKgsDAQr/8U6YeKz4BPtiMjl054haeSiGsS5hLqPsna0vBqYz5OuRgdN5c98t2bvyqfc1E/1as/1o78WhDMjwejm48OwU+EOz6YFDNoDXvrQbezIc0N7i+aM/9sn3g+CXifPukE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021433; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=u44Mc737QUAQdDpt7MqrQuDnPMeRpzPKMimxP0OQq0M=; b=Dq+Z3Rbt/B3xczAzknuoJxgW9B4BDID2JL6FDKFlARRAUADqUB9an9RAm9QUIOilxN4m8JP6D+wqMz253NN7+4Xllo4AAWL+CLWk1vCSV+KC7PfR0j/DvRWVTssKmHimTTtvVJ6WrLifDpOrC/Fkf6VbcTjIVeYzNXvVoUwiMxI= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021433048191.12529467005731; Mon, 21 Sep 2026 13:10:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kJi-0005gB-T1; Mon, 21 Sep 2026 16:08:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJZ-0005e3-4C; Mon, 21 Sep 2026 16:08:38 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJX-0005Ju-BQ; Mon, 21 Sep 2026 16:08:36 -0400 Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8WD41711839; Mon, 21 Sep 2026 20:08:34 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gske1abv9-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:33 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJKdv21451390; Mon, 21 Sep 2026 20:08:33 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt67gpu3x-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:33 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8Wri24904224 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:32 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0D9A858055; Mon, 21 Sep 2026 20:08:32 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7B15158043; Mon, 21 Sep 2026 20:08:31 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:31 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=u44Mc737QUAQdDpt7 MqrQuDnPMeRpzPKMimxP0OQq0M=; b=D9Y/xBXHb0BTnAIGNOY7FJka9F8MgYVxM T73ImqJqzHU4Qv+DewgLQF5X4O4xqKH56usAIMtLKF1UQDpmK9P+Ji5fHfaRdNSS at3vHC1Fppmt0gcilqMrFNy4p4lTvk6IOpd1v9Kon6rtI7kzgHRLDRRahCOIT8qM M+pd7OaKXbTyhunfFOvvITahiHcqdvWSyBLjSawP+ZBYh9tEv4NbmYbBPbUFkjfR gbbYQb8IZeLfBUr3+Q3OYq03Jgu8HLyWJ841TZocv8LvvkPJeDacdA6cT+bI1Ndg 5HZ694qHZGQp2fGZkzQ9Pn2/IXWLXnqLpEXXt22MAn2Rtb1bCb9Lg== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 01/33] target/s390x: Fix missing privileged flag at PCKMO instruction Date: Mon, 21 Sep 2026 16:07:58 -0400 Message-ID: <20260921200830.1302919-2-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: jaeNlKsPJqz_yEoAhO9rBIWaWlK7cDwU X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX1DEBEC6xg2bf YhF9QPCFWF2tMfTVAqSui11QTEdNzjy8rdE1ORyx9IFVm3gdvL2ydj04SazZbGcH0EPJqGkRyim hYl/dtOBUANGIjq4tSM38tmU5R5FZZDVwGzMKLYdexGbjXGAQXHBUnCt5B+P5nCIo+lHEi7Xdl4 r0UJiBEb9dJYtxVWBTVpj77x7MDm+JNHHylDhkSlmx6quPle9QF5bVACTG0e2ZjUiNHchIIvmiz E8CfS/PJG1ZaKzgipirG8XI7iKRG7mZR+oE1IVQAT2Xc84A2rLHNuJLs6RLg6NG2mj7qrk9tfZb ZxnU7kI98F7Ux+WNQyFLz0fglqWISiuTuDKc0mViso37g4NqDVZv/j+8vSXYVUEoGP+TGHC6Eai LEuPDny4rWSx914zezd9ulSnAhMi58XafVANolGVWk6MAfJMNSqO/IjjRyyvh+mS0jDBEAOLjgT pmrR7Z953LX5QPEA3dA== X-Authority-Analysis: v=2.4 cv=O/KsLx9W c=1 sm=1 tr=0 ts=6ab18ec1 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=OshStu86mOkqpzp6wrYA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX8n0s4gEBHpHJ Y6nbPs9y7wxAnIn6bcnYeuj9IwRl4QEqGFqgj8cAppWx9o/yv+EYUIoQhVlkF7r8yHbrjuJ/aOE hdoAJjUgf+xPluk2pnK1Zd1E6NnFGlY= X-Proofpoint-GUID: jaeNlKsPJqz_yEoAhO9rBIWaWlK7cDwU X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 malwarescore=0 phishscore=0 impostorscore=0 suspectscore=0 bulkscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021434813158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger The CPACF instruction PCKMO is a privileged instruction. So set the IF_PRIV flag in insn-data.h.inc to reflect this. Signed-off-by: Harald Freudenberger Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-2-freude@linu= x.ibm.com Signed-off-by: Eric Farman --- target/s390x/tcg/insn-data.h.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/s390x/tcg/insn-data.h.inc b/target/s390x/tcg/insn-data.= h.inc index 68260ffd9d..b5683f7641 100644 --- a/target/s390x/tcg/insn-data.h.inc +++ b/target/s390x/tcg/insn-data.h.inc @@ -1007,7 +1007,7 @@ =20 /* MSA Instructions */ D(0xb91e, KMAC, RRE, MSA, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_KMA= C) - D(0xb928, PCKMO, RRE, MSA3, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_PCK= MO) + E(0xb928, PCKMO, RRE, MSA3, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_PCK= MO, IF_PRIV) D(0xb92a, KMF, RRE, MSA4, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_KMF) D(0xb92b, KMO, RRE, MSA4, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_KMO) D(0xb92c, PCC, RRE, MSA4, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_PCC) --=20 2.55.0 From nobody Sat Sep 26 20:00:15 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021465; cv=none; d=zohomail.com; s=zohoarc; b=SKuPBMSow780gDGVhqoooNJiy/z1T34zD7QLijgpCzOFCOEnv+yNkFUadtOKISjUmtGnZbxbFDFMHi/PGbKLur7pX7WulC4Msq2N8JiP5iVLRvNTpvy/0lkJx4lw77h6tzQFiAvwN7xDJH1U3p+ArbYmtH1vaEMt56/fevVKBcE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021465; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=lXBRHP/MXAFEzDME6eNFr5WHwYo30GziULfabUt51NE=; b=YB+25wv1+smLf/LNSuznhMZbqmrjGCTv0ZBRsJQjASkBN8thMPc3F+1dfCaX+0C0hPwKBwTQxyU6zSvnnNe5Y8mxv46qqFoEw8T4bs3XmW7SmygHz2XUxXum41/9Ygl5krIflBb+XnRARprGi7kMJqolsO8bCP064yvZRkcr6P8= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021465837933.7603892399751; Mon, 21 Sep 2026 13:11:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kJs-0005lz-QT; Mon, 21 Sep 2026 16:08:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJb-0005eX-QN; Mon, 21 Sep 2026 16:08:40 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJY-0005KD-RQ; Mon, 21 Sep 2026 16:08:39 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8DDn1860560; Mon, 21 Sep 2026 20:08:35 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskg2ah3w-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:34 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJUIMb1408451; Mon, 21 Sep 2026 20:08:33 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt5qjpvkk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:33 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8WKC24904228 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:32 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AD91C58043; Mon, 21 Sep 2026 20:08:32 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 29E0358059; Mon, 21 Sep 2026 20:08:32 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:32 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=lXBRHP/MXAFEzDME6 eNFr5WHwYo30GziULfabUt51NE=; b=aBHV7/kd+4HWJeeGQMmqYV2pNgfAX+O6U IEPBTApStyfvGAnHR8vcRZlIpk7aXFsr84n0y+2BjOQRa8c/FGYveJI3AlzKMbj9 fw9PplgXi9Gs0FCpuud5Nh0CgVhy3WNsUZwNOhNf+eD171hxar3iQCyP7eXj6Vg6 U+/ePGQCBdLG9yoCIFc8zdEehBbc+8xsfpYLPMxrj1MgCLig5a46+bXwfoxcFuiI OAoQv68CeBaj4IZE1oTGnSzUGLYBCqoR7higFqwRHpUbD9+JeNG8tU0IZAMY2a9B fMXAff+T0tLFa66+Nwukxuj+1Z3U5DSYszhgniEIBnEL/GDKNS0NQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 02/33] target/s390x: Rework s390 cpacf implementations Date: Mon, 21 Sep 2026 16:07:59 -0400 Message-ID: <20260921200830.1302919-3-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: IPgIIP8Xt14RJfsbr06LA8beIJwU9NkQ X-Authority-Analysis: v=2.4 cv=I43w19gg c=1 sm=1 tr=0 ts=6ab18ec2 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=4KKJp7DvKucWb6I3c-QA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX/PJpW7PwxBgr xdAR+j+5NDHrbGLAeV1X13ipkes6v7OM5CdPqD4GCo9Xg3MCGrUjCqSL0VLQuitDEw7DM+BTHRa LV+1FcnRMRtAWrfs2crbj84mCQpqefRrqDeVPN4VkV92JKwVB0xoAQjgyw2DkWd6pqDptAmCQyo NEe5cauoWnsPsNQ42QlnYxPMW96CH74NRFRONY8S0JZD7L3Y0DJ2WjOGno9UsRZrvAVKY2mY1Ux pHJAAEpkAKpKAtwOtJrdGV9CpAekHOnFjd1pTE2JOFyGQ3CLtnL1/UuZHiEUTrpKyQyIi9RX/v+ JjBkr9+bgDJptaZeeRXVunOJCEUz/tJnB+OYnmkXUfMWa0VzGiim/v0rJowvqVjS1uGcw9wuW0E UtmYKzfqES9FU9hp7O7tGJcmtJ/ukmctnjIEI/CGhqjxJnYSBWPBNTgNaQShMeU+bpcqp2DQbx+ 54AHW9v+CyrdYTMggEQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX0/fHvwRbwVrp RIyOIMqkJK/nDL0K40t9utyydPdidpGuaIAsKRV4ABavr8UgHKAPgg6u9eZT+3TEy6LdW/fJp+9 5G8C155Ne+rMukcPc8WK7oG2+KwCyfE= X-Proofpoint-GUID: IPgIIP8Xt14RJfsbr06LA8beIJwU9NkQ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 phishscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021467012158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Fix missing parts for MSA 9 kdsa and rework the cpacf handling code so that further extensions can be made in a clean and structured way. Introduce a new header file cpacf-arch.h to hold defines, structs and function prototypes around s390 cpacf. Use the cpcaf function defines in the existing code. Signed-off-by: Harald Freudenberger Tested-by: Holger Dengler Reviewed-by: Holger Dengler Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-3-freude@linu= x.ibm.com Signed-off-by: Eric Farman --- target/s390x/tcg/cpacf-arch.h | 226 +++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 101 +++++++++++--- target/s390x/tcg/insn-data.h.inc | 1 + target/s390x/tcg/translate.c | 2 + 4 files changed, 311 insertions(+), 19 deletions(-) create mode 100644 target/s390x/tcg/cpacf-arch.h diff --git a/target/s390x/tcg/cpacf-arch.h b/target/s390x/tcg/cpacf-arch.h new file mode 100644 index 0000000000..f92e4b44e3 --- /dev/null +++ b/target/s390x/tcg/cpacf-arch.h @@ -0,0 +1,226 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * s390x cpacf-arch + * + */ + +#ifndef S390X_CPACF_ARCH_H +#define S390X_CPACF_ARCH_H + +/* + * Function codes for the KM instruction + */ +#define CPACF_KM_QUERY 0x00 +#define CPACF_KM_DEA 0x01 +#define CPACF_KM_TDEA_128 0x02 +#define CPACF_KM_TDEA_192 0x03 +#define CPACF_KM_AES_128 0x12 +#define CPACF_KM_AES_192 0x13 +#define CPACF_KM_AES_256 0x14 +#define CPACF_KM_PAES_128 0x1a +#define CPACF_KM_PAES_192 0x1b +#define CPACF_KM_PAES_256 0x1c +#define CPACF_KM_XTS_128 0x32 +#define CPACF_KM_XTS_256 0x34 +#define CPACF_KM_PXTS_128 0x3a +#define CPACF_KM_PXTS_256 0x3c +#define CPACF_KM_FULL_XTS_128 0x52 +#define CPACF_KM_FULL_XTS_256 0x54 +#define CPACF_KM_FULL_PXTS_128 0x5a +#define CPACF_KM_FULL_PXTS_256 0x5c + +/* + * Function codes for the KMC instruction + */ +#define CPACF_KMC_QUERY 0x00 +#define CPACF_KMC_DEA 0x01 +#define CPACF_KMC_TDEA_128 0x02 +#define CPACF_KMC_TDEA_192 0x03 +#define CPACF_KMC_AES_128 0x12 +#define CPACF_KMC_AES_192 0x13 +#define CPACF_KMC_AES_256 0x14 +#define CPACF_KMC_PAES_128 0x1a +#define CPACF_KMC_PAES_192 0x1b +#define CPACF_KMC_PAES_256 0x1c +#define CPACF_KMC_PRNG 0x43 + +/* + * Function codes for the KMCTR instruction + */ +#define CPACF_KMCTR_QUERY 0x00 +#define CPACF_KMCTR_DEA 0x01 +#define CPACF_KMCTR_TDEA_128 0x02 +#define CPACF_KMCTR_TDEA_192 0x03 +#define CPACF_KMCTR_AES_128 0x12 +#define CPACF_KMCTR_AES_192 0x13 +#define CPACF_KMCTR_AES_256 0x14 +#define CPACF_KMCTR_PAES_128 0x1a +#define CPACF_KMCTR_PAES_192 0x1b +#define CPACF_KMCTR_PAES_256 0x1c + +/* + * Function codes for the KIMD instruction + */ +#define CPACF_KIMD_QUERY 0x00 +#define CPACF_KIMD_SHA_1 0x01 +#define CPACF_KIMD_SHA_256 0x02 +#define CPACF_KIMD_SHA_512 0x03 +#define CPACF_KIMD_SHA3_224 0x20 +#define CPACF_KIMD_SHA3_256 0x21 +#define CPACF_KIMD_SHA3_384 0x22 +#define CPACF_KIMD_SHA3_512 0x23 +#define CPACF_KIMD_SHAKE_128 0x24 +#define CPACF_KIMD_SHAKE_256 0x25 +#define CPACF_KIMD_GHASH 0x41 + +/* + * Function codes for the KLMD instruction + */ +#define CPACF_KLMD_QUERY 0x00 +#define CPACF_KLMD_SHA_1 0x01 +#define CPACF_KLMD_SHA_256 0x02 +#define CPACF_KLMD_SHA_512 0x03 +#define CPACF_KLMD_SHA3_224 0x20 +#define CPACF_KLMD_SHA3_256 0x21 +#define CPACF_KLMD_SHA3_384 0x22 +#define CPACF_KLMD_SHA3_512 0x23 +#define CPACF_KLMD_SHAKE_128 0x24 +#define CPACF_KLMD_SHAKE_256 0x25 + +/* + * function codes for the KMAC instruction + */ +#define CPACF_KMAC_QUERY 0x00 +#define CPACF_KMAC_DEA 0x01 +#define CPACF_KMAC_TDEA_128 0x02 +#define CPACF_KMAC_TDEA_192 0x03 +#define CPACF_KMAC_AES_128 0x12 +#define CPACF_KMAC_AES_192 0x13 +#define CPACF_KMAC_AES_256 0x14 +#define CPACF_KMAC_PAES_128 0x1A +#define CPACF_KMAC_PAES_192 0x1B +#define CPACF_KMAC_PAES_256 0x1C +#define CPACF_KMAC_HMAC_SHA_224 0x70 +#define CPACF_KMAC_HMAC_SHA_256 0x71 +#define CPACF_KMAC_HMAC_SHA_384 0x72 +#define CPACF_KMAC_HMAC_SHA_512 0x73 +#define CPACF_KMAC_PHMAC_SHA_224 0x78 +#define CPACF_KMAC_PHMAC_SHA_256 0x79 +#define CPACF_KMAC_PHMAC_SHA_384 0x7a +#define CPACF_KMAC_PHMAC_SHA_512 0x7b + +/* + * Function codes for the PCKMO instruction + */ +#define CPACF_PCKMO_QUERY 0x00 +#define CPACF_PCKMO_ENC_DES_KEY 0x01 +#define CPACF_PCKMO_ENC_TDES_128_KEY 0x02 +#define CPACF_PCKMO_ENC_TDES_192_KEY 0x03 +#define CPACF_PCKMO_ENC_AES_128_KEY 0x12 +#define CPACF_PCKMO_ENC_AES_192_KEY 0x13 +#define CPACF_PCKMO_ENC_AES_256_KEY 0x14 +#define CPACF_PCKMO_ENC_AES_XTS_128_DOUBLE_KEY 0x15 +#define CPACF_PCKMO_ENC_AES_XTS_256_DOUBLE_KEY 0x16 +#define CPACF_PCKMO_ENC_ECC_P256_KEY 0x20 +#define CPACF_PCKMO_ENC_ECC_P384_KEY 0x21 +#define CPACF_PCKMO_ENC_ECC_P521_KEY 0x22 +#define CPACF_PCKMO_ENC_ECC_ED25519_KEY 0x28 +#define CPACF_PCKMO_ENC_ECC_ED448_KEY 0x29 +#define CPACF_PCKMO_ENC_HMAC_512_KEY 0x76 +#define CPACF_PCKMO_ENC_HMAC_1024_KEY 0x7a + +/* + * Function codes for the PRNO instruction + */ +#define CPACF_PRNO_QUERY 0x00 +#define CPACF_PRNO_SHA512_DRNG_GEN 0x03 +#define CPACF_PRNO_SHA512_DRNG_SEED 0x83 +#define CPACF_PRNO_TRNG_Q_R2C_RATIO 0x70 +#define CPACF_PRNO_TRNG 0x72 + +/* + * Function codes for the KMA instruction + */ +#define CPACF_KMA_QUERY 0x00 +#define CPACF_KMA_GCM_AES_128 0x12 +#define CPACF_KMA_GCM_AES_192 0x13 +#define CPACF_KMA_GCM_AES_256 0x14 +#define CPACF_KMA_GCM_PAES_128 0x1A +#define CPACF_KMA_GCM_PAES_192 0x1B +#define CPACF_KMA_GCM_PAES_256 0x1C + +/* + * Function codes for the KMF instruction + */ +#define CPACF_KMF_QUERY 0 +#define CPACF_KMF_DEA 1 +#define CPACF_KMF_TDEA_128 2 +#define CPACF_KMF_TDEA_192 3 +#define CPACF_KMF_AES_128 18 +#define CPACF_KMF_AES_192 19 +#define CPACF_KMF_AES_256 20 +#define CPACF_KMF_PAES_128 26 +#define CPACF_KMF_PAES_192 27 +#define CPACF_KMF_PAES_256 28 + +/* + * Function codes for the KMO instruction + */ +#define CPACF_KMO_QUERY 0 +#define CPACF_KMO_DEA 1 +#define CPACF_KMO_TDEA_128 2 +#define CPACF_KMO_TDEA_192 3 +#define CPACF_KMO_AES_128 18 +#define CPACF_KMO_AES_192 19 +#define CPACF_KMO_AES_256 20 +#define CPACF_KMO_PAES_128 26 +#define CPACF_KMO_PAES_192 27 +#define CPACF_KMO_PAES_256 28 + +/* + * Function codes for the PCC instruction + */ +#define CPACF_PCC_QUERY 0 +#define CPACF_PCC_CMAC_DEA 1 +#define CPACF_PCC_CMAC_TDEA_128 2 +#define CPACF_PCC_CMAC_TDEA_192 3 +#define CPACF_PCC_CMAC_AES_128 18 +#define CPACF_PCC_CMAC_AES_192 19 +#define CPACF_PCC_CMAC_AES_256 20 +#define CPACF_PCC_CMAC_PAES_128 26 +#define CPACF_PCC_CMAC_PAES_192 27 +#define CPACF_PCC_CMAC_PAES_256 28 +#define CPACF_PCC_XTS_AES_128 50 +#define CPACF_PCC_XTS_AES_256 52 +#define CPACF_PCC_XTS_PAES_128 58 +#define CPACF_PCC_XTS_PAES_256 60 +#define CPACF_PCC_SM_P256 64 +#define CPACF_PCC_SM_P384 65 +#define CPACF_PCC_SM_P521 66 +#define CPACF_PCC_SM_ED25519 72 +#define CPACF_PCC_SM_ED448 73 +#define CPACF_PCC_SM_X25519 80 +#define CPACF_PCC_SM_X448 81 + +/* + * Function codes for the KDSA instruction + */ +#define CPACF_KDSA_QUERY 0 +#define CPACF_KDSA_VERIFY_P256 1 +#define CPACF_KDSA_VERIFY_P384 2 +#define CPACF_KDSA_VERIFY_P521 3 +#define CPACF_KDSA_SIGN_P256 9 +#define CPACF_KDSA_SIGN_P384 10 +#define CPACF_KDSA_SIGN_P521 11 +#define CPACF_KDSA_PSIGN_P256 17 +#define CPACF_KDSA_PSIGN_P384 18 +#define CPACF_KDSA_PSIGN_P521 19 +#define CPACF_KDSA_VERIFY_ED25519 32 +#define CPACF_KDSA_VERIFY_ED448 36 +#define CPACF_KDSA_SIGN_ED25519 40 +#define CPACF_KDSA_SIGN_ED448 44 +#define CPACF_KDSA_PSIGN_ED25519 48 +#define CPACF_KDSA_PSIGN_ED448 52 + +#endif /* S390X_CPACF_ARCH_H */ diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index 6a5dbe1caf..e39ad153a8 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -20,6 +20,7 @@ #include "exec/helper-proto.h" #include "accel/tcg/cpu-ldst-common.h" #include "accel/tcg/cpu-mmu-index.h" +#include "target/s390x/tcg/cpacf-arch.h" =20 static uint64_t R(uint64_t x, int c) { @@ -275,6 +276,61 @@ static int fill_buf_random(CPUS390XState *env, const i= nt mmu_idx, uintptr_t ra, return len =3D=3D 0 ? 0 : 3; } =20 +static int cpacf_kimd(CPUS390XState *env, const int mmu_idx, const uintptr= _t ra, + uint32_t r1, uint32_t r2, uint32_t r3, uint8_t fc) +{ + int rc =3D 0; + + switch (fc) { + case CPACF_KIMD_SHA_512: + rc =3D cpacf_sha512(env, mmu_idx, ra, env->regs[1], &env->regs[r2], + &env->regs[r2 + 1], S390_FEAT_TYPE_KIMD); + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + return rc; +} + +static int cpacf_klmd(CPUS390XState *env, const int mmu_idx, const uintptr= _t ra, + uint32_t r1, uint32_t r2, uint32_t r3, uint8_t fc) +{ + int rc =3D 0; + + switch (fc) { + case CPACF_KLMD_SHA_512: + rc =3D cpacf_sha512(env, mmu_idx, ra, env->regs[1], &env->regs[r2], + &env->regs[r2 + 1], S390_FEAT_TYPE_KLMD); + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + return rc; +} + +static int cpacf_ppno(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint32_t r1, uint32_t r2, uint32_t r3, uint8_t fc) +{ + int rc =3D 0; + + switch (fc) { + case CPACF_PRNO_TRNG: + rc =3D fill_buf_random(env, mmu_idx, ra, + &env->regs[r1], &env->regs[r1 + 1]); + if (!rc) { + rc =3D fill_buf_random(env, mmu_idx, ra, + &env->regs[r2], &env->regs[r2 + 1]); + } + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + return rc; +} + uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32_= t r3, uint32_t type) { @@ -285,14 +341,15 @@ uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1,= uint32_t r2, uint32_t r3, uint8_t subfunc[16] =3D { 0 }; uint64_t param_addr; MemOpIdx oi; - int cc; + int rc =3D 0; =20 switch (type) { - case S390_FEAT_TYPE_KMAC: + case S390_FEAT_TYPE_KDSA: case S390_FEAT_TYPE_KIMD: case S390_FEAT_TYPE_KLMD: - case S390_FEAT_TYPE_PCKMO: + case S390_FEAT_TYPE_KMAC: case S390_FEAT_TYPE_PCC: + case S390_FEAT_TYPE_PCKMO: if (mod) { tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); } @@ -304,29 +361,35 @@ uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1,= uint32_t r2, uint32_t r3, tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); } =20 - switch (fc) { - case 0: /* query subfunction */ + /* handle query subfunction */ + if (fc =3D=3D 0) { oi =3D make_memop_idx(MO_8, mmu_idx); - for (int i =3D 0; i < 16; i++) { + for (int i =3D 0; i < sizeof(subfunc); i++) { param_addr =3D wrap_address(env, env->regs[1] + i); cpu_stb_mmu(env, param_addr, subfunc[i], oi, ra); } + goto out; + } + + switch (type) { + case S390_FEAT_TYPE_KIMD: + rc =3D cpacf_kimd(env, mmu_idx, ra, r1, r2, r3, fc); + break; + case S390_FEAT_TYPE_KLMD: + rc =3D cpacf_klmd(env, mmu_idx, ra, r1, r2, r3, fc); + break; + case S390_FEAT_TYPE_PPNO: + rc =3D cpacf_ppno(env, mmu_idx, ra, r1, r2, r3, fc); + break; + case S390_FEAT_TYPE_KDSA: + case S390_FEAT_TYPE_KMAC: + /* subfunctions (other than query) are not implemented yet */ + tcg_s390_program_interrupt(env, PGM_OPERATION, ra); break; - case 3: /* CPACF_*_SHA_512 */ - return cpacf_sha512(env, mmu_idx, ra, env->regs[1], &env->regs[r2], - &env->regs[r2 + 1], type); - case 114: /* CPACF_PRNO_TRNG */ - cc =3D fill_buf_random(env, mmu_idx, ra, - &env->regs[r1], &env->regs[r1 + 1]); - if (cc =3D=3D 0) { - cc =3D fill_buf_random(env, mmu_idx, ra, - &env->regs[r2], &env->regs[r2 + 1]); - } - return cc; default: - /* we don't implement any other subfunction yet */ g_assert_not_reached(); } =20 - return 0; +out: + return rc; } diff --git a/target/s390x/tcg/insn-data.h.inc b/target/s390x/tcg/insn-data.= h.inc index b5683f7641..0c236e2631 100644 --- a/target/s390x/tcg/insn-data.h.inc +++ b/target/s390x/tcg/insn-data.h.inc @@ -1015,6 +1015,7 @@ D(0xb92e, KM, RRE, MSA, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_KM) D(0xb92f, KMC, RRE, MSA, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_KMC) D(0xb929, KMA, RRF_b, MSA8, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_KMA) + D(0xb93a, KDSA, RRE, MSA9, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_KDS= A) E(0xb93c, PPNO, RRE, MSA5, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_PPN= O, IF_IO) D(0xb93e, KIMD, RRE, MSA, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_KIM= D) D(0xb93f, KLMD, RRE, MSA, 0, 0, 0, 0, msa, 0, S390_FEAT_TYPE_KLM= D) diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c index a4374bd41f..7e74e9742f 100644 --- a/target/s390x/tcg/translate.c +++ b/target/s390x/tcg/translate.c @@ -2585,6 +2585,7 @@ static DisasJumpType op_msa(DisasContext *s, DisasOps= *o) case S390_FEAT_TYPE_KMAC: case S390_FEAT_TYPE_KIMD: case S390_FEAT_TYPE_KLMD: + case S390_FEAT_TYPE_KDSA: if (r2 & 1 || !r2) { gen_program_exception(s, PGM_SPECIFICATION); return DISAS_NORETURN; @@ -5969,6 +5970,7 @@ enum DisasInsnEnum { #define FAC_MSA4 S390_FEAT_MSA_EXT_4 /* msa-extension-4 facility */ #define FAC_MSA5 S390_FEAT_MSA_EXT_5 /* msa-extension-5 facility */ #define FAC_MSA8 S390_FEAT_MSA_EXT_8 /* msa-extension-8 facility */ +#define FAC_MSA9 S390_FEAT_MSA_EXT_9 /* msa-extension-9 facility */ #define FAC_ECT S390_FEAT_EXTRACT_CPU_TIME #define FAC_PCI S390_FEAT_ZPCI /* z/PCI facility */ #define FAC_AIS S390_FEAT_ADAPTER_INT_SUPPRESSION --=20 2.55.0 From nobody Sat Sep 26 20:00:15 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021562; cv=none; d=zohomail.com; s=zohoarc; b=VRTcHEuGaTp83VOLgib43/0sHqtFqTpV/4yTVnO00csuk9ARpfdAck/cZAi4ZbNR+Bmi7lQLccurQSKPRbCP6fINd8OaCs4T/kPnLIj2i8TPll2LkZ+G8hc7fp2oGqa1hhl0l3Jf/df+p+sT2HCXODcpTQ155/0KxPjzpNFFnLw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021562; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ZYcvniK4UGiC/nellah9brsb5+Os0RqoKrDTX85a0SA=; b=DbDOMY7bdPAQe+9DPKaTYO8Ote/RMC16IAl7SV1Pk/mVucII4hPBs3CVNCFWuOfXCbC48EP30BCxj7MXsx++D2RymfC3Lgv+ueXR6SBk1JByuxYwVPEZEjsuVXsBrBHWfzQ4sbH1cyYrJSGOIcaea9J5fmDTuppriLorvyrMoH8= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021562638111.64844128398033; Mon, 21 Sep 2026 13:12:42 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kJv-0005nj-7E; Mon, 21 Sep 2026 16:08:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJd-0005ex-1P; Mon, 21 Sep 2026 16:08:41 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJZ-0005KH-8b; Mon, 21 Sep 2026 16:08:40 -0400 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8Yok703543; Mon, 21 Sep 2026 20:08:35 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskgqa9d2-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:35 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJSgsl1431792; Mon, 21 Sep 2026 20:08:35 GMT Received: from smtprelay01.wdc07v.mail.ibm.com ([172.16.1.68]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt53vf01t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:35 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay01.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8Xc01835812 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:33 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5D2CB5805D; Mon, 21 Sep 2026 20:08:33 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CA57858055; Mon, 21 Sep 2026 20:08:32 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:32 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=ZYcvniK4UGiC/nell ah9brsb5+Os0RqoKrDTX85a0SA=; b=Tcnu6HWnCdqz3DWiPQtKP5fbAwwT/t7FO bLyxdAOLpGw3IcbPANBGQE/hGj1R50IJnWm9ZLAJB8yFPxKO2hRl2S3BChkadv31 X1xw8FMN+uPQGM0N4leH8Nz0JLIHPf/soyRvy4hgpLrKJu72mt2xe+M/663Vyy2b xLA2uHu6qX/TEILf3dpGU94lgE0ZlGzMXpof/IiFfhhz56TPnqZxJkiCiB04shoB Uf57xdmOi8rUV5nprNje6lsppe/mZuEhrFbX+uCNeac0Fq2KjOLuuKGJr9Ni915/ 3gTNaEIBz100Id6oWJoESDC3MRKCHDtybWxBJlKRKXs22hvHMM+zw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 03/33] target/s390x: Move cpacf sha512 code into a new file Date: Mon, 21 Sep 2026 16:08:00 -0400 Message-ID: <20260921200830.1302919-4-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=G+OJgNk5 c=1 sm=1 tr=0 ts=6ab18ec3 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=UGG5zPGqAAAA:8 a=o9TamEWjRyXov50siisA:9 a=17ibUXfGiVyGqR_YBevW:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX+qNTtkNYLAMZ to0sj079CnMpVkloararCYWvnd15KiJEFgBHmQ7v0vbX/5FAslj9rsar7CoLbxLYqMV7WLEngnH ucO2t8KEXsFaLG2EpL2AAnHd7ivfmb7aC8AIKIARwiHSuFtcLiKwXgnptWPkS1NYN9K8uq6uuoy 8Lh6N9toNxm6U3A9N+JnhxoA74iqWYj34vGMjqhA1TTLT9QKMWHM+a2UI3cYDCAHbFfiMwqN+k1 Vas/pE3t+N9/SrO5FF+/rNlClM/qUTJEvqLFwb/ZC4Bmk6R2H/Y7NRyU1fztvKS67hyO/t9Tx26 VJnpC9oO411FgWq9AHqjlLb2Wf9uqyAz+L4SxJkb5YCsHehLbe2olU6jjinLWcpwGLf2+Hfmvwx 6S9qJwV/c00oIo1+8sE7u9DNm5oHbxz5ipNdy+0qQNP3O4e5yAw5iX8BQL01RWNkfr9+pJDQLZU hXMpP8pusMKmY+oeD1Q== X-Proofpoint-ORIG-GUID: z5TiO_bOoQM-6YgUwyGuTVEfIi_0SNYD X-Proofpoint-GUID: z5TiO_bOoQM-6YgUwyGuTVEfIi_0SNYD X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXyNhrlu33BYE2 HgQhohqcYEVlzXf//LITmC7H27GkztaJ1h6bTdEfchMRcQLBcun+o2rWp/qKfIa39RFDav+O4zV AealNrdJoi8oqsxLneuUoJZWBEtHA2I= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 phishscore=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 priorityscore=1501 clxscore=1015 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021563623158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Move the cpacf sha512 implementation into a new file cpacf_sha512.c. Add this new file to the build. Introduce a new header file cpacf.h which holds function prototypes and other things around cpacf local to the tcg directory. Signed-off-by: Harald Freudenberger Tested-by: Holger Dengler Reviewed-by: Finn Callies Reviewed-by: Ilya Leoshkevich Reviewed-by: Holger Dengler Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-4-freude@linu= x.ibm.com Signed-off-by: Eric Farman --- target/s390x/tcg/cpacf.h | 16 ++ target/s390x/tcg/cpacf_sha512.c | 242 +++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 223 +--------------------------- target/s390x/tcg/meson.build | 1 + 4 files changed, 260 insertions(+), 222 deletions(-) create mode 100644 target/s390x/tcg/cpacf.h create mode 100644 target/s390x/tcg/cpacf_sha512.c diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h new file mode 100644 index 0000000000..2fa82893f8 --- /dev/null +++ b/target/s390x/tcg/cpacf.h @@ -0,0 +1,16 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * s390x cpacf + * + */ + +#ifndef S390X_CPACF_H +#define S390X_CPACF_H + +/* from cpacf_sha512.c */ +int cpacf_sha512(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *message_reg, uint64_t *len= _reg, + uint32_t type); + +#endif /* S390X_CPACF_H */ diff --git a/target/s390x/tcg/cpacf_sha512.c b/target/s390x/tcg/cpacf_sha51= 2.c new file mode 100644 index 0000000000..2a1ff38c58 --- /dev/null +++ b/target/s390x/tcg/cpacf_sha512.c @@ -0,0 +1,242 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * s390 cpacf sha512 + * + * Copyright (C) 2022 Jason A. Donenfeld . + * All Rights Reserved. + * + * Authors: + * Jason A. Donenfeld + */ + +#include "qemu/osdep.h" +#include "s390x-internal.h" +#include "tcg_s390x.h" +#include "exec/helper-proto.h" +#include "accel/tcg/cpu-ldst-common.h" +#include "accel/tcg/cpu-mmu-index.h" +#include "target/s390x/tcg/cpacf-arch.h" +#include "target/s390x/tcg/cpacf.h" + +static uint64_t R(uint64_t x, int c) +{ + return (x >> c) | (x << (64 - c)); +} +static uint64_t Ch(uint64_t x, uint64_t y, uint64_t z) +{ + return (x & y) ^ (~x & z); +} +static uint64_t Maj(uint64_t x, uint64_t y, uint64_t z) +{ + return (x & y) ^ (x & z) ^ (y & z); +} +static uint64_t Sigma0(uint64_t x) +{ + return R(x, 28) ^ R(x, 34) ^ R(x, 39); +} +static uint64_t Sigma1(uint64_t x) +{ + return R(x, 14) ^ R(x, 18) ^ R(x, 41); +} +static uint64_t sigma0(uint64_t x) +{ + return R(x, 1) ^ R(x, 8) ^ (x >> 7); +} +static uint64_t sigma1(uint64_t x) +{ + return R(x, 19) ^ R(x, 61) ^ (x >> 6); +} + +static const uint64_t K[80] =3D { + 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, + 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, + 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 0xd807aa98a3030242ULL, + 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, + 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, + 0xc19bf174cf692694ULL, 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, + 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x2de92c6f592b0275ULL, + 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, + 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, + 0xbf597fc7beef0ee4ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, + 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 0x27b70a8546d22ffcULL, + 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, + 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, + 0x92722c851482353bULL, 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, + 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xd192e819d6ef5218ULL, + 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, + 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, + 0x34b0bcb5e19b48a8ULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, + 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 0x748f82ee5defb2fcULL, + 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, + 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, + 0xc67178f2e372532bULL, 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, + 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0x06f067aa72176fbaULL, + 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, + 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, + 0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, + 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL +}; + +/* a is icv/ocv, w is a single message block. w will get reused internally= . */ +static void sha512_bda(uint64_t a[8], uint64_t w[16]) +{ + uint64_t t, z[8], b[8]; + int i, j; + + memcpy(z, a, sizeof(z)); + for (i =3D 0; i < 80; i++) { + memcpy(b, a, sizeof(b)); + + t =3D a[7] + Sigma1(a[4]) + Ch(a[4], a[5], a[6]) + K[i] + w[i % 16= ]; + b[7] =3D t + Sigma0(a[0]) + Maj(a[0], a[1], a[2]); + b[3] +=3D t; + for (j =3D 0; j < 8; ++j) { + a[(j + 1) % 8] =3D b[j]; + } + if (i % 16 =3D=3D 15) { + for (j =3D 0; j < 16; ++j) { + w[j] +=3D w[(j + 9) % 16] + sigma0(w[(j + 1) % 16]) + + sigma1(w[(j + 14) % 16]); + } + } + } + + for (i =3D 0; i < 8; i++) { + a[i] +=3D z[i]; + } +} + +/* a is icv/ocv, w is a single message block that needs be64 conversion. */ +static void sha512_bda_be64(uint64_t a[8], uint64_t w[16]) +{ + uint64_t t[16]; + int i; + + for (i =3D 0; i < 16; i++) { + t[i] =3D be64_to_cpu(w[i]); + } + sha512_bda(a, t); +} + +static void sha512_read_icv(CPUS390XState *env, const int mmu_idx, + uint64_t addr, uint64_t a[8], uintptr_t ra) +{ + const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_64 | MO_UNALN, mmu_idx= ); + + for (int i =3D 0; i < 8; i++, addr +=3D 8) { + a[i] =3D cpu_ldq_mmu(env, wrap_address(env, addr), oi, ra); + } +} + +static void sha512_write_ocv(CPUS390XState *env, const int mmu_idx, + uint64_t addr, uint64_t a[8], uintptr_t ra) +{ + const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_64 | MO_UNALN, mmu_idx= ); + + for (int i =3D 0; i < 8; i++, addr +=3D 8) { + cpu_stq_mmu(env, wrap_address(env, addr), a[i], oi, ra); + } +} + +static void sha512_read_block(CPUS390XState *env, const int mmu_idx, + uint64_t addr, uint64_t a[16], uintptr_t ra) +{ + const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_64 | MO_UNALN, mmu_idx= ); + + for (int i =3D 0; i < 16; i++, addr +=3D 8) { + a[i] =3D cpu_ldq_mmu(env, wrap_address(env, addr), oi, ra); + } +} + +static void sha512_read_mbl_be64(CPUS390XState *env, const int mmu_idx, + uint64_t addr, uint8_t a[16], uintptr_t r= a) +{ + const MemOpIdx oi =3D make_memop_idx(MO_8, mmu_idx); + + for (int i =3D 0; i < 16; i++, addr +=3D 1) { + a[i] =3D cpu_ldb_mmu(env, wrap_address(env, addr), oi, ra); + } +} + +int cpacf_sha512(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *message_reg, uint64_t *len= _reg, + uint32_t type) +{ + enum { MAX_BLOCKS_PER_RUN =3D 64 }; /* Arbitrary: keep interactivity. = */ + uint64_t len =3D *len_reg, a[8], processed =3D 0; + int i, message_reg_len =3D 64; + + g_assert(type =3D=3D S390_FEAT_TYPE_KIMD || type =3D=3D S390_FEAT_TYPE= _KLMD); + + if (!(env->psw.mask & PSW_MASK_64)) { + len =3D (uint32_t)len; + message_reg_len =3D (env->psw.mask & PSW_MASK_32) ? 32 : 24; + } + + /* KIMD: length has to be properly aligned. */ + if (type =3D=3D S390_FEAT_TYPE_KIMD && !QEMU_IS_ALIGNED(len, 128)) { + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + sha512_read_icv(env, mmu_idx, param_addr, a, ra); + + /* Process full blocks first. */ + for (; len >=3D 128; len -=3D 128, processed +=3D 128) { + uint64_t w[16]; + + if (processed >=3D MAX_BLOCKS_PER_RUN * 128) { + break; + } + + sha512_read_block(env, mmu_idx, *message_reg + processed, w, ra); + sha512_bda(a, w); + } + + /* KLMD: Process partial/empty block last. */ + if (type =3D=3D S390_FEAT_TYPE_KLMD && len < 128) { + const MemOpIdx oi =3D make_memop_idx(MO_8, mmu_idx); + uint8_t x[128]; + + /* Read the remainder of the message byte-per-byte. */ + for (i =3D 0; i < len; i++) { + uint64_t addr =3D wrap_address(env, *message_reg + processed += i); + + x[i] =3D cpu_ldb_mmu(env, addr, oi, ra); + } + /* Pad the remainder with zero and set the top bit. */ + memset(x + len, 0, 128 - len); + x[len] =3D 128; + + /* + * Place the MBL either into this block (if there is space left), + * or use an additional one. + */ + if (len < 112) { + sha512_read_mbl_be64(env, mmu_idx, param_addr + 64, x + 112, r= a); + } + sha512_bda_be64(a, (uint64_t *)x); + + if (len >=3D 112) { + memset(x, 0, 112); + sha512_read_mbl_be64(env, mmu_idx, param_addr + 64, x + 112, r= a); + sha512_bda_be64(a, (uint64_t *)x); + } + + processed +=3D len; + len =3D 0; + } + + /* + * Modify memory after we read all inputs and modify registers only af= ter + * writing memory succeeded. + * + * TODO: if writing fails halfway through (e.g., when crossing page + * boundaries), we're in trouble. We'd need something like access_prep= are(). + */ + sha512_write_ocv(env, mmu_idx, param_addr, a, ra); + *message_reg =3D deposit64(*message_reg, 0, message_reg_len, + *message_reg + processed); + *len_reg -=3D processed; + return !len ? 0 : 3; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index e39ad153a8..d19db7df25 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -21,228 +21,7 @@ #include "accel/tcg/cpu-ldst-common.h" #include "accel/tcg/cpu-mmu-index.h" #include "target/s390x/tcg/cpacf-arch.h" - -static uint64_t R(uint64_t x, int c) -{ - return (x >> c) | (x << (64 - c)); -} -static uint64_t Ch(uint64_t x, uint64_t y, uint64_t z) -{ - return (x & y) ^ (~x & z); -} -static uint64_t Maj(uint64_t x, uint64_t y, uint64_t z) -{ - return (x & y) ^ (x & z) ^ (y & z); -} -static uint64_t Sigma0(uint64_t x) -{ - return R(x, 28) ^ R(x, 34) ^ R(x, 39); -} -static uint64_t Sigma1(uint64_t x) -{ - return R(x, 14) ^ R(x, 18) ^ R(x, 41); -} -static uint64_t sigma0(uint64_t x) -{ - return R(x, 1) ^ R(x, 8) ^ (x >> 7); -} -static uint64_t sigma1(uint64_t x) -{ - return R(x, 19) ^ R(x, 61) ^ (x >> 6); -} - -static const uint64_t K[80] =3D { - 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, - 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, - 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 0xd807aa98a3030242ULL, - 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, - 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, - 0xc19bf174cf692694ULL, 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, - 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x2de92c6f592b0275ULL, - 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, - 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, - 0xbf597fc7beef0ee4ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, - 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 0x27b70a8546d22ffcULL, - 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, - 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, - 0x92722c851482353bULL, 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, - 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xd192e819d6ef5218ULL, - 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, - 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, - 0x34b0bcb5e19b48a8ULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, - 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 0x748f82ee5defb2fcULL, - 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, - 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, - 0xc67178f2e372532bULL, 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, - 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0x06f067aa72176fbaULL, - 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, - 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, - 0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, - 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL -}; - -/* a is icv/ocv, w is a single message block. w will get reused internally= . */ -static void sha512_bda(uint64_t a[8], uint64_t w[16]) -{ - uint64_t t, z[8], b[8]; - int i, j; - - memcpy(z, a, sizeof(z)); - for (i =3D 0; i < 80; i++) { - memcpy(b, a, sizeof(b)); - - t =3D a[7] + Sigma1(a[4]) + Ch(a[4], a[5], a[6]) + K[i] + w[i % 16= ]; - b[7] =3D t + Sigma0(a[0]) + Maj(a[0], a[1], a[2]); - b[3] +=3D t; - for (j =3D 0; j < 8; ++j) { - a[(j + 1) % 8] =3D b[j]; - } - if (i % 16 =3D=3D 15) { - for (j =3D 0; j < 16; ++j) { - w[j] +=3D w[(j + 9) % 16] + sigma0(w[(j + 1) % 16]) + - sigma1(w[(j + 14) % 16]); - } - } - } - - for (i =3D 0; i < 8; i++) { - a[i] +=3D z[i]; - } -} - -/* a is icv/ocv, w is a single message block that needs be64 conversion. */ -static void sha512_bda_be64(uint64_t a[8], uint64_t w[16]) -{ - uint64_t t[16]; - int i; - - for (i =3D 0; i < 16; i++) { - t[i] =3D be64_to_cpu(w[i]); - } - sha512_bda(a, t); -} - -static void sha512_read_icv(CPUS390XState *env, const int mmu_idx, - uint64_t addr, uint64_t a[8], uintptr_t ra) -{ - const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_64 | MO_UNALN, mmu_idx= ); - - for (int i =3D 0; i < 8; i++, addr +=3D 8) { - a[i] =3D cpu_ldq_mmu(env, wrap_address(env, addr), oi, ra); - } -} - -static void sha512_write_ocv(CPUS390XState *env, const int mmu_idx, - uint64_t addr, uint64_t a[8], uintptr_t ra) -{ - const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_64 | MO_UNALN, mmu_idx= ); - - for (int i =3D 0; i < 8; i++, addr +=3D 8) { - cpu_stq_mmu(env, wrap_address(env, addr), a[i], oi, ra); - } -} - -static void sha512_read_block(CPUS390XState *env, const int mmu_idx, - uint64_t addr, uint64_t a[16], uintptr_t ra) -{ - const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_64 | MO_UNALN, mmu_idx= ); - - for (int i =3D 0; i < 16; i++, addr +=3D 8) { - a[i] =3D cpu_ldq_mmu(env, wrap_address(env, addr), oi, ra); - } -} - -static void sha512_read_mbl_be64(CPUS390XState *env, const int mmu_idx, - uint64_t addr, uint8_t a[16], uintptr_t r= a) -{ - const MemOpIdx oi =3D make_memop_idx(MO_8, mmu_idx); - - for (int i =3D 0; i < 16; i++, addr +=3D 1) { - a[i] =3D cpu_ldb_mmu(env, wrap_address(env, addr), oi, ra); - } -} - -static int cpacf_sha512(CPUS390XState *env, const int mmu_idx, uintptr_t r= a, - uint64_t param_addr, uint64_t *message_reg, - uint64_t *len_reg, uint32_t type) -{ - enum { MAX_BLOCKS_PER_RUN =3D 64 }; /* Arbitrary: keep interactivity. = */ - uint64_t len =3D *len_reg, a[8], processed =3D 0; - int i, message_reg_len =3D 64; - - g_assert(type =3D=3D S390_FEAT_TYPE_KIMD || type =3D=3D S390_FEAT_TYPE= _KLMD); - - if (!(env->psw.mask & PSW_MASK_64)) { - len =3D (uint32_t)len; - message_reg_len =3D (env->psw.mask & PSW_MASK_32) ? 32 : 24; - } - - /* KIMD: length has to be properly aligned. */ - if (type =3D=3D S390_FEAT_TYPE_KIMD && !QEMU_IS_ALIGNED(len, 128)) { - tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); - } - - sha512_read_icv(env, mmu_idx, param_addr, a, ra); - - /* Process full blocks first. */ - for (; len >=3D 128; len -=3D 128, processed +=3D 128) { - uint64_t w[16]; - - if (processed >=3D MAX_BLOCKS_PER_RUN * 128) { - break; - } - - sha512_read_block(env, mmu_idx, *message_reg + processed, w, ra); - sha512_bda(a, w); - } - - /* KLMD: Process partial/empty block last. */ - if (type =3D=3D S390_FEAT_TYPE_KLMD && len < 128) { - const MemOpIdx oi =3D make_memop_idx(MO_8, mmu_idx); - uint8_t x[128]; - - /* Read the remainder of the message byte-per-byte. */ - for (i =3D 0; i < len; i++) { - uint64_t addr =3D wrap_address(env, *message_reg + processed += i); - - x[i] =3D cpu_ldb_mmu(env, addr, oi, ra); - } - /* Pad the remainder with zero and set the top bit. */ - memset(x + len, 0, 128 - len); - x[len] =3D 128; - - /* - * Place the MBL either into this block (if there is space left), - * or use an additional one. - */ - if (len < 112) { - sha512_read_mbl_be64(env, mmu_idx, param_addr + 64, x + 112, r= a); - } - sha512_bda_be64(a, (uint64_t *)x); - - if (len >=3D 112) { - memset(x, 0, 112); - sha512_read_mbl_be64(env, mmu_idx, param_addr + 64, x + 112, r= a); - sha512_bda_be64(a, (uint64_t *)x); - } - - processed +=3D len; - len =3D 0; - } - - /* - * Modify memory after we read all inputs and modify registers only af= ter - * writing memory succeeded. - * - * TODO: if writing fails halfway through (e.g., when crossing page - * boundaries), we're in trouble. We'd need something like access_prep= are(). - */ - sha512_write_ocv(env, mmu_idx, param_addr, a, ra); - *message_reg =3D deposit64(*message_reg, 0, message_reg_len, - *message_reg + processed); - *len_reg -=3D processed; - return !len ? 0 : 3; -} +#include "target/s390x/tcg/cpacf.h" =20 static int fill_buf_random(CPUS390XState *env, const int mmu_idx, uintptr_= t ra, uint64_t *buf_reg, uint64_t *len_reg) diff --git a/target/s390x/tcg/meson.build b/target/s390x/tcg/meson.build index 36cb0e079e..54a87393a3 100644 --- a/target/s390x/tcg/meson.build +++ b/target/s390x/tcg/meson.build @@ -5,6 +5,7 @@ s390x_ss.add(when: 'CONFIG_TCG', if_true: files( )) s390x_common_ss.add(when: 'CONFIG_TCG', if_true: files( 'cc_helper.c', + 'cpacf_sha512.c', 'crypto_helper.c', 'excp_helper.c', 'fpu_helper.c', --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021523; cv=none; d=zohomail.com; s=zohoarc; b=P1bgnG2R2lTLy8K45Zw2xkYW7FfBkRf4k1rH04Flmm5ncLRPUX2uf1fC+ecGbuGqkT9IKdSOaDpkw0FLdCttFy6nfrCX7MihcQkGBpAdCixew/Idq7Uggm/3D7u78/0Y6Sdbg2w9kFR2HCa868MJGGX1HmisemySZ8FZdIc/7B4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021523; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=qKEy8lV8CjUwdia0HjOsCIPoTyVR9d4HGMBXDDdSldI=; b=eq5LM15sRzdkH/NF4G+YC89VhjtChoVix0/6I58O5yhFY9agjzzhg8iIshhYAGTYQ1tEvdkj0Wf8F4W//nrkU5r87mMLh88X2DIKxcdu0IVxzhTtlyJe6ISEdOrH/o6vA2X5zJHATojrZucWCtriXNhddylyQF8amw/qvv3pddY= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021523185711.6871254300232; Mon, 21 Sep 2026 13:12:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kJv-0005o1-Be; Mon, 21 Sep 2026 16:08:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJc-0005ev-W8; Mon, 21 Sep 2026 16:08:41 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJa-0005Ka-HB; Mon, 21 Sep 2026 16:08:40 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8Hua1860608; Mon, 21 Sep 2026 20:08:37 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskg2ah43-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:36 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJNnfG1489438; Mon, 21 Sep 2026 20:08:36 GMT Received: from smtprelay02.wdc07v.mail.ibm.com ([172.16.1.69]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gt4qq71t5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:35 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay02.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8YKd48496986 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:34 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0678E58060; Mon, 21 Sep 2026 20:08:34 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7BA6B5805E; Mon, 21 Sep 2026 20:08:33 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:33 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=qKEy8lV8CjUwdia0H jOsCIPoTyVR9d4HGMBXDDdSldI=; b=Da4S5rEIrv4Z9AT1uccXlyj1LYOmPWvNC w0yW7kfGPNPPsuFk+LbCQSdyZ4feLGVTGVUBjeCEnWP17+lH9HUqRso+pSwe9XSK vOphoclXDS0Cbxl8eBFpCpDKCnfib3MLAyHdJlikcmsqf6ccbr79fHOKnoWuf6BA Zqz0+r96TTVNKrnxaTxtYS+r6Qc3WZlw14fGGeCVirAHlEMT1OBAvmr8mUQu4F/B cFBAsAJ/Rt2YcK7OSqVPkMOmRLnoXWFCK31vvk2Uk8b44azsjqWODu1ua0rP6B4d WDeKPogFwB0Bbv5uNN1N0ZgABDNGVxxHF6T9WtK4x8iXgs0NKGZPA== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 04/33] target/s390x: Support cpacf sha256 Date: Mon, 21 Sep 2026 16:08:01 -0400 Message-ID: <20260921200830.1302919-5-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: t5ehE0n6_kT5-5S3U4gSFkgAa3OS2s9e X-Authority-Analysis: v=2.4 cv=I43w19gg c=1 sm=1 tr=0 ts=6ab18ec4 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=7rAwQbULjql6waQdbJoA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX1k13gcbRweJX pJIlz4jopAYeGPRH7nvcdtVR03BAmakKnMUUi7ZVhwVCbr9VYNl8RD4vTakDAobHTdyke+tApS5 +CI8ZrX3wnUEvBiPhzyGgaHkRdRO/o5FjkoJCNCTPXJvpr2J1FdTWXvowVyrkIwyoBUSQdoa6C4 YZE+6N6lhZUh51uXVyFNGZO8Z8fCaf/OdZ7KSU1LD86HinHI/YCh4e4r4PXMCFcCAVTyMAw7DXn QpESFEPZ20bsUI7uXEW6qWZ8qw+SsdqAJ0OOuSWeobmS7ehjpQDfqtU/+ooRdtO80BvKAcu2PC2 0Mi0LoWk87Z8DZiafpXWwyv/3w+JQ60yrXyKYfB3ne+sL+lnN772bdKFlHRI7E4GSzm4yRVLA08 R9xzPsgZPZr5ofqSf6AJcHZAI3zu9+vm2O3//VuUaNES93YTjfT3MSn+PX8Atdl1ZDpwCy0sLCw LaW44YsJKDMwU6P7uVQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX/hMuXxGJh+xb Ec6Rbq5DWwWUC5VCwRsOQ049XuqAPLYUMDrgXdNQvvu+1jTH3QEmosEz8EPb24kkLaey+VA2Ns5 DL3Z5i74eByJHRjBx8ep+cJrT/FtdHE= X-Proofpoint-GUID: t5ehE0n6_kT5-5S3U4gSFkgAa3OS2s9e X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 phishscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021523459158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Add a new file cpacf_sha256.c which implements sha256. Add support for the sha256 subfuction for CPACF kimd and klmd. Tested-by: Holger Dengler Reviewed-by: Finn Callies Reviewed-by: Ilya Leoshkevich Signed-off-by: Harald Freudenberger Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-5-freude@linu= x.ibm.com [farman@linux.ibm.com: Resolve merge conflict in gen-features.c] Signed-off-by: Eric Farman --- target/s390x/gen-features.c | 2 + target/s390x/tcg/cpacf.h | 5 + target/s390x/tcg/cpacf_sha256.c | 228 +++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 8 ++ target/s390x/tcg/meson.build | 1 + 5 files changed, 244 insertions(+) create mode 100644 target/s390x/tcg/cpacf_sha256.c diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index a99a75d14e..e1d924d04c 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -920,7 +920,9 @@ static uint16_t qemu_V7_1[] =3D { */ static uint16_t qemu_MAX[] =3D { S390_FEAT_MSA_EXT_5, + S390_FEAT_KIMD_SHA_256, S390_FEAT_KIMD_SHA_512, + S390_FEAT_KLMD_SHA_256, S390_FEAT_KLMD_SHA_512, S390_FEAT_PRNO_TRNG, S390_FEAT_EXTENDED_LENGTH_SCCB, diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h index 2fa82893f8..67b8368e4d 100644 --- a/target/s390x/tcg/cpacf.h +++ b/target/s390x/tcg/cpacf.h @@ -8,6 +8,11 @@ #ifndef S390X_CPACF_H #define S390X_CPACF_H =20 +/* from cpacf_sha256.c */ +int cpacf_sha256(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *message_reg, uint64_t *len= _reg, + uint32_t type); + /* from cpacf_sha512.c */ int cpacf_sha512(CPUS390XState *env, const int mmu_idx, uintptr_t ra, uint64_t param_addr, uint64_t *message_reg, uint64_t *len= _reg, diff --git a/target/s390x/tcg/cpacf_sha256.c b/target/s390x/tcg/cpacf_sha25= 6.c new file mode 100644 index 0000000000..30754dbdd4 --- /dev/null +++ b/target/s390x/tcg/cpacf_sha256.c @@ -0,0 +1,228 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * s390 cpacf sha256 + * + * Authors: + * Harald Freudenberger + * + * The sha256 implementation here is more or less a copy-and-paste + * from Jason A. Donenfeld's implementation of sha 512 with adaptions + * for sha 256. + */ + +#include "qemu/osdep.h" +#include "s390x-internal.h" +#include "tcg_s390x.h" +#include "exec/helper-proto.h" +#include "accel/tcg/cpu-ldst-common.h" +#include "accel/tcg/cpu-mmu-index.h" +#include "target/s390x/tcg/cpacf-arch.h" +#include "target/s390x/tcg/cpacf.h" + +static uint32_t R(uint32_t x, int c) +{ + return (x >> c) | (x << (32 - c)); +} +static uint32_t Ch(uint32_t x, uint32_t y, uint32_t z) +{ + return (x & y) ^ (~x & z); +} +static uint32_t Maj(uint32_t x, uint32_t y, uint32_t z) +{ + return (x & y) ^ (x & z) ^ (y & z); +} +static uint32_t Sigma0(uint32_t x) +{ + return R(x, 2) ^ R(x, 13) ^ R(x, 22); +} +static uint32_t Sigma1(uint32_t x) +{ + return R(x, 6) ^ R(x, 11) ^ R(x, 25); +} +static uint32_t sigma0(uint32_t x) +{ + return R(x, 7) ^ R(x, 18) ^ (x >> 3); +} +static uint32_t sigma1(uint32_t x) +{ + return R(x, 17) ^ R(x, 19) ^ (x >> 10); +} + +static const uint32_t K[64] =3D { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, + 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, + 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, + 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, + 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +}; + +/* a is icv/ocv, w is a single message block. w will get reused internally= . */ +static void sha256_bda(uint32_t a[8], uint32_t w[16]) +{ + uint32_t t, z[8], b[8]; + int i, j; + + memcpy(z, a, sizeof(z)); + for (i =3D 0; i < 64; i++) { + memcpy(b, a, sizeof(b)); + + t =3D a[7] + Sigma1(a[4]) + Ch(a[4], a[5], a[6]) + K[i] + w[i % 16= ]; + b[7] =3D t + Sigma0(a[0]) + Maj(a[0], a[1], a[2]); + b[3] +=3D t; + for (j =3D 0; j < 8; ++j) { + a[(j + 1) % 8] =3D b[j]; + } + if (i % 16 =3D=3D 15) { + for (j =3D 0; j < 16; ++j) { + w[j] +=3D w[(j + 9) % 16] + sigma0(w[(j + 1) % 16]) + + sigma1(w[(j + 14) % 16]); + } + } + } + + for (i =3D 0; i < 8; i++) { + a[i] +=3D z[i]; + } +} + +/* a is icv/ocv, w is a single message block that needs be32 conversion. */ +static void sha256_bda_be32(uint32_t a[8], uint32_t w[16]) +{ + uint32_t t[16]; + int i; + + for (i =3D 0; i < 16; i++) { + t[i] =3D be32_to_cpu(w[i]); + } + sha256_bda(a, t); +} + +static void sha256_read_icv(CPUS390XState *env, const int mmu_idx, + uint64_t addr, uint32_t a[8], uintptr_t ra) +{ + const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_32 | MO_UNALN, mmu_idx= ); + + for (int i =3D 0; i < 8; i++, addr +=3D 4) { + a[i] =3D cpu_ldl_mmu(env, wrap_address(env, addr), oi, ra); + } +} + +static void sha256_write_ocv(CPUS390XState *env, const int mmu_idx, + uint64_t addr, uint32_t a[8], uintptr_t ra) +{ + const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_32 | MO_UNALN, mmu_idx= ); + + for (int i =3D 0; i < 8; i++, addr +=3D 4) { + cpu_stl_mmu(env, wrap_address(env, addr), a[i], oi, ra); + } +} + +static void sha256_read_block(CPUS390XState *env, const int mmu_idx, + uint64_t addr, uint32_t a[16], uintptr_t ra) +{ + const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_32 | MO_UNALN, mmu_idx= ); + + for (int i =3D 0; i < 16; i++, addr +=3D 4) { + a[i] =3D cpu_ldl_mmu(env, wrap_address(env, addr), oi, ra); + } +} + +static void sha256_read_mbl_be32(CPUS390XState *env, const int mmu_idx, + uint64_t addr, uint8_t a[8], uintptr_t ra) +{ + const MemOpIdx oi =3D make_memop_idx(MO_8, mmu_idx); + + for (int i =3D 0; i < 8; i++, addr +=3D 1) { + a[i] =3D cpu_ldb_mmu(env, wrap_address(env, addr), oi, ra); + } +} + +int cpacf_sha256(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *message_reg, uint64_t *len= _reg, + uint32_t type) +{ + enum { MAX_BLOCKS_PER_RUN =3D 128 }; /* 128 * 64 =3D 8K */ + uint64_t len =3D *len_reg, processed =3D 0; + int i, message_reg_len =3D 64; + uint32_t a[8]; + + g_assert(type =3D=3D S390_FEAT_TYPE_KIMD || type =3D=3D S390_FEAT_TYPE= _KLMD); + + if (!(env->psw.mask & PSW_MASK_64)) { + len =3D (uint32_t)len; + message_reg_len =3D (env->psw.mask & PSW_MASK_32) ? 32 : 24; + } + + /* KIMD: length has to be properly aligned. */ + if (type =3D=3D S390_FEAT_TYPE_KIMD && !QEMU_IS_ALIGNED(len, 64)) { + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + sha256_read_icv(env, mmu_idx, param_addr, a, ra); + + /* Process full blocks first. */ + for (; len >=3D 64; len -=3D 64, processed +=3D 64) { + uint32_t w[16]; + + if (processed >=3D MAX_BLOCKS_PER_RUN * 64) { + break; + } + + sha256_read_block(env, mmu_idx, *message_reg + processed, w, ra); + sha256_bda(a, w); + } + + /* KLMD: Process partial/empty block last. */ + if (type =3D=3D S390_FEAT_TYPE_KLMD && len < 64) { + const MemOpIdx oi =3D make_memop_idx(MO_8, mmu_idx); + uint8_t x[64]; + + /* Read the remainder of the message byte-per-byte. */ + for (i =3D 0; i < len; i++) { + uint64_t addr =3D wrap_address(env, *message_reg + processed += i); + + x[i] =3D cpu_ldb_mmu(env, addr, oi, ra); + } + /* Pad the remainder with zero and set the top bit. */ + memset(x + len, 0, 64 - len); + x[len] =3D 0x80; + + /* + * Place the MBL either into this block (if there is space left), + * or use an additional one. + */ + if (len < 56) { + sha256_read_mbl_be32(env, mmu_idx, param_addr + 32, x + 56, ra= ); + } + sha256_bda_be32(a, (uint32_t *)x); + + if (len >=3D 56) { + memset(x, 0, 56); + sha256_read_mbl_be32(env, mmu_idx, param_addr + 32, x + 56, ra= ); + sha256_bda_be32(a, (uint32_t *)x); + } + + processed +=3D len; + len =3D 0; + } + + /* + * Modify memory after we read all inputs and modify registers only af= ter + * writing memory succeeded. + * + * TODO: if writing fails halfway through (e.g., when crossing page + * boundaries), we're in trouble. We'd need something like access_prep= are(). + */ + sha256_write_ocv(env, mmu_idx, param_addr, a, ra); + *message_reg =3D deposit64(*message_reg, 0, message_reg_len, + *message_reg + processed); + *len_reg -=3D processed; + return !len ? 0 : 3; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index d19db7df25..4d1b9a54f2 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -61,6 +61,10 @@ static int cpacf_kimd(CPUS390XState *env, const int mmu_= idx, const uintptr_t ra, int rc =3D 0; =20 switch (fc) { + case CPACF_KIMD_SHA_256: + rc =3D cpacf_sha256(env, mmu_idx, ra, env->regs[1], &env->regs[r2], + &env->regs[r2 + 1], S390_FEAT_TYPE_KIMD); + break; case CPACF_KIMD_SHA_512: rc =3D cpacf_sha512(env, mmu_idx, ra, env->regs[1], &env->regs[r2], &env->regs[r2 + 1], S390_FEAT_TYPE_KIMD); @@ -78,6 +82,10 @@ static int cpacf_klmd(CPUS390XState *env, const int mmu_= idx, const uintptr_t ra, int rc =3D 0; =20 switch (fc) { + case CPACF_KLMD_SHA_256: + rc =3D cpacf_sha256(env, mmu_idx, ra, env->regs[1], &env->regs[r2], + &env->regs[r2 + 1], S390_FEAT_TYPE_KLMD); + break; case CPACF_KLMD_SHA_512: rc =3D cpacf_sha512(env, mmu_idx, ra, env->regs[1], &env->regs[r2], &env->regs[r2 + 1], S390_FEAT_TYPE_KLMD); diff --git a/target/s390x/tcg/meson.build b/target/s390x/tcg/meson.build index 54a87393a3..8ae8da9708 100644 --- a/target/s390x/tcg/meson.build +++ b/target/s390x/tcg/meson.build @@ -5,6 +5,7 @@ s390x_ss.add(when: 'CONFIG_TCG', if_true: files( )) s390x_common_ss.add(when: 'CONFIG_TCG', if_true: files( 'cc_helper.c', + 'cpacf_sha256.c', 'cpacf_sha512.c', 'crypto_helper.c', 'excp_helper.c', --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021504; cv=none; d=zohomail.com; s=zohoarc; b=jhr3TQuYQ1EoXiQXMkHMraBPlBlW1eLEFhlZGLf0guF9VKnZRa9rMNWzt9a5VilsqdObALDjK3eP59GXwg7QReL+Nm/ylbsRXA6Cfs1rcjzMOASEodzU7fzVgA3BPpc44xb1Ks0ZuVZkHy5NdZOFdeBNrYGsLfyV7rUl/FnIIA4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021504; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=cdzz8do0BPD7gSy9N/DGnI0UWdX1TAs6Lnn1c7zq1fI=; b=d4fqaql7OHtDHdBEQdc1+LORZkRRswre8aFKwhHkkS/LomhC1MkuobZY3SdNmZZlCDBtHOvd/VVcGJGrAAXeHlCLSGHPvDytPLsm8OFyyw/6XSsDLEtVWBV9gIBjxzRtDAsICKSEPNAHTDUmH7CaF2ddDEHyMxNrtYE5SZsSoU8= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021504434432.77815963171395; Mon, 21 Sep 2026 13:11:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kJx-0005qc-LK; Mon, 21 Sep 2026 16:09:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJf-0005ft-QT; Mon, 21 Sep 2026 16:08:46 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJa-0005Ki-R2; Mon, 21 Sep 2026 16:08:41 -0400 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8ZLr703577; Mon, 21 Sep 2026 20:08:37 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskgqa9d9-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:37 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJGO1f167243; Mon, 21 Sep 2026 20:08:36 GMT Received: from smtprelay02.wdc07v.mail.ibm.com ([172.16.1.69]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gu5bk9f00-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:36 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay02.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8Ye357737672 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:35 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A831858055; Mon, 21 Sep 2026 20:08:34 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2376358059; Mon, 21 Sep 2026 20:08:34 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:34 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=cdzz8do0BPD7gSy9N /DGnI0UWdX1TAs6Lnn1c7zq1fI=; b=fOj0wnccCJ0bUnWwt3V/4y3a+T3UNSONw fI60R6okxJ8aZIxWaGaJKqzVVizHx3v4BhNPMS4xyhsNNXWVQZffN0v+QYKH3/Up LM0AtV3eD8d6tg4EYYr2Zll9XQRwzI8QZNmOdnP99ToXmF03qxv/yGhEspi68CZ0 1A+Dmbg91ha+bbxOr7EaOUTOxH6sNiF7ak/dWf0NiE65wLRDzGNlfX0zDK3KLvuo 0TnpiuXB3PBHj+uQA/v6uvM9BAZyogNNUm2WPruaSaIx06samLKjBtHy4xQ4UlU0 kvobtRsiE/htnB4Q2t3gU5k+SWdC/HXuVL2uOCB8JjLoE4rx70WLg== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 05/33] target/s390x: Add helper functions for copy memory to and from guest Date: Mon, 21 Sep 2026 16:08:02 -0400 Message-ID: <20260921200830.1302919-6-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=G+OJgNk5 c=1 sm=1 tr=0 ts=6ab18ec5 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=FyORFv3Am_Wt7j1hYGwA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX69+IM/tO8ET0 VscYTB3A7wKaaBhCZjhtcxFyjspMm6VoxgzHicbXJyKZ7yB/AO8JHl1EB8Do4tjG9jyWzRe2mNG S+9AJAcK/SfaReATBahogA0Mo/QgDI/awiZIO5VtbYY15Q/XNUdAYTDBt1StMqws+V/DNl1nUQ1 uFRnBsh5svW4bd7HmQzCD32giRT2lETWKBgevlyW6rr2KZKmKG8KpIoAi0gW2SXa9uwiR9Appbk XZ5Lt7VpVp2G7fy7g7h5qZCN1A7yWXZqAfd63f9lFYxV6EmEO28DdH7s8EHxeDQcabwaI8ZaDXk 5+Bxb6xmmPttDkJK4CiCdbkmvW86yoJJx5kTVH2pgwlw82eK0JU7YXAIISFXdz8Sy2Djo+fV7w+ vlOO3nsKRVvvdRcdE8xCQ/APxWi6GOhRHTh2t1h3CHz0mMDBNhNc+OnH63i9tkbeFEDIqjRMq7H h5gQ6r2fRhX7b0AWTjg== X-Proofpoint-ORIG-GUID: Q0sHEH1EuEQ4SqSzAH_xHNqyOi14fsbF X-Proofpoint-GUID: Q0sHEH1EuEQ4SqSzAH_xHNqyOi14fsbF X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXykQ6OA8/Bmjj 8rHJifXF+IjKAJoQnsZpVzI5ZtMi1ZiryD8zyj0BfHqhdM0ioB/Ay9n/zAtDVH1qlfFg0leqtRT yYSbojwy0tYqxoYkKsDzeCZd20Q8/kA= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 phishscore=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 priorityscore=1501 clxscore=1015 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021505510158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Add some simple helper functions to copy memory from guest to a local buffer and the other way around: - read_guest_wrap_u8() - write_guest_wrap_u8() - read_guest_wrap_u32() - write_guest_wrap_u32() - read_guest_wrap_u64() - write_guest_wrap_u64() The reader functions read from guest memory into an array of u8/u32/u64 with BE conversion. Similar the writer functions write an array of u8/u32/u64 into guest memory with BE conversion. All these functions are intended to be used for the crypto implementations thus are located in crypto_helper.h. Rework and simplify the sha 256 and sha 512 implementations to use these helper functions. Signed-off-by: Harald Freudenberger Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-6-freude@linu= x.ibm.com Signed-off-by: Eric Farman --- target/s390x/tcg/cpacf_sha256.c | 63 ++++--------------- target/s390x/tcg/cpacf_sha512.c | 63 ++++--------------- target/s390x/tcg/crypto_helper.c | 1 + target/s390x/tcg/crypto_helper.h | 100 +++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+), 104 deletions(-) create mode 100644 target/s390x/tcg/crypto_helper.h diff --git a/target/s390x/tcg/cpacf_sha256.c b/target/s390x/tcg/cpacf_sha25= 6.c index 30754dbdd4..67321b565c 100644 --- a/target/s390x/tcg/cpacf_sha256.c +++ b/target/s390x/tcg/cpacf_sha256.c @@ -19,6 +19,7 @@ #include "accel/tcg/cpu-mmu-index.h" #include "target/s390x/tcg/cpacf-arch.h" #include "target/s390x/tcg/cpacf.h" +#include "target/s390x/tcg/crypto_helper.h" =20 static uint32_t R(uint32_t x, int c) { @@ -104,53 +105,13 @@ static void sha256_bda_be32(uint32_t a[8], uint32_t w= [16]) sha256_bda(a, t); } =20 -static void sha256_read_icv(CPUS390XState *env, const int mmu_idx, - uint64_t addr, uint32_t a[8], uintptr_t ra) -{ - const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_32 | MO_UNALN, mmu_idx= ); - - for (int i =3D 0; i < 8; i++, addr +=3D 4) { - a[i] =3D cpu_ldl_mmu(env, wrap_address(env, addr), oi, ra); - } -} - -static void sha256_write_ocv(CPUS390XState *env, const int mmu_idx, - uint64_t addr, uint32_t a[8], uintptr_t ra) -{ - const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_32 | MO_UNALN, mmu_idx= ); - - for (int i =3D 0; i < 8; i++, addr +=3D 4) { - cpu_stl_mmu(env, wrap_address(env, addr), a[i], oi, ra); - } -} - -static void sha256_read_block(CPUS390XState *env, const int mmu_idx, - uint64_t addr, uint32_t a[16], uintptr_t ra) -{ - const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_32 | MO_UNALN, mmu_idx= ); - - for (int i =3D 0; i < 16; i++, addr +=3D 4) { - a[i] =3D cpu_ldl_mmu(env, wrap_address(env, addr), oi, ra); - } -} - -static void sha256_read_mbl_be32(CPUS390XState *env, const int mmu_idx, - uint64_t addr, uint8_t a[8], uintptr_t ra) -{ - const MemOpIdx oi =3D make_memop_idx(MO_8, mmu_idx); - - for (int i =3D 0; i < 8; i++, addr +=3D 1) { - a[i] =3D cpu_ldb_mmu(env, wrap_address(env, addr), oi, ra); - } -} - int cpacf_sha256(CPUS390XState *env, const int mmu_idx, uintptr_t ra, uint64_t param_addr, uint64_t *message_reg, uint64_t *len= _reg, uint32_t type) { enum { MAX_BLOCKS_PER_RUN =3D 128 }; /* 128 * 64 =3D 8K */ uint64_t len =3D *len_reg, processed =3D 0; - int i, message_reg_len =3D 64; + int message_reg_len =3D 64; uint32_t a[8]; =20 g_assert(type =3D=3D S390_FEAT_TYPE_KIMD || type =3D=3D S390_FEAT_TYPE= _KLMD); @@ -165,7 +126,8 @@ int cpacf_sha256(CPUS390XState *env, const int mmu_idx,= uintptr_t ra, tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); } =20 - sha256_read_icv(env, mmu_idx, param_addr, a, ra); + /* read icv (8 * u32) */ + read_guest_wrap_u32(env, mmu_idx, ra, param_addr, a, 8); =20 /* Process full blocks first. */ for (; len >=3D 64; len -=3D 64, processed +=3D 64) { @@ -175,21 +137,18 @@ int cpacf_sha256(CPUS390XState *env, const int mmu_id= x, uintptr_t ra, break; } =20 - sha256_read_block(env, mmu_idx, *message_reg + processed, w, ra); + /* read sha256 block (16 * u32) */ + read_guest_wrap_u32(env, mmu_idx, ra, *message_reg + processed, w,= 16); sha256_bda(a, w); } =20 /* KLMD: Process partial/empty block last. */ if (type =3D=3D S390_FEAT_TYPE_KLMD && len < 64) { - const MemOpIdx oi =3D make_memop_idx(MO_8, mmu_idx); uint8_t x[64]; =20 - /* Read the remainder of the message byte-per-byte. */ - for (i =3D 0; i < len; i++) { - uint64_t addr =3D wrap_address(env, *message_reg + processed += i); + /* Read the remainder of the message. */ + read_guest_wrap_u8(env, mmu_idx, ra, *message_reg + processed, x, = len); =20 - x[i] =3D cpu_ldb_mmu(env, addr, oi, ra); - } /* Pad the remainder with zero and set the top bit. */ memset(x + len, 0, 64 - len); x[len] =3D 0x80; @@ -199,13 +158,13 @@ int cpacf_sha256(CPUS390XState *env, const int mmu_id= x, uintptr_t ra, * or use an additional one. */ if (len < 56) { - sha256_read_mbl_be32(env, mmu_idx, param_addr + 32, x + 56, ra= ); + read_guest_wrap_u8(env, mmu_idx, ra, param_addr + 32, x + 56, = 8); } sha256_bda_be32(a, (uint32_t *)x); =20 if (len >=3D 56) { memset(x, 0, 56); - sha256_read_mbl_be32(env, mmu_idx, param_addr + 32, x + 56, ra= ); + read_guest_wrap_u8(env, mmu_idx, ra, param_addr + 32, x + 56, = 8); sha256_bda_be32(a, (uint32_t *)x); } =20 @@ -220,7 +179,7 @@ int cpacf_sha256(CPUS390XState *env, const int mmu_idx,= uintptr_t ra, * TODO: if writing fails halfway through (e.g., when crossing page * boundaries), we're in trouble. We'd need something like access_prep= are(). */ - sha256_write_ocv(env, mmu_idx, param_addr, a, ra); + write_guest_wrap_u32(env, mmu_idx, ra, param_addr, a, 8); *message_reg =3D deposit64(*message_reg, 0, message_reg_len, *message_reg + processed); *len_reg -=3D processed; diff --git a/target/s390x/tcg/cpacf_sha512.c b/target/s390x/tcg/cpacf_sha51= 2.c index 2a1ff38c58..edd8dae78f 100644 --- a/target/s390x/tcg/cpacf_sha512.c +++ b/target/s390x/tcg/cpacf_sha512.c @@ -18,6 +18,7 @@ #include "accel/tcg/cpu-mmu-index.h" #include "target/s390x/tcg/cpacf-arch.h" #include "target/s390x/tcg/cpacf.h" +#include "target/s390x/tcg/crypto_helper.h" =20 static uint64_t R(uint64_t x, int c) { @@ -119,53 +120,13 @@ static void sha512_bda_be64(uint64_t a[8], uint64_t w= [16]) sha512_bda(a, t); } =20 -static void sha512_read_icv(CPUS390XState *env, const int mmu_idx, - uint64_t addr, uint64_t a[8], uintptr_t ra) -{ - const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_64 | MO_UNALN, mmu_idx= ); - - for (int i =3D 0; i < 8; i++, addr +=3D 8) { - a[i] =3D cpu_ldq_mmu(env, wrap_address(env, addr), oi, ra); - } -} - -static void sha512_write_ocv(CPUS390XState *env, const int mmu_idx, - uint64_t addr, uint64_t a[8], uintptr_t ra) -{ - const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_64 | MO_UNALN, mmu_idx= ); - - for (int i =3D 0; i < 8; i++, addr +=3D 8) { - cpu_stq_mmu(env, wrap_address(env, addr), a[i], oi, ra); - } -} - -static void sha512_read_block(CPUS390XState *env, const int mmu_idx, - uint64_t addr, uint64_t a[16], uintptr_t ra) -{ - const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_64 | MO_UNALN, mmu_idx= ); - - for (int i =3D 0; i < 16; i++, addr +=3D 8) { - a[i] =3D cpu_ldq_mmu(env, wrap_address(env, addr), oi, ra); - } -} - -static void sha512_read_mbl_be64(CPUS390XState *env, const int mmu_idx, - uint64_t addr, uint8_t a[16], uintptr_t r= a) -{ - const MemOpIdx oi =3D make_memop_idx(MO_8, mmu_idx); - - for (int i =3D 0; i < 16; i++, addr +=3D 1) { - a[i] =3D cpu_ldb_mmu(env, wrap_address(env, addr), oi, ra); - } -} - int cpacf_sha512(CPUS390XState *env, const int mmu_idx, uintptr_t ra, uint64_t param_addr, uint64_t *message_reg, uint64_t *len= _reg, uint32_t type) { enum { MAX_BLOCKS_PER_RUN =3D 64 }; /* Arbitrary: keep interactivity. = */ uint64_t len =3D *len_reg, a[8], processed =3D 0; - int i, message_reg_len =3D 64; + int message_reg_len =3D 64; =20 g_assert(type =3D=3D S390_FEAT_TYPE_KIMD || type =3D=3D S390_FEAT_TYPE= _KLMD); =20 @@ -179,7 +140,8 @@ int cpacf_sha512(CPUS390XState *env, const int mmu_idx,= uintptr_t ra, tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); } =20 - sha512_read_icv(env, mmu_idx, param_addr, a, ra); + /* read icv (8 * u64) */ + read_guest_wrap_u64(env, mmu_idx, ra, param_addr, a, 8); =20 /* Process full blocks first. */ for (; len >=3D 128; len -=3D 128, processed +=3D 128) { @@ -189,21 +151,18 @@ int cpacf_sha512(CPUS390XState *env, const int mmu_id= x, uintptr_t ra, break; } =20 - sha512_read_block(env, mmu_idx, *message_reg + processed, w, ra); + /* read sha512 block (16 * u64) */ + read_guest_wrap_u64(env, mmu_idx, ra, *message_reg + processed, w,= 16); sha512_bda(a, w); } =20 /* KLMD: Process partial/empty block last. */ if (type =3D=3D S390_FEAT_TYPE_KLMD && len < 128) { - const MemOpIdx oi =3D make_memop_idx(MO_8, mmu_idx); uint8_t x[128]; =20 - /* Read the remainder of the message byte-per-byte. */ - for (i =3D 0; i < len; i++) { - uint64_t addr =3D wrap_address(env, *message_reg + processed += i); + /* Read the remainder of the message. */ + read_guest_wrap_u8(env, mmu_idx, ra, *message_reg + processed, x, = len); =20 - x[i] =3D cpu_ldb_mmu(env, addr, oi, ra); - } /* Pad the remainder with zero and set the top bit. */ memset(x + len, 0, 128 - len); x[len] =3D 128; @@ -213,13 +172,13 @@ int cpacf_sha512(CPUS390XState *env, const int mmu_id= x, uintptr_t ra, * or use an additional one. */ if (len < 112) { - sha512_read_mbl_be64(env, mmu_idx, param_addr + 64, x + 112, r= a); + read_guest_wrap_u8(env, mmu_idx, ra, param_addr + 64, x + 112,= 16); } sha512_bda_be64(a, (uint64_t *)x); =20 if (len >=3D 112) { memset(x, 0, 112); - sha512_read_mbl_be64(env, mmu_idx, param_addr + 64, x + 112, r= a); + read_guest_wrap_u8(env, mmu_idx, ra, param_addr + 64, x + 112,= 16); sha512_bda_be64(a, (uint64_t *)x); } =20 @@ -234,7 +193,7 @@ int cpacf_sha512(CPUS390XState *env, const int mmu_idx,= uintptr_t ra, * TODO: if writing fails halfway through (e.g., when crossing page * boundaries), we're in trouble. We'd need something like access_prep= are(). */ - sha512_write_ocv(env, mmu_idx, param_addr, a, ra); + write_guest_wrap_u64(env, mmu_idx, ra, param_addr, a, 8); *message_reg =3D deposit64(*message_reg, 0, message_reg_len, *message_reg + processed); *len_reg -=3D processed; diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index 4d1b9a54f2..27decdda63 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -22,6 +22,7 @@ #include "accel/tcg/cpu-mmu-index.h" #include "target/s390x/tcg/cpacf-arch.h" #include "target/s390x/tcg/cpacf.h" +#include "target/s390x/tcg/crypto_helper.h" =20 static int fill_buf_random(CPUS390XState *env, const int mmu_idx, uintptr_= t ra, uint64_t *buf_reg, uint64_t *len_reg) diff --git a/target/s390x/tcg/crypto_helper.h b/target/s390x/tcg/crypto_hel= per.h new file mode 100644 index 0000000000..2364e46029 --- /dev/null +++ b/target/s390x/tcg/crypto_helper.h @@ -0,0 +1,100 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Crypto helper functions + */ + +#ifndef TARGET_S390_CRYPTO_HELPER_H +#define TARGET_S390_CRYPTO_HELPER_H + +/* + * helper function to read len * u8 from guest to local buffer + */ +static inline void read_guest_wrap_u8(CPUS390XState *env, const int mmu_id= x, + const uintptr_t ra, uint64_t guest_a= ddr, + uint8_t *dest, size_t len) +{ + const MemOpIdx oi =3D make_memop_idx(MO_8, mmu_idx); + + for (size_t i =3D 0; i < len; i++, guest_addr++) { + uint64_t waddr =3D wrap_address(env, guest_addr); + dest[i] =3D cpu_ldb_mmu(env, waddr, oi, ra); + } +} + +/* + * helper function to write len * u8 from local buffer to guest + */ +static inline void write_guest_wrap_u8(CPUS390XState *env, const int mmu_i= dx, + const uintptr_t ra, uint64_t guest_= addr, + const uint8_t *src, size_t len) +{ + const MemOpIdx oi =3D make_memop_idx(MO_8, mmu_idx); + + for (size_t i =3D 0; i < len; i++, guest_addr++) { + uint64_t waddr =3D wrap_address(env, guest_addr); + cpu_stb_mmu(env, waddr, src[i], oi, ra); + } +} + +/* + * helper function to read len * u32 from guest to local buffer + */ +static inline void read_guest_wrap_u32(CPUS390XState *env, const int mmu_i= dx, + const uintptr_t ra, uint64_t guest_a= ddr, + uint32_t *dest, size_t len) +{ + const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_32 | MO_UNALN, mmu_idx= ); + + for (size_t i =3D 0; i < len; i++, guest_addr +=3D 4) { + uint64_t waddr =3D wrap_address(env, guest_addr); + dest[i] =3D cpu_ldl_mmu(env, waddr, oi, ra); + } +} + +/* + * helper function to write len * u32 from local buffer to guest + */ +static inline void write_guest_wrap_u32(CPUS390XState *env, const int mmu_= idx, + const uintptr_t ra, uint64_t guest= _addr, + const uint32_t *src, size_t len) +{ + const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_32 | MO_UNALN, mmu_idx= ); + + for (size_t i =3D 0; i < len; i++, guest_addr +=3D 4) { + uint64_t waddr =3D wrap_address(env, guest_addr); + cpu_stl_mmu(env, waddr, src[i], oi, ra); + } +} + +/* + * helper function to read len * u64 from guest to local buffer + */ +static inline void read_guest_wrap_u64(CPUS390XState *env, const int mmu_i= dx, + const uintptr_t ra, uint64_t guest_a= ddr, + uint64_t *dest, size_t len) +{ + const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_64 | MO_UNALN, mmu_idx= ); + + for (size_t i =3D 0; i < len; i++, guest_addr +=3D 8) { + uint64_t waddr =3D wrap_address(env, guest_addr); + dest[i] =3D cpu_ldq_mmu(env, waddr, oi, ra); + } +} + +/* + * helper function to write len * u64 from local buffer to guest + */ +static inline void write_guest_wrap_u64(CPUS390XState *env, const int mmu_= idx, + const uintptr_t ra, uint64_t guest= _addr, + const uint64_t *src, size_t len) +{ + const MemOpIdx oi =3D make_memop_idx(MO_BE | MO_64 | MO_UNALN, mmu_idx= ); + + for (size_t i =3D 0; i < len; i++, guest_addr +=3D 8) { + uint64_t waddr =3D wrap_address(env, guest_addr); + cpu_stq_mmu(env, waddr, src[i], oi, ra); + } +} + +#endif /* TARGET_S390_CRYPTO_HELPER_H */ --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021566; cv=none; d=zohomail.com; s=zohoarc; b=Zh44q+PhLCw4Gx1zB1/xJOAmbRWPUiwBTl3liXrgJduxrmw9xgpQO8K8Eco3mFxTO6TSeezywLx0LcLlz4JDlZGdulCVUBygtEJka4uFIcDFqdOQhXRO41PVcx5dDnNxNR8zSeiln/JVL3JxvaXE1JagYzsiz4JV1PhZTMqSr4Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021566; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=QICLEegwFNDENGLohU3G9EssSt6EnRiOx8sK4cnQN5Y=; b=TooX/JlrQXIBkAYpf743irO7eLKHlQ2bATHkFAU2WND1Hnl27b4W5clrdV9G3RpFlnFAZUHhGa8fvCmNJdhCR2c0C7MgQDDU3b3LCf4boSCTG9Dxw11rKpn7MZ6m5oA5rud0uhJFDBGzaTQ1JG9G1mpG/Lx6IGBzTqtTtt+AhS8= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021566312111.97841281725357; Mon, 21 Sep 2026 13:12:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kJn-0005ho-2M; Mon, 21 Sep 2026 16:08:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJc-0005eY-55; Mon, 21 Sep 2026 16:08:40 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJa-0005Kg-Eh; Mon, 21 Sep 2026 16:08:39 -0400 Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8Lol1903077; Mon, 21 Sep 2026 20:08:37 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskdv2bd8-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:36 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJEQDZ167302; Mon, 21 Sep 2026 20:08:36 GMT Received: from smtprelay04.dal12v.mail.ibm.com ([172.16.1.6]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gu5bk9eyy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:36 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay04.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8ZtJ29098692 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:35 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 492F858059; Mon, 21 Sep 2026 20:08:35 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C43C758043; Mon, 21 Sep 2026 20:08:34 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:34 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=QICLEegwFNDENGLoh U3G9EssSt6EnRiOx8sK4cnQN5Y=; b=GWf9JrjZjkmlakQbFoMsixYHs5cozgGVB 5QuzK+sl3c4yBGowimBWlhBkkFNzAW8Ps0/0z1aG4ppm0gW+iUO0Qfd6cZUrnqPK cO34UwFKfEbOdHunTVqMVIYS2htRYbqVwYx1eZlgrSMPb60SE3TlmzWsnMtHkNl9 /fESr7zryWJlp8QUL5fiCoe0ywHGCoMvsdHdST7M4Yi9D3yY4OYA1Yw9UfVDdEx2 7qzwDk0SI3Jr3d9kDPkQYX/OOhm/Mq5V0XX+UaCRHaUROmbzA4MTa4cdJ1XlJ2dz +cTPKDki5YOIYSVdla16EZLeToMdlyXNSRIqsPbISl13DRLBCUXWg== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 06/33] target/s390x: Adjust addressing mode checks for sha512 and sha256 Date: Mon, 21 Sep 2026 16:08:03 -0400 Message-ID: <20260921200830.1302919-7-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: f7D2eAxCtKLNgijORiUQcZ6zwwBWQp2m X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX9rpCryctbtam UMLmT7bXbxSCalWDdHceGos76ElQ5neo3tWFUPGeZlS3QI5G3IQkKP/1aZFDYv6V8HVekTLPEXH 43Ttb3e6Gjw+1ivFf8ujkUPZNhGhZXA= X-Authority-Analysis: v=2.4 cv=FLiOVOos c=1 sm=1 tr=0 ts=6ab18ec5 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=ZpfFLUfXnHEdiUPoyBIA:9 X-Proofpoint-GUID: f7D2eAxCtKLNgijORiUQcZ6zwwBWQp2m X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX9z2gd64LXed5 hYiUh3Hi97DlPeWk+NOmEGzdt7NZDmm3uXqIfoKonfxRXwSDzgGYoEPWMl4oIqaqzOyWUtc4Bz6 n9q4EFqJyhYSIgZEy2DVyb3LHm5/GqgfmvqmzQ6vlKgwmw/NhuJR5LRvFInWQqFkjFAfayg/6T0 FRD8ZDOodn2NleJK3pNDfPxD7feaJfR3YIyhY7ccK3IFnGBvuj1Ha8yrT7tJAPDXvkOuX7gK8/C GzLdhQYJeVTGGQSprBzToP47F8U1VI+f6AJK0aGw91zKe60nxa91QQZ3IJI61d+j4hMlDEVjocf Pzj7MXi0kwKPeK4kT58mjm+GlKgDccivc1HDOwiPXTFOWzZIJ7dz92HSuSto5ogjY2ckR/n1uOq 9hTprd3/lajmkEepDFRJOGNWgAMkCrFaubgK4TWImwIHoCFLddUxPi/Mll0VmFN0QZHDQC9CGZX Wk/fwyTOvuOOQzAlW+w== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 phishscore=0 spamscore=0 clxscore=1015 suspectscore=0 bulkscore=0 lowpriorityscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021567622158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger The handling for different addressing modes in the both sha implementations cpacf sha256 and sha512 was incomplete. Rework this addressing checking to clearly have support for s390 64 bit and 32 bit addressing mode but raise an exception otherwise. Also bail out early (for KIMD only) if length is 0. Signed-off-by: Harald Freudenberger Suggested-by: Ilya Leoshkevich Reviewed-by: Eric Farman Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-7-freude@linu= x.ibm.com Signed-off-by: Eric Farman --- target/s390x/tcg/cpacf_sha256.c | 16 +++++++++++++--- target/s390x/tcg/cpacf_sha512.c | 16 +++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/target/s390x/tcg/cpacf_sha256.c b/target/s390x/tcg/cpacf_sha25= 6.c index 67321b565c..de305b6838 100644 --- a/target/s390x/tcg/cpacf_sha256.c +++ b/target/s390x/tcg/cpacf_sha256.c @@ -111,14 +111,24 @@ int cpacf_sha256(CPUS390XState *env, const int mmu_id= x, uintptr_t ra, { enum { MAX_BLOCKS_PER_RUN =3D 128 }; /* 128 * 64 =3D 8K */ uint64_t len =3D *len_reg, processed =3D 0; - int message_reg_len =3D 64; + int message_reg_len; uint32_t a[8]; =20 g_assert(type =3D=3D S390_FEAT_TYPE_KIMD || type =3D=3D S390_FEAT_TYPE= _KLMD); =20 - if (!(env->psw.mask & PSW_MASK_64)) { + /* check addressing mode, raise exception if not supported here */ + if (env->psw.mask & PSW_MASK_64) { + message_reg_len =3D 64; + } else if (env->psw.mask & PSW_MASK_32) { + message_reg_len =3D 32; len =3D (uint32_t)len; - message_reg_len =3D (env->psw.mask & PSW_MASK_32) ? 32 : 24; + } else { + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* for KIMD only: early bail out if length is zero */ + if (type =3D=3D S390_FEAT_TYPE_KIMD && !len) { + return 0; } =20 /* KIMD: length has to be properly aligned. */ diff --git a/target/s390x/tcg/cpacf_sha512.c b/target/s390x/tcg/cpacf_sha51= 2.c index edd8dae78f..cad8e0e1bd 100644 --- a/target/s390x/tcg/cpacf_sha512.c +++ b/target/s390x/tcg/cpacf_sha512.c @@ -126,13 +126,23 @@ int cpacf_sha512(CPUS390XState *env, const int mmu_id= x, uintptr_t ra, { enum { MAX_BLOCKS_PER_RUN =3D 64 }; /* Arbitrary: keep interactivity. = */ uint64_t len =3D *len_reg, a[8], processed =3D 0; - int message_reg_len =3D 64; + int message_reg_len; =20 g_assert(type =3D=3D S390_FEAT_TYPE_KIMD || type =3D=3D S390_FEAT_TYPE= _KLMD); =20 - if (!(env->psw.mask & PSW_MASK_64)) { + /* check addressing mode, raise exception if not supported here */ + if (env->psw.mask & PSW_MASK_64) { + message_reg_len =3D 64; + } else if (env->psw.mask & PSW_MASK_32) { + message_reg_len =3D 32; len =3D (uint32_t)len; - message_reg_len =3D (env->psw.mask & PSW_MASK_32) ? 32 : 24; + } else { + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* for KIMD only: early bail out if length is zero */ + if (type =3D=3D S390_FEAT_TYPE_KIMD && !len) { + return 0; } =20 /* KIMD: length has to be properly aligned. */ --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021559; cv=none; d=zohomail.com; s=zohoarc; b=AIawuYwq85ryTfvEnqrBiv4MuXqi/hyKpxSLKMOz6PAwc/a2bROFZV3KWX6/+YdusKNaom5Xx1XUlPWfVOdwD6hx6XjDpsRVUY02tuTaul/vUqpmU3jnReORYSJ2jmFZCES99iqXxJ9OZfTwJAvdW2J1Nc5BHe/bNTBwR98D80Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021559; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=nEpuEXytfcGleGChe5oVl8JqseXcNxp4/FVjoACUqs4=; b=lLDIS7C/127n9RkZZjfcdWNTu6ej0QIHCyNQCL84nIDmiogsMjHMgNPBja5mDyUA284gYhOsfHv4fF9AzsmEGTm6X9aAJ6zZY2DudTX26F9rg2ktKE2QQLCTVSXQyMJCBVnt/VAVnV6mTtbkWmNvMPTEww0Wrl0VCoBxU0wXfUo= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021559726608.7739449743257; Mon, 21 Sep 2026 13:12:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kK0-0005t7-L0; Mon, 21 Sep 2026 16:09:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJe-0005fj-07; Mon, 21 Sep 2026 16:08:43 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJa-0005Kn-Tn; Mon, 21 Sep 2026 16:08:41 -0400 Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8W6L1711838; Mon, 21 Sep 2026 20:08:37 GMT Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gske1abvj-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:37 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJ93pl2399637; Mon, 21 Sep 2026 20:08:36 GMT Received: from smtprelay04.dal12v.mail.ibm.com ([172.16.1.6]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gt7dy6nat-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:36 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay04.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8ZCn29098694 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:36 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DC25D58055; Mon, 21 Sep 2026 20:08:35 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 64E5558043; Mon, 21 Sep 2026 20:08:35 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:35 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pp1; bh=nEpuEX ytfcGleGChe5oVl8JqseXcNxp4/FVjoACUqs4=; b=opLY+ZsqVeBpy2CQSTXo20 ArVWsw8uariP43v0laRTntJu2dKpWGnnhJlh9/Te5B9R5L81nbkZ4OIajpYuF7Aw OOwGOOzDPzsE5MnadXLbKSElYz6YxcI3+049gjpP15RoZAu+VI1FDdmqOYdVLsWo +91qJa1rMFZo9Jr7o4UWPRcQ0C4UQWMyF6n4lk6anXsJAXhJVfy112BiiDkMmFLK OxYzRDSNTPDARB9LqZ/tZUIfaRaPpFZnwqlXzo03+FpOTbyICD3qeJX1+hf8qeQD dFcyvQh55MSPA+v8pCf7isKPJSAN5bUweOgTTuzWprxcq9szftYgPNseumh0QvcA == From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 07/33] crypto: Add aes-helpers file to support some AES modes Date: Mon, 21 Sep 2026 16:08:04 -0400 Message-ID: <20260921200830.1302919-8-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: iiBU32FVzo50lrdSIbw0IevXdlM4O7-8 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXyObAvQNzg/DP EtZSamKcWm63f0kuc2e+y2Pmjoq+m7eFx3Cdsys1MYReiBF4tYZuRy1IZksW/3X4Xvwmdh1T+1X WmpBm+LsdSkC1LZVAfeKIffz4zxUoMt9PH1D6yu19N26UaJjFM/e9wfwYcTreZ5Ya5u89IzQuZe rQSgtwZONBOs1tjFOSPUzQ+a3YyO3q8sfUfsF0lt/8EDKPsRjmBPol++rzsrKczWYpCQafvmiVy zco6r4/ZznROR4Sla905YvuDk/wy44Gt+COvYfLa5pJnW3YMx5dO/wmTpvI5IOr/7213adm1u5g vzL+Kvay3jNuiMINCDajplQZEXJEDBzKUlb1EPLoA7UZ8wv4wakHvmOEqvjzLNWl7kqV4qHg5tc GW4GNURAGM9ikzS+x9A4FjGJmWCyzWXHqL00E5VU7jGERSRL3rDJ8eDWvX9IU2zCaltHcXmrEh2 lpO5m3JbkQVGF0gs3zg== X-Authority-Analysis: v=2.4 cv=O/KsLx9W c=1 sm=1 tr=0 ts=6ab18ec5 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=zkwM-tl61wuaHISZUgYA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX59yCRRH7Y7f1 aKaGlKMkf68RHHGKDFL5fBw0e/Pjo5hbS4cQjdUSSpA/TWMxQJM0A6aHOltYL2EbOO9pRfSZE4Q ayhwcNGInhFDpWJchO5Q2fbtfmVnDmM= X-Proofpoint-GUID: iiBU32FVzo50lrdSIbw0IevXdlM4O7-8 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 malwarescore=0 phishscore=0 impostorscore=0 suspectscore=0 bulkscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021561622158500 From: Harald Freudenberger Add a new file crypto/aes-helpers.c with simple functions to support some AES modes: - AES cbc: AES_cbc_encrypt() AES_cbc_decrypt() - AES ctr: AES_ctr_encrypt() - AES xts: AES_xts_encrypt() AES_xts_decrypt() and some AES related helpers: - AES_xor() - AES_xts_prep_next_tweak() Add header file include/crypto/aes-helpers.h for these functions Signed-off-by: Harald Freudenberger Reviewed-by: Finn Callies Reviewed-by: Ilya Leoshkevich Reviewed-by: Daniel P. Berrang=C3=A9 Acked-by: Daniel P. Berrang=C3=A9 Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-8-freude@linu= x.ibm.com Signed-off-by: Eric Farman --- crypto/aes-helpers.c | 106 ++++++++++++++++++++++++++++++++++ crypto/meson.build | 1 + include/crypto/aes-helpers.h | 109 +++++++++++++++++++++++++++++++++++ 3 files changed, 216 insertions(+) create mode 100644 crypto/aes-helpers.c create mode 100644 include/crypto/aes-helpers.h diff --git a/crypto/aes-helpers.c b/crypto/aes-helpers.c new file mode 100644 index 0000000000..68d848683c --- /dev/null +++ b/crypto/aes-helpers.c @@ -0,0 +1,106 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * AES helper functions and mode implementations + * + * Authors: + * Harald Freudenberger + */ + +#include "qemu/osdep.h" +#include "crypto/aes.h" +#include "crypto/aes-helpers.h" + +void AES_xor(const unsigned char *src1, const unsigned char *src2, + unsigned char *dst) +{ + int i; + + for (i =3D 0; i < AES_BLOCK_SIZE; i++) { + dst[i] =3D src1[i] ^ src2[i]; + } +} + +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + unsigned char *iv, const AES_KEY *key) +{ + unsigned char buf[AES_BLOCK_SIZE]; + + /* in xor iv =3D> buf */ + AES_xor(in, iv, buf); + /* encrypt buf =3D> out */ + AES_encrypt(buf, out, key); + /* prep iv for next round */ + memcpy(iv, out, AES_BLOCK_SIZE); +} + +void AES_cbc_decrypt(const unsigned char *in, unsigned char *out, + unsigned char *iv, const AES_KEY *key) +{ + unsigned char buf[AES_BLOCK_SIZE]; + + /* decrypt in =3D> buf */ + AES_decrypt(in, buf, key); + /* buf xor iv =3D> out */ + AES_xor(buf, iv, out); + /* prep iv for next round */ + memcpy(iv, in, AES_BLOCK_SIZE); +} + +void AES_ctr_encrypt(const unsigned char *in, unsigned char *out, + const unsigned char *ctr, const AES_KEY *key) +{ + unsigned char buf[AES_BLOCK_SIZE]; + + /* encrypt ctr =3D> buf */ + AES_encrypt(ctr, buf, key); + /* exor input data with encrypted ctr =3D> out */ + AES_xor(in, buf, out); +} + +/* + * Tweak calculation for AES XTS. + * Multiply tweak by =CE=B1 (x) in GF(2^128) per IEEE 1619-2007. The tweak + * is a 128-bit little-endian integer (tweak[0]=3DLSB, tweak[15]=3DMSB). + * This implementation has been verified on little and big endian. + */ +void AES_xts_prep_next_tweak(unsigned char *tweak) +{ + unsigned char carry; + int i; + + carry =3D tweak[AES_BLOCK_SIZE - 1] >> 7; + + for (i =3D AES_BLOCK_SIZE - 1; i > 0; i--) { + tweak[i] =3D (unsigned char)((tweak[i] << 1) | (tweak[i - 1] >> 7)= ); + } + + tweak[i] =3D (unsigned char)(tweak[i] << 1); + tweak[i] ^=3D (unsigned char)(0x87 & (unsigned char)(-(unsigned char)c= arry)); +} + +void AES_xts_encrypt(const unsigned char *in, unsigned char *out, + const unsigned char *tweak, const AES_KEY *key) +{ + unsigned char buf1[AES_BLOCK_SIZE], buf2[AES_BLOCK_SIZE]; + + /* in xor tweak =3D> buf1 */ + AES_xor(in, tweak, buf1); + /* encrypt buf1 =3D> buf2 */ + AES_encrypt(buf1, buf2, key); + /* buf2 xor tweak =3D> out */ + AES_xor(buf2, tweak, out); +} + +void AES_xts_decrypt(const unsigned char *in, unsigned char *out, + const unsigned char *tweak, const AES_KEY *key) +{ + unsigned char buf1[AES_BLOCK_SIZE], buf2[AES_BLOCK_SIZE]; + + /* in xor tweak =3D> buf1 */ + AES_xor(in, tweak, buf1); + /* encrypt buf1 =3D> buf2 */ + AES_decrypt(buf1, buf2, key); + /* buf2 xor tweak =3D> out */ + AES_xor(buf2, tweak, out); +} diff --git a/crypto/meson.build b/crypto/meson.build index 15f0bc72e2..bcd598e727 100644 --- a/crypto/meson.build +++ b/crypto/meson.build @@ -55,6 +55,7 @@ system_ss.add(when: gnutls, if_true: files('tls-cipher-su= ites.c')) =20 util_ss.add(files( 'aes.c', + 'aes-helpers.c', 'clmul.c', 'init.c', 'sm4.c', diff --git a/include/crypto/aes-helpers.h b/include/crypto/aes-helpers.h new file mode 100644 index 0000000000..9a94c48d86 --- /dev/null +++ b/include/crypto/aes-helpers.h @@ -0,0 +1,109 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * AES helper functions and modes + */ + +#ifndef QEMU_AES_HELPERS_H +#define QEMU_AES_HELPERS_H + +/** + * AES_xor: + * @src1: first source buffer of AES_BLOCK_SIZE bytes + * @src2: second source buffer of AES_BLOCK_SIZE bytes + * @dst: destination buffer of AES_BLOCK_SIZE bytes + * + * Bitwise XOR operation between two AES blocks. + */ +void AES_xor(const unsigned char *src1, const unsigned char *src2, + unsigned char *dst); + +/** + * AES_cbc_encrypt: + * @in: input plaintext block of AES_BLOCK_SIZE bytes + * @out: output ciphertext block of AES_BLOCK_SIZE bytes + * @iv: IV, updated after processing for chaining + * @key: AES key + * + * Single block AES encrypt in CBC (Cipher Block Chaining) mode. + * The input block is XORed with the IV, then encrypted with AES. + * IV is updated at the end and is prepared for the next invocation. + */ +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + unsigned char *iv, const AES_KEY *key); + +/** + * AES_cbc_decrypt: + * @in: input ciphertext block of AES_BLOCK_SIZE bytes + * @out: output plaintext block of AES_BLOCK_SIZE bytes + * @iv: initialization vector, updated to input block for chaining + * @key: AES key + * + * Single block AES decrypt in CBC (Cipher Block Chaining) mode. + * The input block is decrypted, then XORed with the IV. + * IV is updated at the end and is prepared for the next invocation. + */ +void AES_cbc_decrypt(const unsigned char *in, unsigned char *out, + unsigned char *iv, const AES_KEY *key); + +/** + * AES_ctr_encrypt: + * @in: input data block of AES_BLOCK_SIZE bytes + * @out: output data block of AES_BLOCK_SIZE bytes + * @ctr: counter value of AES_BLOCK_SIZE bytes + * @key: AES key + * + * Single block AES encrypt/decrypt in CTR (Counter) mode. + * The counter block is encrypted, then XORed with the + * input data block. + * In CTR mode encrypt and decrypt are identical operations. + * Note that the caller is responsible for incrementing the + * counter block. + */ +void AES_ctr_encrypt(const unsigned char *in, unsigned char *out, + const unsigned char *ctr, const AES_KEY *key); + +/** + * AES_xts_prep_next_tweak: + * @tweak: pointer to tweak value to be updated (16 bytes buffer + * containing a 128 bit little endian integer) + * + * Tweak calculation for AES XTS. + * Prepares the next tweak value for AES-XTS mode by multiplying + * the current tweak by =CE=B1 (x) in GF(2^128) according to IEEE 1619-200= 7. + */ +void AES_xts_prep_next_tweak(unsigned char *tweak); + +/** + * AES_xts_encrypt: + * @in: input plaintext block of AES_BLOCK_SIZE bytes + * @out: output ciphertext block of AES_BLOCK_SIZE bytes + * @tweak: tweak value (16 bytes) + * @key: AES key + * + * Single block AES encrypt in XTS mode. + * The input is XORed with the tweak, encrypted, then XORed with + * the tweak again to produce the output. + * Note that the caller is responsible for managing the tweak value. + * Use AES_xts_prep_next_tweak() to advance the tweak for the next block. + */ +void AES_xts_encrypt(const unsigned char *in, unsigned char *out, + const unsigned char *tweak, const AES_KEY *key); + +/** + * AES_xts_decrypt: + * @in: input ciphertext block of AES_BLOCK_SIZE bytes + * @out: output plaintext block of AES_BLOCK_SIZE bytes + * @tweak: tweak value (16 bytes) + * @key: AES key + * + * Single block AES decrypt in XTS mode. + * The input is XORed with the tweak, decrypted, then XORed with + * the tweak again to produce the output. + * Note that the caller is responsible for managing the tweak value. + * Use AES_xts_prep_next_tweak() to advance the tweak for the next block. + */ +void AES_xts_decrypt(const unsigned char *in, unsigned char *out, + const unsigned char *tweak, const AES_KEY *key); + +#endif --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021418; cv=none; d=zohomail.com; s=zohoarc; b=OveEAQy+mXjuO2hXDDPk36+Fz/2sW9ADKdxSHr3sSF68ibG1GFOlCN+vKMad3aGN3OrpOxjr0/8j3GsC6SQ7WHWX1MDd0SJxX4uB6+F+aIoPjEV1mq177Nxl3t4XsvkTD8NVuffA6V51VrY4WWAx0pqDifakxGDYHdW8FQgzBZ8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021418; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=IW0P9iE+/uLRC8QWi9bCuPE9No+6hX37znsPmC54NdM=; b=fmAD9Lpsbxy9cp5WtTNjuxtp0cq74E/j/HlGVPrDHvL2/QLRUNgYyT3yNGl+MDkIcpRVUtCdcM4iClvAt9kV4nlfSW/cpU280H2VoUbvlVKt17PJurqWE/peuLQbUxbHvlpXakn3xA04Z5irECz71bLD/knKlijpLws4ppy8fbo= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021418749304.46980667918183; Mon, 21 Sep 2026 13:10:18 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kK7-0005yC-RK; Mon, 21 Sep 2026 16:09:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJf-0005fs-Q3; Mon, 21 Sep 2026 16:08:46 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJc-0005LI-GT; Mon, 21 Sep 2026 16:08:42 -0400 Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8Crm1869526; Mon, 21 Sep 2026 20:08:39 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskgs2h21-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:38 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJUIMc1408451; Mon, 21 Sep 2026 20:08:37 GMT Received: from smtprelay05.dal12v.mail.ibm.com ([172.16.1.7]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt5qjpvkw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:37 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay05.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8akL24117966 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:36 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 76CDE58059; Mon, 21 Sep 2026 20:08:36 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0294A58043; Mon, 21 Sep 2026 20:08:36 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:35 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=IW0P9iE+/uLRC8QWi 9bCuPE9No+6hX37znsPmC54NdM=; b=ZL1LoQIz4YWdY5ipx2MqmLob8EowvwJPD 14wIRKGmtQpy2lvaEEi+32EzH4sJPoFHMYheFzQ+oU7g+rbidT/5T3m6AxR1z5U7 AnieMM1/h+/blLp7lDhP8kuZuewIxzcHsyTN7HL5O6UtrLvTOMWc7FrytQCWMbN3 v8zY831Ht7iSzx6kR6C+cAUCaj/IaI44KMGTEj8JwWwLmAlN54eZvU/KVNPPTw+c x1B0qqyctcRcAE7XawcwJ8G3/G1JqwjaH1+WxveCfbh86tKSL2PPIMEQTKP+29wr 1IFsONQP6p+e3NdqerM0km1jkJW9JeifdXHGiOl95WUEHnZmk0TmQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 08/33] target/s390x: Support AES ECB for cpacf km instruction Date: Mon, 21 Sep 2026 16:08:05 -0400 Message-ID: <20260921200830.1302919-9-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=V/XoQuni c=1 sm=1 tr=0 ts=6ab18ec6 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=5Vg_AgGwEONL64qEDWAA:9 X-Proofpoint-ORIG-GUID: x25HGH5w1GfVts03ZwOnY5b6XKqkRWhA X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX66o1oDMotB91 hXQX8qNUufvbvYjLlXGIyuE+ZqrJ+ELPMfcPumgxP7KB8JodKacdhOtD4I+L2Unlo7+pmeJQx6c OMedzMnAs/c6hqLTGkEi0UKJ51ZHgr2mjprk0Z/K9sJgf3ZrAOC0U+utEyUfU4A5ZLJXP0f+4fF QvOrup4hYYahwO0+ljNXfc8iEPPmTwmxghugYFpkGsRFleL3QeZGtDrp8954t+jH0sxcN362pvq kdxNk5wg/v1+dZY5olC1sbCW9E7D4TcmFKy8oGIgkGmm/GhjJsnTxDIHhy+DzZ6mGiXquhtAsS7 qfsEWAO7FEsbR5NgqZoGO1yBomPNvKloViywttfsCZ0vyFYdBkP25PVwN9e7W3jfA6F+RzwQzk5 X17zfV0iy0guoMmWYus2VrVlXmQbA9nJBUYJk+nhwf3Q9zop1cvz+Jld402rRyyC9fdRZUkFj83 z8A4WGNGbY/ljqwy1iw== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX1HP6LQM+Evjw xjZ0s3JEl3BAphWXMN6LWszHqSIJS7X7HhM7nGfT0sQiY8nVDXIVG2uI3JJSSoNfzJWHjr+kA6q nx85jeYQvUjlpOymVILkNUbVqcweKt0= X-Proofpoint-GUID: x25HGH5w1GfVts03ZwOnY5b6XKqkRWhA X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 malwarescore=0 clxscore=1015 phishscore=0 bulkscore=0 adultscore=0 lowpriorityscore=0 impostorscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021420804158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Support the subfunctions CPACF_KM_AES_128, CPACF_KM_AES_192 and CPACF_KM_AES_256 for the cpacf km instruction. Signed-off-by: Harald Freudenberger Tested-by: Holger Dengler Reviewed-by: Finn Callies Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-9-freude@linu= x.ibm.com [farman@linux.ibm.com: Resolve merge conflict in gen-features.c] Signed-off-by: Eric Farman --- target/s390x/gen-features.c | 3 + target/s390x/tcg/cpacf.h | 6 ++ target/s390x/tcg/cpacf_aes.c | 137 +++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 24 ++++++ target/s390x/tcg/meson.build | 1 + 5 files changed, 171 insertions(+) create mode 100644 target/s390x/tcg/cpacf_aes.c diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index e1d924d04c..d6d4c45434 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -929,6 +929,9 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_CERT_STORE, S390_FEAT_SIPL, S390_FEAT_SCLAF, + S390_FEAT_KM_AES_128, + S390_FEAT_KM_AES_192, + S390_FEAT_KM_AES_256, }; =20 /****** END FEATURE DEFS ******/ diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h index 67b8368e4d..49630bab5e 100644 --- a/target/s390x/tcg/cpacf.h +++ b/target/s390x/tcg/cpacf.h @@ -18,4 +18,10 @@ int cpacf_sha512(CPUS390XState *env, const int mmu_idx, = uintptr_t ra, uint64_t param_addr, uint64_t *message_reg, uint64_t *len= _reg, uint32_t type); =20 +/* from cpacf_aes.c */ +int cpacf_aes_ecb(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint32_t type, uint8_t fc, uint8_t mod); + #endif /* S390X_CPACF_H */ diff --git a/target/s390x/tcg/cpacf_aes.c b/target/s390x/tcg/cpacf_aes.c new file mode 100644 index 0000000000..d87da18c19 --- /dev/null +++ b/target/s390x/tcg/cpacf_aes.c @@ -0,0 +1,137 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * s390 cpacf aes + * + * Authors: + * Harald Freudenberger + */ + +#include "qemu/osdep.h" +#include "s390x-internal.h" +#include "tcg_s390x.h" +#include "accel/tcg/cpu-ldst-common.h" +#include "accel/tcg/cpu-mmu-index.h" +#include "crypto/aes.h" +#include "crypto/aes-helpers.h" +#include "target/s390x/tcg/cpacf-arch.h" +#include "target/s390x/tcg/cpacf.h" +#include "target/s390x/tcg/crypto_helper.h" + +/* + * read exactly one AES block from guest memory into a local buffer + */ +static inline void aes_read_block(CPUS390XState *env, const int mmu_idx, + const uintptr_t ra, uint64_t guest_addr, + uint8_t *buf) +{ + read_guest_wrap_u8(env, mmu_idx, ra, guest_addr, buf, AES_BLOCK_SIZE); +} + +/* + * write exactly one AES block from local buffer to guest memory + */ +static void aes_write_block(CPUS390XState *env, const int mmu_idx, + const uintptr_t ra, uint64_t guest_addr, + uint8_t *buf) +{ + write_guest_wrap_u8(env, mmu_idx, ra, guest_addr, buf, AES_BLOCK_SIZE); +} + +/* + * Helper function returning the bitsize of the address mode. + * Within this file only 64 bit and 32 bit are supported and + * thus this function returns either 64 or 32 or 0. + */ +static int get_address_bitsize(CPUS390XState *env) +{ + if (env->psw.mask & PSW_MASK_64) { + return 64; + } else if (env->psw.mask & PSW_MASK_32) { + return 32; + } else { + /* unknown or unsupported here */ + return 0; + } +} + +int cpacf_aes_ecb(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint32_t type, uint8_t fc, uint8_t mod) +{ + enum { MAX_BLOCKS_PER_RUN =3D 8192 / AES_BLOCK_SIZE }; + uint8_t in[AES_BLOCK_SIZE], out[AES_BLOCK_SIZE]; + uint64_t len =3D *src_len_reg, done =3D 0; + int i, keysize, addr_reg_size; + uint8_t key[32]; + AES_KEY exkey; + + g_assert(type =3D=3D S390_FEAT_TYPE_KM); + switch (fc) { + case CPACF_KM_AES_128: + keysize =3D 16; + break; + case CPACF_KM_AES_192: + keysize =3D 24; + break; + case CPACF_KM_AES_256: + keysize =3D 32; + break; + default: + g_assert_not_reached(); + } + + /* check addressing mode, raise exception if not supported here */ + addr_reg_size =3D get_address_bitsize(env); + switch (addr_reg_size) { + case 64: + break; + case 32: + len =3D (uint32_t)len; + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* early bail out if length is zero */ + if (!len) { + return 0; + } + + /* length has to be properly aligned. */ + if (!QEMU_IS_ALIGNED(len, AES_BLOCK_SIZE)) { + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* fetch key from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, param_addr, key, keysize); + + /* expand key */ + if (mod) { + AES_set_decrypt_key(key, keysize * 8, &exkey); + } else { + AES_set_encrypt_key(key, keysize * 8, &exkey); + } + + /* process up to MAX_BLOCKS_PER_RUN aes blocks */ + for (i =3D 0; i < MAX_BLOCKS_PER_RUN && len >=3D AES_BLOCK_SIZE; i++) { + aes_read_block(env, mmu_idx, ra, *src_ptr_reg + done, in); + if (mod) { + AES_decrypt(in, out, &exkey); + } else { + AES_encrypt(in, out, &exkey); + } + aes_write_block(env, mmu_idx, ra, *dst_ptr_reg + done, out); + len -=3D AES_BLOCK_SIZE; + done +=3D AES_BLOCK_SIZE; + } + + *src_ptr_reg =3D deposit64(*src_ptr_reg, 0, addr_reg_size, + *src_ptr_reg + done); + *dst_ptr_reg =3D deposit64(*dst_ptr_reg, 0, addr_reg_size, + *dst_ptr_reg + done); + *src_len_reg -=3D done; + + return !len ? 0 : 3; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index 27decdda63..534498173c 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -98,6 +98,27 @@ static int cpacf_klmd(CPUS390XState *env, const int mmu_= idx, const uintptr_t ra, return rc; } =20 +static int cpacf_km(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint32_t r1, uint32_t r2, uint32_t r3, + uint8_t fc, uint8_t mod) +{ + int rc =3D 0; + + switch (fc) { + case CPACF_KM_AES_128: + case CPACF_KM_AES_192: + case CPACF_KM_AES_256: + rc =3D cpacf_aes_ecb(env, mmu_idx, ra, env->regs[1], + &env->regs[r1], &env->regs[r2], &env->regs[r2 += 1], + S390_FEAT_TYPE_KM, fc, mod); + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + return rc; +} + static int cpacf_ppno(CPUS390XState *env, const int mmu_idx, uintptr_t ra, uint32_t r1, uint32_t r2, uint32_t r3, uint8_t fc) { @@ -166,6 +187,9 @@ uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, u= int32_t r2, uint32_t r3, case S390_FEAT_TYPE_KLMD: rc =3D cpacf_klmd(env, mmu_idx, ra, r1, r2, r3, fc); break; + case S390_FEAT_TYPE_KM: + rc =3D cpacf_km(env, mmu_idx, ra, r1, r2, r3, fc, mod); + break; case S390_FEAT_TYPE_PPNO: rc =3D cpacf_ppno(env, mmu_idx, ra, r1, r2, r3, fc); break; diff --git a/target/s390x/tcg/meson.build b/target/s390x/tcg/meson.build index 8ae8da9708..6f2e75764b 100644 --- a/target/s390x/tcg/meson.build +++ b/target/s390x/tcg/meson.build @@ -5,6 +5,7 @@ s390x_ss.add(when: 'CONFIG_TCG', if_true: files( )) s390x_common_ss.add(when: 'CONFIG_TCG', if_true: files( 'cc_helper.c', + 'cpacf_aes.c', 'cpacf_sha256.c', 'cpacf_sha512.c', 'crypto_helper.c', --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021395; cv=none; d=zohomail.com; s=zohoarc; b=lUrODOn8lylwzKXr1i65x4e16Zy5jmuTWFcoQ68XlmXsQA4fykbejhb4MwuflABQI2dfJPeo5PDZ2phNz3cDocKfMkuss3IaQ91TRgsDjivy6oKSkDo4Nnyz8IDOA5mzK7RgR/0zd0vz0x8IG1qY7sc9GwhD6j2ymmu38GD6YAw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021395; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=g2pbpwLqZt70jfALPr68fxPb9O5cVWi6/a8vH1B2q/w=; b=NC7kGdFwLZLhm8z8BwYQxtGPzfiZAkb+Nror6ayZVAI56n9glMuMk3Xl40f2AWq0e3fOO7py6wGlePvf/hSRnsSfGP73xjDk9qXidPLp3TRvcc9MIKrcYi9EvN09exkpYa1FZhRIAM8KdbFTN/pAk2Eour3MSHOin7hMnZ4gUn8= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021395889315.55180653639775; Mon, 21 Sep 2026 13:09:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kK2-0005u4-9G; Mon, 21 Sep 2026 16:09:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJf-0005fq-PJ; Mon, 21 Sep 2026 16:08:46 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJc-0005LJ-2y; Mon, 21 Sep 2026 16:08:41 -0400 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8aS2703761; Mon, 21 Sep 2026 20:08:39 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskgqa9dd-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:38 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJHgvm1451443; Mon, 21 Sep 2026 20:08:38 GMT Received: from smtprelay02.dal12v.mail.ibm.com ([172.16.1.4]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt67gpu4b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:38 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay02.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8bwZ26870332 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:37 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1576158059; Mon, 21 Sep 2026 20:08:37 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 924D758043; Mon, 21 Sep 2026 20:08:36 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:36 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=g2pbpwLqZt70jfALP r68fxPb9O5cVWi6/a8vH1B2q/w=; b=HwYEVNMdxaDUrr4MMgM10LSjvj5RkFfk3 ufW2I+qB7bay5faFqo44o2Xso5SUR3SG4hzmXaT1xRM/8UEq/d/YsLZqN5FWemYj dyOZR8ailYNBqk8Kxu1m7U6rJWPA9nI8v/N4QwF65VvzEFs5wcFaVahwIZUIad0E 1dZfKp26VLIfViueb3C6ibD8znk+ONcHONU0cREAtytKEa2KpC9fNHtmHVdgOfJI KNURIKNbXjd5ngS5exW9XXRKwmacDdYnovdPFdhZ+cVq8afWvohEgksHQLdegc7h T1nMqvEy16ZFNXdyj4gV9rKN92f+wft/ulipOxw/gwjgJmSvhRJxA== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 09/33] target/s390x: Support AES CBC for cpacf kmc instruction Date: Mon, 21 Sep 2026 16:08:06 -0400 Message-ID: <20260921200830.1302919-10-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=G+OJgNk5 c=1 sm=1 tr=0 ts=6ab18ec6 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=4s_zGP7M7QCs5o7xjogA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX/PuEXEBuR/3n SywCWnocoysVLrKqkRRokoRbc/q/F5wnYbrPawL0fDn6hcWzWIqTuztNksuS+e+kansFlr3k71j RGdexu4a4A+2ss8JUcwXpcYoOFpe+dz8+lrOP5fShr9KOjDqIpIyYIQKerUc4kohFkbPSwvCQYp z1fXxKpVoxfl77f22gmRxPjtdr6lb8TGloUIHydxKMLYzAhuWXtIYPkN9C1m3qQOPD2szhs7E2g 5Bk2IlbrJUck2NOwjX6svzeAKZNg+8PAPN3tuY9K8f3zzEOLQrN11xDWXQL7GAdb3aqY+Rn7ynC 1rwhT2XJySQWab/n+TSVIyVdafvXCFfP+4iCBeqyguDmIuTgRrzXIEbvpu6AClS7JA+QS25AQaY IOZ9W+9AGGrcIYa9nUT7cS5LKYAPxrYlIcNWEftATo6JmW+JLV0naEcYheYt/E6twIbiKMYs4Uc hp83Toob2ENmqRmksGA== X-Proofpoint-ORIG-GUID: hydWT2-Gyb2wE7xrNWM51h86K69X_GAR X-Proofpoint-GUID: hydWT2-Gyb2wE7xrNWM51h86K69X_GAR X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXy1ssby/vmvvY dYimC95QxSrx7aO3Vtwg+qTv8UOt34WY1/h0xD3e2o+kq1EvpKgENfsTeDVqJUQCBhsCp16E+gG T6Po3fhTflzy9HdBdNk250Ua6R9Fw9k= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 phishscore=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 priorityscore=1501 clxscore=1015 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021397139158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Support the subfunctions CPACF_KMC_AES_128, CPACF_KMC_AES_192 and CPACF_KMC_AES_256 for the cpacf kmc instruction. Signed-off-by: Harald Freudenberger Tested-by: Holger Dengler Reviewed-by: Finn Callies Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-10-freude@lin= ux.ibm.com Signed-off-by: Eric Farman --- target/s390x/gen-features.c | 3 ++ target/s390x/tcg/cpacf.h | 4 ++ target/s390x/tcg/cpacf_aes.c | 91 ++++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 24 +++++++++ 4 files changed, 122 insertions(+) diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index d6d4c45434..1dadbcd34c 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -932,6 +932,9 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_KM_AES_128, S390_FEAT_KM_AES_192, S390_FEAT_KM_AES_256, + S390_FEAT_KMC_AES_128, + S390_FEAT_KMC_AES_192, + S390_FEAT_KMC_AES_256, }; =20 /****** END FEATURE DEFS ******/ diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h index 49630bab5e..7dde122879 100644 --- a/target/s390x/tcg/cpacf.h +++ b/target/s390x/tcg/cpacf.h @@ -23,5 +23,9 @@ int cpacf_aes_ecb(CPUS390XState *env, const int mmu_idx, = uintptr_t ra, uint64_t param_addr, uint64_t *dst_ptr_reg, uint64_t *src_ptr_reg, uint64_t *src_len_reg, uint32_t type, uint8_t fc, uint8_t mod); +int cpacf_aes_cbc(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint32_t type, uint8_t fc, uint8_t mod); =20 #endif /* S390X_CPACF_H */ diff --git a/target/s390x/tcg/cpacf_aes.c b/target/s390x/tcg/cpacf_aes.c index d87da18c19..c937514e9b 100644 --- a/target/s390x/tcg/cpacf_aes.c +++ b/target/s390x/tcg/cpacf_aes.c @@ -135,3 +135,94 @@ int cpacf_aes_ecb(CPUS390XState *env, const int mmu_id= x, uintptr_t ra, =20 return !len ? 0 : 3; } + +int cpacf_aes_cbc(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint32_t type, uint8_t fc, uint8_t mod) +{ + enum { MAX_BLOCKS_PER_RUN =3D 8192 / AES_BLOCK_SIZE }; + uint8_t in[AES_BLOCK_SIZE], out[AES_BLOCK_SIZE]; + uint64_t len =3D *src_len_reg, done =3D 0; + uint8_t key[32], iv[AES_BLOCK_SIZE]; + int i, keysize, addr_reg_size; + AES_KEY exkey; + + g_assert(type =3D=3D S390_FEAT_TYPE_KMC); + + switch (fc) { + case CPACF_KMC_AES_128: + keysize =3D 16; + break; + case CPACF_KMC_AES_192: + keysize =3D 24; + break; + case CPACF_KMC_AES_256: + keysize =3D 32; + break; + default: + g_assert_not_reached(); + } + + /* check addressing mode, raise exception if not supported here */ + addr_reg_size =3D get_address_bitsize(env); + switch (addr_reg_size) { + case 64: + break; + case 32: + len =3D (uint32_t)len; + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* early bail out if length is zero */ + if (!len) { + return 0; + } + + /* length has to be properly aligned. */ + if (!QEMU_IS_ALIGNED(len, AES_BLOCK_SIZE)) { + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* fetch iv from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, param_addr, iv, AES_BLOCK_SIZE); + + /* fetch key from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + AES_BLOCK_SIZE, key, keysize); + + /* expand key */ + if (mod) { + AES_set_decrypt_key(key, keysize * 8, &exkey); + } else { + AES_set_encrypt_key(key, keysize * 8, &exkey); + } + + /* process up to MAX_BLOCKS_PER_RUN aes blocks */ + for (i =3D 0; i < MAX_BLOCKS_PER_RUN && len >=3D AES_BLOCK_SIZE; i++) { + aes_read_block(env, mmu_idx, ra, *src_ptr_reg + done, in); + if (mod) { + /* decrypt in =3D> out */ + AES_cbc_decrypt(in, out, iv, &exkey); + } else { + /* encrypt in =3D> out */ + AES_cbc_encrypt(in, out, iv, &exkey); + } + aes_write_block(env, mmu_idx, ra, *dst_ptr_reg + done, out); + len -=3D AES_BLOCK_SIZE; + done +=3D AES_BLOCK_SIZE; + } + + /* update iv in param block */ + write_guest_wrap_u8(env, mmu_idx, ra, param_addr, iv, AES_BLOCK_SIZE); + + *src_ptr_reg =3D deposit64(*src_ptr_reg, 0, addr_reg_size, + *src_ptr_reg + done); + *dst_ptr_reg =3D deposit64(*dst_ptr_reg, 0, addr_reg_size, + *dst_ptr_reg + done); + *src_len_reg -=3D done; + + return !len ? 0 : 3; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index 534498173c..7368c25e5d 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -119,6 +119,27 @@ static int cpacf_km(CPUS390XState *env, const int mmu_= idx, uintptr_t ra, return rc; } =20 +static int cpacf_kmc(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint32_t r1, uint32_t r2, uint32_t r3, + uint8_t fc, uint8_t mod) +{ + int rc =3D 0; + + switch (fc) { + case CPACF_KMC_AES_128: + case CPACF_KMC_AES_192: + case CPACF_KMC_AES_256: + rc =3D cpacf_aes_cbc(env, mmu_idx, ra, env->regs[1], + &env->regs[r1], &env->regs[r2], &env->regs[r2 += 1], + S390_FEAT_TYPE_KMC, fc, mod); + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + return rc; +} + static int cpacf_ppno(CPUS390XState *env, const int mmu_idx, uintptr_t ra, uint32_t r1, uint32_t r2, uint32_t r3, uint8_t fc) { @@ -190,6 +211,9 @@ uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, u= int32_t r2, uint32_t r3, case S390_FEAT_TYPE_KM: rc =3D cpacf_km(env, mmu_idx, ra, r1, r2, r3, fc, mod); break; + case S390_FEAT_TYPE_KMC: + rc =3D cpacf_kmc(env, mmu_idx, ra, r1, r2, r3, fc, mod); + break; case S390_FEAT_TYPE_PPNO: rc =3D cpacf_ppno(env, mmu_idx, ra, r1, r2, r3, fc); break; --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021479; cv=none; d=zohomail.com; s=zohoarc; b=ZPF/vZGmNu4CuNLTFZCtJrqgGglNqF+JTqfeWHOLsQhvjLJYfMINC5FWGzenG6MZR4aUZLFwE3rE9ADn2blvD5XxZIypwQfEBnefd8kc8r3VorZHRZNcJHJigWdwd+w5BJwPtnv2AowvhwS7yobp/S7C1MXI5g3FSPnkTbV+R/s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021479; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=c9bmlMvjLHhavxpV3uNa4HvfOwW0vqBHYceoMXd57Fs=; b=PgAKkwi14m+RbpWDSVC2dgwhlogr6PG6yjG+prW826o6rLYo6q0HbbPlrzfgHQp3ZazK8QMOxuU3lw/bGbCXxQh0+ZNZwN/fjiINmR+BhdSQvrpQAg0Lc58oarSHn/sG3WYFUFSZFbnzfFqwX5v6zSPcoeq+HK8olub8JS8XGjg= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 179002147922198.97419996406825; Mon, 21 Sep 2026 13:11:19 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kJr-0005l9-WE; Mon, 21 Sep 2026 16:08:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJf-0005fr-Ph; Mon, 21 Sep 2026 16:08:46 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJc-0005LX-R1; Mon, 21 Sep 2026 16:08:42 -0400 Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8HwS1902958; Mon, 21 Sep 2026 20:08:39 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskdv2bdh-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:39 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJPxfN1408943; Mon, 21 Sep 2026 20:08:38 GMT Received: from smtprelay02.dal12v.mail.ibm.com ([172.16.1.4]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt5qjpvm1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:38 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay02.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8b6a15336080 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:37 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A90D158043; Mon, 21 Sep 2026 20:08:37 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 304645805D; Mon, 21 Sep 2026 20:08:37 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:37 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=c9bmlMvjLHhavxpV3 uNa4HvfOwW0vqBHYceoMXd57Fs=; b=NOYhQWbZGpW8mfp+HpZBievyS+qy7Qk6q g/aquVukdrqJQGogiwOzKnKfym/5lMjN+x5tOp9qHfyLNo5Aj48pp8u45vtXqzvt s4YabZ0bQBmVhTOhza50p6bTH046i9Icmz2I6HO5QBG9VL7FA19D9IhovKDNoTdB X8fLE2z4nDsKqnq/gVfii8B8O6P2FGB3vH1ukxLqkgNfsmifwsGaoDLfjL6i0J9u YlAnC51ZUwUUeVAbC9f9SGHTHF8Ko16SvJ53D/yevycdVcgjRTZB22rwlpiFqSgz LmW8vsNqUDF26HbEFEvkA6pCkv58mTgJWrDG+xC/chMv0Sz4/TA6A== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 10/33] target/s390x: Support AES CTR for cpacf kmctr instruction Date: Mon, 21 Sep 2026 16:08:07 -0400 Message-ID: <20260921200830.1302919-11-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: pv-IeielCMuaSwjkgBeVlNCoMmihQs-i X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX5Ah/x6d+b1hI jhiPtJd8PB518Fa9ZHmHF7/ybwrrHg0fD9Q2qoJd90Mdmm+bOyQFa1AF0uXPire5ixLZ3/mvipW jncQr8/Yp3RXYCdgdv5Dl/KHKurNn74= X-Authority-Analysis: v=2.4 cv=FLiOVOos c=1 sm=1 tr=0 ts=6ab18ec7 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=LQnWXxm1RwZjr7XDrSkA:9 X-Proofpoint-GUID: pv-IeielCMuaSwjkgBeVlNCoMmihQs-i X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX36T56HgqiZlm YW5eWqpJlE8cR+ecHIyHPcdM7s/zLOal5y4GQx9dT1pInV9WfVg6KYPPlAzsgZhGjcJ5gLcO4q4 T8FI1aLmbxxw9orqeE63hIIjESkCldmS05ocJqnBbbbhYSV0fubg6FvONsxME5gFjgn/k/v7P1N E8WTlygxfMVFgnphDi1NrZio36eeQusEmsnry0CuJ6FT9/C172XFtZ7Cs7peFk2hdxbjG3YGZVv 6rbhKbEJmWDLnR2F7A8gk2Bckh6yiPrvRuTHk/9oJLD/Acr5nW1KubNWBl9UNLNrl/pbfsXrc5u +nXxA6FkhLsBFYfZTbnO76DYU5xgrwj9otaW9GY6xvKh99BXuxricSwawwwbVcdNXV47g9+ojt3 4UzP+q9zdTObcRrlb1w/27EFprwTf7h6Z37GaMQh5CdILH1CQmd6iKPBd14o+KKF3sVymikuXMb kX/Lv7SL0jzWq+HyK3g== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 phishscore=0 spamscore=0 clxscore=1015 suspectscore=0 bulkscore=0 lowpriorityscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021481176158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Support the subfunctions CPACF_KMCTR_AES_128, CPACF_KMCTR_AES_192 and CPACF_KMCTR_AES_256 for the cpacf kmctr instruction. Signed-off-by: Harald Freudenberger Reviewed-by: Finn Callies Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-11-freude@lin= ux.ibm.com Signed-off-by: Eric Farman --- target/s390x/gen-features.c | 3 ++ target/s390x/tcg/cpacf.h | 5 ++ target/s390x/tcg/cpacf_aes.c | 82 ++++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 24 ++++++++++ 4 files changed, 114 insertions(+) diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index 1dadbcd34c..d2452b51d9 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -935,6 +935,9 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_KMC_AES_128, S390_FEAT_KMC_AES_192, S390_FEAT_KMC_AES_256, + S390_FEAT_KMCTR_AES_128, + S390_FEAT_KMCTR_AES_192, + S390_FEAT_KMCTR_AES_256, }; =20 /****** END FEATURE DEFS ******/ diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h index 7dde122879..a78ddc2821 100644 --- a/target/s390x/tcg/cpacf.h +++ b/target/s390x/tcg/cpacf.h @@ -27,5 +27,10 @@ int cpacf_aes_cbc(CPUS390XState *env, const int mmu_idx,= uintptr_t ra, uint64_t param_addr, uint64_t *dst_ptr_reg, uint64_t *src_ptr_reg, uint64_t *src_len_reg, uint32_t type, uint8_t fc, uint8_t mod); +int cpacf_aes_ctr(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint64_t *ctr_ptr_reg, uint32_t type, + uint8_t fc, uint8_t mod); =20 #endif /* S390X_CPACF_H */ diff --git a/target/s390x/tcg/cpacf_aes.c b/target/s390x/tcg/cpacf_aes.c index c937514e9b..474516bb5f 100644 --- a/target/s390x/tcg/cpacf_aes.c +++ b/target/s390x/tcg/cpacf_aes.c @@ -226,3 +226,85 @@ int cpacf_aes_cbc(CPUS390XState *env, const int mmu_id= x, uintptr_t ra, =20 return !len ? 0 : 3; } + +int cpacf_aes_ctr(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint64_t *ctr_ptr_reg, uint32_t type, + uint8_t fc, uint8_t mod) +{ + enum { MAX_BLOCKS_PER_RUN =3D 8192 / AES_BLOCK_SIZE }; + uint8_t in[AES_BLOCK_SIZE], out[AES_BLOCK_SIZE]; + uint64_t len =3D *src_len_reg, done =3D 0; + uint8_t ctr[AES_BLOCK_SIZE], key[32]; + int i, keysize, addr_reg_size; + AES_KEY exkey; + + g_assert(type =3D=3D S390_FEAT_TYPE_KMCTR); + + switch (fc) { + case CPACF_KMCTR_AES_128: + keysize =3D 16; + break; + case CPACF_KMCTR_AES_192: + keysize =3D 24; + break; + case CPACF_KMCTR_AES_256: + keysize =3D 32; + break; + default: + g_assert_not_reached(); + } + + /* check addressing mode, raise exception if not supported here */ + addr_reg_size =3D get_address_bitsize(env); + switch (addr_reg_size) { + case 64: + break; + case 32: + len =3D (uint32_t)len; + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* early bail out if length is zero */ + if (!len) { + return 0; + } + + /* length has to be properly aligned. */ + if (!QEMU_IS_ALIGNED(len, AES_BLOCK_SIZE)) { + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* fetch key from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, param_addr, key, keysize); + + /* expand key */ + AES_set_encrypt_key(key, keysize * 8, &exkey); + + /* process up to MAX_BLOCKS_PER_RUN aes blocks */ + for (i =3D 0; i < MAX_BLOCKS_PER_RUN && len >=3D AES_BLOCK_SIZE; i++) { + /* read in nonce/ctr =3D> ctr */ + aes_read_block(env, mmu_idx, ra, *ctr_ptr_reg + done, ctr); + /* read in one block of input data =3D> in */ + aes_read_block(env, mmu_idx, ra, *src_ptr_reg + done, in); + /* encrypt ctr and xor with in =3D> out */ + AES_ctr_encrypt(in, out, ctr, &exkey); + /* write out the processed block */ + aes_write_block(env, mmu_idx, ra, *dst_ptr_reg + done, out); + len -=3D AES_BLOCK_SIZE; + done +=3D AES_BLOCK_SIZE; + } + + *src_ptr_reg =3D deposit64(*src_ptr_reg, 0, addr_reg_size, + *src_ptr_reg + done); + *dst_ptr_reg =3D deposit64(*dst_ptr_reg, 0, addr_reg_size, + *dst_ptr_reg + done); + *ctr_ptr_reg =3D deposit64(*ctr_ptr_reg, 0, addr_reg_size, + *ctr_ptr_reg + done); + *src_len_reg -=3D done; + + return !len ? 0 : 3; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index 7368c25e5d..3135974234 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -140,6 +140,27 @@ static int cpacf_kmc(CPUS390XState *env, const int mmu= _idx, uintptr_t ra, return rc; } =20 +static int cpacf_kmctr(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint32_t r1, uint32_t r2, uint32_t r3, + uint8_t fc, uint8_t mod) +{ + int rc =3D 0; + + switch (fc) { + case CPACF_KMCTR_AES_128: + case CPACF_KMCTR_AES_192: + case CPACF_KMCTR_AES_256: + rc =3D cpacf_aes_ctr(env, mmu_idx, ra, env->regs[1], + &env->regs[r1], &env->regs[r2], &env->regs[r2 += 1], + &env->regs[r3], S390_FEAT_TYPE_KMCTR, fc, mod); + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + return rc; +} + static int cpacf_ppno(CPUS390XState *env, const int mmu_idx, uintptr_t ra, uint32_t r1, uint32_t r2, uint32_t r3, uint8_t fc) { @@ -214,6 +235,9 @@ uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, u= int32_t r2, uint32_t r3, case S390_FEAT_TYPE_KMC: rc =3D cpacf_kmc(env, mmu_idx, ra, r1, r2, r3, fc, mod); break; + case S390_FEAT_TYPE_KMCTR: + rc =3D cpacf_kmctr(env, mmu_idx, ra, r1, r2, r3, fc, mod); + break; case S390_FEAT_TYPE_PPNO: rc =3D cpacf_ppno(env, mmu_idx, ra, r1, r2, r3, fc); break; --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021566; cv=none; d=zohomail.com; s=zohoarc; b=Paz6dkTgx+17H3NFUfbSTnWhhJaAkvzmGxjv/MX1bqtvvxKWxIp6B8TLrXZ7skMxR7b7ldYzTcGmQ5W49stx0unfIT1QGXJsmBLe2E+QFufPagTrl/GwhBHu965YNVMLb39+dGkM/L7WUGelIqbZ9hMitmCbSiWtm+WWq0bFta0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021566; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=yNRJFpONMyNXEsoiE2AicLT5dEZMqB0gxDvqKoQw9PY=; b=InKknS826sUJ7bsj1xuwI9DcxluWBYirK35yVM0sxpHe+1MwUWPU+CdhBK9QSiu94WEKGA671Eu9QnJFG1dkmvXM6yD47WtJJEZUOO111Bv3Xf1w7V0XL1hsuEKb4de/i3r4CHL2DYeA3vySLPRbHTzK0BJRWJ6EYmVLv7rSoIU= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021566561557.3482234643493; Mon, 21 Sep 2026 13:12:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kK6-0005xM-Sq; Mon, 21 Sep 2026 16:09:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJf-0005fy-RO; Mon, 21 Sep 2026 16:08:46 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJd-0005Lj-4I; Mon, 21 Sep 2026 16:08:43 -0400 Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8VFm1903226; Mon, 21 Sep 2026 20:08:40 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskdv2bdk-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:39 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJEQDb167302; Mon, 21 Sep 2026 20:08:39 GMT Received: from smtprelay03.dal12v.mail.ibm.com ([172.16.1.5]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gu5bk9f0b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:39 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay03.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8c3F33554946 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:38 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 50C9058043; Mon, 21 Sep 2026 20:08:38 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CDC2758055; Mon, 21 Sep 2026 20:08:37 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:37 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=yNRJFpONMyNXEsoiE 2AicLT5dEZMqB0gxDvqKoQw9PY=; b=q6vwu22QCIW5RnXwr3KC+Jmpzbgyq3BFb AHD51MaEyT4BhVd1uF8dq16vqJ7C4jQrThn0PX/9AnDHwAxNE1eRrMWEoPkvMGwr fZ016bVItJ9Xnh38DGtJyoOhCw0fsYP2uhDrGtr336kag6sJXFLLqWvBda8P8AJo 05iB9/bHsJVR5g3xbS4f9U8130uSH7nTjsj+nxnmMThSQOmZUkQTwEieqE5zUOhy 9xNrQRoL7dKge/lAIutXkGHBQWmVfCGsRLZUs6mJJ3vl1BA7UYUCX33n3GUVD3lk VT9m5N7wNRYslzV6AscY8KepX8+PG9UZ6+N0a6CsI4zcLQPJtkCtw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 11/33] target/s390x: Minimal AES XTS support for cpacf pcc instruction Date: Mon, 21 Sep 2026 16:08:08 -0400 Message-ID: <20260921200830.1302919-12-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: oj4QH4stBayMxs-cdL4JFF0sueh0AdTa X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX9JdIEo9UaeNL APSpgeD1NimDR4jer9nG3jvAl6n7PlbhRkEr9azDf8o21j61TjgPJMg5ntFwqrvWJGHdbt0fsqS zcsbaFT/PapHOn3JYAD9kBuO96QS0rY= X-Authority-Analysis: v=2.4 cv=FLiOVOos c=1 sm=1 tr=0 ts=6ab18ec7 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=R34g-DyYV1Q20TOuEiIA:9 X-Proofpoint-GUID: oj4QH4stBayMxs-cdL4JFF0sueh0AdTa X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXzdJ3tXtwOoYU UxAO3wLKoEYNNdKMLRwFk3IJUwsgQEti3xknrnLy3R258MH4Hx5y70pG3cD6JssI6WBzKV5nXau 7eq6CWfrTsFSj5ETIQACjXtyGyzwcD5z+CNnYTJjEldZ6SRQVWblRFViSE5oIcXCU7cJmajNtqX kMPp1w5ysQZ8kLMYlvbJIuzBHTszQ23E8REWtQOkoLe4gOA5RDi7Kr9USvpaA94XWfYP9fVA3Zc EazKnGRj4ypfyyp/eYa5EzzOVR+uD6cG5zfheDkbK7faek2enYRXVz/DmiQZI0o7sXyBNhfSUiy yRc2YqcXevFJvrtTKNvkAu+qjOT6RfEHAsEl5+NaWspTE09DE6kJG1EmtKL1fXsfEs0hAbfQnk0 HtXw4sNgiyrMxCYnXFCezsF8/7NlIH3yh7WshdxoJMSsy8fWH37283L+Ee649k2szUFKQqwGqZ3 MgHYrKaReNT8DzdsIRA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 phishscore=0 spamscore=0 clxscore=1015 suspectscore=0 bulkscore=0 lowpriorityscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021567634158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Support CPACF pcc subfunctions PCC-Compute-XTS-Parameter-AES-128 and PCC-Compute-XTS-Parameter-AES-245 but only for the special case block sequential number is 0. However, this covers the s390 AES XTS implementation in the Linux kernel and Libica and thus also Opencryptoki clear key via Libica. Signed-off-by: Harald Freudenberger Tested-by: Holger Dengler Reviewed-by: Holger Dengler Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-12-freude@lin= ux.ibm.com Signed-off-by: Eric Farman --- target/s390x/gen-features.c | 2 ++ target/s390x/tcg/cpacf.h | 2 ++ target/s390x/tcg/cpacf_aes.c | 53 ++++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 20 ++++++++++++ 4 files changed, 77 insertions(+) diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index d2452b51d9..34e2be3af1 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -938,6 +938,8 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_KMCTR_AES_128, S390_FEAT_KMCTR_AES_192, S390_FEAT_KMCTR_AES_256, + S390_FEAT_PCC_XTS_AES_128, + S390_FEAT_PCC_XTS_AES_256, }; =20 /****** END FEATURE DEFS ******/ diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h index a78ddc2821..4a20aeacde 100644 --- a/target/s390x/tcg/cpacf.h +++ b/target/s390x/tcg/cpacf.h @@ -32,5 +32,7 @@ int cpacf_aes_ctr(CPUS390XState *env, const int mmu_idx, = uintptr_t ra, uint64_t *src_ptr_reg, uint64_t *src_len_reg, uint64_t *ctr_ptr_reg, uint32_t type, uint8_t fc, uint8_t mod); +int cpacf_aes_pcc(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint8_t fc); =20 #endif /* S390X_CPACF_H */ diff --git a/target/s390x/tcg/cpacf_aes.c b/target/s390x/tcg/cpacf_aes.c index 474516bb5f..6c7b959bd9 100644 --- a/target/s390x/tcg/cpacf_aes.c +++ b/target/s390x/tcg/cpacf_aes.c @@ -308,3 +308,56 @@ int cpacf_aes_ctr(CPUS390XState *env, const int mmu_id= x, uintptr_t ra, =20 return !len ? 0 : 3; } + +int cpacf_aes_pcc(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint8_t fc) +{ + uint8_t key[32], tweak[AES_BLOCK_SIZE], buf[AES_BLOCK_SIZE]; + int keysize, i; + AES_KEY exkey; + + switch (fc) { + case CPACF_PCC_XTS_AES_128: + keysize =3D 16; + break; + case CPACF_PCC_XTS_AES_256: + keysize =3D 32; + break; + default: + g_assert_not_reached(); + } + + /* fetch block sequence nr from param block into buf */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize + AES_BLOCK_SIZE, + buf, AES_BLOCK_SIZE); + + /* is the block sequence nr 0 ? */ + for (i =3D 0; i < AES_BLOCK_SIZE && !buf[i]; i++) { + ; + } + if (i < AES_BLOCK_SIZE) { + /* no, sorry handling of non zero block sequence is not implemente= d */ + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* fetch key from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, param_addr, key, keysize); + + /* fetch tweak from param block into tweak */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize, tweak, AES_BLOCK_SIZE); + + /* expand key */ + AES_set_encrypt_key(key, keysize * 8, &exkey); + + /* encrypt tweak */ + AES_encrypt(tweak, buf, &exkey); + + /* store encrypted tweak into xts parameter field of the param block */ + write_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize + 3 * AES_BLOCK_SIZE, + buf, AES_BLOCK_SIZE); + + return 0; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index 3135974234..c829d16f74 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -182,6 +182,23 @@ static int cpacf_ppno(CPUS390XState *env, const int mm= u_idx, uintptr_t ra, return rc; } =20 +static int cpacf_pcc(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint8_t fc) +{ + int rc =3D 0; + + switch (fc) { + case CPACF_PCC_XTS_AES_128: + case CPACF_PCC_XTS_AES_256: + rc =3D cpacf_aes_pcc(env, mmu_idx, ra, env->regs[1], fc); + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + return rc; +} + uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32_= t r3, uint32_t type) { @@ -238,6 +255,9 @@ uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, u= int32_t r2, uint32_t r3, case S390_FEAT_TYPE_KMCTR: rc =3D cpacf_kmctr(env, mmu_idx, ra, r1, r2, r3, fc, mod); break; + case S390_FEAT_TYPE_PCC: + rc =3D cpacf_pcc(env, mmu_idx, ra, fc); + break; case S390_FEAT_TYPE_PPNO: rc =3D cpacf_ppno(env, mmu_idx, ra, r1, r2, r3, fc); break; --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021509; cv=none; d=zohomail.com; s=zohoarc; b=jd9up7GtLATQrXue69vQpkz72puQQUOoAQBpkWH1OAya7pBnEHqQUQCceEPpCaT4NeLl9wcFAPfW3aosYh8BtWqjPTpe+G/ywlOTLiOUFvyq95Y0YHD2dEpsLidOoOY9vhHEEerWswTxrjb9Tb4x/zHJgS8kLksrfzZhL70e3mQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021509; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=EEX/bxYxFI2XKCXpO0w1r8Jjwy37WuLXjIRybz3RzzM=; b=mrQkRfyzfuoYyOExQZvWAyKHU4fAxGdywADpVF1thpxlWM5sGW3oIv2IyAIASAcEljBmOAYygQksayAjsFRtflqio54mvW76l2Ies5nPhOzO0ByGGalNnqwe86+STwqxPht92BNDlQtWyPuBlNLoRoUMj7OAIgLkixqcYCdVWYM= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021509251515.4419867922355; Mon, 21 Sep 2026 13:11:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kJv-0005nS-1t; Mon, 21 Sep 2026 16:08:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJl-0005hg-G4; Mon, 21 Sep 2026 16:08:50 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJf-0005MH-Px; Mon, 21 Sep 2026 16:08:46 -0400 Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8HWP4193480; Mon, 21 Sep 2026 20:08:41 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gske1jh6c-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:41 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJK5U81451389; Mon, 21 Sep 2026 20:08:40 GMT Received: from smtprelay03.dal12v.mail.ibm.com ([172.16.1.5]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt67gpu4j-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:40 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay03.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8c3l28508774 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:39 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E07AE58043; Mon, 21 Sep 2026 20:08:38 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6CC385805D; Mon, 21 Sep 2026 20:08:38 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:38 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=EEX/bxYxFI2XKCXpO 0w1r8Jjwy37WuLXjIRybz3RzzM=; b=o0uB91ZB5jhZVR3/uJ+olPz1STf1ZlIMJ BF3Z4FuSN/H1pXl6VvRRZs1UGo6LPbU3SgX7a4CL0tv5Pokt2P5NQvdkZo8YK5WX 2BWJGBOTdGefe7HVRGwDpkIeHUwK6HaEp6FnP4hJ5AQOuxZDtS/zKJAJS0B0ASAn gM6Nea4F5NftYHZT7bDb6ndubh+mTp8eQoSw6JfuubYLvjkyFQ5vu32SpRIdFhuw YWa6G+T45LMyr/8mXtmcMf1GodADcWnVSZT4mHYNKRacCtwDnSPET7QeecOUVZgJ IQ8aH2rfPyYb4fdZeJC4uiAUTFpLNiuQMUr8WBHCK4Y7nWk0sMniQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 12/33] target/s390x: Support AES XTS for cpacf km instruction Date: Mon, 21 Sep 2026 16:08:09 -0400 Message-ID: <20260921200830.1302919-13-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: fht72DiNAhSOOOlPucHu9zw8EtX_Orhz X-Authority-Analysis: v=2.4 cv=EOCTQFZC c=1 sm=1 tr=0 ts=6ab18ec9 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=NfUx3EYS-SKBlRlFgzgA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX8xtgyJyDLqJR 33AbwxPJlmrb+pGPvuB7rEeyK62C13KWeYbNxw47SaxZXyV7WtZvCV6IT+mOdwrnKKOjPuS7Hp2 UbydF00vPo3TicLUyPULTBApyU8feXg= X-Proofpoint-GUID: fht72DiNAhSOOOlPucHu9zw8EtX_Orhz X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX8JMEN3KnRtY1 6Ac/glAIS4q46z6Y+fDa6VpLfxhEN7Q/K1wDTJxDO0hn02aGB2s84oAhBZsrpolIaQsv8xk3jL7 EMlgkeAn8DBcOsEfFrJpY8JqUAfVsjjRQ8gf0n6LgvseP757EzUBL6qdjaZsOuST/fJHZag5eLS AAjdxBmDlKlfVpK/8MUUKXIIPA53cKIX800nX0IvXa9Yf10Wn6bdJaj+6QTMxGys+VLtOtJGYGH c+vlu2c5XE6aTeXpbTNa5/RLDFF/IrWVOJc4MPEPU/g6BPGbeyKpWo44ayRqglmdJYT+gop4ymb dVGbc33SIT8y+vYwW9M3Y5KzEuFmUk9KE0zR500VeD4059uF+8JZzAdsiaPzfW0wg/gxGIJdYw3 vC9g/5lPK30UYFFXiukc3LSj0mVe+i1srMEpxjGrzxX6wSgQZm5xV4Uu/Qy8yfRvoqpmb4YYzXa CkS8CxYSlfLRI4yTRGg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 phishscore=0 priorityscore=1501 clxscore=1015 spamscore=0 adultscore=0 impostorscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021511320158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Support the subfunctions XTS-AES-128 and XTS-AES-256 for the cpacf km instruction. Signed-off-by: Harald Freudenberger Tested-by: Holger Dengler Reviewed-by: Holger Dengler Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-13-freude@lin= ux.ibm.com Signed-off-by: Eric Farman --- target/s390x/gen-features.c | 2 + target/s390x/tcg/cpacf.h | 4 ++ target/s390x/tcg/cpacf_aes.c | 93 ++++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 6 +++ 4 files changed, 105 insertions(+) diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index 34e2be3af1..ad99f9ff85 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -932,6 +932,8 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_KM_AES_128, S390_FEAT_KM_AES_192, S390_FEAT_KM_AES_256, + S390_FEAT_KM_XTS_AES_128, + S390_FEAT_KM_XTS_AES_256, S390_FEAT_KMC_AES_128, S390_FEAT_KMC_AES_192, S390_FEAT_KMC_AES_256, diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h index 4a20aeacde..5013e19907 100644 --- a/target/s390x/tcg/cpacf.h +++ b/target/s390x/tcg/cpacf.h @@ -34,5 +34,9 @@ int cpacf_aes_ctr(CPUS390XState *env, const int mmu_idx, = uintptr_t ra, uint8_t fc, uint8_t mod); int cpacf_aes_pcc(CPUS390XState *env, const int mmu_idx, uintptr_t ra, uint64_t param_addr, uint8_t fc); +int cpacf_aes_xts(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint32_t type, uint8_t fc, uint8_t mod); =20 #endif /* S390X_CPACF_H */ diff --git a/target/s390x/tcg/cpacf_aes.c b/target/s390x/tcg/cpacf_aes.c index 6c7b959bd9..f705bd6677 100644 --- a/target/s390x/tcg/cpacf_aes.c +++ b/target/s390x/tcg/cpacf_aes.c @@ -361,3 +361,96 @@ int cpacf_aes_pcc(CPUS390XState *env, const int mmu_id= x, uintptr_t ra, =20 return 0; } + +int cpacf_aes_xts(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint32_t type, uint8_t fc, uint8_t mod) +{ + enum { MAX_BLOCKS_PER_RUN =3D 8192 / AES_BLOCK_SIZE }; + uint8_t in[AES_BLOCK_SIZE], out[AES_BLOCK_SIZE]; + uint64_t len =3D *src_len_reg, done =3D 0; + uint8_t key[32], tweak[AES_BLOCK_SIZE]; + int i, keysize, addr_reg_size; + AES_KEY exkey; + + g_assert(type =3D=3D S390_FEAT_TYPE_KM); + + switch (fc) { + case CPACF_KM_XTS_128: + keysize =3D 16; + break; + case CPACF_KM_XTS_256: + keysize =3D 32; + break; + default: + g_assert_not_reached(); + } + + /* check addressing mode, raise exception if not supported here */ + addr_reg_size =3D get_address_bitsize(env); + switch (addr_reg_size) { + case 64: + break; + case 32: + len =3D (uint32_t)len; + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* early bail out if length is zero */ + if (!len) { + return 0; + } + + /* length has to be properly aligned. */ + if (!QEMU_IS_ALIGNED(len, AES_BLOCK_SIZE)) { + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* fetch key from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, param_addr, key, keysize); + + /* expand key */ + if (mod) { + AES_set_decrypt_key(key, keysize * 8, &exkey); + } else { + AES_set_encrypt_key(key, keysize * 8, &exkey); + } + + /* fetch tweak from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize, tweak, AES_BLOCK_SIZE); + + /* process up to MAX_BLOCKS_PER_RUN aes blocks */ + for (i =3D 0; i < MAX_BLOCKS_PER_RUN && len >=3D AES_BLOCK_SIZE; i++) { + /* fetch one AES block into in */ + aes_read_block(env, mmu_idx, ra, *src_ptr_reg + done, in); + if (mod) { + /* decrypt in =3D> out */ + AES_xts_decrypt(in, out, tweak, &exkey); + } else { + /* encrypt in =3D> out */ + AES_xts_encrypt(in, out, tweak, &exkey); + } + /* prep tweak for next round */ + AES_xts_prep_next_tweak(tweak); + /* write out this processed block from out */ + aes_write_block(env, mmu_idx, ra, *dst_ptr_reg + done, out); + len -=3D AES_BLOCK_SIZE; + done +=3D AES_BLOCK_SIZE; + } + + /* update tweak in param block */ + write_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize, tweak, AES_BLOCK_SIZE); + + *src_ptr_reg =3D deposit64(*src_ptr_reg, 0, addr_reg_size, + *src_ptr_reg + done); + *dst_ptr_reg =3D deposit64(*dst_ptr_reg, 0, addr_reg_size, + *dst_ptr_reg + done); + *src_len_reg -=3D done; + + return !len ? 0 : 3; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index c829d16f74..2bd39f8978 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -112,6 +112,12 @@ static int cpacf_km(CPUS390XState *env, const int mmu_= idx, uintptr_t ra, &env->regs[r1], &env->regs[r2], &env->regs[r2 += 1], S390_FEAT_TYPE_KM, fc, mod); break; + case CPACF_KM_XTS_128: + case CPACF_KM_XTS_256: + rc =3D cpacf_aes_xts(env, mmu_idx, ra, env->regs[1], + &env->regs[r1], &env->regs[r2], &env->regs[r2 += 1], + S390_FEAT_TYPE_KM, fc, mod); + break; default: tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); } --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021397; cv=none; d=zohomail.com; s=zohoarc; b=mtMC2eyYmPneHEtaSVZ+p8hMnX5EX74XnQ2GHOXW3CGhHX+7BWXtUO/gqcL8gnhwK9x8LFtvdKFYA7ej/7PkbzjjO+MH/EVcxnA39ETEVZak0UDn9maOcluimzipMv1UfIxFatZ/qgkRd0hM8NWK7E2E0wGCxXs8su8YGfWlwbE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021397; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=KYIq3Mivz8CRluR2OvUILZ8ic5gWefhGGwYZT2bpY0k=; b=TMtpxqTgR7NV7yM1TAp0MNKbeP1KHUNVci5FUSYqJanQdVe4f0Qt/h+Knjis8E9L+f5pPW/63BFa6ufspDMcfMY7NspggdRQNCJJqhOLF7Fcp9UfuoPyx5JmPSB57FWabHGks2jaVl7tnHxrkBVlzAJBugHET9sLt9usa2rqMU8= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021397242580.2946592564946; Mon, 21 Sep 2026 13:09:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kJz-0005sZ-WB; Mon, 21 Sep 2026 16:09:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJl-0005hd-EM; Mon, 21 Sep 2026 16:08:50 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJf-0005MS-Rg; Mon, 21 Sep 2026 16:08:48 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8ZoW1860816; Mon, 21 Sep 2026 20:08:42 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskg2ah4h-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:41 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJMEY81451757; Mon, 21 Sep 2026 20:08:41 GMT Received: from smtprelay03.wdc07v.mail.ibm.com ([172.16.1.70]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt67gpu4r-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:41 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay03.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK7usE55640454 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:07:56 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7F0B758061; Mon, 21 Sep 2026 20:08:39 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 08DEC58055; Mon, 21 Sep 2026 20:08:39 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:38 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=KYIq3Mivz8CRluR2O vUILZ8ic5gWefhGGwYZT2bpY0k=; b=WlcJ75C8fc88mUGv7DjSCwuTJjdTGO0Xl ZM3QKt8HDsFL+4f+EvSxnJHJHcz5mxJPkSIih506pH1xzvTJyFS+CBeQ4B1f8Gnh +TIvUyCHKy0mn0QwEcN4YLz79JUX4dmySY6pGGOlkI3cbof2NgGw65KoU9oxYODG k5aL1hbnWMT+TNvAVw66+/uLhgeL34zRYPoKGWpIq2zWEu9+d6RhfHBcY4IFXYWh rQ+9F9rZv7SE41veTY69qjB+l5LVb5bFCnsqGhJRRM6n8Auid6UXKdVRU0dhPdfz oYBMFMZRQUE4eHY29p9xNC5KY1JYWHdSNtHcGoye09WesgSzVCjHw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 13/33] target/s390x: Base support for cpacf protected keys and pckmo Date: Mon, 21 Sep 2026 16:08:10 -0400 Message-ID: <20260921200830.1302919-14-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: D1ULYf6afc8dUGKGuEYRcipI3TTTza4i X-Authority-Analysis: v=2.4 cv=I43w19gg c=1 sm=1 tr=0 ts=6ab18eca cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=Ka7jyKarb0bbGO5OOBwA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX6iU+RAHw1Sxd H4P5ZKHk/5VTAuDBeifX3psg81svcuYmyJvat4d1FX67hittsjjDaY9+J96+FNbxW4Pn8mPYXTj +pC9wystWxnk+r/OUsgIyEVTsFfpc0niqAx1AhjluCCBtVqYRV1uSk4h+1DBpT2bq2vYNb25AUw 2CWrEF2qzkno7xaIV2GSZAApPg7fJ7MZZLjJNiZ4xvocRY5uYBcvC35NxPIHwI/MvRBUN5IldUh aiuVlB3NchP2yMWNvMe4xEIfAyneHPYx1TW+XDlh/sgZQ6X2J8Hk0PUombzr//b4RWnzmqpaxLV nE9/6ZSsK3CPbQg1/iZezkb7LLfGJMyfpBXwuUg4INnp7mdE00jz2dQxzwkkoSG73TzHauEF02J 161fxeL5IauDRAh6sht6wEu3YEJmp/oODphDiVy97EVWhEJK4ypDjYK4hf5VD9kPZoOy/uM26aD hTwAeCWQO0KB2A3ydfQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX/E5Hhs5f/8uK cioZmseBWiVGiZu3Mva77/Cgcm++20Jn1s45mQuqYnJWhmTPidWPHWnE0ODyGnuXCfRWxxBgc2N 0eg4AWZLyDBP4U2T6xhCv9gVXmQFn48= X-Proofpoint-GUID: D1ULYf6afc8dUGKGuEYRcipI3TTTza4i X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 phishscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021398784158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Add base support for cpacf protected key handling. Add support for the pckmo subfunctions PCKMO-Encrypt-AES-128-Key, PCKMO-Encrypt-AES-192-Key and PCKMO-Encrypt-AES-256-Key which deal with protected keys. These pckmo subfunctions derive a protected key from an AES clear key by encrypting it with an internal AES wrapping key. More details about protected keys can be found in the "z/Architecture Prinziples of Operation" document. The qemu version provided here is only a fake intended to make protected key available for developing and testing purpose: * The protected key is 'derived' from the clear key by xoring the fixed pattern 0xAAAA... onto the key value. * The AES Wrapping Key Verification Pattern is a fixed value of 32 bytes 0x0F0A0C0E0F0A0C0E... Add preprocessor defines for the xor pattern and wkvp used to construct ('encrypt') a protected key from a clear key value with this implementation. Also add some static functions to 'encrypt' from clear key to protected key and 'decrypt' back to cpacf_aes.c. The preprocessor defines shall be used later in testcases to construct and decode protected keys. Signed-off-by: Harald Freudenberger Tested-by: Holger Dengler Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-14-freude@lin= ux.ibm.com Signed-off-by: Eric Farman --- target/s390x/gen-features.c | 3 ++ target/s390x/tcg/cpacf-arch.h | 25 +++++++++++++ target/s390x/tcg/cpacf.h | 2 + target/s390x/tcg/cpacf_aes.c | 64 ++++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 21 +++++++++++ target/s390x/tcg/translate.c | 14 +++++-- 6 files changed, 126 insertions(+), 3 deletions(-) diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index ad99f9ff85..e00255af67 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -942,6 +942,9 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_KMCTR_AES_256, S390_FEAT_PCC_XTS_AES_128, S390_FEAT_PCC_XTS_AES_256, + S390_FEAT_PCKMO_AES_128, + S390_FEAT_PCKMO_AES_192, + S390_FEAT_PCKMO_AES_256, }; =20 /****** END FEATURE DEFS ******/ diff --git a/target/s390x/tcg/cpacf-arch.h b/target/s390x/tcg/cpacf-arch.h index f92e4b44e3..cd51169c45 100644 --- a/target/s390x/tcg/cpacf-arch.h +++ b/target/s390x/tcg/cpacf-arch.h @@ -223,4 +223,29 @@ #define CPACF_KDSA_PSIGN_ED25519 48 #define CPACF_KDSA_PSIGN_ED448 52 =20 +/* + * Support for protected key cpacf functions. Note that this is + * a fake implementation intended for debugging and development. + * Do not use for production load ! + */ + +/* + * Hard coded pattern xored with the AES clear key + * to 'produce' the protected key. + */ +#define PROTKEY_XOR_PATTERN { \ + 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, \ + 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, \ + 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, \ + 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA } + +/* + * Hard coded wkvp ("Wrapping Key Verification Pattern") + */ +#define PROTKEY_WKVP { \ + 0x0F, 0x0A, 0x0C, 0x0E, 0x0F, 0x0A, 0x0C, 0x0E, \ + 0x0F, 0x0A, 0x0C, 0x0E, 0x0F, 0x0A, 0x0C, 0x0E, \ + 0x0F, 0x0A, 0x0C, 0x0E, 0x0F, 0x0A, 0x0C, 0x0E, \ + 0x0F, 0x0A, 0x0C, 0x0E, 0x0F, 0x0A, 0x0C, 0x0E } + #endif /* S390X_CPACF_ARCH_H */ diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h index 5013e19907..1964de5b6d 100644 --- a/target/s390x/tcg/cpacf.h +++ b/target/s390x/tcg/cpacf.h @@ -38,5 +38,7 @@ int cpacf_aes_xts(CPUS390XState *env, const int mmu_idx, = uintptr_t ra, uint64_t param_addr, uint64_t *dst_ptr_reg, uint64_t *src_ptr_reg, uint64_t *src_len_reg, uint32_t type, uint8_t fc, uint8_t mod); +int cpacf_aes_pckmo(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint8_t fc); =20 #endif /* S390X_CPACF_H */ diff --git a/target/s390x/tcg/cpacf_aes.c b/target/s390x/tcg/cpacf_aes.c index f705bd6677..5a835016df 100644 --- a/target/s390x/tcg/cpacf_aes.c +++ b/target/s390x/tcg/cpacf_aes.c @@ -454,3 +454,67 @@ int cpacf_aes_xts(CPUS390XState *env, const int mmu_id= x, uintptr_t ra, =20 return !len ? 0 : 3; } + +/* + * Support for protected key cpacf functions. Note that this is + * a fake implementation intended for debugging and development. + * Do not use for production load ! + */ + +/* + * Hard coded pattern xored with the AES clear key + * to 'produce' the protected key. + */ +static const uint8_t protkey_xor_pattern[32] =3D PROTKEY_XOR_PATTERN; + +/* + * Hard coded wkvp ("Wrapping Key Verification Pattern") + */ +static const uint8_t protkey_wkvp[32] =3D PROTKEY_WKVP; + +/* + * 'encrypt' the clear key value into a protected key + * by xor-ing the protkey_xor_pattern onto it. + */ +static void encrypt_clrkey(uint8_t *key, int keysize) +{ + for (int i =3D 0; i < keysize; i++) { + key[i] ^=3D protkey_xor_pattern[i]; + } +} + +int cpacf_aes_pckmo(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint8_t fc) +{ + uint8_t key[32]; + int keysize; + + switch (fc) { + case CPACF_PCKMO_ENC_AES_128_KEY: + keysize =3D 16; + break; + case CPACF_PCKMO_ENC_AES_192_KEY: + keysize =3D 24; + break; + case CPACF_PCKMO_ENC_AES_256_KEY: + keysize =3D 32; + break; + default: + g_assert_not_reached(); + } + + /* fetch key from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, param_addr, key, keysize); + + /* 'derive' the protected key from the clear key */ + encrypt_clrkey(key, keysize); + + /* store the protected key into param block */ + write_guest_wrap_u8(env, mmu_idx, ra, param_addr, key, keysize); + /* followed by the fake wkvp */ + write_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize, + protkey_wkvp, sizeof(protkey_wkvp)); + + return 0; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index 2bd39f8978..191b30e0f8 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -205,6 +205,24 @@ static int cpacf_pcc(CPUS390XState *env, const int mmu= _idx, uintptr_t ra, return rc; } =20 +static int cpacf_pckmo(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint8_t fc) +{ + int rc =3D 0; + + switch (fc) { + case CPACF_PCKMO_ENC_AES_128_KEY: + case CPACF_PCKMO_ENC_AES_192_KEY: + case CPACF_PCKMO_ENC_AES_256_KEY: + rc =3D cpacf_aes_pckmo(env, mmu_idx, ra, env->regs[1], fc); + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + return rc; +} + uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32_= t r3, uint32_t type) { @@ -264,6 +282,9 @@ uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, u= int32_t r2, uint32_t r3, case S390_FEAT_TYPE_PCC: rc =3D cpacf_pcc(env, mmu_idx, ra, fc); break; + case S390_FEAT_TYPE_PCKMO: + rc =3D cpacf_pckmo(env, mmu_idx, ra, fc); + break; case S390_FEAT_TYPE_PPNO: rc =3D cpacf_ppno(env, mmu_idx, ra, r1, r2, r3, fc); break; diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c index 7e74e9742f..474d604ed1 100644 --- a/target/s390x/tcg/translate.c +++ b/target/s390x/tcg/translate.c @@ -2558,6 +2558,7 @@ static DisasJumpType op_msa(DisasContext *s, DisasOps= *o) int r2 =3D have_field(s, r2) ? get_field(s, r2) : 0; int r3 =3D have_field(s, r3) ? get_field(s, r3) : 0; TCGv_i32 t_r1, t_r2, t_r3, type; + bool update_cc =3D true; =20 switch (s->insn->data) { case S390_FEAT_TYPE_KMA: @@ -2590,8 +2591,10 @@ static DisasJumpType op_msa(DisasContext *s, DisasOp= s *o) gen_program_exception(s, PGM_SPECIFICATION); return DISAS_NORETURN; } - /* FALL THROUGH */ + break; case S390_FEAT_TYPE_PCKMO: + update_cc =3D false; + /* FALL THROUGH */ case S390_FEAT_TYPE_PCC: break; default: @@ -2602,8 +2605,13 @@ static DisasJumpType op_msa(DisasContext *s, DisasOp= s *o) t_r2 =3D tcg_constant_i32(r2); t_r3 =3D tcg_constant_i32(r3); type =3D tcg_constant_i32(s->insn->data); - gen_helper_msa(cc_op, tcg_env, t_r1, t_r2, t_r3, type); - set_cc_static(s); + if (update_cc) { + gen_helper_msa(cc_op, tcg_env, t_r1, t_r2, t_r3, type); + set_cc_static(s); + } else { + TCGv_i32 cc_dummy =3D tcg_temp_new_i32(); + gen_helper_msa(cc_dummy, tcg_env, t_r1, t_r2, t_r3, type); + } return DISAS_NEXT; } =20 --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021422; cv=none; d=zohomail.com; s=zohoarc; b=ZZnqeoa6HM95dvnFcndZMrFkjWvJX8/2V52VG0vtp0ot0wyRx8zMsXb49YC7H3EUCuqcVnG5GV0qGDsqGP2Rrlhz1lm3MyqVoc3DEQ10i1JIjEiOiQ3l+T3IpxqSUqmtzbq8O0xg0DDPsUNeGljcq0SxdQkuhN1r86parqYFEvA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021422; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=erPy9sskiasuWwhNylweyl0PNJ+BuHFsPqSWxBCg+lM=; b=Lcjrk4Wb3Abef0AbZXEJtnH0/gQYrEv5WaJLgC5gJ8W5x1wT0Mx/UxsIvs5UqLNJWoE8XcC9Df9ogSMN6W2GvtRN43Hd3+zzbtNqzP51C3YCNsow8g5naxup+dT5P3DezDfzO5+ZogcrQGv+6peUYsgA+5r5TA4jUOSTeyTP03c= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021422919343.1432863409392; Mon, 21 Sep 2026 13:10:22 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKB-00069T-Kc; Mon, 21 Sep 2026 16:09:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJl-0005hf-Ed; Mon, 21 Sep 2026 16:08:50 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJg-0005MV-0u; Mon, 21 Sep 2026 16:08:46 -0400 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF90pb704071; Mon, 21 Sep 2026 20:08:42 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskgqa9dp-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:42 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJHKnT1489428; Mon, 21 Sep 2026 20:08:42 GMT Received: from smtprelay04.wdc07v.mail.ibm.com ([172.16.1.71]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gt4qq71tu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:42 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay04.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8ej428246746 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:40 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1C4B158043; Mon, 21 Sep 2026 20:08:40 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9BAA35805E; Mon, 21 Sep 2026 20:08:39 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:39 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=erPy9sskiasuWwhNy lweyl0PNJ+BuHFsPqSWxBCg+lM=; b=ljrL+1bEXLx8G1V6ArqKzypS8zMpzGlJ4 ACkxxzfYTKY9tagJsNVBL7ZWAsnnueSM9HnjSc5K7oTwqb5vwAexVaMMNFJD2SJ0 q1zrxgZ3vOcKkrvEznhi1piARS9mks60y9aOt5Tw3n/aIZRX2DmyYHNBoC3Oy0aY eDbN0d3LTp1otBLe69CsZZOP/7tG9DuTDyZBXKX7Y3EsL32/JXuEOzZieG1uGaFV SJJsAxAyNkKeS9JLgB/PtaYvBr3iaoWlGL4PH2KwoDZXmX5jnVzz9Q9aHiHmqxKW UGY71t3ez3MODqR+/E3edJEQxnZPOXMHC/sQ/doDyvy3hm4XjYnlQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 14/33] target/s390x: Support protected key AES ECB for cpacf km instruction Date: Mon, 21 Sep 2026 16:08:11 -0400 Message-ID: <20260921200830.1302919-15-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=G+OJgNk5 c=1 sm=1 tr=0 ts=6ab18eca cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=H4cIW5jPVsLKBRIgpP4A:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXwi2Xifp9LPqf QTUxJAy0PcHncSgRfolDXiYv8GAJ9Rah6XIv3CR87/+r9FG6aI7pzD35uG/CxWdJwnpdPP5RnW5 IPMtbPw7K8F7Xpp/DOF4h9J/ymUU5D5Xbmo7RSRq6VCmGEFUJNh+/sis0UA3WwK+NI+pAXxd7Lf UELPN1fwM7wMwp1VSUWaTOqgk+NdtA2XW7MbZbyWZqXmDYTFPP3lA32oCxAADR1CAYsptdDNGn5 9qxCHxRJ95bTINgGGO6TI7dCew5Ddu8Ma0eGAMDD9jAQu2S6VXqInvsdh8YYiVyFm+IJL/pKNiy 0cwHSS9omhN3ZgdAMkXO8z0bPQE+3BsPI7wmUGVS1lwODsUON4Ew5gYeQniC5wW1/NqW8jHQeYI Cr7VQE+QKGUfJ6NmxKVzbj38uvlBs8hvOivZ9qWnxqrgOYgaY2l2Qw/CssZcGg9iERAOWc2CViq kUoJZKi+aMtmnWkvZrA== X-Proofpoint-ORIG-GUID: GdKLvdqjvC_yY7W4DKjY2FAXgEcgsplU X-Proofpoint-GUID: GdKLvdqjvC_yY7W4DKjY2FAXgEcgsplU X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX3DW2v6lC4ke9 MEvno8hSddn0luGRI8Ypcnl3rthvWtqq5o4Pllh43J2k0yPT5iXzk4ck1mcmPkTVX20IuMrYDvS 0aMg5Y7UiGAqHk6dIB1YwtMl9Ayy0n8= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 phishscore=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 priorityscore=1501 clxscore=1015 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021424889158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Support the subfunctions CPACF_KM_PAES_128, CPACF_KM_PAES_192 and CPACF_KM_PAES_256 for the cpacf km instruction. Signed-off-by: Harald Freudenberger Tested-by: Holger Dengler Reviewed-by: Finn Callies Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-15-freude@lin= ux.ibm.com Signed-off-by: Eric Farman --- target/s390x/gen-features.c | 3 + target/s390x/tcg/cpacf.h | 4 ++ target/s390x/tcg/cpacf_aes.c | 103 +++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 7 +++ 4 files changed, 117 insertions(+) diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index e00255af67..4e3d851873 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -932,6 +932,9 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_KM_AES_128, S390_FEAT_KM_AES_192, S390_FEAT_KM_AES_256, + S390_FEAT_KM_EAES_128, + S390_FEAT_KM_EAES_192, + S390_FEAT_KM_EAES_256, S390_FEAT_KM_XTS_AES_128, S390_FEAT_KM_XTS_AES_256, S390_FEAT_KMC_AES_128, diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h index 1964de5b6d..9c654c3353 100644 --- a/target/s390x/tcg/cpacf.h +++ b/target/s390x/tcg/cpacf.h @@ -40,5 +40,9 @@ int cpacf_aes_xts(CPUS390XState *env, const int mmu_idx, = uintptr_t ra, uint32_t type, uint8_t fc, uint8_t mod); int cpacf_aes_pckmo(CPUS390XState *env, const int mmu_idx, uintptr_t ra, uint64_t param_addr, uint8_t fc); +int cpacf_paes_ecb(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint32_t type, uint8_t fc, uint8_t mod); =20 #endif /* S390X_CPACF_H */ diff --git a/target/s390x/tcg/cpacf_aes.c b/target/s390x/tcg/cpacf_aes.c index 5a835016df..cbe7547c0b 100644 --- a/target/s390x/tcg/cpacf_aes.c +++ b/target/s390x/tcg/cpacf_aes.c @@ -483,6 +483,17 @@ static void encrypt_clrkey(uint8_t *key, int keysize) } } =20 +/* + * 'decrypt' the protected key by reverting the xor + * of the protkey_xor_pattern onto the clear key value. + */ +static void decrypt_protkey(uint8_t *key, int keysize) +{ + for (int i =3D 0; i < keysize; i++) { + key[i] ^=3D protkey_xor_pattern[i]; + } +} + int cpacf_aes_pckmo(CPUS390XState *env, const int mmu_idx, uintptr_t ra, uint64_t param_addr, uint8_t fc) { @@ -518,3 +529,95 @@ int cpacf_aes_pckmo(CPUS390XState *env, const int mmu_= idx, uintptr_t ra, =20 return 0; } + +int cpacf_paes_ecb(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint32_t type, uint8_t fc, uint8_t mod) +{ + enum { MAX_BLOCKS_PER_RUN =3D 8192 / AES_BLOCK_SIZE }; + uint8_t in[AES_BLOCK_SIZE], out[AES_BLOCK_SIZE]; + uint64_t len =3D *src_len_reg, done =3D 0; + int i, keysize, addr_reg_size; + uint8_t key[32], wkvp[32]; + AES_KEY exkey; + + g_assert(type =3D=3D S390_FEAT_TYPE_KM); + + switch (fc) { + case CPACF_KM_PAES_128: + keysize =3D 16; + break; + case CPACF_KM_PAES_192: + keysize =3D 24; + break; + case CPACF_KM_PAES_256: + keysize =3D 32; + break; + default: + g_assert_not_reached(); + } + + /* check addressing mode, raise exception if not supported here */ + addr_reg_size =3D get_address_bitsize(env); + switch (addr_reg_size) { + case 64: + break; + case 32: + len =3D (uint32_t)len; + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* early bail out if length is zero */ + if (!len) { + return 0; + } + + /* length has to be properly aligned. */ + if (!QEMU_IS_ALIGNED(len, AES_BLOCK_SIZE)) { + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* fetch and check wkvp from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize, wkvp, sizeof(wkvp)); + if (memcmp(wkvp, protkey_wkvp, sizeof(wkvp))) { + /* wkvp mismatch -> return with cc 1 */ + return 1; + } + + /* fetch protected key from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, param_addr, key, keysize); + /* decrypt the protected key */ + decrypt_protkey(key, keysize); + + /* expand key */ + if (mod) { + AES_set_decrypt_key(key, keysize * 8, &exkey); + } else { + AES_set_encrypt_key(key, keysize * 8, &exkey); + } + + /* process up to MAX_BLOCKS_PER_RUN aes blocks */ + for (i =3D 0; i < MAX_BLOCKS_PER_RUN && len >=3D AES_BLOCK_SIZE; i++) { + aes_read_block(env, mmu_idx, ra, *src_ptr_reg + done, in); + if (mod) { + AES_decrypt(in, out, &exkey); + } else { + AES_encrypt(in, out, &exkey); + } + aes_write_block(env, mmu_idx, ra, *dst_ptr_reg + done, out); + len -=3D AES_BLOCK_SIZE; + done +=3D AES_BLOCK_SIZE; + } + + *src_ptr_reg =3D deposit64(*src_ptr_reg, 0, addr_reg_size, + *src_ptr_reg + done); + *dst_ptr_reg =3D deposit64(*dst_ptr_reg, 0, addr_reg_size, + *dst_ptr_reg + done); + *src_len_reg -=3D done; + + return !len ? 0 : 3; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index 191b30e0f8..82d03fb8a1 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -112,6 +112,13 @@ static int cpacf_km(CPUS390XState *env, const int mmu_= idx, uintptr_t ra, &env->regs[r1], &env->regs[r2], &env->regs[r2 += 1], S390_FEAT_TYPE_KM, fc, mod); break; + case CPACF_KM_PAES_128: + case CPACF_KM_PAES_192: + case CPACF_KM_PAES_256: + rc =3D cpacf_paes_ecb(env, mmu_idx, ra, env->regs[1], + &env->regs[r1], &env->regs[r2], &env->regs[r2 = + 1], + S390_FEAT_TYPE_KM, fc, mod); + break; case CPACF_KM_XTS_128: case CPACF_KM_XTS_256: rc =3D cpacf_aes_xts(env, mmu_idx, ra, env->regs[1], --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021464; cv=none; d=zohomail.com; s=zohoarc; b=FpqXXWY2pha06EqeSzBBtH2FXcL9P7nIYS26wGtrU58T1Lxc773jvsp3jZPLXmeXPU1pusKpx77kl5OwHxT6CD4/7y2jAZI9nIdRTV3SALosgFTieyJHvN3W8ro6EW+lOqgGxDlo8/71ISxyzmZczcYRftmOBKLnFLCjS2/z90k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021464; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=1qIJ2UF0UczWNNrPmf+nrl/htKyPSw+r5K0i2B+liQ8=; b=VIFgb0a3WISdO0oSMecCLBzhUhhjDNVS1GiFgoP3vmfCGIfDTlo1SRH5RiIovG9DNL7Iom6o/DXE2+KrLCQQaXLoEoNCQuC1SU9jTKk2AZskSRoa95Rqm+QTFLJ8MhXYhyMwarrEPGbHTvezn1slc2zkZtooKQgF8umjP2+hJ6M= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021464611652.4258785495299; Mon, 21 Sep 2026 13:11:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kJy-0005s0-NG; Mon, 21 Sep 2026 16:09:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJl-0005he-Dx; Mon, 21 Sep 2026 16:08:50 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJh-0005N7-LJ; Mon, 21 Sep 2026 16:08:48 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8Hub1860608; Mon, 21 Sep 2026 20:08:43 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskg2ah4n-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:43 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJLb42167329; Mon, 21 Sep 2026 20:08:42 GMT Received: from smtprelay04.wdc07v.mail.ibm.com ([172.16.1.71]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gu5bk9f0t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:42 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay04.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8eBV8454856 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:41 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AABDA58059; Mon, 21 Sep 2026 20:08:40 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 37D205805D; Mon, 21 Sep 2026 20:08:40 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:40 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=1qIJ2UF0UczWNNrPm f+nrl/htKyPSw+r5K0i2B+liQ8=; b=lSCK5lakHZo91Mu0TR5odYCRMbO6/fN7L tzl6yE9c7W70Psa0RQ/Pv589fYtyWeo75peY5Cr/otEVAPQANcWP/5YO0p3YngWv lUR+RjZvhbxjc7WZtsFkbth8kSVlMARUsdCVEsgXGVnf72zGe2EpCr4xdTj/Ea3A voMsCyNz2mzUkbBCb990wY4Z0UUF9yeWYLSLkSYUJSe7JrZNyD+362Ftq/r7TZVP 6EyH20Z1i94/laaTKqDXuTwxY0YCXlaLnDDx3mKxxcYweCc499OtgoMjHW8M+eLB 4gDr/79xHDbHdAhXZbZHtnd26kEDh5aUPkeaCQv2IZgcPeNagb10A== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 15/33] target/s390x: Support protected key AES CBC for cpacf kmc instruction Date: Mon, 21 Sep 2026 16:08:12 -0400 Message-ID: <20260921200830.1302919-16-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: TipbGXhlsiGHpSfIIc_QkkuEx1A9phq3 X-Authority-Analysis: v=2.4 cv=I43w19gg c=1 sm=1 tr=0 ts=6ab18ecb cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=1XR5bUzyU_lZOmb26nMA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX6n3XzugL5U62 t0meiazCcz3SvoXNLdg7ld9pHBTHP3/qJaWWjAZe282RCHkXFjyjD530KkZ9ptIRNlmZSwt4ejS bdp3bniQA+y5J6gX3yLTehERrbw7Ea/s0lOEQFC0O+syubWZwtL8eWZWBwF9mKGejTgX1O6qzox kbGXyu5qWmaztPvwCHAWfsZwNTYHUB4yjv6UiAy8Di9nC/5IBudwUYdED7Il/ZmHYjJxlaWDGDZ VrYEC8h+09+PyBYVDkh0zIBzQdWRo+YHB+9axK01qEdvSOFOzfPl62CJCttGJAhSrVglF87lLBa Ly6cIwjb6kKFUYxGKcFgguviXaY38I66em4R+FJtfY6UodLZOmnucwczUrZG8FbjTD+XPv/7pkl pnvKhrXMHyJijGVftY2YmaA5Z2TIvhRyTzN+AQwTq0MbZ7IoUu7jl7Y5mef1QzWgobgoIGAfQRI yYGK5oo2rt9Pbe0YyTQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX+1F+IJeSQw3f pCxdtkdB9YoXWAS1MEQXMhZqJzwzc9lUKVT2kSRBko2YSYdP+fohyWo6mlebD6w+zDQd7hmWSFm RWoSM9JoP4cVBm/GgOKKckULGq88vd0= X-Proofpoint-GUID: TipbGXhlsiGHpSfIIc_QkkuEx1A9phq3 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 phishscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021467081158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Support the subfunctions CPACF_KMC_PAES_128, CPACF_KMC_PAES_192 and CPACF_KMC_PAES_256 for the cpacf kmc instruction. Signed-off-by: Harald Freudenberger Tested-by: Holger Dengler Reviewed-by: Finn Callies Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-16-freude@lin= ux.ibm.com Signed-off-by: Eric Farman --- target/s390x/gen-features.c | 3 + target/s390x/tcg/cpacf.h | 4 ++ target/s390x/tcg/cpacf_aes.c | 102 +++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 7 +++ 4 files changed, 116 insertions(+) diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index 4e3d851873..eb7c00a448 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -940,6 +940,9 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_KMC_AES_128, S390_FEAT_KMC_AES_192, S390_FEAT_KMC_AES_256, + S390_FEAT_KMC_EAES_128, + S390_FEAT_KMC_EAES_192, + S390_FEAT_KMC_EAES_256, S390_FEAT_KMCTR_AES_128, S390_FEAT_KMCTR_AES_192, S390_FEAT_KMCTR_AES_256, diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h index 9c654c3353..73cb564c0b 100644 --- a/target/s390x/tcg/cpacf.h +++ b/target/s390x/tcg/cpacf.h @@ -44,5 +44,9 @@ int cpacf_paes_ecb(CPUS390XState *env, const int mmu_idx,= uintptr_t ra, uint64_t param_addr, uint64_t *dst_ptr_reg, uint64_t *src_ptr_reg, uint64_t *src_len_reg, uint32_t type, uint8_t fc, uint8_t mod); +int cpacf_paes_cbc(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint32_t type, uint8_t fc, uint8_t mod); =20 #endif /* S390X_CPACF_H */ diff --git a/target/s390x/tcg/cpacf_aes.c b/target/s390x/tcg/cpacf_aes.c index cbe7547c0b..e155387fa8 100644 --- a/target/s390x/tcg/cpacf_aes.c +++ b/target/s390x/tcg/cpacf_aes.c @@ -621,3 +621,105 @@ int cpacf_paes_ecb(CPUS390XState *env, const int mmu_= idx, uintptr_t ra, =20 return !len ? 0 : 3; } + +int cpacf_paes_cbc(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint32_t type, uint8_t fc, uint8_t mod) +{ + enum { MAX_BLOCKS_PER_RUN =3D 8192 / AES_BLOCK_SIZE }; + uint8_t in[AES_BLOCK_SIZE], out[AES_BLOCK_SIZE]; + uint8_t key[32], wkvp[32], iv[AES_BLOCK_SIZE]; + uint64_t len =3D *src_len_reg, done =3D 0; + int i, keysize, addr_reg_size; + AES_KEY exkey; + + g_assert(type =3D=3D S390_FEAT_TYPE_KMC); + + switch (fc) { + case CPACF_KMC_PAES_128: + keysize =3D 16; + break; + case CPACF_KMC_PAES_192: + keysize =3D 24; + break; + case CPACF_KMC_PAES_256: + keysize =3D 32; + break; + default: + g_assert_not_reached(); + } + + /* check addressing mode, raise exception if not supported here */ + addr_reg_size =3D get_address_bitsize(env); + switch (addr_reg_size) { + case 64: + break; + case 32: + len =3D (uint32_t)len; + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* early bail out if length is zero */ + if (!len) { + return 0; + } + + /* length has to be properly aligned. */ + if (!QEMU_IS_ALIGNED(len, AES_BLOCK_SIZE)) { + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* fetch and check wkvp from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + AES_BLOCK_SIZE + keysize, + wkvp, sizeof(wkvp)); + if (memcmp(wkvp, protkey_wkvp, sizeof(wkvp))) { + /* wkvp mismatch -> return with cc 1 */ + return 1; + } + + /* fetch iv from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, param_addr, iv, AES_BLOCK_SIZE); + + /* fetch protected key from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + AES_BLOCK_SIZE, key, keysize); + /* decrypt the protected key */ + decrypt_protkey(key, keysize); + + /* expand key */ + if (mod) { + AES_set_decrypt_key(key, keysize * 8, &exkey); + } else { + AES_set_encrypt_key(key, keysize * 8, &exkey); + } + + /* process up to MAX_BLOCKS_PER_RUN aes blocks */ + for (i =3D 0; i < MAX_BLOCKS_PER_RUN && len >=3D AES_BLOCK_SIZE; i++) { + aes_read_block(env, mmu_idx, ra, *src_ptr_reg + done, in); + if (mod) { + /* decrypt in =3D> out */ + AES_cbc_decrypt(in, out, iv, &exkey); + } else { + /* encrypt in =3D> out */ + AES_cbc_encrypt(in, out, iv, &exkey); + } + aes_write_block(env, mmu_idx, ra, *dst_ptr_reg + done, out); + len -=3D AES_BLOCK_SIZE; + done +=3D AES_BLOCK_SIZE; + } + + /* update iv in param block */ + write_guest_wrap_u8(env, mmu_idx, ra, param_addr, iv, AES_BLOCK_SIZE); + + *src_ptr_reg =3D deposit64(*src_ptr_reg, 0, addr_reg_size, + *src_ptr_reg + done); + *dst_ptr_reg =3D deposit64(*dst_ptr_reg, 0, addr_reg_size, + *dst_ptr_reg + done); + *src_len_reg -=3D done; + + return !len ? 0 : 3; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index 82d03fb8a1..8141f833a3 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -146,6 +146,13 @@ static int cpacf_kmc(CPUS390XState *env, const int mmu= _idx, uintptr_t ra, &env->regs[r1], &env->regs[r2], &env->regs[r2 += 1], S390_FEAT_TYPE_KMC, fc, mod); break; + case CPACF_KMC_PAES_128: + case CPACF_KMC_PAES_192: + case CPACF_KMC_PAES_256: + rc =3D cpacf_paes_cbc(env, mmu_idx, ra, env->regs[1], + &env->regs[r1], &env->regs[r2], &env->regs[r2 = + 1], + S390_FEAT_TYPE_KMC, fc, mod); + break; default: tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); } --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021494; cv=none; d=zohomail.com; s=zohoarc; b=gVsQphU4sY08QsOlp8AooYHpi7Dm8k5xlV38sODBXi0TKTMKidb16mRSRieActCU6YnfxKY5PK+wU+9MkD7zE4g+Kg6WLV928Qk8zc7o0ChaaTzGPzaEKd0JqEUbYJBJQhCTMFtd2YzLbY2kFzOOSrT3hxeAp1mYnIcoSw5Pev8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021494; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=1UCYjXCNSIerPgjjRn5hMPxGprxeB7v6hxI3Zicenio=; b=ZuVow/GrLdPiOQWPUTur22ryvPPEL8qrZwyMU1Y0KPi4s1r11fZnvRTKIe1teQ6wI059JdwBnELpvo+ZHQd4xazp3D94Z0FLIIz5iOnZ1JVoKwNBxVU+1SU/6NCU7w6mjFp/NPtBSLKXzNgotp2K1xRisfzjP6xu52J46dv8lt0= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021494440379.41314917206046; Mon, 21 Sep 2026 13:11:34 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kK7-0005xa-DB; Mon, 21 Sep 2026 16:09:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJl-0005hc-Dp; Mon, 21 Sep 2026 16:08:50 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJh-0005Mm-MD; Mon, 21 Sep 2026 16:08:48 -0400 Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8UM81903205; Mon, 21 Sep 2026 20:08:43 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskdv2bdt-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:43 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJUMaO1431717; Mon, 21 Sep 2026 20:08:42 GMT Received: from smtprelay05.wdc07v.mail.ibm.com ([172.16.1.72]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt53vf02f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:42 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay05.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8fRP40173918 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:41 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4928F58043; Mon, 21 Sep 2026 20:08:41 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C5CD358055; Mon, 21 Sep 2026 20:08:40 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:40 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=1UCYjXCNSIerPgjjR n5hMPxGprxeB7v6hxI3Zicenio=; b=YL+LLN9z5LU/7A3V00VFLGNYQ4JAzCKNz TL7wDubTHafJUMcJevdyqmhkWIq+mTDWbPDr/tdHNkXq2VnT2KBHeG9X5WfV5cAP QwaqNQ04DMyPuxCvHHs1HeDyo+f5/zDzkcM0PpgJx9anQE5562L7+morF/D+RNkN ldS6SW01rz5ErMC77fVPXwZFYlk2mNJXr82LfSUgC+IJrVrYOzfllNnbmqUi4vXe 5QBV+DtvTClerzFknbU8pdgDTCJ35dvZwQ8wmRpWN0vl/fx/Kr7qk/wvt81o65bG TG1UbFW8hCRww09/k7MJXhHRYtKrU7jd72/YECGjkbr9UNIQZXBoA== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 16/33] target/s390x: Support protected key AES CTR for cpacf kmctr instruction Date: Mon, 21 Sep 2026 16:08:13 -0400 Message-ID: <20260921200830.1302919-17-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: eCOdnQLvfoGGmcj5Jl9QVt7twfDUMoc4 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX0V5ZJeh86z0i EajwKYzM+GLgYeI9zpp+8Ky04HliRIet1F1kGbpO9CnN9/LCTXbRSpXSBA3XHuYhILn0sv97ro4 8Zp3nYuUvWncLXHN+1lCjdhPDblp0g4= X-Authority-Analysis: v=2.4 cv=FLiOVOos c=1 sm=1 tr=0 ts=6ab18ecb cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=s7YHn70HNGjeB9XmMgkA:9 X-Proofpoint-GUID: eCOdnQLvfoGGmcj5Jl9QVt7twfDUMoc4 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX+IppIdBw8uKp BS7du/munQFC8TzbXAoYB7Pj8fa9fiPM4V28bGw02M5/9oX2szMDAer3YqctOA8YN1yW9P0R4sQ utFu6wyr3Vae3AdO466jrjXZiOntR4iV5VxiU9Hz5tCSMQmmrJIn0LjzJB4oBUcH3gIDwELUndq J+STFU+fAJWmWWiZM6CB/hv/W0WUh7xanE1ZixAYirfUpBmxZBJk8YLuTdAmARIRp0883oYqLQj HZWcQGPBVCm1M2/MLDIXvSfHS83QRbkBoW14foAu9D3u3Noa/0mHrd6KwmNaTA1FFwFMvXi9JJk b6vcCrOeBqBMa7dIKVcKcfnIzXSx9yBGBNa40LaCrZuLo+csZ2jWd3GVXfGCE/dYNWL/iyaDAJp 3pXkux3zPWaQdPGbSL8MSMnkPEAkjJ/gojTXHk9DNAcxJ4/OPJM68YLE4o0eR5L1xbAIT6/9088 a7fz1hrwEdtOhjRDesQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 phishscore=0 spamscore=0 clxscore=1015 suspectscore=0 bulkscore=0 lowpriorityscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021495204158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Support the subfunctions CPACF_KMCTR_PAES_128, CPACF_KMCTR_PAES_192 and CPACF_KMCTR_PAES_256 for the cpacf kmctr instruction. Signed-off-by: Harald Freudenberger Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-17-freude@lin= ux.ibm.com Signed-off-by: Eric Farman --- target/s390x/gen-features.c | 3 ++ target/s390x/tcg/cpacf.h | 5 ++ target/s390x/tcg/cpacf_aes.c | 92 ++++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 7 +++ 4 files changed, 107 insertions(+) diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index eb7c00a448..01149a04c5 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -946,6 +946,9 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_KMCTR_AES_128, S390_FEAT_KMCTR_AES_192, S390_FEAT_KMCTR_AES_256, + S390_FEAT_KMCTR_EAES_128, + S390_FEAT_KMCTR_EAES_192, + S390_FEAT_KMCTR_EAES_256, S390_FEAT_PCC_XTS_AES_128, S390_FEAT_PCC_XTS_AES_256, S390_FEAT_PCKMO_AES_128, diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h index 73cb564c0b..15fd860e3a 100644 --- a/target/s390x/tcg/cpacf.h +++ b/target/s390x/tcg/cpacf.h @@ -48,5 +48,10 @@ int cpacf_paes_cbc(CPUS390XState *env, const int mmu_idx= , uintptr_t ra, uint64_t param_addr, uint64_t *dst_ptr_reg, uint64_t *src_ptr_reg, uint64_t *src_len_reg, uint32_t type, uint8_t fc, uint8_t mod); +int cpacf_paes_ctr(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint64_t *ctr_ptr_reg, uint32_t type, + uint8_t fc, uint8_t mod); =20 #endif /* S390X_CPACF_H */ diff --git a/target/s390x/tcg/cpacf_aes.c b/target/s390x/tcg/cpacf_aes.c index e155387fa8..52f8644468 100644 --- a/target/s390x/tcg/cpacf_aes.c +++ b/target/s390x/tcg/cpacf_aes.c @@ -723,3 +723,95 @@ int cpacf_paes_cbc(CPUS390XState *env, const int mmu_i= dx, uintptr_t ra, =20 return !len ? 0 : 3; } + +int cpacf_paes_ctr(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint64_t *ctr_ptr_reg, uint32_t type, + uint8_t fc, uint8_t mod) +{ + enum { MAX_BLOCKS_PER_RUN =3D 8192 / AES_BLOCK_SIZE }; + uint8_t in[AES_BLOCK_SIZE], out[AES_BLOCK_SIZE]; + uint8_t ctr[AES_BLOCK_SIZE], key[32], wkvp[32]; + uint64_t len =3D *src_len_reg, done =3D 0; + int i, keysize, addr_reg_size; + AES_KEY exkey; + + g_assert(type =3D=3D S390_FEAT_TYPE_KMCTR); + + switch (fc) { + case CPACF_KMCTR_PAES_128: + keysize =3D 16; + break; + case CPACF_KMCTR_PAES_192: + keysize =3D 24; + break; + case CPACF_KMCTR_PAES_256: + keysize =3D 32; + break; + default: + g_assert_not_reached(); + } + + /* check addressing mode, raise exception if not supported here */ + addr_reg_size =3D get_address_bitsize(env); + switch (addr_reg_size) { + case 64: + break; + case 32: + len =3D (uint32_t)len; + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* early bail out if length is zero */ + if (!len) { + return 0; + } + + /* length has to be properly aligned. */ + if (!QEMU_IS_ALIGNED(len, AES_BLOCK_SIZE)) { + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* fetch and check wkvp from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize, wkvp, sizeof(wkvp)); + if (memcmp(wkvp, protkey_wkvp, sizeof(wkvp))) { + /* wkvp mismatch -> return with cc 1 */ + return 1; + } + + /* fetch protected key from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, param_addr, key, keysize); + /* decrypt the protected key */ + decrypt_protkey(key, keysize); + + /* expand key */ + AES_set_encrypt_key(key, keysize * 8, &exkey); + + /* process up to MAX_BLOCKS_PER_RUN aes blocks */ + for (i =3D 0; i < MAX_BLOCKS_PER_RUN && len >=3D AES_BLOCK_SIZE; i++) { + /* read in nonce/ctr =3D> ctr */ + aes_read_block(env, mmu_idx, ra, *ctr_ptr_reg + done, ctr); + /* read in one block of input data =3D> in */ + aes_read_block(env, mmu_idx, ra, *src_ptr_reg + done, in); + /* encrypt ctr and xor with in =3D> out */ + AES_ctr_encrypt(in, out, ctr, &exkey); + /* write out the processed block */ + aes_write_block(env, mmu_idx, ra, *dst_ptr_reg + done, out); + len -=3D AES_BLOCK_SIZE; + done +=3D AES_BLOCK_SIZE; + } + + *src_ptr_reg =3D deposit64(*src_ptr_reg, 0, addr_reg_size, + *src_ptr_reg + done); + *dst_ptr_reg =3D deposit64(*dst_ptr_reg, 0, addr_reg_size, + *dst_ptr_reg + done); + *ctr_ptr_reg =3D deposit64(*ctr_ptr_reg, 0, addr_reg_size, + *ctr_ptr_reg + done); + *src_len_reg -=3D done; + + return !len ? 0 : 3; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index 8141f833a3..44fb7611cd 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -174,6 +174,13 @@ static int cpacf_kmctr(CPUS390XState *env, const int m= mu_idx, uintptr_t ra, &env->regs[r1], &env->regs[r2], &env->regs[r2 += 1], &env->regs[r3], S390_FEAT_TYPE_KMCTR, fc, mod); break; + case CPACF_KMCTR_PAES_128: + case CPACF_KMCTR_PAES_192: + case CPACF_KMCTR_PAES_256: + rc =3D cpacf_paes_ctr(env, mmu_idx, ra, env->regs[1], + &env->regs[r1], &env->regs[r2], &env->regs[r2 = + 1], + &env->regs[r3], S390_FEAT_TYPE_KMCTR, fc, mod); + break; default: tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); } --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021558; cv=none; d=zohomail.com; s=zohoarc; b=Kta/iUSCiSQTIuAmXuKrzo3mH0m4E74ZVr3yEzuHlw5yAOW2Li596G/wTgWhF8oy3dyonT+HzhvrX3Sdo2wTeZMdlXqiKHHno48God0L5q8lzDmpfhtfWFviKTIp2EtmqroAvLqlzFsi48sID6wkc+WxBDmr5sPqb6imRzj1aE8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021558; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=eTXpseRIDG+SzDkD5k4seVSnRMjOsakYNeQSggHoihA=; b=J1GexcBSgX/X2eU7n6Z51g3Gn1PvMNRS7KhW9RznuloMV6fQv1Ew9nNTXBOejOrl3RhMRR9xoU2cmZirtJYIS97Nv4E1/J7Y3pwnLo9DMKbfH+QfGFxdVhQya1AupMjuZwOS6no0+QKRGnUyMC3SRsIzeNsPNARKo02XoeFU7Qg= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021558483780.0413625515056; Mon, 21 Sep 2026 13:12:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kK6-0005wl-Jc; Mon, 21 Sep 2026 16:09:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJn-0005iB-7D; Mon, 21 Sep 2026 16:08:52 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJi-0005NE-Ql; Mon, 21 Sep 2026 16:08:50 -0400 Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8KSw4193492; Mon, 21 Sep 2026 20:08:44 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gske1jh6p-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:44 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJEQDd167302; Mon, 21 Sep 2026 20:08:43 GMT Received: from smtprelay05.wdc07v.mail.ibm.com ([172.16.1.72]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gu5bk9f0w-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:43 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay05.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8gwT40173922 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:42 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E05C558043; Mon, 21 Sep 2026 20:08:41 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 652BA58055; Mon, 21 Sep 2026 20:08:41 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:41 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=eTXpseRIDG+SzDkD5 k4seVSnRMjOsakYNeQSggHoihA=; b=sxDCfxfC35Pk3IdnSw82hbfG0SGKWYLN8 pjxDz0vpaHqsW14rRAWEQeiHjmWec1j6lUslA1yIg0beyxFi2d9UJoS9hoX39PDo g8KboME4ukEiWaG3sk6bj+j9xRPpAwgGeuAvJbE/0PisK68oLNjSQyJFGDsXoB/1 JGg1Yh/PNJPkV5xlK80/qUr+UPjD8kCc10s3EfLbComkkA+28ipUITx1shV2z3xN ZvVYz2/yf0Z6cDKAGRC7RyECgLmlOjcnMrYQcYRWNq9WOShltmN7S5/uBPcB4/9W Q/2HsD/WSF8GDz62087TrSoif+tNWEX5ARZvKNdmV8Somkj26a/Vw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 17/33] target/s390x: Minimal protected key AES XTS support for cpacf pcc instruction Date: Mon, 21 Sep 2026 16:08:14 -0400 Message-ID: <20260921200830.1302919-18-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: tU-F9ZD-bhjHKi_HZHPfcstx_nxmJgIo X-Authority-Analysis: v=2.4 cv=EOCTQFZC c=1 sm=1 tr=0 ts=6ab18ecc cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=ML8HfGjnpObMZ2AgGjwA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX+1KVqYkheOOV PFyp4KMiZDfGu2GY5Ft1k2qRnuRpFQhqe1/F9Hj8M8IeEDYUPkCljXywpaMYeXM76OzheIEJbZ/ xMeEEfJBtA0493IHt4vsNGgX6p8ywGU= X-Proofpoint-GUID: tU-F9ZD-bhjHKi_HZHPfcstx_nxmJgIo X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXydJ5D56ZrU5a PFMZ0BZRttNJxMShZ/9r0NcWN2Ad7h4ZXG4zrt2nVfqnio2et4tWCcJ5lkJ5NOtIx9WHqrgC1u/ V5nIolZlJCz39EqPQ5D6I7ojBH7+Bat0zcl2QSxN170ugdsndGwBkz4NuoVg5BghD2PdqSt59EF MAqONBPfqI1dkjoMp6EAQqvSfjSjmypVgIBEOe9Dd1LrZnMeOo42XPyBjDdRyLJzNeB757ZHMcp HFxFXYhLa8/45VHb5KXOhT46hLSUNa4iUMtZ0+BzKzbuw/PyNPLGBlnSCM2L9/HBVubIRS4V4+K gBOKJb3VjIV5Y3G+N5PDCPr4lSg7iYPyq0I8mAlZz1zCtIAHavBr0T8aMPaNqcSxG7S1HYeYiAT Sv2MKjT3mEn4eiQS9OAJa/Uf1LuHjuLMVTwZmcA6N2tC4OYuV3yp3T+exl399HCCXqdxmabFRdU fDpH4pWDJCbxMLRuIvw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 phishscore=0 priorityscore=1501 clxscore=1015 spamscore=0 adultscore=0 impostorscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021559569158501 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Support CPACF pcc subfunctions PCC-Compute-XTS-Parameter-Encrypted-AES-128 and PCC-Compute-XTS-Parameter-Encrypted-AES-128 but only for the special case block sequential number is 0. However, this covers the s390 PAES XTS implementation in the Linux kernel. Signed-off-by: Harald Freudenberger Tested-by: Holger Dengler Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-18-freude@lin= ux.ibm.com Signed-off-by: Eric Farman --- target/s390x/gen-features.c | 2 + target/s390x/tcg/cpacf.h | 2 + target/s390x/tcg/cpacf_aes.c | 64 ++++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 4 ++ 4 files changed, 72 insertions(+) diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index 01149a04c5..1ed0d4efeb 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -951,6 +951,8 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_KMCTR_EAES_256, S390_FEAT_PCC_XTS_AES_128, S390_FEAT_PCC_XTS_AES_256, + S390_FEAT_PCC_XTS_EAES_128, + S390_FEAT_PCC_XTS_EAES_256, S390_FEAT_PCKMO_AES_128, S390_FEAT_PCKMO_AES_192, S390_FEAT_PCKMO_AES_256, diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h index 15fd860e3a..f0c2e7fb6c 100644 --- a/target/s390x/tcg/cpacf.h +++ b/target/s390x/tcg/cpacf.h @@ -53,5 +53,7 @@ int cpacf_paes_ctr(CPUS390XState *env, const int mmu_idx,= uintptr_t ra, uint64_t *src_ptr_reg, uint64_t *src_len_reg, uint64_t *ctr_ptr_reg, uint32_t type, uint8_t fc, uint8_t mod); +int cpacf_paes_pcc(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint8_t fc); =20 #endif /* S390X_CPACF_H */ diff --git a/target/s390x/tcg/cpacf_aes.c b/target/s390x/tcg/cpacf_aes.c index 52f8644468..dbbe5bda64 100644 --- a/target/s390x/tcg/cpacf_aes.c +++ b/target/s390x/tcg/cpacf_aes.c @@ -815,3 +815,67 @@ int cpacf_paes_ctr(CPUS390XState *env, const int mmu_i= dx, uintptr_t ra, =20 return !len ? 0 : 3; } + +int cpacf_paes_pcc(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint8_t fc) +{ + uint8_t key[32], wkvp[32], tweak[AES_BLOCK_SIZE], buf[AES_BLOCK_SIZE]; + int keysize, i; + AES_KEY exkey; + + switch (fc) { + case CPACF_PCC_XTS_PAES_128: + keysize =3D 16; + break; + case CPACF_PCC_XTS_PAES_256: + keysize =3D 32; + break; + default: + g_assert_not_reached(); + } + + /* fetch and check wkvp from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize, wkvp, sizeof(wkvp)); + if (memcmp(wkvp, protkey_wkvp, sizeof(wkvp))) { + /* wkvp mismatch -> return with cc 1 */ + return 1; + } + + /* fetch block sequence nr from param block into buf */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize + sizeof(wkvp) + AES_BLOCK_SIZ= E, + buf, AES_BLOCK_SIZE); + + /* is the block sequence nr 0 ? */ + for (i =3D 0; i < AES_BLOCK_SIZE && !buf[i]; i++) { + ; + } + if (i < AES_BLOCK_SIZE) { + /* no, sorry handling of non zero block sequence is not implemente= d */ + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* fetch protected key from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, param_addr, key, keysize); + /* decrypt the protected key */ + decrypt_protkey(key, keysize); + + /* fetch tweak from param block into tweak */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize + sizeof(wkvp), + tweak, AES_BLOCK_SIZE); + + /* expand key */ + AES_set_encrypt_key(key, keysize * 8, &exkey); + + /* encrypt tweak */ + AES_encrypt(tweak, buf, &exkey); + + /* store encrypted tweak into xts parameter field of the param block */ + write_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize + sizeof(wkvp) + 3 * AES_BLOC= K_SIZE, + buf, AES_BLOCK_SIZE); + + return 0; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index 44fb7611cd..886f9c72d6 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -219,6 +219,10 @@ static int cpacf_pcc(CPUS390XState *env, const int mmu= _idx, uintptr_t ra, case CPACF_PCC_XTS_AES_256: rc =3D cpacf_aes_pcc(env, mmu_idx, ra, env->regs[1], fc); break; + case CPACF_PCC_XTS_PAES_128: + case CPACF_PCC_XTS_PAES_256: + rc =3D cpacf_paes_pcc(env, mmu_idx, ra, env->regs[1], fc); + break; default: tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); } --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021568; cv=none; d=zohomail.com; s=zohoarc; b=GUC7K9rVT/+LJl3WgjsabWE4+rr7jKgij7QdlPN/DXWdryGeo0vQYRSeh5tvoCep0FnPIGjmN9GmI5wq9LGRHdTrubFWAa6G7D4BAL8UE+o/7ap0I/ZafwLy6CQVXVlUQzeenamSbi7nzk+KXBxfKEgt7GXQqB4IR6PuUZ6fSug= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021568; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=gwaIiBEYoNnKXTfqaRMZXLwy8NuRzGIZSUADCUHXkOM=; b=Q5YQ5vNmwdrCD+yrICnN/FGifj17oAWM9TOEsxvbzWChs/4FmSs42kR0I6RMl4SyAU78llG+QZiOqFWpdsIPZ/dS7Ednh96FoSGSEGTHMFM5QjfE5W4sIlJJ77aFwAKNb2Yg5JjU//Y3QVRd5fvlCJzWsB28N2I6F+FAJ/VYuCM= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021568488419.725634961192; Mon, 21 Sep 2026 13:12:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kJt-0005mV-4X; Mon, 21 Sep 2026 16:08:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJn-0005iC-7P; Mon, 21 Sep 2026 16:08:52 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJi-0005NG-Se; Mon, 21 Sep 2026 16:08:50 -0400 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8ZLs703577; Mon, 21 Sep 2026 20:08:45 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskgqa9du-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:44 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJLb43167329; Mon, 21 Sep 2026 20:08:44 GMT Received: from smtprelay06.wdc07v.mail.ibm.com ([172.16.1.73]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gu5bk9f10-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:44 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay06.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8g1V8848108 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:42 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7EDC758043; Mon, 21 Sep 2026 20:08:42 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 08B7E58055; Mon, 21 Sep 2026 20:08:42 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:41 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=gwaIiBEYoNnKXTfqa RMZXLwy8NuRzGIZSUADCUHXkOM=; b=Q5kBYNKtxdD3tj14PPXzGWB2NuI5kiLiP MQKPi68JAhhfsvxnJ9TKKt20EESXy7x0uJ3qBnZkeQtiBNNoLadq4nibd+xGJEJG /0QNwKacCUzb8h0p9/1/d5THBV72KGfXn0oOEW+tGAWsrn2r+Ff/LufRgGCzfNY+ gp2O5CT/JZBLTWyokdRXi2gScH9ZNHIRVc+lWF52lIrLMvPcJKbV2LsJ3sJHably zvmUYcJvaKU3m/MMvefm/r9JgWrrPhx8ZVmozWqJismgR4RyZka8tuLzlazfV4hV kz6vGSH6CguyydjBoU/hnlzpHOWOXMSDZB/X+WNBSRul25fcg/DGQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 18/33] target/s390x: Support protected key AES XTS for cpacf km instruction Date: Mon, 21 Sep 2026 16:08:15 -0400 Message-ID: <20260921200830.1302919-19-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=G+OJgNk5 c=1 sm=1 tr=0 ts=6ab18ecd cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=fNq4rp3DiFnTniV0vFsA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX3FENfaBGgKnl pTdiDHSHfPwM1V3n4lpJSK3uK9Y0nWwtgQRaldGPGbhdFYAZ+j/YU3wPalzTWVVdaG6lxkcvz4P yfJUZO55YdoBU5Y558UxR4fF6QguKY2/VzgTvrNmf+9paPjpUjOX/Vk1m267Hv3pOcn+gJcNlKM dXdL9UgDSKLtexFylZOY0Mx+7/fzfw+4k/ki+ULFd/wGl9lGXltQMEW+qVSi09NsIZo6/qxIAoe 8q0Lf2ajNd8Mw3wZZm1Lw8tuP3KRgPuNPycMdCNGe6uiDFZntwcQx3EQWxAKqYx3cwck5CuY62J 3pJJSo3SiCe5xjslqAwDWiZRVVk0bHJhXocK8QLUmjQzGSDhHgkNpNgOuxeoO2bUdyxl1lcFvix SfhZfvjzo+11dT2JIL75eB3/N4HnXIgi9tgFaNxdA7k6Yoksrvccman+I6b94UcKN04XgUCGfMA 0q3pN0IFCh0K9k+oh/Q== X-Proofpoint-ORIG-GUID: XV8dDWKEsL-ARIDGRG9g9oRkhXvzz1tg X-Proofpoint-GUID: XV8dDWKEsL-ARIDGRG9g9oRkhXvzz1tg X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX0dnR+TnzBlHU Sx7e0e39gdZGweIGOPbgJNfKSkGKWK2fGB2z3N4EIEaGwYwpp6iH4Mat3xJwxChjhUj77f+yApV tdPWamq2MOx+/kwQYMzyw5fID+Inly8= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 phishscore=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 priorityscore=1501 clxscore=1015 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021569558158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Support the subfunctions CPACF_KM_PXTS_128 and CPACF_KM_PXTS_256 for the cpacf km instruction. Signed-off-by: Harald Freudenberger Tested-by: Holger Dengler Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-19-freude@lin= ux.ibm.com Signed-off-by: Eric Farman --- target/s390x/gen-features.c | 2 + target/s390x/tcg/cpacf.h | 4 ++ target/s390x/tcg/cpacf_aes.c | 105 +++++++++++++++++++++++++++++++ target/s390x/tcg/crypto_helper.c | 6 ++ 4 files changed, 117 insertions(+) diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index 1ed0d4efeb..aa489e0d9c 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -937,6 +937,8 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_KM_EAES_256, S390_FEAT_KM_XTS_AES_128, S390_FEAT_KM_XTS_AES_256, + S390_FEAT_KM_XTS_EAES_128, + S390_FEAT_KM_XTS_EAES_256, S390_FEAT_KMC_AES_128, S390_FEAT_KMC_AES_192, S390_FEAT_KMC_AES_256, diff --git a/target/s390x/tcg/cpacf.h b/target/s390x/tcg/cpacf.h index f0c2e7fb6c..550a6ee183 100644 --- a/target/s390x/tcg/cpacf.h +++ b/target/s390x/tcg/cpacf.h @@ -55,5 +55,9 @@ int cpacf_paes_ctr(CPUS390XState *env, const int mmu_idx,= uintptr_t ra, uint8_t fc, uint8_t mod); int cpacf_paes_pcc(CPUS390XState *env, const int mmu_idx, uintptr_t ra, uint64_t param_addr, uint8_t fc); +int cpacf_paes_xts(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint32_t type, uint8_t fc, uint8_t mod); =20 #endif /* S390X_CPACF_H */ diff --git a/target/s390x/tcg/cpacf_aes.c b/target/s390x/tcg/cpacf_aes.c index dbbe5bda64..92884c4120 100644 --- a/target/s390x/tcg/cpacf_aes.c +++ b/target/s390x/tcg/cpacf_aes.c @@ -879,3 +879,108 @@ int cpacf_paes_pcc(CPUS390XState *env, const int mmu_= idx, uintptr_t ra, =20 return 0; } + +int cpacf_paes_xts(CPUS390XState *env, const int mmu_idx, uintptr_t ra, + uint64_t param_addr, uint64_t *dst_ptr_reg, + uint64_t *src_ptr_reg, uint64_t *src_len_reg, + uint32_t type, uint8_t fc, uint8_t mod) +{ + enum { MAX_BLOCKS_PER_RUN =3D 8192 / AES_BLOCK_SIZE }; + uint8_t in[AES_BLOCK_SIZE], out[AES_BLOCK_SIZE]; + uint8_t key[32], wkvp[32], tweak[AES_BLOCK_SIZE]; + uint64_t len =3D *src_len_reg, done =3D 0; + int i, keysize, addr_reg_size; + AES_KEY exkey; + + g_assert(type =3D=3D S390_FEAT_TYPE_KM); + + switch (fc) { + case CPACF_KM_PXTS_128: + keysize =3D 16; + break; + case CPACF_KM_PXTS_256: + keysize =3D 32; + break; + default: + g_assert_not_reached(); + } + + /* check addressing mode, raise exception if not supported here */ + addr_reg_size =3D get_address_bitsize(env); + switch (addr_reg_size) { + case 64: + break; + case 32: + len =3D (uint32_t)len; + break; + default: + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* early bail out if length is zero */ + if (!len) { + return 0; + } + + /* length has to be properly aligned. */ + if (!QEMU_IS_ALIGNED(len, AES_BLOCK_SIZE)) { + tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); + } + + /* fetch and check wkvp from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize, wkvp, sizeof(wkvp)); + if (memcmp(wkvp, protkey_wkvp, sizeof(wkvp))) { + /* wkvp mismatch -> return with cc 1 */ + return 1; + } + + /* fetch protected key from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, param_addr, key, keysize); + /* decrypt the protected key */ + decrypt_protkey(key, keysize); + + /* expand key */ + if (mod) { + AES_set_decrypt_key(key, keysize * 8, &exkey); + } else { + AES_set_encrypt_key(key, keysize * 8, &exkey); + } + + /* fetch tweak from param block */ + read_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize + sizeof(wkvp), + tweak, AES_BLOCK_SIZE); + + /* process up to MAX_BLOCKS_PER_RUN aes blocks */ + for (i =3D 0; i < MAX_BLOCKS_PER_RUN && len >=3D AES_BLOCK_SIZE; i++) { + /* fetch one AES block into in */ + aes_read_block(env, mmu_idx, ra, *src_ptr_reg + done, in); + if (mod) { + /* decrypt in =3D> out */ + AES_xts_decrypt(in, out, tweak, &exkey); + } else { + /* encrypt in =3D> out */ + AES_xts_encrypt(in, out, tweak, &exkey); + } + /* prep tweak for next round */ + AES_xts_prep_next_tweak(tweak); + /* write out this processed block from out */ + aes_write_block(env, mmu_idx, ra, *dst_ptr_reg + done, out); + len -=3D AES_BLOCK_SIZE; + done +=3D AES_BLOCK_SIZE; + } + + /* update tweak in param block */ + write_guest_wrap_u8(env, mmu_idx, ra, + param_addr + keysize + sizeof(wkvp), + tweak, AES_BLOCK_SIZE); + + *src_ptr_reg =3D deposit64(*src_ptr_reg, 0, addr_reg_size, + *src_ptr_reg + done); + *dst_ptr_reg =3D deposit64(*dst_ptr_reg, 0, addr_reg_size, + *dst_ptr_reg + done); + *src_len_reg -=3D done; + + return !len ? 0 : 3; +} diff --git a/target/s390x/tcg/crypto_helper.c b/target/s390x/tcg/crypto_hel= per.c index 886f9c72d6..1014f1d954 100644 --- a/target/s390x/tcg/crypto_helper.c +++ b/target/s390x/tcg/crypto_helper.c @@ -125,6 +125,12 @@ static int cpacf_km(CPUS390XState *env, const int mmu_= idx, uintptr_t ra, &env->regs[r1], &env->regs[r2], &env->regs[r2 += 1], S390_FEAT_TYPE_KM, fc, mod); break; + case CPACF_KM_PXTS_128: + case CPACF_KM_PXTS_256: + rc =3D cpacf_paes_xts(env, mmu_idx, ra, env->regs[1], + &env->regs[r1], &env->regs[r2], &env->regs[r2 = + 1], + S390_FEAT_TYPE_KM, fc, mod); + break; default: tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra); } --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021464; cv=none; d=zohomail.com; s=zohoarc; b=Et+yDBmkjLiW+GJX6DdFWWnWR8KgqrSkBm/p9/ROpitIITEzxLhTzVWX1fuBTo9yry0tw8Go+sbpTOGu3GAEngyscc7RdzfC2fFuwj9efEEprNA1kPeCavrtA84y4FnqqJB5vCATs/XGsxKfiG325EJKfv0Vl6ZF7klAKLkzZp4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021464; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=g3kkliMUIvnVzkGVP2iBBgQ2OSwdctir5MORf2jf5r8=; b=SpEm8sfEYUh0kbbbHt6a7UQ4hRvraScSww8qQTjENUHqwGasDrWOahzqkA3o64OVEiuKswsPTvcc7mcbgC3HXPESyWhQr0jwUABQaWQyYWavA0JBj/1jbEjY3q26jXYqETujt5N6Zx2NsfYVtPxLwpryQl7a/4QZn7cj7Zm8Pno= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021464658812.3013939957007; Mon, 21 Sep 2026 13:11:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKB-0006B6-Uf; Mon, 21 Sep 2026 16:09:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kK5-0005w5-1z; Mon, 21 Sep 2026 16:09:10 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kK3-0005NV-4Q; Mon, 21 Sep 2026 16:09:08 -0400 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8aHr703753; Mon, 21 Sep 2026 20:08:46 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskgqa9dv-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:45 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJUGWn167295; Mon, 21 Sep 2026 20:08:45 GMT Received: from smtprelay07.wdc07v.mail.ibm.com ([172.16.1.74]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gu5bk9f11-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:45 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay07.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8hr163504782 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:43 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1CFA558043; Mon, 21 Sep 2026 20:08:43 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9AF1458059; Mon, 21 Sep 2026 20:08:42 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:42 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=g3kkliMUIvnVzkGVP 2iBBgQ2OSwdctir5MORf2jf5r8=; b=gPtHcdhrx2LZ7cgnM0BXSgw52jVHHxVJx hAaiLLcYV8hCXBlb+DEMtqe0p+uiF+WlRXoggYy63E9wkwNEiLQZKpOP/hKCTR0+ 7juOXXCTkcdme4L3W+8APuKuVzFVotZcm6uRqIcIpfOgs3/mWZ35HGZq2Fg5tFFN LB94OlBuQ1yQ1urlS17MM9r421tmI6udcXSGYBZWpLBJRRk4n6QnaH88zCSb/p49 mgxJ+SgrTeIVM9mwi9BDgakiwPL+BG/vS7P4ma9rhxR4d+WNHl2vdokLr+1rdFzh kHdPzof6E0RkBSkF4tU7lO9J+XZCfBJusCM/Z7Nv6WH5oOlHWjtnQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 19/33] docs/s390: Document CPACF instructions support Date: Mon, 21 Sep 2026 16:08:16 -0400 Message-ID: <20260921200830.1302919-20-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=G+OJgNk5 c=1 sm=1 tr=0 ts=6ab18ecd cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=IlYB4z8HrC9mJJy16gAA:9 a=5wi_FRADO1KgGG3s:21 a=O8hF6Hzn-FEA:10 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX7Mw0x++PGAqz mr9BMkyT4P3CbngOfrv4PbePR2VUmQn/tqgOz2sPxq9wjpSS7GVlc8MSYc7au7KHWEvs4NXNT9a IrDIicVJELuG6s8p8AnKW3NNzzUEa5wIjdJ3wJs8ADp90k6SGmFjohynE58xiNPLOW4Cs8r0SbA OtPj1qaV3eoejhzEnN6LQLe7eTNR9S9xo0khGKR7TMA6Eu2xzNhUjpbsBJ56ywfTl5r7B3ZVhjL /M8zz0WGwYddaKpqgoZcu9o4ZF/fqwuZbNCkJeBSWFiWBWyfO08x9KTGpoK1cQjdA/4BwdbpprR o9FCx28u6dar0YhkzqWfPdCDXTE0SNrbAos7yOM15zRmEPGwIhk8CK6oIE2WIBDUDp2u8trVvu7 jbT0cumCA50kOT2HzXMzHXO9sWufpqwKQitZtSOnTu+X0QdX5lFn26xPJnWgZXmbyW3bllYSAaV aPmGeRphedPCsR+gZKg== X-Proofpoint-ORIG-GUID: 5iLfxUI_H46s3FG5lLrntQLdzPlMisXc X-Proofpoint-GUID: 5iLfxUI_H46s3FG5lLrntQLdzPlMisXc X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX05dfJ8/oQbeg 9uU09ZGBFhOeA5Uln9JFiNjV4hqpnzUFXNTRbENRCaLWlBPZn6hvtC+biJBkSEAfSwdCg+v0nzK SGDwG9eaMb7D3EZv2h0TSPmMxiw/wjI= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 phishscore=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 priorityscore=1501 clxscore=1015 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021465077158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Add a first document covering the Qemu s390 CPACF instructions and functions supported. Signed-off-by: Harald Freudenberger Reviewed-by: Finn Callies Reviewed-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-20-freude@lin= ux.ibm.com [farman@linux.ibm.com: Resolve merge conflict in target-s390x.rst] Signed-off-by: Eric Farman --- docs/system/s390x/cpacf.rst | 143 +++++++++++++++++++++++++++++++++++ docs/system/target-s390x.rst | 1 + 2 files changed, 144 insertions(+) create mode 100644 docs/system/s390x/cpacf.rst diff --git a/docs/system/s390x/cpacf.rst b/docs/system/s390x/cpacf.rst new file mode 100644 index 0000000000..c68aa74abe --- /dev/null +++ b/docs/system/s390x/cpacf.rst @@ -0,0 +1,143 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +CPACF Support +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +CPACF +----- + +CP Assist for Cryptographic Function (CPACF) is a hardware-integrated +coprocessor feature built into every processor core of IBM Z and +LinuxONE mainframes (s390x architecture). It provides high-speed, +hardware-accelerated encryption and hashing directly on the CPU. + +CPACF provides a set of z/Architecture instructions (known as Message +Security Assist or MSA) that execute cryptographic operations +synchronously with the main processor. + +- Symmetric Encryption: Support for AES (128, 192, 256-bit), DES, and + Triple-DES (TDES). +- Hashing: Acceleration for SHA-1, SHA-2 (up to SHA-512), SHA-3 and + SHAKE. +- Random Number Generation: Pseudo Random Number Generator (PRNG) and + a hardware-based True Random Number Generator (TRNG). +- Asymmetric Support: Elliptic Curve Cryptography (ECC) primitives + P-256, P-384, P-521, Montgomery/Edwards curves (e.g., Ed25519). + +Documentation about CPACF instructions is publicly available and +can be found in the "z/Architecture Principles of Operation" +accessible at the IBM documentation hub https://www.ibm.com/docs/en. +For example the latest version as a pdf is available here: +https://www.ibm.com/support/pages/zvm/library/other/22783214.pdf + + +CPACF instructions +------------------ + +Here is a list of implemented CPACF instructions and the supported +functions for each instruction: + +KDSA (COMPUTE DIGITAL SIGNATURE AUTHENTICATION) +- Function code 0x00 - Function Query + +KIMD (COMPUTE INTERMEDIATE MESSAGE DIGEST) +- Function code 0x00 - Function Query +- Function code 0x02 - CPACF_KIMD_SHA_256 +- Function code 0x03 - CPACF_KIMD_SHA_512 + +KLMD (COMPUTE LAST MESSAGE DIGEST) +- Function code 0x00 - Function Query +- Function code 0x02 - CPACF_KLMD_SHA_256 +- Function code 0x03 - CPACF_KLMD_SHA_512 + +KM (CIPHER MESSAGE) +- Function code 0x00 - Function Query +- Function code 0x12 - CPACF_KM_AES_128 +- Function code 0x13 - CPACF_KM_AES_192 +- Function code 0x14 - CPACF_KM_AES_256 +- Function code 0x1a - CPACF_KM_PAES_128 +- Function code 0x1b - CPACF_KM_PAES_192 +- Function code 0x1c - CPACF_KM_PAES_256 +- Function code 0x32 - CPACF_KM_XTS_128 +- Function code 0x34 - CPACF_KM_XTS_256 +- Function code 0x3a - CPACF_KM_PXTS_128 +- Function code 0x3c - CPACF_KM_PXTS_256 + +KMAC (COMPUTE MESSAGE AUTHENTICATION CODE) +- Function code 0x00 - Function Query + +KMC (CIPHER MESSAGE WITH CHAINING) +- Function code 0x00 - Function Query +- Function code 0x12 - CPACF_KMC_AES_128 +- Function code 0x13 - CPACF_KMC_AES_192 +- Function code 0x14 - CPACF_KMC_AES_256 +- Function code 0x1a - CPACF_KMC_PAES_128 +- Function code 0x1b - CPACF_KMC_PAES_192 +- Function code 0x1c - CPACF_KMC_PAES_256 + +KMCTR (CIPHER MESSAGE WITH COUNTER) +- Function code 0x00 - Function Query +- Function code 0x12 - CPACF_KMCTR_AES_128 +- Function code 0x13 - CPACF_KMCTR_AES_192 +- Function code 0x14 - CPACF_KMCTR_AES_256 +- Function code 0x1a - CPACF_KMCTR_PAES_128 +- Function code 0x1b - CPACF_KMCTR_PAES_192 +- Function code 0x1c - CPACF_KMCTR_PAES_256 + +KMF (CIPHER MESSAGE WITH CIPHER FEEDBACK) +- not supported + +KMO (CIPHER MESSAGE WITH OUTPUT FEEDBACK) +- not supported + +PCC (PERFORM CRYPTOGRAPHIC COMPUTATION) +- Function code 0x00 - Function Query +- Function code 0x32 - compute XTS param AES-128 +- Function code 0x34 - compute XTS param AES-256 +- Function code 0x3a - compute XTS param Encrypted AES-128 +- Function code 0x3c - compute XTS param Encrypted AES-256 + +PCKMO (PERFORM CRYPTOGRAPHIC KEY MANAGEMENT OPERATION) +- Function code 0x00 - Function Query +- Function code 0x12 - CPACF_PCKMO_ENC_AES_128_KEY +- Function code 0x13 - CPACF_PCKMO_ENC_AES_192_KEY +- Function code 0x14 - CPACF_PCKMO_ENC_AES_256_KEY + +PRNO (PERFORM RANDOM NUMBER OPERATION) +- Function code 0x00 - Function Query +- Function code 0x72 - CPACF_PRNO_TRNG + +Not listed CPACF instructions (KMA) cause an Operation Exception when +used. Instructions with only query function support (KMF, KMO, KDSA) +perform register validation and raise a Specification Exception for +invalid registers or non-query function codes. The query function for +these instructions will return a function status word with all but the +query function bit set to 0. + + +Protected key support +--------------------- + +The qemu version for protected key support is only a fake provided +here for developing and testing purpose: + +- The protected key is _derived_ from the clear key by xoring the + fixed pattern 0xAAAA... onto the key value. +- The AES Wrapping Key Verification Pattern is a fixed value of 32 + bytes 0x0F0A0C0E0F0A0C0E... + +The PCKMO instruction implementation does exactly this - _derive_ a +_protected_ key from the clear key given by xor 0xAAAA... and writing +the fixed value for the WKVP of 0x0F0A0C0E0F0A0C0E... into the blob. +The other subfunctions of the CPACF instructions dealing with +protected key treat the protected key blob by first checking for the +WKVP (against the fixed value of 0x0F0A0C0E0F0A0C0E...) and second +_decrypting_ the key value by xoring 0xAAAA... and then execute the +clear key operation with the decrypted key value. +This is suitable for testing purpose but such keys are not for real +production load and would open up a huge security breach! + +For more details about protected keys see the "z/Architecture +Principles of Operation" document chapter "General Instructions" +sub-chapter "Protection of Cryptographic Keys" and again the +implementation here does NOT implement what is explained there. diff --git a/docs/system/target-s390x.rst b/docs/system/target-s390x.rst index 8938a13d10..1454dae48d 100644 --- a/docs/system/target-s390x.rst +++ b/docs/system/target-s390x.rst @@ -36,3 +36,4 @@ Architectural features s390x/protvirt s390x/cpu-topology s390x/secure-ipl + s390x/cpacf --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021567; cv=none; d=zohomail.com; s=zohoarc; b=bdejHzpK7ZuUl0p1bzZaUK2UvI/8u+b/vfM8K9LmQ3fqyT1mjFeV+LAl+rjBBdNVvwe5vTPCeqItI5CJtViGFbPudehkjGLRrNr74d/qNdKMNixNbE9zKNz4uvxhev2aCJDWglAF7V7lhLR7M0sY3/x+K35QWN+oVwMn12OPjWs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021567; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=lVLCbtG48/Q/PHIaA1BNsK3Kh/XQ6bxC6ZJURuINT2I=; b=BKemXxjlW4HazaBEIwVxDYSp8fLgJSdYVNria0lkEVRFL2c0gR5l/zz9ou2epS72sh1ipJkbpvqDknsMYr9xRcjb6kuYEv+jdH+ckLzb8uTjuvwIhQOFNU3/lzHggOGU2x5vE3v7HPr83myzHlGSEZgJC2jNXHu0nq8GmgZ9IQY= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021567030573.119670617329; Mon, 21 Sep 2026 13:12:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKI-0006L9-UD; Mon, 21 Sep 2026 16:09:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKB-00069V-5P; Mon, 21 Sep 2026 16:09:15 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kK4-0005NY-Qf; Mon, 21 Sep 2026 16:09:14 -0400 Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8WD61711839; Mon, 21 Sep 2026 20:08:46 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gske1abw5-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:45 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJHgvq1451443; Mon, 21 Sep 2026 20:08:45 GMT Received: from smtprelay06.dal12v.mail.ibm.com ([172.16.1.8]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt67gpu53-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:45 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay06.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8io832965244 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:44 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D2FF058043; Mon, 21 Sep 2026 20:08:43 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3C09B58059; Mon, 21 Sep 2026 20:08:43 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:43 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=lVLCbtG48/Q/PHIaA 1BNsK3Kh/XQ6bxC6ZJURuINT2I=; b=iKxTrHaV4ZJysLxYPxlVu13qXlFSm1gUn /x1wxvVrsyaE+8Maw4ZKVRQO/jgek5+GDQ/hvfVnhUD9n6RAs9yGjA/hekMkX0Qy 8rmNOXDjbfT7Yo1jJc6A1Fh0aO9lhZpY0UT+j0wZi++X4OpU9EpXMTEESPuBnLRI c1usNqWwY2Al6ot8Bj8r/UDVCueO7KQHg3tusnkNfKlxW3NzQmxbJo+w012mNaMU /f5LYZVa23ARPK9AT3vkx6RxQ4/1gYTbIvVkjCA3WKwxEa1UfvBHj9xHt4L00skE rbrpUXNl9FLil6bi8r34RTmAtcrrX5dvTgKpLn6KmBh+50nCmz7Ag== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Harald Freudenberger , Eric Farman Subject: [PULL 20/33] tests/tcg/s390x: Add tests for CPACF instructions Date: Mon, 21 Sep 2026 16:08:17 -0400 Message-ID: <20260921200830.1302919-21-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: l1MUWAQzrE2uQMbk2641b3_DmOz5Uv6Y X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX+PMq++E4A+DJ LyvdbKtx9O9tSNCkw63xaH2aemCQV6gs7aH+et3BP3f3e2FdrlnBI8sC8d7H0dVh3ul2K8BS0bP R912kUWz57djaGu9RubqPJPk9q5dK+cgRtqKk5zE7v5jRwkZ3n1/NGx66uR8oEM9UPHu8AIKqmN +EeDiH0h3O+4KGPO0OeXrx1u7HhVGOpRgypcrYJIMmetMCJ21Vn2N4QtWYCd86+GpbT7NXUAD73 s8VRHQzn9zT3/vS/qIYEauShJSECIfUuYWSJ46LO5Z6xK1VRt7kvmr85lR/AJo1YqAERbqOnNou HMwt0p//BSVxkah3TxxqZDfHZRAuKgMIgVPaT1PrOCgkzlNlrldwL6ikKe6W99dPlYNAjywwj0i Fe9sAeTAbW27mTHeyaFiH5A6bgmBzf/2UNSm/mH563Mr3f/LAk/4Ik4+m2P4cs60fNClhnn0k+M 0jEUY86UCukouInpQIQ== X-Authority-Analysis: v=2.4 cv=O/KsLx9W c=1 sm=1 tr=0 ts=6ab18ece cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=uTGXcgEPX-vUjW6082YA:9 a=9gp5PUktWgSiYFtD:21 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX+FtGagUzVKjy BPInd9nENgBrvEXHB5A/elKpXQNi+zHf9kZUFccIjl1ePCY1vKqjVk7QbgDErT4e0oHv//wTOau KqWw001rAI7OADXSxZPVsoa29YWTDX0= X-Proofpoint-GUID: l1MUWAQzrE2uQMbk2641b3_DmOz5Uv6Y X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 malwarescore=0 phishscore=0 impostorscore=0 suspectscore=0 bulkscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021567611158500 Content-Type: text/plain; charset="utf-8" From: Harald Freudenberger Add simple tests for the CPACF instructions implemented: - kdsa - minimal as only query is implemented - kimd - query, sha256, sha512 - klmd - query, sha256, sha512 - km - query, aes 128, 192, 256 with clear and prot key - kmac - minimal as only query is implemented - kmc - query, aes 128, 192, 256 with clear and prot key - kmctr - query, aes 128, 192, 256 with clear and prot key - pcc - query, xts aes 128, 256 and prot key xts aes 128, 256 - pckmo - run query and check for SIGILL - prno - query, trng No test for kma, kmf, kmo as these instructions are currently not implemented at all. Signed-off-by: Harald Freudenberger Acked-by: Ilya Leoshkevich Link: https://lore.kernel.org/qemu-devel/20260824083204.40877-21-freude@lin= ux.ibm.com [farman@linux.ibm.com: Convert Makefile hunk to meson] Signed-off-by: Eric Farman --- tests/tcg/s390x/cpacf-kdsa.c | 58 ++++ tests/tcg/s390x/cpacf-kimd.c | 166 ++++++++++ tests/tcg/s390x/cpacf-klmd.c | 206 ++++++++++++ tests/tcg/s390x/cpacf-km.c | 590 ++++++++++++++++++++++++++++++++++ tests/tcg/s390x/cpacf-kmac.c | 58 ++++ tests/tcg/s390x/cpacf-kmc.c | 351 ++++++++++++++++++++ tests/tcg/s390x/cpacf-kmctr.c | 360 +++++++++++++++++++++ tests/tcg/s390x/cpacf-pcc.c | 245 ++++++++++++++ tests/tcg/s390x/cpacf-pckmo.c | 45 +++ tests/tcg/s390x/cpacf-prno.c | 131 ++++++++ tests/tcg/s390x/cpacf.h | 570 ++++++++++++++++++++++++++++++++ tests/tcg/s390x/meson.build | 10 + 12 files changed, 2790 insertions(+) create mode 100644 tests/tcg/s390x/cpacf-kdsa.c create mode 100644 tests/tcg/s390x/cpacf-kimd.c create mode 100644 tests/tcg/s390x/cpacf-klmd.c create mode 100644 tests/tcg/s390x/cpacf-km.c create mode 100644 tests/tcg/s390x/cpacf-kmac.c create mode 100644 tests/tcg/s390x/cpacf-kmc.c create mode 100644 tests/tcg/s390x/cpacf-kmctr.c create mode 100644 tests/tcg/s390x/cpacf-pcc.c create mode 100644 tests/tcg/s390x/cpacf-pckmo.c create mode 100644 tests/tcg/s390x/cpacf-prno.c create mode 100644 tests/tcg/s390x/cpacf.h diff --git a/tests/tcg/s390x/cpacf-kdsa.c b/tests/tcg/s390x/cpacf-kdsa.c new file mode 100644 index 0000000000..cc06e60f11 --- /dev/null +++ b/tests/tcg/s390x/cpacf-kdsa.c @@ -0,0 +1,58 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Simple test for the CPACF KDSA instruction + */ + +#include +#include +#include +#include +#include "cpacf.h" + +#define QUERY_BLOCK_SIZE 16 + +/* expected kdsa query block */ +static uint8_t exp_query_block[QUERY_BLOCK_SIZE] =3D { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static int test_kdsa_query(void) +{ + uint8_t query_block[QUERY_BLOCK_SIZE] =3D {0}; + unsigned long cc =3D 0; + int i, rc =3D 0; + + cpacf_kdsa(CPACF_KDSA_QUERY, query_block, NULL, 0, &cc); + + /* compare with expected query block */ + for (i =3D 0; i < QUERY_BLOCK_SIZE; i++) { + if ((query_block[i] & exp_query_block[i]) !=3D exp_query_block[i])= { + rc++; + break; + } + } + + if (rc) { + printf("%s failed\n", __func__); + } + + return rc; +} + +int main(void) +{ + int rc; + + /* Test query function */ + rc =3D test_kdsa_query(); + + /* As of now only KDSA query is implemented */ + + if (rc) { + printf("cpacf-kdsa: %d failures\n", rc); + } + + return rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/tests/tcg/s390x/cpacf-kimd.c b/tests/tcg/s390x/cpacf-kimd.c new file mode 100644 index 0000000000..61c5268ccb --- /dev/null +++ b/tests/tcg/s390x/cpacf-kimd.c @@ -0,0 +1,166 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Simple test for CPACF KIMD instruction + */ + +#include +#include +#include +#include +#include "cpacf.h" + +#define QUERY_BLOCK_SIZE 16 + +/* expected kimd query block */ +static uint8_t exp_query_block[QUERY_BLOCK_SIZE] =3D { + 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +/* SHA-256 test data */ +static const uint8_t sha256in[] =3D { + 0x5a, 0x86, 0xb7, 0x37, 0xea, 0xea, 0x8e, 0xe9, + 0x76, 0xa0, 0xa2, 0x4d, 0xa6, 0x3e, 0x7e, 0xd7, + 0xee, 0xfa, 0xd1, 0x8a, 0x10, 0x1c, 0x12, 0x11, + 0xe2, 0xb3, 0x65, 0x0c, 0x51, 0x87, 0xc2, 0xa8, + 0xa6, 0x50, 0x54, 0x72, 0x08, 0x25, 0x1f, 0x6d, + 0x42, 0x37, 0xe6, 0x61, 0xc7, 0xbf, 0x4c, 0x77, + 0xf3, 0x35, 0x39, 0x03, 0x94, 0xc3, 0x7f, 0xa1, + 0xa9, 0xf9, 0xbe, 0x83, 0x6a, 0xc2, 0x85, 0x09 +}; + +/* SHA-512 test data */ +static const uint8_t sha512in[] =3D { + 0xfd, 0x22, 0x03, 0xe4, 0x67, 0x57, 0x4e, 0x83, + 0x4a, 0xb0, 0x7c, 0x90, 0x97, 0xae, 0x16, 0x45, + 0x32, 0xf2, 0x4b, 0xe1, 0xeb, 0x5d, 0x88, 0xf1, + 0xaf, 0x77, 0x48, 0xce, 0xff, 0x0d, 0x2c, 0x67, + 0xa2, 0x1f, 0x4e, 0x40, 0x97, 0xf9, 0xd3, 0xbb, + 0x4e, 0x9f, 0xbf, 0x97, 0x18, 0x6e, 0x0d, 0xb6, + 0xdb, 0x01, 0x00, 0x23, 0x0a, 0x52, 0xb4, 0x53, + 0xd4, 0x21, 0xf8, 0xab, 0x9c, 0x9a, 0x60, 0x43, + 0xaa, 0x32, 0x95, 0xea, 0x20, 0xd2, 0xf0, 0x6a, + 0x2f, 0x37, 0x47, 0x0d, 0x8a, 0x99, 0x07, 0x5f, + 0x1b, 0x8a, 0x83, 0x36, 0xf6, 0x22, 0x8c, 0xf0, + 0x8b, 0x59, 0x42, 0xfc, 0x1f, 0xb4, 0x29, 0x9c, + 0x7d, 0x24, 0x80, 0xe8, 0xe8, 0x2b, 0xce, 0x17, + 0x55, 0x40, 0xbd, 0xfa, 0xd7, 0x75, 0x2b, 0xc9, + 0x5b, 0x57, 0x7f, 0x22, 0x95, 0x15, 0x39, 0x4f, + 0x3a, 0xe5, 0xce, 0xc8, 0x70, 0xa4, 0xb2, 0xf8 +}; + +/* + * Query test for kimd + * returns > 0 on failure, otherwise 0 + */ +static int test_kimd_query(void) +{ + uint8_t query_block[QUERY_BLOCK_SIZE] =3D {0}; + unsigned long cc =3D 0; + int i, rc =3D 0; + + cpacf_kimd(CPACF_KIMD_QUERY, query_block, NULL, 0, &cc); + + /* compare with expected query block */ + for (i =3D 0; i < QUERY_BLOCK_SIZE; i++) { + if ((query_block[i] & exp_query_block[i]) !=3D exp_query_block[i])= { + rc++; + break; + } + } + + if (rc) { + printf("%s failed\n", __func__); + } + + return rc; +} + +/* + * Subfunction CPACF_KIMD_SHA_256 test for kimd + * returns > 0 on failure, otherwise 0 + */ +static int test_kimd_sha256(void) +{ + uint32_t param[8]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Initialize SHA-256 hash values */ + param[0] =3D 0x6a09e667u; + param[1] =3D 0xbb67ae85u; + param[2] =3D 0x3c6ef372u; + param[3] =3D 0xa54ff53au; + param[4] =3D 0x510e527fu; + param[5] =3D 0x9b05688cu; + param[6] =3D 0x1f83d9abu; + param[7] =3D 0x5be0cd19u; + + /* Process input data */ + cpacf_kimd(CPACF_KIMD_SHA_256, param, sha256in, sizeof(sha256in), &cc); + + /* No check of the result in param block as this is an intermediate va= lue */ + + /* Check for correct condition code (should be 0 on success) */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KIMD_SHA_512 test for kimd + * returns > 0 on failure, otherwise 0 + */ +static int test_kimd_sha512(void) +{ + uint64_t param[8]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Initialize SHA-512 hash values */ + param[0] =3D 0x6a09e667f3bcc908lu; + param[1] =3D 0xbb67ae8584caa73blu; + param[2] =3D 0x3c6ef372fe94f82blu; + param[3] =3D 0xa54ff53a5f1d36f1lu; + param[4] =3D 0x510e527fade682d1lu; + param[5] =3D 0x9b05688c2b3e6c1flu; + param[6] =3D 0x1f83d9abfb41bd6blu; + param[7] =3D 0x5be0cd19137e2179lu; + + /* Process input data */ + cpacf_kimd(CPACF_KIMD_SHA_512, param, sha512in, sizeof(sha512in), &cc); + + /* No check of the result in param block as this is an intermediate va= lue */ + + /* Check for correct condition code (should be 0 on success) */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + return rc; +} + +int main(void) +{ + int rc =3D 0; + + /* Test query function */ + rc +=3D test_kimd_query(); + + /* Test SHA-256 */ + rc +=3D test_kimd_sha256(); + + /* Test SHA-512 */ + rc +=3D test_kimd_sha512(); + + if (rc) { + printf("cpacf-kimd: %d failures\n", rc); + } + + return rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/tests/tcg/s390x/cpacf-klmd.c b/tests/tcg/s390x/cpacf-klmd.c new file mode 100644 index 0000000000..1761bb64f9 --- /dev/null +++ b/tests/tcg/s390x/cpacf-klmd.c @@ -0,0 +1,206 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Simple test for CPACF KLMD instruction + */ + +#include +#include +#include +#include +#include "cpacf.h" + +#define QUERY_BLOCK_SIZE 16 + +/* expected klmd query block */ +static uint8_t exp_query_block[QUERY_BLOCK_SIZE] =3D { + 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +/* SHA-256 test data */ +static const uint8_t sha256in[] =3D { + 0x5a, 0x86, 0xb7, 0x37, 0xea, 0xea, 0x8e, 0xe9, + 0x76, 0xa0, 0xa2, 0x4d, 0xa6, 0x3e, 0x7e, 0xd7, + 0xee, 0xfa, 0xd1, 0x8a, 0x10, 0x1c, 0x12, 0x11, + 0xe2, 0xb3, 0x65, 0x0c, 0x51, 0x87, 0xc2, 0xa8, + 0xa6, 0x50, 0x54, 0x72, 0x08, 0x25, 0x1f, 0x6d, + 0x42, 0x37, 0xe6, 0x61, 0xc7, 0xbf, 0x4c, 0x77, + 0xf3, 0x35, 0x39, 0x03, 0x94, 0xc3, 0x7f, 0xa1, + 0xa9, 0xf9, 0xbe, 0x83, 0x6a, 0xc2, 0x85, 0x09 +}; + +static const uint8_t sha256md[] =3D { + 0x42, 0xe6, 0x1e, 0x17, 0x4f, 0xbb, 0x38, 0x97, + 0xd6, 0xdd, 0x6c, 0xef, 0x3d, 0xd2, 0x80, 0x2f, + 0xe6, 0x7b, 0x33, 0x19, 0x53, 0xb0, 0x61, 0x14, + 0xa6, 0x5c, 0x77, 0x28, 0x59, 0xdf, 0xc1, 0xaa +}; + +/* SHA-512 test data */ +static const uint8_t sha512in[] =3D { + 0xfd, 0x22, 0x03, 0xe4, 0x67, 0x57, 0x4e, 0x83, + 0x4a, 0xb0, 0x7c, 0x90, 0x97, 0xae, 0x16, 0x45, + 0x32, 0xf2, 0x4b, 0xe1, 0xeb, 0x5d, 0x88, 0xf1, + 0xaf, 0x77, 0x48, 0xce, 0xff, 0x0d, 0x2c, 0x67, + 0xa2, 0x1f, 0x4e, 0x40, 0x97, 0xf9, 0xd3, 0xbb, + 0x4e, 0x9f, 0xbf, 0x97, 0x18, 0x6e, 0x0d, 0xb6, + 0xdb, 0x01, 0x00, 0x23, 0x0a, 0x52, 0xb4, 0x53, + 0xd4, 0x21, 0xf8, 0xab, 0x9c, 0x9a, 0x60, 0x43, + 0xaa, 0x32, 0x95, 0xea, 0x20, 0xd2, 0xf0, 0x6a, + 0x2f, 0x37, 0x47, 0x0d, 0x8a, 0x99, 0x07, 0x5f, + 0x1b, 0x8a, 0x83, 0x36, 0xf6, 0x22, 0x8c, 0xf0, + 0x8b, 0x59, 0x42, 0xfc, 0x1f, 0xb4, 0x29, 0x9c, + 0x7d, 0x24, 0x80, 0xe8, 0xe8, 0x2b, 0xce, 0x17, + 0x55, 0x40, 0xbd, 0xfa, 0xd7, 0x75, 0x2b, 0xc9, + 0x5b, 0x57, 0x7f, 0x22, 0x95, 0x15, 0x39, 0x4f, + 0x3a, 0xe5, 0xce, 0xc8, 0x70, 0xa4, 0xb2, 0xf8 +}; + +static const uint8_t sha512md[] =3D { + 0xa2, 0x1b, 0x10, 0x77, 0xd5, 0x2b, 0x27, 0xac, + 0x54, 0x5a, 0xf6, 0x3b, 0x32, 0x74, 0x6c, 0x6e, + 0x3c, 0x51, 0xcb, 0x0c, 0xb9, 0xf2, 0x81, 0xeb, + 0x9f, 0x35, 0x80, 0xa6, 0xd4, 0x99, 0x6d, 0x5c, + 0x99, 0x17, 0xd2, 0xa6, 0xe4, 0x84, 0x62, 0x7a, + 0x9d, 0x5a, 0x06, 0xfa, 0x1b, 0x25, 0x32, 0x7a, + 0x9d, 0x71, 0x0e, 0x02, 0x73, 0x87, 0xfc, 0x3e, + 0x07, 0xd7, 0xc4, 0xd1, 0x4c, 0x60, 0x86, 0xcc +}; + +/* + * Query test for klmd + * returns > 0 on failure, otherwise 0 + */ +static int test_klmd_query(void) +{ + uint8_t query_block[QUERY_BLOCK_SIZE] =3D {0}; + unsigned long cc =3D 0; + int i, rc =3D 0; + + cpacf_klmd(CPACF_KLMD_QUERY, query_block, NULL, 0, NULL, 0, &cc); + + /* compare with expected query block */ + for (i =3D 0; i < QUERY_BLOCK_SIZE; i++) { + if ((query_block[i] & exp_query_block[i]) !=3D exp_query_block[i])= { + rc++; + break; + } + } + + if (rc) { + printf("%s failed\n", __func__); + } + + return rc; +} + +/* + * Subfunction CPACF_KLMD_SHA_256 test for klmd + * returns > 0 on failure, otherwise 0 + */ +static int test_klmd_sha256(void) +{ + uint8_t param[40]; /* 32 bytes hash + 8 bytes message bit length */ + uint32_t *hash =3D (uint32_t *)param; + uint64_t *mbl =3D (uint64_t *)(param + 32); + unsigned long cc =3D 0; + int rc =3D 0; + + /* Initialize SHA-256 hash values (H0-H7) */ + hash[0] =3D 0x6a09e667u; + hash[1] =3D 0xbb67ae85u; + hash[2] =3D 0x3c6ef372u; + hash[3] =3D 0xa54ff53au; + hash[4] =3D 0x510e527fu; + hash[5] =3D 0x9b05688cu; + hash[6] =3D 0x1f83d9abu; + hash[7] =3D 0x5be0cd19u; + + /* Set message bit length for KLMD */ + *mbl =3D sizeof(sha256in) * 8; + + /* Process input data with KLMD (finalize hash) */ + cpacf_klmd(CPACF_KLMD_SHA_256, param, sha256in, + sizeof(sha256in), NULL, 0, &cc); + + /* Check for correct condition code (should be 0 on success) */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare hash result in param with expected message digest */ + if (memcmp(param, sha256md, sizeof(sha256md))) { + printf("%s failed: hash mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KLMD_SHA_512 test for klmd + * returns > 0 on failure, otherwise 0 + */ +static int test_klmd_sha512(void) +{ + uint8_t param[80]; /* 64 bytes hash + 16 bytes message bit length */ + uint64_t *hash =3D (uint64_t *)param; + uint64_t *mbl_high =3D (uint64_t *)(param + 64); + uint64_t *mbl_low =3D (uint64_t *)(param + 72); + unsigned long cc =3D 0; + int rc =3D 0; + + /* Initialize SHA-512 hash values (H0-H7) */ + hash[0] =3D 0x6a09e667f3bcc908lu; + hash[1] =3D 0xbb67ae8584caa73blu; + hash[2] =3D 0x3c6ef372fe94f82blu; + hash[3] =3D 0xa54ff53a5f1d36f1lu; + hash[4] =3D 0x510e527fade682d1lu; + hash[5] =3D 0x9b05688c2b3e6c1flu; + hash[6] =3D 0x1f83d9abfb41bd6blu; + hash[7] =3D 0x5be0cd19137e2179lu; + + /* Set message bit length for KLMD (128-bit, high and low) */ + *mbl_high =3D 0; + *mbl_low =3D sizeof(sha512in) * 8; + + /* Process input data with KLMD (finalize hash) */ + cpacf_klmd(CPACF_KLMD_SHA_512, param, sha512in, + sizeof(sha512in), NULL, 0, &cc); + + /* Check for correct condition code (should be 0 on success) */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare hash result in param with expected message digest */ + if (memcmp(param, sha512md, sizeof(sha512md))) { + printf("%s failed: hash mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +int main(void) +{ + int rc =3D 0; + + /* Test query function */ + rc +=3D test_klmd_query(); + + /* Test SHA-256 */ + rc +=3D test_klmd_sha256(); + + /* Test SHA-512 */ + rc +=3D test_klmd_sha512(); + + if (rc) { + printf("cpacf-klmd: %d failures\n", rc); + } + + return rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/tests/tcg/s390x/cpacf-km.c b/tests/tcg/s390x/cpacf-km.c new file mode 100644 index 0000000000..35a5ecbfef --- /dev/null +++ b/tests/tcg/s390x/cpacf-km.c @@ -0,0 +1,590 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Simple test for CPACF KM instruction + */ + +#include +#include +#include +#include +#include "cpacf.h" + +#define QUERY_BLOCK_SIZE 16 + +/* expected km query block */ +static uint8_t exp_query_block[QUERY_BLOCK_SIZE] =3D { + 0x80, 0x00, 0x38, 0x38, 0x00, 0x00, 0x28, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +/* KM AES-128 test data */ +static const uint8_t kmaes128key[] =3D { + 0xed, 0xfd, 0xb2, 0x57, 0xcb, 0x37, 0xcd, 0xf1, + 0x82, 0xc5, 0x45, 0x5b, 0x0c, 0x0e, 0xfe, 0xbb +}; +static const uint8_t kmaes128plain[] =3D { + 0x16, 0x95, 0xfe, 0x47, 0x54, 0x21, 0xca, 0xce, + 0x35, 0x57, 0xda, 0xca, 0x01, 0xf4, 0x45, 0xff +}; +static const uint8_t kmaes128cipher[] =3D { + 0x78, 0x88, 0xbe, 0xae, 0x6e, 0x7a, 0x42, 0x63, + 0x32, 0xa7, 0xea, 0xa2, 0xf8, 0x08, 0xe6, 0x37 +}; + +/* KM AES-192 test data */ +static const uint8_t kmaes192key[] =3D { + 0x61, 0x39, 0x6c, 0x53, 0x0c, 0xc1, 0x74, 0x9a, + 0x5b, 0xab, 0x6f, 0xbc, 0xf9, 0x06, 0xfe, 0x67, + 0x2d, 0x0c, 0x4a, 0xb2, 0x01, 0xaf, 0x45, 0x54 +}; +static const uint8_t kmaes192plain[] =3D { + 0x60, 0xbc, 0xdb, 0x94, 0x16, 0xba, 0xc0, 0x8d, + 0x7f, 0xd0, 0xd7, 0x80, 0x35, 0x37, 0x40, 0xa5 +}; +static const uint8_t kmaes192cipher[] =3D { + 0x24, 0xf4, 0x0c, 0x4e, 0xec, 0xd9, 0xc4, 0x98, + 0x25, 0x00, 0x0f, 0xcb, 0x49, 0x72, 0x64, 0x7a +}; + +/* KM AES-256 test data */ +static const uint8_t kmaes256key[] =3D { + 0xcc, 0x22, 0xda, 0x78, 0x7f, 0x37, 0x57, 0x11, + 0xc7, 0x63, 0x02, 0xbe, 0xf0, 0x97, 0x9d, 0x8e, + 0xdd, 0xf8, 0x42, 0x82, 0x9c, 0x2b, 0x99, 0xef, + 0x3d, 0xd0, 0x4e, 0x23, 0xe5, 0x4c, 0xc2, 0x4b +}; +static const uint8_t kmaes256plain[] =3D { + 0xcc, 0xc6, 0x2c, 0x6b, 0x0a, 0x09, 0xa6, 0x71, + 0xd6, 0x44, 0x56, 0x81, 0x8d, 0xb2, 0x9a, 0x4d +}; +static const uint8_t kmaes256cipher[] =3D { + 0xdf, 0x86, 0x34, 0xca, 0x02, 0xb1, 0x3a, 0x12, + 0x5b, 0x78, 0x6e, 0x1d, 0xce, 0x90, 0x65, 0x8b +}; + +/* KM AES XTS-128 test data */ +static const uint8_t kmaesxts128key1[] =3D { + 0xa1, 0xb9, 0x0c, 0xba, 0x3f, 0x06, 0xac, 0x35, + 0x3b, 0x2c, 0x34, 0x38, 0x76, 0x08, 0x17, 0x62 +}; +static const uint8_t kmaesxts128key2[] =3D { + 0x09, 0x09, 0x23, 0x02, 0x6e, 0x91, 0x77, 0x18, + 0x15, 0xf2, 0x9d, 0xab, 0x01, 0x93, 0x2f, 0x2f +}; +static const uint8_t kmaesxts128sect[] =3D { + 0x4f, 0xae, 0xf7, 0x11, 0x7c, 0xda, 0x59, 0xc6, + 0x6e, 0x4b, 0x92, 0x01, 0x3e, 0x76, 0x8a, 0xd5 +}; +static const uint8_t kmaesxts128plain[] =3D { + 0xeb, 0xab, 0xce, 0x95, 0xb1, 0x4d, 0x3c, 0x8d, + 0x6f, 0xb3, 0x50, 0x39, 0x07, 0x90, 0x31, 0x1c +}; +static const uint8_t kmaesxts128cipher[] =3D { + 0x77, 0x8a, 0xe8, 0xb4, 0x3c, 0xb9, 0x8d, 0x5a, + 0x82, 0x50, 0x81, 0xd5, 0xbe, 0x47, 0x1c, 0x63 +}; + +/* KM AES XTS-256 test data */ +static const uint8_t kmaesxts256key1[] =3D { + 0x1e, 0xa6, 0x61, 0xc5, 0x8d, 0x94, 0x3a, 0x0e, + 0x48, 0x01, 0xe4, 0x2f, 0x4b, 0x09, 0x47, 0x14, + 0x9e, 0x7f, 0x9f, 0x8e, 0x3e, 0x68, 0xd0, 0xc7, + 0x50, 0x52, 0x10, 0xbd, 0x31, 0x1a, 0x0e, 0x7c +}; +static const uint8_t kmaesxts256key2[] =3D { + 0xd6, 0xe1, 0x3f, 0xfd, 0xf2, 0x41, 0x8d, 0x8d, + 0x19, 0x11, 0xc0, 0x04, 0xcd, 0xa5, 0x8d, 0xa3, + 0xd6, 0x19, 0xb7, 0xe2, 0xb9, 0x14, 0x1e, 0x58, + 0x31, 0x8e, 0xea, 0x39, 0x2c, 0xf4, 0x1b, 0x08 +}; +static const uint8_t kmaesxts256sect[] =3D { + 0xad, 0xf8, 0xd9, 0x26, 0x27, 0x46, 0x4a, 0xd2, + 0xf0, 0x42, 0x8e, 0x84, 0xa9, 0xf8, 0x75, 0x64 +}; +static const uint8_t kmaesxts256plain[] =3D { + 0x2e, 0xed, 0xea, 0x52, 0xcd, 0x82, 0x15, 0xe1, + 0xac, 0xc6, 0x47, 0xe8, 0x10, 0xbb, 0xc3, 0x64, + 0x2e, 0x87, 0x28, 0x7f, 0x8d, 0x2e, 0x57, 0xe3, + 0x6c, 0x0a, 0x24, 0xfb, 0xc1, 0x2a, 0x20, 0x2e +}; +static const uint8_t kmaesxts256cipher[] =3D { + 0xcb, 0xaa, 0xd0, 0xe2, 0xf6, 0xce, 0xa3, 0xf5, + 0x0b, 0x37, 0xf9, 0x34, 0xd4, 0x6a, 0x9b, 0x13, + 0x0b, 0x9d, 0x54, 0xf0, 0x7e, 0x34, 0xf3, 0x6a, + 0xf7, 0x93, 0xe8, 0x6f, 0x73, 0xc6, 0xd7, 0xdb +}; + +/* static byte array containing the WKVP */ +static const uint8_t protkey_wkvp[32] =3D PROTKEY_WKVP; + +/* + * Query test for km + * returns > 0 on failure, otherwise 0 + */ +static int test_km_query(void) +{ + uint8_t query_block[QUERY_BLOCK_SIZE] =3D {0}; + unsigned long cc =3D 0; + int i, rc =3D 0; + + cpacf_km(CPACF_KM_QUERY, query_block, NULL, NULL, 0, &cc); + + /* compare with expected query block */ + for (i =3D 0; i < QUERY_BLOCK_SIZE; i++) { + if ((query_block[i] & exp_query_block[i]) !=3D exp_query_block[i])= { + rc++; + break; + } + } + + if (rc) { + printf("%s failed\n", __func__); + } + + return rc; +} + +/* + * Subfunction CPACF_KM_AES_128 test for km + * returns > 0 on failure, otherwise 0 + */ +static int test_km_aes_128(void) +{ + uint8_t param[16]; /* key only, no IV for ECB mode */ + uint8_t output[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: key only */ + memcpy(param, kmaes128key, sizeof(kmaes128key)); + + /* Encrypt */ + cpacf_km(CPACF_KM_AES_128, param, output, kmaes128plain, + sizeof(kmaes128plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmaes128cipher, sizeof(kmaes128cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KM_AES_192 test for km + * returns > 0 on failure, otherwise 0 + */ +static int test_km_aes_192(void) +{ + uint8_t param[24]; /* key only, no IV for ECB mode */ + uint8_t output[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: key only */ + memcpy(param, kmaes192key, sizeof(kmaes192key)); + + /* Encrypt */ + cpacf_km(CPACF_KM_AES_192, param, output, kmaes192plain, + sizeof(kmaes192plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmaes192cipher, sizeof(kmaes192cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KM_AES_256 test for km + * returns > 0 on failure, otherwise 0 + */ +static int test_km_aes_256(void) +{ + uint8_t param[32]; /* key only, no IV for ECB mode */ + uint8_t output[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: key only */ + memcpy(param, kmaes256key, sizeof(kmaes256key)); + + /* Encrypt */ + cpacf_km(CPACF_KM_AES_256, param, output, kmaes256plain, + sizeof(kmaes256plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmaes256cipher, sizeof(kmaes256cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KM_PAES_128 test for km + * returns > 0 on failure, otherwise 0 + */ +static int test_km_paes_128(void) +{ + uint8_t param[16 + 32]; /* protected key + wkvp */ + uint8_t output[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: protected key + wkvp */ + memcpy(param, kmaes128key, sizeof(kmaes128key)); + encrypt_clrkey(param, sizeof(kmaes128key)); + memcpy(param + sizeof(kmaes128key), protkey_wkvp, sizeof(protkey_wkvp)= ); + + /* Encrypt */ + cpacf_km(CPACF_KM_PAES_128, param, output, kmaes128plain, + sizeof(kmaes128plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmaes128cipher, sizeof(kmaes128cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KM_PAES_192 test for km + * returns > 0 on failure, otherwise 0 + */ +static int test_km_paes_192(void) +{ + uint8_t param[24 + 32]; /* protected key + wkvp */ + uint8_t output[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: protected key + wkvp */ + memcpy(param, kmaes192key, sizeof(kmaes192key)); + encrypt_clrkey(param, sizeof(kmaes192key)); + memcpy(param + sizeof(kmaes192key), protkey_wkvp, sizeof(protkey_wkvp)= ); + + /* Encrypt */ + cpacf_km(CPACF_KM_PAES_192, param, output, kmaes192plain, + sizeof(kmaes192plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmaes192cipher, sizeof(kmaes192cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KM_PAES_256 test for km + * returns > 0 on failure, otherwise 0 + */ +static int test_km_paes_256(void) +{ + uint8_t param[32 + 32]; /* protected key + wkvp */ + uint8_t output[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: protected key + wkvp */ + memcpy(param, kmaes256key, sizeof(kmaes256key)); + encrypt_clrkey(param, sizeof(kmaes256key)); + memcpy(param + sizeof(kmaes256key), protkey_wkvp, sizeof(protkey_wkvp)= ); + + /* Encrypt */ + cpacf_km(CPACF_KM_PAES_256, param, output, kmaes256plain, + sizeof(kmaes256plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmaes256cipher, sizeof(kmaes256cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KM_XTS_128 test for km + * returns > 0 on failure, otherwise 0 + */ +static int test_km_xts_128(void) +{ + uint8_t param[16 + 16]; /* key + initial XTS value */ + uint8_t output[16]; + uint8_t init_xts[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* First compute initial XTS value using key2 and sector */ + memcpy(param, kmaesxts128key2, sizeof(kmaesxts128key2)); + cpacf_km(CPACF_KM_AES_128, param, init_xts, kmaesxts128sect, + sizeof(kmaesxts128sect), &cc); + + if (cc !=3D 0) { + printf("%s failed: initial XTS computation cc=3D%lu\n", __func__, = cc); + return 1; + } + + /* Setup parameter block: key1 + initial XTS value */ + memcpy(param, kmaesxts128key1, sizeof(kmaesxts128key1)); + memcpy(param + 16, init_xts, sizeof(init_xts)); + + /* Encrypt */ + cpacf_km(CPACF_KM_XTS_128, param, output, kmaesxts128plain, + sizeof(kmaesxts128plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmaesxts128cipher, sizeof(kmaesxts128cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KM_XTS_256 test for km + * returns > 0 on failure, otherwise 0 + */ +static int test_km_xts_256(void) +{ + uint8_t param[32 + 16]; /* key + initial XTS value */ + uint8_t output[32]; + uint8_t init_xts[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* First compute initial XTS value using key2 and sector */ + memcpy(param, kmaesxts256key2, sizeof(kmaesxts256key2)); + cpacf_km(CPACF_KM_AES_256, param, init_xts, kmaesxts256sect, + sizeof(kmaesxts256sect), &cc); + + if (cc !=3D 0) { + printf("%s failed: initial XTS computation cc=3D%lu\n", __func__, = cc); + return 1; + } + + /* Setup parameter block: key1 + initial XTS value */ + memcpy(param, kmaesxts256key1, sizeof(kmaesxts256key1)); + memcpy(param + 32, init_xts, sizeof(init_xts)); + + /* Encrypt */ + cpacf_km(CPACF_KM_XTS_256, param, output, kmaesxts256plain, + sizeof(kmaesxts256plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmaesxts256cipher, sizeof(kmaesxts256cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KM_PXTS_128 test for km + * returns > 0 on failure, otherwise 0 + */ +static int test_km_pxts_128(void) +{ + uint8_t param[16 + 32 + 16]; /* protected key + wkvp + initial XTS val= ue */ + uint8_t output[16]; + uint8_t init_xts[16]; + uint8_t key2_param[16 + 32]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* First compute initial XTS value using protected key2 and sector */ + memcpy(key2_param, kmaesxts128key2, sizeof(kmaesxts128key2)); + encrypt_clrkey(key2_param, sizeof(kmaesxts128key2)); + memcpy(key2_param + sizeof(kmaesxts128key2), + protkey_wkvp, sizeof(protkey_wkvp)); + + cpacf_km(CPACF_KM_PAES_128, key2_param, init_xts, kmaesxts128sect, + sizeof(kmaesxts128sect), &cc); + + if (cc !=3D 0) { + printf("%s failed: initial XTS computation cc=3D%lu\n", __func__, = cc); + return 1; + } + + /* Setup parameter block: protected key1 + wkvp + initial XTS value */ + memcpy(param, kmaesxts128key1, sizeof(kmaesxts128key1)); + encrypt_clrkey(param, sizeof(kmaesxts128key1)); + memcpy(param + sizeof(kmaesxts128key1), protkey_wkvp, sizeof(protkey_w= kvp)); + memcpy(param + sizeof(kmaesxts128key1) + sizeof(protkey_wkvp), + init_xts, sizeof(init_xts)); + + /* Encrypt */ + cpacf_km(CPACF_KM_PXTS_128, param, output, kmaesxts128plain, + sizeof(kmaesxts128plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmaesxts128cipher, sizeof(kmaesxts128cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KM_PXTS_256 test for km + * returns > 0 on failure, otherwise 0 + */ +static int test_km_pxts_256(void) +{ + uint8_t param[32 + 32 + 16]; /* protected key + wkvp + initial XTS val= ue */ + uint8_t output[32]; + uint8_t init_xts[16]; + uint8_t key2_param[32 + 32]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* First compute initial XTS value using protected key2 and sector */ + memcpy(key2_param, kmaesxts256key2, sizeof(kmaesxts256key2)); + encrypt_clrkey(key2_param, sizeof(kmaesxts256key2)); + memcpy(key2_param + sizeof(kmaesxts256key2), + protkey_wkvp, sizeof(protkey_wkvp)); + + cpacf_km(CPACF_KM_PAES_256, key2_param, init_xts, kmaesxts256sect, + sizeof(kmaesxts256sect), &cc); + + if (cc !=3D 0) { + printf("%s failed: initial XTS computation cc=3D%lu\n", __func__, = cc); + return 1; + } + + /* Setup parameter block: protected key1 + wkvp + initial XTS value */ + memcpy(param, kmaesxts256key1, sizeof(kmaesxts256key1)); + encrypt_clrkey(param, sizeof(kmaesxts256key1)); + memcpy(param + sizeof(kmaesxts256key1), protkey_wkvp, sizeof(protkey_w= kvp)); + memcpy(param + sizeof(kmaesxts256key1) + sizeof(protkey_wkvp), + init_xts, sizeof(init_xts)); + + /* Encrypt */ + cpacf_km(CPACF_KM_PXTS_256, param, output, kmaesxts256plain, + sizeof(kmaesxts256plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmaesxts256cipher, sizeof(kmaesxts256cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +int main(void) +{ + int rc =3D 0; + + /* Test query function */ + rc +=3D test_km_query(); + + /* Test AES-128 */ + rc +=3D test_km_aes_128(); + + /* Test AES-192 */ + rc +=3D test_km_aes_192(); + + /* Test AES-256 */ + rc +=3D test_km_aes_256(); + + /* Test PAES-128 */ + rc +=3D test_km_paes_128(); + + /* Test PAES-192 */ + rc +=3D test_km_paes_192(); + + /* Test PAES-256 */ + rc +=3D test_km_paes_256(); + + /* Test XTS-128 */ + rc +=3D test_km_xts_128(); + + /* Test XTS-256 */ + rc +=3D test_km_xts_256(); + + /* Test PXTS-128 */ + rc +=3D test_km_pxts_128(); + + /* Test PXTS-256 */ + rc +=3D test_km_pxts_256(); + + if (rc) { + printf("cpacf-km: %d failures\n", rc); + } + + return rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/tests/tcg/s390x/cpacf-kmac.c b/tests/tcg/s390x/cpacf-kmac.c new file mode 100644 index 0000000000..c9ef847110 --- /dev/null +++ b/tests/tcg/s390x/cpacf-kmac.c @@ -0,0 +1,58 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Simple test for the CPACF KMAC instruction + */ + +#include +#include +#include +#include +#include "cpacf.h" + +#define QUERY_BLOCK_SIZE 16 + +/* expected kmac query block */ +static uint8_t exp_query_block[QUERY_BLOCK_SIZE] =3D { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static int test_kmac_query(void) +{ + uint8_t query_block[QUERY_BLOCK_SIZE] =3D {0}; + unsigned long cc =3D 0; + int i, rc =3D 0; + + cpacf_kmac(CPACF_KMAC_QUERY, query_block, NULL, 0, &cc); + + /* compare with expected query block */ + for (i =3D 0; i < QUERY_BLOCK_SIZE; i++) { + if ((query_block[i] & exp_query_block[i]) !=3D exp_query_block[i])= { + rc++; + break; + } + } + + if (rc) { + printf("%s failed\n", __func__); + } + + return rc; +} + +int main(void) +{ + int rc; + + /* Test query function */ + rc =3D test_kmac_query(); + + /* As of now only KMAC query is implemented */ + + if (rc) { + printf("cpacf-kmac: %d failures\n", rc); + } + + return rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/tests/tcg/s390x/cpacf-kmc.c b/tests/tcg/s390x/cpacf-kmc.c new file mode 100644 index 0000000000..671a8f3171 --- /dev/null +++ b/tests/tcg/s390x/cpacf-kmc.c @@ -0,0 +1,351 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Simple test for CPACF KMC instruction + */ + +#include +#include +#include +#include +#include "cpacf.h" + +#define QUERY_BLOCK_SIZE 16 + +/* expected kmc query block */ +static uint8_t exp_query_block[QUERY_BLOCK_SIZE] =3D { + 0x80, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +/* KMC AES-128 test data */ +static const uint8_t kmcaes128key[] =3D { + 0x1f, 0x8e, 0x49, 0x73, 0x95, 0x3f, 0x3f, 0xb0, + 0xbd, 0x6b, 0x16, 0x66, 0x2e, 0x9a, 0x3c, 0x17 +}; +static const uint8_t kmcaes128iv[] =3D { + 0x2f, 0xe2, 0xb3, 0x33, 0xce, 0xda, 0x8f, 0x98, + 0xf4, 0xa9, 0x9b, 0x40, 0xd2, 0xcd, 0x34, 0xa8 +}; +static const uint8_t kmcaes128plain[] =3D { + 0x45, 0xcf, 0x12, 0x96, 0x4f, 0xc8, 0x24, 0xab, + 0x76, 0x61, 0x6a, 0xe2, 0xf4, 0xbf, 0x08, 0x22 +}; +static const uint8_t kmcaes128cipher[] =3D { + 0x0f, 0x61, 0xc4, 0xd4, 0x4c, 0x51, 0x47, 0xc0, + 0x3c, 0x19, 0x5a, 0xd7, 0xe2, 0xcc, 0x12, 0xb2 +}; + +/* KMC AES-192 test data */ +static const uint8_t kmcaes192key[] =3D { + 0xba, 0x75, 0xf4, 0xd1, 0xd9, 0xd7, 0xcf, 0x7f, + 0x55, 0x14, 0x45, 0xd5, 0x6c, 0xc1, 0xa8, 0xab, + 0x2a, 0x07, 0x8e, 0x15, 0xe0, 0x49, 0xdc, 0x2c +}; +static const uint8_t kmcaes192iv[] =3D { + 0x53, 0x1c, 0xe7, 0x81, 0x76, 0x40, 0x16, 0x66, + 0xaa, 0x30, 0xdb, 0x94, 0xec, 0x4a, 0x30, 0xeb +}; +static const uint8_t kmcaes192plain[] =3D { + 0xc5, 0x1f, 0xc2, 0x76, 0x77, 0x4d, 0xad, 0x94, + 0xbc, 0xdc, 0x1d, 0x28, 0x91, 0xec, 0x86, 0x68 +}; +static const uint8_t kmcaes192cipher[] =3D { + 0x70, 0xdd, 0x95, 0xa1, 0x4e, 0xe9, 0x75, 0xe2, + 0x39, 0xdf, 0x36, 0xff, 0x4a, 0xee, 0x1d, 0x5d +}; + +/* KMC AES-256 test data */ +static const uint8_t kmcaes256key[] =3D { + 0x6e, 0xd7, 0x6d, 0x2d, 0x97, 0xc6, 0x9f, 0xd1, + 0x33, 0x95, 0x89, 0x52, 0x39, 0x31, 0xf2, 0xa6, + 0xcf, 0xf5, 0x54, 0xb1, 0x5f, 0x73, 0x8f, 0x21, + 0xec, 0x72, 0xdd, 0x97, 0xa7, 0x33, 0x09, 0x07 +}; +static const uint8_t kmcaes256iv[] =3D { + 0x85, 0x1e, 0x87, 0x64, 0x77, 0x6e, 0x67, 0x96, + 0xaa, 0xb7, 0x22, 0xdb, 0xb6, 0x44, 0xac, 0xe8 +}; +static const uint8_t kmcaes256plain[] =3D { + 0x62, 0x82, 0xb8, 0xc0, 0x5c, 0x5c, 0x15, 0x30, + 0xb9, 0x7d, 0x48, 0x16, 0xca, 0x43, 0x47, 0x62 +}; +static const uint8_t kmcaes256cipher[] =3D { + 0x6a, 0xcc, 0x04, 0x14, 0x2e, 0x10, 0x0a, 0x65, + 0xf5, 0x1b, 0x97, 0xad, 0xf5, 0x17, 0x2c, 0x41 +}; + +/* static byte array containing the WKVP */ +static const uint8_t protkey_wkvp[32] =3D PROTKEY_WKVP; + +/* + * Query test for kmc + * returns > 0 on failure, otherwise 0 + */ +static int test_kmc_query(void) +{ + uint8_t query_block[QUERY_BLOCK_SIZE] =3D {0}; + unsigned long cc =3D 0; + int i, rc =3D 0; + + cpacf_kmc(CPACF_KMC_QUERY, query_block, NULL, NULL, 0, &cc); + + /* compare with expected query block */ + for (i =3D 0; i < QUERY_BLOCK_SIZE; i++) { + if ((query_block[i] & exp_query_block[i]) !=3D exp_query_block[i])= { + rc++; + break; + } + } + + if (rc) { + printf("%s failed\n", __func__); + } + + return rc; +} + +/* + * Subfunction CPACF_KMC_AES_128 test for kmc + * returns > 0 on failure, otherwise 0 + */ +static int test_kmc_aes_128(void) +{ + uint8_t param[16 + 16]; /* IV + key */ + uint8_t output[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: IV followed by key */ + memcpy(param, kmcaes128iv, sizeof(kmcaes128iv)); + memcpy(param + sizeof(kmcaes128iv), kmcaes128key, sizeof(kmcaes128key)= ); + + /* Encrypt */ + cpacf_kmc(CPACF_KMC_AES_128, param, output, kmcaes128plain, + sizeof(kmcaes128plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmcaes128cipher, sizeof(kmcaes128cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KMC_AES_192 test for kmc + * returns > 0 on failure, otherwise 0 + */ +static int test_kmc_aes_192(void) +{ + uint8_t param[16 + 24]; /* IV + key */ + uint8_t output[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: IV followed by key */ + memcpy(param, kmcaes192iv, sizeof(kmcaes192iv)); + memcpy(param + sizeof(kmcaes192iv), kmcaes192key, sizeof(kmcaes192key)= ); + + /* Encrypt */ + cpacf_kmc(CPACF_KMC_AES_192, param, output, kmcaes192plain, + sizeof(kmcaes192plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmcaes192cipher, sizeof(kmcaes192cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KMC_AES_256 test for kmc + * returns > 0 on failure, otherwise 0 + */ +static int test_kmc_aes_256(void) +{ + uint8_t param[16 + 32]; /* IV + key */ + uint8_t output[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: IV followed by key */ + memcpy(param, kmcaes256iv, sizeof(kmcaes256iv)); + memcpy(param + sizeof(kmcaes256iv), kmcaes256key, sizeof(kmcaes256key)= ); + + /* Encrypt */ + cpacf_kmc(CPACF_KMC_AES_256, param, output, kmcaes256plain, + sizeof(kmcaes256plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmcaes256cipher, sizeof(kmcaes256cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KMC_PAES_128 test for kmc + * returns > 0 on failure, otherwise 0 + */ +static int test_kmc_paes_128(void) +{ + uint8_t param[16 + 16 + 32]; /* IV + protected key + wkvp */ + uint8_t output[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: IV + protected key + wkvp */ + memcpy(param, kmcaes128iv, sizeof(kmcaes128iv)); + memcpy(param + sizeof(kmcaes128iv), kmcaes128key, sizeof(kmcaes128key)= ); + encrypt_clrkey(param + sizeof(kmcaes128iv), sizeof(kmcaes128key)); + memcpy(param + sizeof(kmcaes128iv) + sizeof(kmcaes128key), + protkey_wkvp, sizeof(protkey_wkvp)); + + /* Encrypt */ + cpacf_kmc(CPACF_KMC_PAES_128, param, output, kmcaes128plain, + sizeof(kmcaes128plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmcaes128cipher, sizeof(kmcaes128cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KMC_PAES_192 test for kmc + * returns > 0 on failure, otherwise 0 + */ +static int test_kmc_paes_192(void) +{ + uint8_t param[16 + 24 + 32]; /* IV + protected key + wkvp */ + uint8_t output[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: IV + protected key + wkvp */ + memcpy(param, kmcaes192iv, sizeof(kmcaes192iv)); + memcpy(param + sizeof(kmcaes192iv), kmcaes192key, sizeof(kmcaes192key)= ); + encrypt_clrkey(param + sizeof(kmcaes192iv), sizeof(kmcaes192key)); + memcpy(param + sizeof(kmcaes192iv) + sizeof(kmcaes192key), + protkey_wkvp, sizeof(protkey_wkvp)); + + /* Encrypt */ + cpacf_kmc(CPACF_KMC_PAES_192, param, output, kmcaes192plain, + sizeof(kmcaes192plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmcaes192cipher, sizeof(kmcaes192cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KMC_PAES_256 test for kmc + * returns > 0 on failure, otherwise 0 + */ +static int test_kmc_paes_256(void) +{ + uint8_t param[16 + 32 + 32]; /* IV + protected key + wkvp */ + uint8_t output[16]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: IV + protected key + wkvp */ + memcpy(param, kmcaes256iv, sizeof(kmcaes256iv)); + memcpy(param + sizeof(kmcaes256iv), kmcaes256key, sizeof(kmcaes256key)= ); + encrypt_clrkey(param + sizeof(kmcaes256iv), sizeof(kmcaes256key)); + memcpy(param + sizeof(kmcaes256iv) + sizeof(kmcaes256key), + protkey_wkvp, sizeof(protkey_wkvp)); + + /* Encrypt */ + cpacf_kmc(CPACF_KMC_PAES_256, param, output, kmcaes256plain, + sizeof(kmcaes256plain), &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmcaes256cipher, sizeof(kmcaes256cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +int main(void) +{ + int rc =3D 0; + + /* Test query function */ + rc +=3D test_kmc_query(); + + /* Test AES-128 */ + rc +=3D test_kmc_aes_128(); + + /* Test AES-192 */ + rc +=3D test_kmc_aes_192(); + + /* Test AES-256 */ + rc +=3D test_kmc_aes_256(); + + /* Test PAES-128 */ + rc +=3D test_kmc_paes_128(); + + /* Test PAES-192 */ + rc +=3D test_kmc_paes_192(); + + /* Test PAES-256 */ + rc +=3D test_kmc_paes_256(); + + if (rc) { + printf("cpacf-kmc: %d failures\n", rc); + } + + return rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/tests/tcg/s390x/cpacf-kmctr.c b/tests/tcg/s390x/cpacf-kmctr.c new file mode 100644 index 0000000000..515f94038b --- /dev/null +++ b/tests/tcg/s390x/cpacf-kmctr.c @@ -0,0 +1,360 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Simple test for CPACF KMCTR instruction + */ + +#include +#include +#include +#include +#include "cpacf.h" + +#define QUERY_BLOCK_SIZE 16 + +/* expected kmctr query block */ +static uint8_t exp_query_block[QUERY_BLOCK_SIZE] =3D { + 0x80, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +/* KMCTR AES-128 test data */ +static const uint8_t kmctraes128key[] =3D { + 0xed, 0xfd, 0xb2, 0x57, 0xcb, 0x37, 0xcd, 0xf1, + 0x82, 0xc5, 0x45, 0x5b, 0x0c, 0x0e, 0xfe, 0xbb +}; +static const uint8_t kmctraes128plain[] =3D { + 0x16, 0x95, 0xfe, 0x47, 0x54, 0x21, 0xca, 0xce, + 0x35, 0x57, 0xda, 0xca, 0x01, 0xf4, 0x45, 0xff +}; +static const uint8_t kmctraes128cipher[] =3D { + 0x78, 0x88, 0xbe, 0xae, 0x6e, 0x7a, 0x42, 0x63, + 0x32, 0xa7, 0xea, 0xa2, 0xf8, 0x08, 0xe6, 0x37 +}; + +/* KMCTR AES-192 test data */ +static const uint8_t kmctraes192key[] =3D { + 0x61, 0x39, 0x6c, 0x53, 0x0c, 0xc1, 0x74, 0x9a, + 0x5b, 0xab, 0x6f, 0xbc, 0xf9, 0x06, 0xfe, 0x67, + 0x2d, 0x0c, 0x4a, 0xb2, 0x01, 0xaf, 0x45, 0x54 +}; +static const uint8_t kmctraes192plain[] =3D { + 0x60, 0xbc, 0xdb, 0x94, 0x16, 0xba, 0xc0, 0x8d, + 0x7f, 0xd0, 0xd7, 0x80, 0x35, 0x37, 0x40, 0xa5 +}; +static const uint8_t kmctraes192cipher[] =3D { + 0x24, 0xf4, 0x0c, 0x4e, 0xec, 0xd9, 0xc4, 0x98, + 0x25, 0x00, 0x0f, 0xcb, 0x49, 0x72, 0x64, 0x7a +}; + +/* KMCTR AES-256 test data */ +static const uint8_t kmctraes256key[] =3D { + 0xcc, 0x22, 0xda, 0x78, 0x7f, 0x37, 0x57, 0x11, + 0xc7, 0x63, 0x02, 0xbe, 0xf0, 0x97, 0x9d, 0x8e, + 0xdd, 0xf8, 0x42, 0x82, 0x9c, 0x2b, 0x99, 0xef, + 0x3d, 0xd0, 0x4e, 0x23, 0xe5, 0x4c, 0xc2, 0x4b +}; +static const uint8_t kmctraes256plain[] =3D { + 0xcc, 0xc6, 0x2c, 0x6b, 0x0a, 0x09, 0xa6, 0x71, + 0xd6, 0x44, 0x56, 0x81, 0x8d, 0xb2, 0x9a, 0x4d +}; +static const uint8_t kmctraes256cipher[] =3D { + 0xdf, 0x86, 0x34, 0xca, 0x02, 0xb1, 0x3a, 0x12, + 0x5b, 0x78, 0x6e, 0x1d, 0xce, 0x90, 0x65, 0x8b +}; + +/* static byte array containing the WKVP */ +static const uint8_t protkey_wkvp[32] =3D PROTKEY_WKVP; + +/* + * Query test for kmctr + * returns > 0 on failure, otherwise 0 + */ +static int test_kmctr_query(void) +{ + uint8_t query_block[QUERY_BLOCK_SIZE] =3D {0}; + unsigned long cc =3D 0; + int i, rc =3D 0; + + cpacf_kmctr(CPACF_KMCTR_QUERY, query_block, NULL, NULL, 0, NULL, &cc); + + /* compare with expected query block */ + for (i =3D 0; i < QUERY_BLOCK_SIZE; i++) { + if ((query_block[i] & exp_query_block[i]) !=3D exp_query_block[i])= { + rc++; + break; + } + } + + if (rc) { + printf("%s failed\n", __func__); + } + + return rc; +} + +/* + * Subfunction CPACF_KMCTR_AES_128 test for kmctr + * returns > 0 on failure, otherwise 0 + */ +static int test_kmctr_aes_128(void) +{ + uint8_t param[16]; /* Parameter block: AES-128 key */ + uint8_t src[16] =3D {0}; /* Source data (zeros for this test) */ + uint8_t counter[16]; /* Counter value */ + uint8_t output[16]; /* Output buffer */ + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: key only */ + memcpy(param, kmctraes128key, sizeof(kmctraes128key)); + + /* Setup counter buffer */ + memcpy(counter, kmctraes128plain, sizeof(kmctraes128plain)); + + /* En/Decrypt src with given counter, note that src is all zero */ + cpacf_kmctr(CPACF_KMCTR_AES_128, param, output, src, + sizeof(src), counter, &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmctraes128cipher, sizeof(kmctraes128cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KMCTR_AES_192 test for kmctr + * returns > 0 on failure, otherwise 0 + */ +static int test_kmctr_aes_192(void) +{ + uint8_t param[24]; /* Parameter block: AES-192 key */ + uint8_t src[16] =3D {0}; /* Source data (zeros for this test) */ + uint8_t counter[16]; /* Counter value */ + uint8_t output[16]; /* Output buffer */ + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: key only */ + memcpy(param, kmctraes192key, sizeof(kmctraes192key)); + + /* Setup counter buffer */ + memcpy(counter, kmctraes192plain, sizeof(kmctraes192plain)); + + /* En/Decrypt src with given counter, note that src is all zero */ + cpacf_kmctr(CPACF_KMCTR_AES_192, param, output, src, + sizeof(src), counter, &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmctraes192cipher, sizeof(kmctraes192cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KMCTR_AES_256 test for kmctr + * returns > 0 on failure, otherwise 0 + */ +static int test_kmctr_aes_256(void) +{ + uint8_t param[32]; /* Parameter block: AES-256 key */ + uint8_t src[16] =3D {0}; /* Source data (zeros for this test) */ + uint8_t counter[16]; /* Counter value */ + uint8_t output[16]; /* Output buffer */ + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: key only */ + memcpy(param, kmctraes256key, sizeof(kmctraes256key)); + + /* Setup counter buffer */ + memcpy(counter, kmctraes256plain, sizeof(kmctraes256plain)); + + /* En/Decrypt src with given counter, note that src is all zero */ + cpacf_kmctr(CPACF_KMCTR_AES_256, param, output, src, + sizeof(src), counter, &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmctraes256cipher, sizeof(kmctraes256cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KMCTR_PAES_128 test for kmctr + * returns > 0 on failure, otherwise 0 + */ +static int test_kmctr_paes_128(void) +{ + uint8_t param[16 + 32]; /* Parameter block: protected key + wkvp */ + uint8_t src[16] =3D {0}; /* Source data (zeros for this test) */ + uint8_t counter[16]; /* Counter value */ + uint8_t output[16]; /* Output buffer */ + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: protected key + wkvp */ + memcpy(param, kmctraes128key, sizeof(kmctraes128key)); + encrypt_clrkey(param, sizeof(kmctraes128key)); + memcpy(param + sizeof(kmctraes128key), protkey_wkvp, sizeof(protkey_wk= vp)); + + /* Setup counter buffer */ + memcpy(counter, kmctraes128plain, sizeof(kmctraes128plain)); + + /* En/Decrypt src with given counter, note that src is all zero */ + cpacf_kmctr(CPACF_KMCTR_PAES_128, param, output, src, + sizeof(src), counter, &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmctraes128cipher, sizeof(kmctraes128cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KMCTR_PAES_192 test for kmctr + * returns > 0 on failure, otherwise 0 + */ +static int test_kmctr_paes_192(void) +{ + uint8_t param[24 + 32]; /* Parameter block: protected key + wkvp */ + uint8_t src[16] =3D {0}; /* Source data (zeros for this test) */ + uint8_t counter[16]; /* Counter value */ + uint8_t output[16]; /* Output buffer */ + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: protected key + wkvp */ + memcpy(param, kmctraes192key, sizeof(kmctraes192key)); + encrypt_clrkey(param, sizeof(kmctraes192key)); + memcpy(param + sizeof(kmctraes192key), protkey_wkvp, sizeof(protkey_wk= vp)); + + /* Setup counter buffer */ + memcpy(counter, kmctraes192plain, sizeof(kmctraes192plain)); + + /* En/Decrypt src with given counter, note that src is all zero */ + cpacf_kmctr(CPACF_KMCTR_PAES_192, param, output, src, + sizeof(src), counter, &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmctraes192cipher, sizeof(kmctraes192cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_KMCTR_PAES_256 test for kmctr + * returns > 0 on failure, otherwise 0 + */ +static int test_kmctr_paes_256(void) +{ + uint8_t param[32 + 32]; /* Parameter block: protected key + wkvp */ + uint8_t src[16] =3D {0}; /* Source data (zeros for this test) */ + uint8_t counter[16]; /* Counter value */ + uint8_t output[16]; /* Output buffer */ + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: protected key + wkvp */ + memcpy(param, kmctraes256key, sizeof(kmctraes256key)); + encrypt_clrkey(param, sizeof(kmctraes256key)); + memcpy(param + sizeof(kmctraes256key), protkey_wkvp, sizeof(protkey_wk= vp)); + + /* Setup counter buffer */ + memcpy(counter, kmctraes256plain, sizeof(kmctraes256plain)); + + /* En/Decrypt src with given counter, note that src is all zero */ + cpacf_kmctr(CPACF_KMCTR_PAES_256, param, output, src, + sizeof(src), counter, &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare result with expected ciphertext */ + if (memcmp(output, kmctraes256cipher, sizeof(kmctraes256cipher))) { + printf("%s failed: output mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +int main(void) +{ + int rc =3D 0; + + /* Test query function */ + rc +=3D test_kmctr_query(); + + /* Test AES-128 */ + rc +=3D test_kmctr_aes_128(); + + /* Test AES-192 */ + rc +=3D test_kmctr_aes_192(); + + /* Test AES-256 */ + rc +=3D test_kmctr_aes_256(); + + /* Test PAES-128 */ + rc +=3D test_kmctr_paes_128(); + + /* Test PAES-192 */ + rc +=3D test_kmctr_paes_192(); + + /* Test PAES-256 */ + rc +=3D test_kmctr_paes_256(); + + if (rc) { + printf("cpacf-kmctr: %d failures\n", rc); + } + + return rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/tests/tcg/s390x/cpacf-pcc.c b/tests/tcg/s390x/cpacf-pcc.c new file mode 100644 index 0000000000..e61672f98b --- /dev/null +++ b/tests/tcg/s390x/cpacf-pcc.c @@ -0,0 +1,245 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Simple test for CPACF PCC instruction + */ + +#include +#include +#include +#include +#include "cpacf.h" + +#define QUERY_BLOCK_SIZE 16 + +/* expected pcc query block */ +static uint8_t exp_query_block[QUERY_BLOCK_SIZE] =3D { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +/* PCC XTS AES-128 test data */ +static const uint8_t kmaes128key[] =3D { + 0xed, 0xfd, 0xb2, 0x57, 0xcb, 0x37, 0xcd, 0xf1, + 0x82, 0xc5, 0x45, 0x5b, 0x0c, 0x0e, 0xfe, 0xbb +}; +static const uint8_t kmaes128plain[] =3D { + 0x16, 0x95, 0xfe, 0x47, 0x54, 0x21, 0xca, 0xce, + 0x35, 0x57, 0xda, 0xca, 0x01, 0xf4, 0x45, 0xff +}; +static const uint8_t kmaes128cipher[] =3D { + 0x78, 0x88, 0xbe, 0xae, 0x6e, 0x7a, 0x42, 0x63, + 0x32, 0xa7, 0xea, 0xa2, 0xf8, 0x08, 0xe6, 0x37 +}; + +/* PCC XTS AES-256 test data */ +static const uint8_t kmaes256key[] =3D { + 0xcc, 0x22, 0xda, 0x78, 0x7f, 0x37, 0x57, 0x11, + 0xc7, 0x63, 0x02, 0xbe, 0xf0, 0x97, 0x9d, 0x8e, + 0xdd, 0xf8, 0x42, 0x82, 0x9c, 0x2b, 0x99, 0xef, + 0x3d, 0xd0, 0x4e, 0x23, 0xe5, 0x4c, 0xc2, 0x4b +}; +static const uint8_t kmaes256plain[] =3D { + 0xcc, 0xc6, 0x2c, 0x6b, 0x0a, 0x09, 0xa6, 0x71, + 0xd6, 0x44, 0x56, 0x81, 0x8d, 0xb2, 0x9a, 0x4d +}; +static const uint8_t kmaes256cipher[] =3D { + 0xdf, 0x86, 0x34, 0xca, 0x02, 0xb1, 0x3a, 0x12, + 0x5b, 0x78, 0x6e, 0x1d, 0xce, 0x90, 0x65, 0x8b +}; + +/* static byte array containing the WKVP */ +static const uint8_t protkey_wkvp[32] =3D PROTKEY_WKVP; + +/* + * Query test for pcc + * returns > 0 on failure, otherwise 0 + */ +static int test_pcc_query(void) +{ + uint8_t query_block[QUERY_BLOCK_SIZE] =3D {0}; + unsigned long cc =3D 0; + int i, rc =3D 0; + + cpacf_pcc(CPACF_PCC_QUERY, query_block, &cc); + + /* compare with expected query block */ + for (i =3D 0; i < QUERY_BLOCK_SIZE; i++) { + if ((query_block[i] & exp_query_block[i]) !=3D exp_query_block[i])= { + rc++; + break; + } + } + + if (rc) { + printf("%s failed\n", __func__); + } + + return rc; +} + +/* + * Subfunction CPACF_PCC_XTS_AES_128 test for pcc + * returns > 0 on failure, otherwise 0 + */ +static int test_pcc_xts_aes_128(void) +{ + uint8_t param[80]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: key + plaintext + zeros */ + memcpy(param, kmaes128key, sizeof(kmaes128key)); + memcpy(param + 16, kmaes128plain, sizeof(kmaes128plain)); + /* Clear Block Sequential Nr, Intermediate Bit Index, and XTS Paramete= r */ + memset(param + 32, 0, 48); + + /* Execute PCC to compute XTS parameter */ + cpacf_pcc(CPACF_PCC_XTS_AES_128, param, &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare computed XTS parameter (at offset 64) with expected cipher = */ + if (memcmp(param + 64, kmaes128cipher, sizeof(kmaes128cipher))) { + printf("%s failed: XTS parameter mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_PCC_XTS_AES_256 test for pcc + * returns > 0 on failure, otherwise 0 + */ +static int test_pcc_xts_aes_256(void) +{ + uint8_t param[96]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: key + plaintext + zeros */ + memcpy(param, kmaes256key, sizeof(kmaes256key)); + memcpy(param + 32, kmaes256plain, sizeof(kmaes256plain)); + /* Clear Block Sequential Nr, Intermediate Bit Index, and XTS Paramete= r */ + memset(param + 48, 0, 48); + + /* Execute PCC to compute XTS parameter */ + cpacf_pcc(CPACF_PCC_XTS_AES_256, param, &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare computed XTS parameter (at offset 80) with expected cipher = */ + if (memcmp(param + 80, kmaes256cipher, sizeof(kmaes256cipher))) { + printf("%s failed: XTS parameter mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_PCC_XTS_PAES_128 test for pcc + * returns > 0 on failure, otherwise 0 + */ +static int test_pcc_xts_paes_128(void) +{ + uint8_t param[112]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: protected key + wkvp + plaintext + zeros */ + memcpy(param, kmaes128key, sizeof(kmaes128key)); + encrypt_clrkey(param, sizeof(kmaes128key)); + memcpy(param + 16, protkey_wkvp, sizeof(protkey_wkvp)); + memcpy(param + 48, kmaes128plain, sizeof(kmaes128plain)); + /* Clear Block Sequential Nr, Intermediate Bit Index, and XTS Paramete= r */ + memset(param + 64, 0, 48); + + /* Execute PCC to compute XTS parameter */ + cpacf_pcc(CPACF_PCC_XTS_PAES_128, param, &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare computed XTS parameter (at offset 96) with expected cipher = */ + if (memcmp(param + 96, kmaes128cipher, sizeof(kmaes128cipher))) { + printf("%s failed: XTS parameter mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +/* + * Subfunction CPACF_PCC_XTS_PAES_256 test for pcc + * returns > 0 on failure, otherwise 0 + */ +static int test_pcc_xts_paes_256(void) +{ + uint8_t param[128]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Setup parameter block: protected key + wkvp + plaintext + zeros */ + memcpy(param, kmaes256key, sizeof(kmaes256key)); + encrypt_clrkey(param, sizeof(kmaes256key)); + memcpy(param + 32, protkey_wkvp, sizeof(protkey_wkvp)); + memcpy(param + 64, kmaes256plain, sizeof(kmaes256plain)); + /* Clear Block Sequential Nr, Intermediate Bit Index, and XTS Paramete= r */ + memset(param + 80, 0, 48); + + /* Execute PCC to compute XTS parameter */ + cpacf_pcc(CPACF_PCC_XTS_PAES_256, param, &cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu\n", __func__, cc); + rc =3D 1; + } + + /* Compare computed XTS parameter (at offset 112) with expected cipher= */ + if (memcmp(param + 112, kmaes256cipher, sizeof(kmaes256cipher))) { + printf("%s failed: XTS parameter mismatch\n", __func__); + rc =3D 1; + } + + return rc; +} + +int main(void) +{ + int rc =3D 0; + + /* Test query function */ + rc +=3D test_pcc_query(); + + /* Test XTS-AES-128 */ + rc +=3D test_pcc_xts_aes_128(); + + /* Test XTS-AES-256 */ + rc +=3D test_pcc_xts_aes_256(); + + /* Test XTS-PAES-128 */ + rc +=3D test_pcc_xts_paes_128(); + + /* Test XTS-PAES-256 */ + rc +=3D test_pcc_xts_paes_256(); + + if (rc) { + printf("cpacf-pcc: %d failures\n", rc); + } + + return rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/tests/tcg/s390x/cpacf-pckmo.c b/tests/tcg/s390x/cpacf-pckmo.c new file mode 100644 index 0000000000..affcc88d56 --- /dev/null +++ b/tests/tcg/s390x/cpacf-pckmo.c @@ -0,0 +1,45 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Simple test for CPACF PCKMO instruction (privileged operation). + * + * As PCKMO is a privileged instruction, when executed in user mode, + * it triggers a privileged operation exception, which is mapped to SIGILL. + */ + +#include +#include +#include +#include +#include +#include +#include "cpacf.h" + +static void handle_sigill(int sig, siginfo_t *info, void *ucontext) +{ + /* PCKMO is privileged, so we expect SIGILL - this is success */ + _exit(EXIT_SUCCESS); +} + +int main(void) +{ + struct sigaction act; + uint8_t param_block[32] =3D {0}; /* Parameter block for PCKMO */ + int err; + + /* Setup signal handler for SIGILL (privileged operation exception) */ + memset(&act, 0, sizeof(act)); + act.sa_sigaction =3D handle_sigill; + act.sa_flags =3D SA_SIGINFO; + err =3D sigaction(SIGILL, &act, NULL); + assert(err =3D=3D 0); + + /* + * Attempt to execute PCKMO with subfunction CPACF_PCKMO_QUERY. + * As PCKMO is privileged, it should trigger SIGILL. + */ + cpacf_pckmo(CPACF_PCKMO_QUERY, param_block); + + /* Should never be reached - PCKMO should trigger exception */ + return EXIT_FAILURE; +} diff --git a/tests/tcg/s390x/cpacf-prno.c b/tests/tcg/s390x/cpacf-prno.c new file mode 100644 index 0000000000..1081a9e970 --- /dev/null +++ b/tests/tcg/s390x/cpacf-prno.c @@ -0,0 +1,131 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Simple test for CPACF PRNO instruction + */ + +#include +#include +#include +#include +#include +#include "cpacf.h" + +#define QUERY_BLOCK_SIZE 16 +#define TRNG_OUTPUT_SIZE 32 + +/* expected prno query block */ +static uint8_t exp_query_block[QUERY_BLOCK_SIZE] =3D { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, +}; + +/* + * Query test for prno + * returns > 0 on failure, otherwise 0 + */ +static int test_prno_query(void) +{ + uint8_t query_block[QUERY_BLOCK_SIZE] =3D {0}; + unsigned long cc =3D 0; + int i, rc =3D 0; + + cpacf_prno(CPACF_PRNO_QUERY, query_block, NULL, 0, NULL, 0, &cc); + + /* compare with expected query block */ + for (i =3D 0; i < QUERY_BLOCK_SIZE; i++) { + if ((query_block[i] & exp_query_block[i]) !=3D exp_query_block[i])= { + rc++; + break; + } + } + + if (rc) { + printf("%s failed\n", __func__); + } + + return rc; +} + +/* check for buffer is all zero */ +static bool is_all_zeros(const uint8_t *buf, size_t len) +{ + size_t i; + + for (i =3D 0; i < len; i++) { + if (buf[i] !=3D 0) { + return false; + } + } + + return true; +} + +/* + * Subfunction CPACF_PRNO_TRNG test for prno + * returns > 0 on failure, otherwise 0 + */ +static int test_prno_trng(void) +{ + uint8_t output1[TRNG_OUTPUT_SIZE]; + uint8_t output2[TRNG_OUTPUT_SIZE]; + unsigned long cc =3D 0; + int rc =3D 0; + + /* Initialize outputs to detect if they get filled */ + memset(output1, 0, sizeof(output1)); + memset(output2, 0, sizeof(output2)); + + /* First TRNG call */ + cpacf_prno(CPACF_PRNO_TRNG, NULL, output1, sizeof(output1), NULL, 0, &= cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu on first call\n", __func__,= cc); + rc =3D 1; + } + /* Verify output is not all zeros */ + if (is_all_zeros(output1, TRNG_OUTPUT_SIZE)) { + printf("%s failed: output1 is all zeros\n", __func__); + rc =3D 1; + } + + /* Second TRNG call */ + cpacf_prno(CPACF_PRNO_TRNG, NULL, output2, sizeof(output2), NULL, 0, &= cc); + + /* Check for correct condition code */ + if (cc !=3D 0) { + printf("%s failed: unexpected cc=3D%lu on second call\n", __func__= , cc); + rc =3D 1; + } + /* Verify output is not all zeros */ + if (is_all_zeros(output2, TRNG_OUTPUT_SIZE)) { + printf("%s failed: output2 is all zeros\n", __func__); + rc =3D 1; + } + + /* Verify the two outputs are different */ + if (memcmp(output1, output2, TRNG_OUTPUT_SIZE) =3D=3D 0) { + printf("%s failed: two TRNG calls produced same output\n", __func_= _); + rc =3D 1; + } + + return rc; +} + +int main(void) +{ + int rc =3D 0; + + /* Test query function */ + rc +=3D test_prno_query(); + + /* Test TRNG */ + rc +=3D test_prno_trng(); + + if (rc) { + printf("cpacf-prno: %d failures\n", rc); + } + + return rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/tests/tcg/s390x/cpacf.h b/tests/tcg/s390x/cpacf.h new file mode 100644 index 0000000000..c0578abd09 --- /dev/null +++ b/tests/tcg/s390x/cpacf.h @@ -0,0 +1,570 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Defines and inline functions around testing CPACF instructions + * + */ + +#ifndef _S390_CPACF_H_ +#define _S390_CPACF_H_ + +#include "../../../target/s390x/tcg/cpacf-arch.h" + +union register_pair { + unsigned __int128 pair; + struct { + unsigned long even; + unsigned long odd; + }; +}; + +/* + * Instruction opcodes for the CPACF instructions + */ +#define CPACF_KMAC 0xb91e /* MSA */ +#define CPACF_KM 0xb92e /* MSA */ +#define CPACF_KMC 0xb92f /* MSA */ +#define CPACF_KIMD 0xb93e /* MSA */ +#define CPACF_KLMD 0xb93f /* MSA */ +#define CPACF_PCKMO 0xb928 /* MSA3 */ +#define CPACF_KMF 0xb92a /* MSA4 */ +#define CPACF_KMO 0xb92b /* MSA4 */ +#define CPACF_PCC 0xb92c /* MSA4 */ +#define CPACF_KMCTR 0xb92d /* MSA4 */ +#define CPACF_PRNO 0xb93c /* MSA5 */ +#define CPACF_KMA 0xb929 /* MSA8 */ +#define CPACF_KDSA 0xb93a /* MSA9 */ + +/* + * 'encrypt' the clear key value into a protected key + * by xor-ing the protkey_xor_pattern onto it. + */ +static inline void encrypt_clrkey(uint8_t *key, int keysize) +{ + const uint8_t protkey_xor_pattern[32] =3D PROTKEY_XOR_PATTERN; + + for (int i =3D 0; i < keysize; i++) { + key[i] ^=3D protkey_xor_pattern[i]; + } +} + +/** + * cpacf_km() - executes the KM instruction + * @func: the function code passed to KM; see CPACF_KM_xxx defines + * @param: address of parameter block; see POP for details on each func + * @dest: address of destination memory area + * @src: address of source memory area + * @src_len: length of src operand in bytes + * + * Returns 0 for the query func, number of processed bytes for + * encryption/decryption funcs + */ +static inline int cpacf_km(unsigned long func, void *param, + uint8_t *dest, const uint8_t *src, long src_len, + unsigned long *cc) +{ + union register_pair d, s; + + *cc =3D 0; + d.even =3D (unsigned long)dest; + s.even =3D (unsigned long)src; + s.odd =3D (unsigned long)src_len; + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rre,%[opc] << 16,%[dst],%[src]\n" + " brc 1,0b\n" /* handle partial completion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [src] "+&d" (s.pair), [dst] "+&d" (d.pair), [__cc] "+Q"= (*cc) + : [fc] "d" (func), [pba] "d" ((unsigned long)param), + [opc] "i" (CPACF_KM) + : "cc", "memory", "0", "1"); + + return src_len - s.odd; +} + +/** + * cpacf_kmc() - executes the KMC instruction + * @func: the function code passed to KM; see CPACF_KMC_xxx defines + * @param: address of parameter block; see POP for details on each func + * @dest: address of destination memory area + * @src: address of source memory area + * @src_len: length of src operand in bytes + * + * Returns 0 for the query func, number of processed bytes for + * encryption/decryption funcs + */ +static inline int cpacf_kmc(unsigned long func, void *param, + uint8_t *dest, const uint8_t *src, long src_le= n, + unsigned long *cc) +{ + union register_pair d, s; + + *cc =3D 0; + d.even =3D (unsigned long)dest; + s.even =3D (unsigned long)src; + s.odd =3D (unsigned long)src_len; + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rre,%[opc] << 16,%[dst],%[src]\n" + " brc 1,0b\n" /* handle partial completion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [src] "+&d" (s.pair), [dst] "+&d" (d.pair), [__cc] "+Q"= (*cc) + : [fc] "d" (func), [pba] "d" ((unsigned long)param), + [opc] "i" (CPACF_KMC) + : "cc", "memory", "0", "1"); + + return src_len - s.odd; +} + +/** + * cpacf_kimd() - executes the KIMD instruction + * @func: the function code passed to KM; see CPACF_KIMD_xxx defines + * @param: address of parameter block; see POP for details on each func + * @src: address of source memory area + * @src_len: length of src operand in bytes + */ +static inline void cpacf_kimd(unsigned long func, void *param, + const uint8_t *src, long src_len, + unsigned long *cc) +{ + union register_pair s; + + *cc =3D 0; + s.even =3D (unsigned long)src; + s.odd =3D (unsigned long)src_len; + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rre,%[opc] << 16,0,%[src]\n" + " brc 1,0b\n" /* handle partial completion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [src] "+&d" (s.pair), [__cc] "+Q" (*cc) + : [fc] "d" (func), [pba] "d" ((unsigned long)(param)), + [opc] "i" (CPACF_KIMD) + : "cc", "memory", "0", "1"); +} + +/** + * cpacf_klmd() - executes the KLMD instruction + * @func: the function code passed to KM; see CPACF_KLMD_xxx defines + * @param: address of parameter block; see POP for details on each func + * @src: address of source memory area + * @src_len: length of src operand in bytes + */ +static inline void cpacf_klmd(unsigned long func, void *param, + const uint8_t *src, long src_len, + uint8_t *dest, long dest_len, + unsigned long *cc) +{ + union register_pair s, d; + + *cc =3D 0; + s.even =3D (unsigned long)src; + s.odd =3D (unsigned long)src_len; + d.even =3D (unsigned long)dest; + d.odd =3D (unsigned long)dest_len; + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rre,%[opc] << 16,%[dst],%[src]\n" + " brc 1,0b\n" /* handle partial completion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [src] "+&d" (s.pair), [dst] "+&d" (d.pair), [__cc] "+Q"= (*cc) + : [fc] "d" (func), [pba] "d" ((unsigned long)param), + [opc] "i" (CPACF_KLMD) + : "cc", "memory", "0", "1"); +} + +/** + * cpacf_kmac() - executes the KMAC instruction + * @func: the function code passed to KM; see CPACF_KMAC_xxx defines + * @param: address of parameter block; see POP for details on each func + * @src: address of source memory area + * @src_len: length of src operand in bytes + * + * Returns 0 for the query func, number of processed bytes for digest funcs + */ +static inline int cpacf_kmac(unsigned long func, void *param, + const uint8_t *src, long src_len, + unsigned long *cc) +{ + union register_pair s; + + *cc =3D 0; + s.even =3D (unsigned long)src; + s.odd =3D (unsigned long)src_len; + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rre,%[opc] << 16,0,%[src]\n" + " brc 1,0b\n" /* handle partial completion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [src] "+&d" (s.pair), [__cc] "+Q" (*cc) + : [fc] "d" (func), [pba] "d" ((unsigned long)param), + [opc] "i" (CPACF_KMAC) + : "cc", "memory", "0", "1"); + + return src_len - s.odd; +} + +static inline int cpacf_kmac_x(unsigned long *func, void *param, + const uint8_t *src, long src_len, + unsigned long *cc) +{ + union register_pair s; + unsigned long fc =3D *func; + + *cc =3D 0; + s.even =3D (unsigned long)src; + s.odd =3D (unsigned long)src_len; + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rre,%[opc] << 16,0,%[src]\n" + " brc 1,0b\n" /* handle partial completion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2: lgr %[fc],0\n" + : [fc] "+d" (fc), [src] "+&d" (s.pair), [__cc] "+Q" (*cc) + : [pba] "d" ((unsigned long)param), + [opc] "i" (CPACF_KMAC) + : "cc", "memory", "0", "1"); + + *func =3D fc; + + return src_len - s.odd; +} + +/** + * cpacf_kmctr() - executes the KMCTR instruction + * @func: the function code passed to KMCTR; see CPACF_KMCTR_xxx defines + * @param: address of parameter block; see POP for details on each func + * @dest: address of destination memory area + * @src: address of source memory area + * @src_len: length of src operand in bytes + * @counter: address of counter value + * + * Returns 0 for the query func, number of processed bytes for + * encryption/decryption funcs + */ +static inline int cpacf_kmctr(unsigned long func, void *param, uint8_t *de= st, + const uint8_t *src, long src_len, + uint8_t *counter, unsigned long *cc) +{ + union register_pair d, s, c; + + *cc =3D 0; + d.even =3D (unsigned long)dest; + s.even =3D (unsigned long)src; + s.odd =3D (unsigned long)src_len; + c.even =3D (unsigned long)counter; + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rrf,%[opc] << 16,%[dst],%[src],%[ctr],0\n" + " brc 1,0b\n" /* handle partial completion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [src] "+&d" (s.pair), [dst] "+&d" (d.pair), + [ctr] "+&d" (c.pair), [__cc] "+Q" (*cc) + : [fc] "d" (func), [pba] "d" ((unsigned long)param), + [opc] "i" (CPACF_KMCTR) + : "cc", "memory", "0", "1"); + + return src_len - s.odd; +} + +/** + * cpacf_prno() - executes the PRNO instruction + * @func: the function code passed to PRNO; see CPACF_PRNO_xxx defines + * @param: address of parameter block; see POP for details on each func + * @dest: address of destination memory area + * @dest_len: size of destination memory area in bytes + * @seed: address of seed data + * @seed_len: size of seed data in bytes + */ +static inline void cpacf_prno(unsigned long func, void *param, + uint8_t *dest, unsigned long dest_len, + const uint8_t *seed, unsigned long seed_len, + unsigned long *cc) +{ + union register_pair d, s; + + *cc =3D 0; + d.even =3D (unsigned long)dest; + d.odd =3D (unsigned long)dest_len; + s.even =3D (unsigned long)seed; + s.odd =3D (unsigned long)seed_len; + asm volatile ( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rre,%[opc] << 16,%[dst],%[seed]\n" + " brc 1,0b\n" /* handle partial complet= ion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [dst] "+&d" (d.pair), [__cc] "+Q" (*cc) + : [fc] "d" (func), [pba] "d" ((unsigned long)param), + [seed] "d" (s.pair), [opc] "i" (CPACF_PRNO) + : "cc", "memory", "0", "1"); +} + +/** + * cpacf_trng() - executes the TRNG subfunction of the PRNO instruction + * @ucbuf: buffer for unconditioned data + * @ucbuf_len: amount of unconditioned data to fetch in bytes + * @cbuf: buffer for conditioned data + * @cbuf_len: amount of conditioned data to fetch in bytes + */ +static inline void cpacf_trng(uint8_t *ucbuf, unsigned long ucbuf_len, + uint8_t *cbuf, unsigned long cbuf_len, + unsigned long *cc) +{ + union register_pair u, c; + + *cc =3D 0; + u.even =3D (unsigned long)ucbuf; + u.odd =3D (unsigned long)ucbuf_len; + c.even =3D (unsigned long)cbuf; + c.odd =3D (unsigned long)cbuf_len; + asm volatile ( + " lghi 0,%[fc]\n" + "0: .insn rre,%[opc] << 16,%[ucbuf],%[cbuf]\n" + " brc 1,0b\n" /* handle partial complet= ion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [ucbuf] "+&d" (u.pair), [cbuf] "+&d" (c.pair), + [__cc] "+Q" (*cc) + : [fc] "K" (CPACF_PRNO_TRNG), [opc] "i" (CPACF_PRNO) + : "cc", "memory", "0"); +} + +/** + * cpacf_pcc() - executes the PCC instruction + * @func: the function code passed to PCC; see CPACF_KM_xxx defines + * @param: address of parameter block; see POP for details on each func + */ +static inline void cpacf_pcc(unsigned long func, void *param, unsigned lon= g *cc) +{ + *cc =3D 0; + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rre,%[opc] << 16,0,0\n" /* PCC opcode */ + " brc 1,0b\n" /* handle partial completion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [__cc] "+Q" (*cc) + : [fc] "d" (func), [pba] "d" ((unsigned long)param), + [opc] "i" (CPACF_PCC) + : "cc", "memory", "0", "1"); +} + +/** + * cpacf_pckmo() - executes the PCKMO instruction + * @func: the function code passed to PCKMO; see CPACF_PCKMO_xxx defines + * @param: address of parameter block; see POP for details on each func + */ +static inline void cpacf_pckmo(long func, void *param) +{ + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + " .insn rre,%[opc] << 16,0,0\n" /* PCKMO opcode */ + : + : [fc] "d" (func), [pba] "d" ((unsigned long)param), + [opc] "i" (CPACF_PCKMO) + : "cc", "memory", "0", "1"); +} + +/** + * cpacf_kma() - executes the KMA instruction + * @func: the function code passed to KMA; see CPACF_KMA_xxx defines + * @param: address of parameter block; see POP for details on each func + * @dest: address of destination memory area + * @src: address of source memory area + * @src_len: length of src operand in bytes + * @aad: address of additional authenticated data memory area + * @aad_len: length of aad operand in bytes + */ +static inline void cpacf_kma(unsigned long func, void *param, uint8_t *des= t, + const uint8_t *src, unsigned long src_len, + const uint8_t *aad, unsigned long aad_len, + unsigned long *cc) +{ + union register_pair d, s, a; + + *cc =3D 0; + d.even =3D (unsigned long)dest; + s.even =3D (unsigned long)src; + s.odd =3D (unsigned long)src_len; + a.even =3D (unsigned long)aad; + a.odd =3D (unsigned long)aad_len; + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rrf,%[opc] << 16,%[dst],%[src],%[aad],0\n" + " brc 1,0b\n" /* handle partial completi= on */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [dst] "+&d" (d.pair), [src] "+&d" (s.pair), + [aad] "+&d" (a.pair), [__cc] "+Q" (*cc) + : [fc] "d" (func), [pba] "d" ((unsigned long)param), + [opc] "i" (CPACF_KMA) + : "cc", "memory", "0", "1"); +} + +/** + * cpacf_kmf() - executes the KMF instruction + * @func: the function code passed to KMF; see CPACF_KMF_xxx defines + * @param: address of parameter block; see POP for details on each func + * @dest: address of destination memory area + * @src: address of source memory area + * @src_len: length of src operand in bytes + * + * Returns 0 for the query func, number of processed bytes for + * encryption/decryption funcs + */ +static inline int cpacf_kmf(unsigned long func, void *param, + uint8_t *dest, const uint8_t *src, long src_le= n, + unsigned long *cc) +{ + union register_pair d, s; + + *cc =3D 0; + d.even =3D (unsigned long)dest; + s.even =3D (unsigned long)src; + s.odd =3D (unsigned long)src_len; + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rre,%[opc] << 16,%[dst],%[src]\n" + " brc 1,0b\n" /* handle partial completion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [src] "+&d" (s.pair), [dst] "+&d" (d.pair), [__cc] "+Q"= (*cc) + : [fc] "d" (func), [pba] "d" ((unsigned long)param), + [opc] "i" (CPACF_KMF) + : "cc", "memory", "0", "1"); + + return src_len - s.odd; +} + +/** + * cpacf_kmo() - executes the KMO instruction + * @func: the function code passed to KMO; see CPACF_KMO_xxx defines + * @param: address of parameter block; see POP for details on each func + * @dest: address of destination memory area + * @src: address of source memory area + * @src_len: length of src operand in bytes + * + * Returns 0 for the query func, number of processed bytes for + * encryption/decryption funcs + */ +static inline int cpacf_kmo(unsigned long func, void *param, + uint8_t *dest, const uint8_t *src, long src_le= n, + unsigned long *cc) +{ + union register_pair d, s; + + *cc =3D 0; + d.even =3D (unsigned long)dest; + s.even =3D (unsigned long)src; + s.odd =3D (unsigned long)src_len; + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rre,%[opc] << 16,%[dst],%[src]\n" + " brc 1,0b\n" /* handle partial completion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [src] "+&d" (s.pair), [dst] "+&d" (d.pair), [__cc] "+Q"= (*cc) + : [fc] "d" (func), [pba] "d" ((unsigned long)param), + [opc] "i" (CPACF_KMO) + : "cc", "memory", "0", "1"); + + return src_len - s.odd; +} + +/** + * cpacf_kdsa() - executes the KDSA instruction + * @func: the function code passed to KDSA; see CPACF_KDSA_xxx defines + * @param: address of parameter block; see POP for details on each func + * @src: address of source memory area + * @src_len: length of src operand in bytes + * + * Returns 0 for the query func, otherwise the condition code is checked + * and 0 returned on cc 0, otherwise a value !=3D 0 to indicate failure. + */ +static inline int cpacf_kdsa(unsigned long func, void *param, + const uint8_t *src, long src_len, + unsigned long *cc) +{ + union register_pair s; + + *cc =3D 0; + s.even =3D (unsigned long)src; + s.odd =3D (unsigned long)src_len; + asm volatile( + " lgr 0,%[fc]\n" + " lgr 1,%[pba]\n" + "0: .insn rre,%[opc] << 16,0,%[src]\n" + " brc 1,0b\n" /* handle partial completion */ + " brc 8,2f\n" + " brc 4,1f\n" + " agsi %[__cc],1\n" + "1: agsi %[__cc],1\n" + "2:\n" + : [src] "+&d" (s.pair), [__cc] "+Q" (*cc) + : [fc] "d" (func), [pba] "d" ((unsigned long)param), + [opc] "i" (CPACF_KDSA) + : "cc", "memory", "0", "1"); + + return (int)(*cc !=3D 0); +} + +#endif /* _S390_CPACF_H_ */ diff --git a/tests/tcg/s390x/meson.build b/tests/tcg/s390x/meson.build index c9af66aa1b..57ea6c5ca5 100644 --- a/tests/tcg/s390x/meson.build +++ b/tests/tcg/s390x/meson.build @@ -74,6 +74,16 @@ tests +=3D { 'ts.c': {}, 'ex-smc.c': {'cflags': ['-Wl,--no-warn-rwx-segments']}, 'load-store-reversed.c': {}, + 'cpacf-kdsa.c': {}, + 'cpacf-kimd.c': {}, + 'cpacf-klmd.c': {}, + 'cpacf-km.c': {}, + 'cpacf-kmac.c': {}, + 'cpacf-kmc.c': {}, + 'cpacf-kmctr.c': {}, + 'cpacf-pcc.c': {}, + 'cpacf-pckmo.c': {}, + 'cpacf-prno.c': {}, } =20 foreach src: tests_s390x_pgm --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021485; cv=none; d=zohomail.com; s=zohoarc; b=eK6gjkupWo70E8wc/XwUs+Yh506ZYBfdgyO8zMhXr0cJ7xSzQeksPI9ur24GkYt7v1iGRaTicqoKJFz/NhMHkBH/GVV7YWUABOWZkhEAgTDUUkPxiJSHP0HD+Kx3dkmL1VAGt1a5HXooDO7yXL11H+oZdVYjfH5GQaanrp4sQa8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021485; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Vj2nYoePS1TiCkzp1CAatz3dWQXQRnrhHZNMXIDk0vI=; b=H1rmKjE4ObId6/oDhY5ghG0BKidgpRj/hKnjFrmDxXeSdOeGqL5JnSE+oY/5NO2a9nLVU9sQcNNLCXv1DG68lJP/gU7DW6PjbKiXCOejKd70pWoYFYcT4K9TRy1JSlQtuYRgyJ1sXVCCAHO2LgMYu91iip9ZLK0oUolC2lJgJhc= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021485226520.7527737037847; Mon, 21 Sep 2026 13:11:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKC-0006DA-T8; Mon, 21 Sep 2026 16:09:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJq-0005l5-Cr; Mon, 21 Sep 2026 16:08:55 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJl-0005Nq-GE; Mon, 21 Sep 2026 16:08:52 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8UGu1860730; Mon, 21 Sep 2026 20:08:46 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskg2ah4s-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:46 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJIURV1408934; Mon, 21 Sep 2026 20:08:45 GMT Received: from smtprelay06.dal12v.mail.ibm.com ([172.16.1.8]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt5qjpvme-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:45 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay06.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8iqk32965248 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:44 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6E8E458043; Mon, 21 Sep 2026 20:08:44 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EDAD958055; Mon, 21 Sep 2026 20:08:43 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:43 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=Vj2nYoePS1TiCkzp1 CAatz3dWQXQRnrhHZNMXIDk0vI=; b=UQqWqaxq1bYWOI0pwJClipZjdROz58pzx 6qm9BPyi9ZZ5zi6Ti7EnXLCsbS/2nRGgfHjA77o8e/3SC3/EmPNqMtZVJoOlS5PA XiP7QfYQl31I7L7z70knCfkmqZCxga5G8kbrQzCOnOhKk14bphDi+6qGV4dlJnfC m3B9dHNcQT0/OhH3iUdmvV/6RXNjBUm8kNnC54F46aOVepev7k1bjHDru7TChhLp Ls0QNleSqjCIhr8mrjXQHi3Veitilz3uBX+dfDpdKuwcT5eZJi0J6oz/+RIEoB98 +hZnxvnhAHj7uu/Z2raaTZ7NlEGL+LWY64bcnzUqllF+2+3tWYNSg== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Joshua Daley , Eric Farman Subject: [PULL 21/33] hw/s390x/ipl: Add secure boot support to PCI dev IPLB builder Date: Mon, 21 Sep 2026 16:08:18 -0400 Message-ID: <20260921200830.1302919-22-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: BV2BhR1yeps1Zwyj90-io8kmL2cbmFW1 X-Authority-Analysis: v=2.4 cv=I43w19gg c=1 sm=1 tr=0 ts=6ab18ece cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=4QctWtjvTb62bRHQMjcA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX5d/ZHlNcpE/b LqLbo8B6GWx7T/h83R5CrqVhCxRIjAgcsgaVjtmgVm2uVZseOjnRtDndR0dxiEjueJSdBHEkGVH C18vRQu/dNwU5Wzo/fGuSZ+iznXxNannNSxnX1cnZBduf6oedTEydCRueW6rO+nYUNsvvZCThnA ojHS2hReuZe182bRLNi85P+e9b5/+gFRH0taYmNQdu83fvaMAVwEzto2j4TXYXRzTmIf9ROj5vo Z92UCi8Lz0UTK9QZDymrs/KOgIwVU1y5TDWxy4JMspaN7T8sJVBB8VHrzr4vhYLKYjESJ3ZQHu7 K46Vp0AJot2SSqbfKMEi1ulEibQkN3QwFmoCWqB9g/8UswWRztLQ1dE1p8q5yXIPNoH4To1xnN2 mS8STdpu5akaMsFn8ADL9emanJH5ERSEqEOWxO8HKILc0tE8RqXkdmMycB/q0FIC1IvOho+zbHR fDxVfosnaB4CfwD9TaQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX5nEQNJOBSKUc S/yIgxZQHXIGjZLEl+XgQE3DSzqTli4JTN3mWYFQGOy4wD+gtDb7KyIORZD3hyyu4LUyfzm9jt3 K0i488FcLow7lstxEf4HHqiRENiWMx0= X-Proofpoint-GUID: BV2BhR1yeps1Zwyj90-io8kmL2cbmFW1 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 phishscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021487133158500 Content-Type: text/plain; charset="utf-8" From: Joshua Daley In the PCI boot device case of s390_build_iplb(), call s390_apply_secure_boot() to update the IPLB when secure boot or audit mode are enabled. Secure IPL is now supported for virtio-blk-pci boot devices. Signed-off-by: Joshua Daley Reviewed-by: Jared Rossi Reviewed-by: Zhuoying Cai Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260903155805.1881366-2-jdaley@li= nux.ibm.com Signed-off-by: Eric Farman --- hw/s390x/ipl.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index d59ed36c78..b0da3cbb27 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -599,11 +599,6 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPa= rameterBlock *iplb) =20 pbdev =3D s390_get_pci_device(dev_st, &devtype); if (pbdev) { - if (s390_secure_boot_enabled() || s390_has_certificate()) { - error_report("Virtio pci boot device does not support secure b= oot!"); - exit(1); - } - pci_lp =3D object_property_get_str(OBJECT(pbdev->pdev), "loadparm"= , NULL); if (pci_lp && strlen(pci_lp) > 0) { lp =3D pci_lp; @@ -625,6 +620,9 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPar= ameterBlock *iplb) s390_ipl_convert_loadparm((char *)lp, iplb->loadparm); iplb->flags |=3D DIAG308_FLAGS_LP_VALID; =20 + s390_apply_secure_boot(iplb, devtype, s390_secure_boot_enabled(), + s390_has_certificate()); + return true; } =20 --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021453; cv=none; d=zohomail.com; s=zohoarc; b=L2xx3177CTJqL1aoITyddgkTVIstpOhSt3zlt41mEJGtKoGOUD13FPVQbZo0mVyL2B0PTLyINAydpaUwh46z+vDEHzu5LC6zNfGcum8NDAGxTlT0pKpiUR++LyDjGa3+iR8CxpDWDxyhQ9DZqwXYDho9G4I8keiKEqHmbR6vmyI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021453; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=IXQb1T0BseVH5ND5kA8soZ2S0NaNEA5/77jGxglATFI=; b=h/3jqxQdgeq1UOgS9hDzFPa+CN/WcJmui+so5BldcLCxVjSzIXGXiukb+uD5451MD0jYMFrjQ4Gl1LqRRauozvsx0NnNW3UTwAfE3Wtzq3EP6hUhYuXdmN3BnDZ4C6VkfmSEcVkGHdiinu1P4rWfhlHcNqMvjMg38W79nJK3uYg= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021453098735.6141121707541; Mon, 21 Sep 2026 13:10:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kK1-0005tQ-0g; Mon, 21 Sep 2026 16:09:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJq-0005l4-C5; Mon, 21 Sep 2026 16:08:55 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJl-0005Nu-Ec; Mon, 21 Sep 2026 16:08:52 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8UGv1860730; Mon, 21 Sep 2026 20:08:47 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskg2ah4t-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:47 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJ0keQ1451434; Mon, 21 Sep 2026 20:08:46 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt67gpu55-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:46 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8jcw25428550 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:45 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0A5A558043; Mon, 21 Sep 2026 20:08:45 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 88E4D58055; Mon, 21 Sep 2026 20:08:44 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:44 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=IXQb1T0BseVH5ND5k A8soZ2S0NaNEA5/77jGxglATFI=; b=j2WStmqDmsLqZNlAwuTkjyfvwOb84qQEd AtJFHzwHxLntDmAX8cBpTtphtrue7Da7K/VB/k+OdIsEpimVJvKr5ZLNkSCf9M1T q4QrzbKd0AdeYnNpW7oWs09z4Y3zOORPPIZbBftkFRYg+UAvZ5jZIJRGZxlF2Tr+ 47I7Yi8NQJQHho8bJDCqY2MqafTBBPEq+3t4M7OPghsCxcrzIUq5AbAPecqr/iEi K8Xz9yTzFC42HIbjxIV0S6KkdOBYx8qrcVdIKo5v1KVvpN1Rhr1n2da2jk6oHsW5 TAI58F7z4Xaz4PFGStYzbXEGfrwOg/f/HLee+RbrFv1pg9Fbb0e8w== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Joshua Daley , Eric Farman Subject: [PULL 22/33] tests/functional/s390x/test_secure_ipl: Skip test if SIPL not supported by hypervisor Date: Mon, 21 Sep 2026 16:08:19 -0400 Message-ID: <20260921200830.1302919-23-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: Lt6hVkWlDLnDeYgd5lC58Uylr4V1N-rF X-Authority-Analysis: v=2.4 cv=I43w19gg c=1 sm=1 tr=0 ts=6ab18ecf cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=UZxYUTtkSsvthtqRCrcA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX5OzxFHXBVZT1 ZmMs+c0Xev3fEkQ6h6FbYN75ka56Xwl83Dlvrh6OjSrlJZQL5b2TJA3oAirOQw36/VOxONtpxxA 6L0Q8bvBK0SuEWZVdA2+iy90kKQf35u1v86jOKEUfxNqWPAjsXEPhgswRw3IqTKaVn3rVOIcV15 yV4f7iiumhhIQgaxoLY6SACAa4TCnCOLcoRU42lGV7xRdSjLy4YxrO/+3t2qaU+aPjQgjUEoaMK 3dqKKQSmGc6HHqUSdjBOujpIcyC+yLyvnaa1O7Pi0I2cBEqblzAH7PpliIUHTXI25h1AWuePl9K T216+9hwNl9T75Cw5h9Eo5HntnY4EK5KqvEx3WOiUhYgX8dXzyBRBExMpuF8h2DK8JBM5rVwJ8Q ZFHtQVSslgVpxUkQhq1zZIxmBvayVPLkEwE0jJNqTNcjDQ3vOfOsmuIPv042b52JnqoWokKxTQt GxWOaxCLR8X5Z2gv+8Q== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXxFCM2zxCSkaP +mYFCN1GWKf+ESDszgytA3QOK/rT39uS+HZWqaGrlN5Uuon/M3kJpKzfJw+7291pfby5+9hndba GFHSXNZss8Dl109Oj4yt9K7COu2dQ+I= X-Proofpoint-GUID: Lt6hVkWlDLnDeYgd5lC58Uylr4V1N-rF X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 phishscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021454952158500 Content-Type: text/plain; charset="utf-8" From: Joshua Daley Currently, if secure IPL is not supported by the hypervisor, the test will fail because "Verified component" never appears. One must inspect the console log to observe the cause of the failure. Add a check that skips the test if the host CPU model is missing the secure IPL facilities. Signed-off-by: Joshua Daley Reviewed-by: Jared Rossi Reviewed-by: Matthew Rosato Reviewed-by: Zhuoying Cai Link: https://lore.kernel.org/qemu-devel/20260903155805.1881366-3-jdaley@li= nux.ibm.com Signed-off-by: Eric Farman --- tests/functional/s390x/test_secure_ipl.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/functional/s390x/test_secure_ipl.py b/tests/functional/s= 390x/test_secure_ipl.py index 06fc93e404..5af36b91d8 100755 --- a/tests/functional/s390x/test_secure_ipl.py +++ b/tests/functional/s390x/test_secure_ipl.py @@ -29,6 +29,22 @@ def __init__(self, *args, **kwargs): self.cert_path =3D None self.prompt =3D None =20 + def _require_host_secure_ipl_support(self, vm): + """ + Skip the test if the host CPU model does not expose the Secure IPL + facilities (sipl, sclaf, cstore). + """ + props =3D vm.cmd('query-cpu-model-expansion', + model=3D{'name': 'host'}, + type=3D'full')['model']['props'] + missing =3D [f for f in ('sipl', 'sclaf', 'cstore') + if not props.get(f)] + if missing: + self.skipTest( + f"Host CPU does not support Secure IPL: " + f"missing feature(s): {', '.join(missing)}. " + f"Secure IPL requires a z16+ host.") + def _create_certificate(self, vm): """Generate x509 certificate""" exec_command_and_wait_for_pattern(self, @@ -107,6 +123,8 @@ def setup_s390x_secure_ipl(self): '-device', 'virtio-blk-ccw,drive=3Ddrive0,bootind= ex=3D1') temp_vm.launch() =20 + self._require_host_secure_ipl_support(temp_vm) + # Initial root account setup (Fedora first boot screen) self.root_password =3D 'fedora40password' wait_for_console_pattern(self, 'Please make a selection from the a= bove', --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021464; cv=none; d=zohomail.com; s=zohoarc; b=b3Tt/UunHs4ICdhKkyGadiE4E7/7Y9C5c0TpFyByq1fCzugo3GYytkOStYOZdmWYdlGeuzysqILhY7SYF9YXAIOsJAmsnKYkkHUsRwuB7JMrY1OvU6J1r9Q59/H4mGco7As1XGTl4o34y2RGzq6E+VJyW9lveQ3fuU3b5HjULO0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021464; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Uzn8QYsetvbe8LT9Gcf+LOOHp4yY1mUFkA6yetFYYmU=; b=QfkZfLreq56+8Hc53goBMAh7B0qHiboTz8mlrIpZAKHdkpvPColgiTc6LxdCGKkn6oJXY91+cdMBrv1d3+eL931g91L3/GzTsjjfkAMwx/B1MwV0zBwJE/Abjtqzw13CQYB/IZf/IE9tq4H5kK1o8ER3u475TCx967yX7k98HwU= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021464443603.0069581330966; Mon, 21 Sep 2026 13:11:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKB-00069w-NR; Mon, 21 Sep 2026 16:09:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kK7-0005yk-Sv; Mon, 21 Sep 2026 16:09:12 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kK5-0005Nx-FH; Mon, 21 Sep 2026 16:09:11 -0400 Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8PDo1903158; Mon, 21 Sep 2026 20:08:47 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskdv2bdx-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:47 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJPxfP1408943; Mon, 21 Sep 2026 20:08:46 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt5qjpvmf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:46 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8jC832047840 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:45 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A085F58043; Mon, 21 Sep 2026 20:08:45 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 27B7558059; Mon, 21 Sep 2026 20:08:45 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:45 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=Uzn8QYsetvbe8LT9G cf+LOOHp4yY1mUFkA6yetFYYmU=; b=VV8tcm3Rl7X9PES8dAfaQiacpEt+vBELm 73MGb2rIjwt+AyxxUpQ2tTZWw1uLTDZcxZ+v2tm9Fh5MkZ5EwY9T4tm9B688/5cR OpuMp0wiXFr3th/8m2/+l4rzdnp792ncNK6HTSbj9UQFY7aObNWZOs+HYmRSc+qC b8Aus2EcaBy3rUU0IjIahBAsJQCUe3AauCrt0tD0UgLtvPLwPCdRvyVqlj8L3Js6 A4KpwKNIBQnpvFxOZheB+JFqg3LRuuOh0fZTrVatq2BrNuUY4KxZtWIukSmSMAJT rgl6jwR297jWpU1lm1obdC0tTy3vnCsWaEuZUBJ5ecaw3UGgR9/XQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Joshua Daley , Eric Farman Subject: [PULL 23/33] tests/functional/s390x/test_secure_ipl: Add virtio-blk-pci boot dev case Date: Mon, 21 Sep 2026 16:08:20 -0400 Message-ID: <20260921200830.1302919-24-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: FpHU-T8CgzMFvNpOtJ5c8I3Lu6VgoB3N X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX0SxpQKY+BiOP rnuLCH1n52CdCHzbIaZHcBxAbAq98UB33Nnt0EEon476sYasRLmT2yNAyfCnsYrtygOMwfoTOsL keLXglsTpniFQb7bBVduFMODL1xZKUQ= X-Authority-Analysis: v=2.4 cv=FLiOVOos c=1 sm=1 tr=0 ts=6ab18ecf cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=WP5zsaevAAAA:8 a=jH-0nMekS77raGL10bsA:9 a=t8Kx07QrZZTALmIZmm-o:22 X-Proofpoint-GUID: FpHU-T8CgzMFvNpOtJ5c8I3Lu6VgoB3N X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX/Kj/jWcWgLMG d+cnw5dtN3Y3tW4HdVHnau5aOVCo0NmGn8Ob5i3lJZn68A8pWt6BAzDeWHNveRt65aOKmkOCJyK +HOBxe7IbZ/ccw8a5PyPO6Zql0VdWczQe/H4fL67JIsn5rDT6G/pVlm2ZXLkm96sH70oNZ0v47d Mlx6ZtNoBASix1Xw6AcV1/Wky2pxt75+5DSp61Qutfd+gX3lfzUHpvJgGtIhhuc5tpv7EVyp1b9 8GdcXAtMUgMH1bYGWXsmvAwidRNKQ2/sXAhYh4bqJzmwEkqhCbSEHG6R1wb6IMZ4lvVC0gryTn3 B3U67WPtMcCJgXPk3J4eF5FJOsfsKo+QGgzGRTwq7DV90S2NeqJu+SwSugZiGhz3prWLUPoXQol stBoc+ro+mDKBIHWlhdpHpvsl5qIh6nMOzf9xY8urcKQNqs8X/ubVJ8aS1ejiZf6WQmnSGVsZWI 8bfYpvZqQMG7ZAAw60w== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 phishscore=0 spamscore=0 clxscore=1015 suspectscore=0 bulkscore=0 lowpriorityscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021465114158500 Content-Type: text/plain; charset="utf-8" From: Joshua Daley Split test_s390x_secure_ipl() into two subtests. Each tests with a different boot device: virtio-blk-ccw or virtio-blk-pci. Use class-level variables and a temporary shared workdir such that the time-consuming setup is not run multiple times. Signed-off-by: Joshua Daley Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260903155805.1881366-4-jdaley@li= nux.ibm.com Signed-off-by: Eric Farman --- tests/functional/s390x/test_secure_ipl.py | 139 +++++++++++++++------- 1 file changed, 95 insertions(+), 44 deletions(-) diff --git a/tests/functional/s390x/test_secure_ipl.py b/tests/functional/s= 390x/test_secure_ipl.py index 5af36b91d8..461d73c0d7 100755 --- a/tests/functional/s390x/test_secure_ipl.py +++ b/tests/functional/s390x/test_secure_ipl.py @@ -8,6 +8,9 @@ secure-boot enabled, and verifying cryptographic validation results. """ =20 +import os +import shutil +import tempfile from subprocess import check_call, DEVNULL =20 from qemu_test import QemuSystemTest, Asset, get_qemu_img @@ -22,12 +25,25 @@ class S390xSecureIpl(QemuSystemTest): 'Fedora-Server-KVM-40-1.14.s390x.qcow2'), '091c232a7301be14e19c76ce9a0c1cbd2be2c4157884a731e1fc4f89e7455a5f') =20 - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.root_password =3D None - self.qcow2_path =3D None - self.cert_path =3D None - self.prompt =3D None + _shared_workdir =3D None + _root_password =3D None + _qcow2_path =3D None + _cert_path =3D None + _prompt =3D None + _setup_done =3D None + _host_lacks_sipl_support =3D False + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls._shared_workdir =3D tempfile.mkdtemp(prefix=3D'qemu_sipl_') + + @classmethod + def tearDownClass(cls): + if cls._shared_workdir is not None: + shutil.rmtree(cls._shared_workdir, ignore_errors=3DTrue) + cls._shared_workdir =3D None + super().tearDownClass() =20 def _require_host_secure_ipl_support(self, vm): """ @@ -40,6 +56,7 @@ def _require_host_secure_ipl_support(self, vm): missing =3D [f for f in ('sipl', 'sclaf', 'cstore') if not props.get(f)] if missing: + S390xSecureIpl._host_lacks_sipl_support =3D True self.skipTest( f"Host CPU does not support Secure IPL: " f"missing feature(s): {', '.join(missing)}. " @@ -62,7 +79,7 @@ def _sign_binaries(self, vm): exec_command_and_wait_for_pattern(self, 'sudo dnf install kernel-devel-$(uname -r)= -y', 'Complete!', vm=3Dvm) - wait_for_console_pattern(self, self.prompt, vm=3Dvm) + wait_for_console_pattern(self, S390xSecureIpl._prompt, vm=3Dvm) exec_command_and_wait_for_pattern(self, 'ls /usr/src/kernels/$(uname -r)/scrip= ts/', 'sign-file', vm=3Dvm) @@ -71,11 +88,11 @@ def _sign_binaries(self, vm): exec_command(self, '/usr/src/kernels/$(uname -r)/scripts/sign-file= ' 'sha256 mykey.pem mycert.pem /lib/s390-tools/stage3.bi= n', vm=3Dvm) - wait_for_console_pattern(self, self.prompt, vm=3Dvm) + wait_for_console_pattern(self, S390xSecureIpl._prompt, vm=3Dvm) exec_command(self, '/usr/src/kernels/$(uname -r)/scripts/sign-file= ' 'sha256 mykey.pem mycert.pem /boot/vmlinuz-$(uname -r)= ', vm=3Dvm) - wait_for_console_pattern(self, self.prompt, vm=3Dvm) + wait_for_console_pattern(self, S390xSecureIpl._prompt, vm=3Dvm) =20 def _run_zipl_secure(self, vm): """Run zipl to prepare for secure boot""" @@ -91,10 +108,11 @@ def _extract_certificate(self, vm): cert =3D "\n".join(out.decode("utf-8").splitlines()[1:]) self.log.info("%s", cert) =20 - self.cert_path =3D self.scratch_file("mycert.pem") + cert_path =3D os.path.join(S390xSecureIpl._shared_workdir, "mycert= .pem") =20 - with open(self.cert_path, 'w', encoding=3D"utf-8") as file_object: + with open(cert_path, 'w', encoding=3D"utf-8") as file_object: file_object.write(cert) + S390xSecureIpl._cert_path =3D cert_path =20 def setup_s390x_secure_ipl(self): """ @@ -109,39 +127,42 @@ def setup_s390x_secure_ipl(self): temp_vm.set_machine('s390-ccw-virtio') =20 asset_path =3D self.ASSET_F40_QCOW2.fetch() - self.qcow2_path =3D self.scratch_file('f40.qcow2') + qcow2_path =3D os.path.join(S390xSecureIpl._shared_workdir, 'f40.q= cow2') qemu_img =3D get_qemu_img(self) check_call([qemu_img, 'create', '-f', 'qcow2', '-b', asset_path, - '-F', 'qcow2', self.qcow2_path], stdout=3DDEVNULL, std= err=3DDEVNULL) + '-F', 'qcow2', qcow2_path], stdout=3DDEVNULL, stderr= =3DDEVNULL) + S390xSecureIpl._qcow2_path =3D qcow2_path =20 temp_vm.set_console() temp_vm.add_args('-nographic', '-accel', 'kvm', '-m', '1024', '-drive', - f'id=3Ddrive0,if=3Dnone,format=3Dqcow2,file=3D{se= lf.qcow2_path}', + f'id=3Ddrive0,if=3Dnone,format=3Dqcow2,file=3D{qc= ow2_path}', '-device', 'virtio-blk-ccw,drive=3Ddrive0,bootind= ex=3D1') temp_vm.launch() =20 self._require_host_secure_ipl_support(temp_vm) =20 # Initial root account setup (Fedora first boot screen) - self.root_password =3D 'fedora40password' + S390xSecureIpl._root_password =3D 'fedora40password' wait_for_console_pattern(self, 'Please make a selection from the a= bove', vm=3Dtemp_vm) exec_command_and_wait_for_pattern(self, '4', 'Password:', vm=3Dtem= p_vm) - exec_command_and_wait_for_pattern(self, self.root_password, + exec_command_and_wait_for_pattern(self, S390xSecureIpl._root_passw= ord, 'Password (confirm):', vm=3Dtemp= _vm) - exec_command_and_wait_for_pattern(self, self.root_password, + exec_command_and_wait_for_pattern(self, S390xSecureIpl._root_passw= ord, 'Please make a selection from the abov= e', vm=3Dtemp_vm) =20 # Login as root - self.prompt =3D '[root@localhost ~]#' - exec_command_and_wait_for_pattern(self, 'c', 'localhost login:', v= m=3Dtemp_vm) - exec_command_and_wait_for_pattern(self, 'root', 'Password:', vm=3D= temp_vm) - exec_command_and_wait_for_pattern(self, self.root_password, self.p= rompt, + S390xSecureIpl._prompt =3D '[root@localhost ~]#' + exec_command_and_wait_for_pattern(self, 'c', 'localhost login:', vm=3Dtemp_vm) + exec_command_and_wait_for_pattern(self, 'root', 'Password:', + vm=3Dtemp_vm) + exec_command_and_wait_for_pattern(self, S390xSecureIpl._root_passw= ord, + S390xSecureIpl._prompt, vm=3Dtem= p_vm) =20 self._create_certificate(temp_vm) self._sign_binaries(temp_vm) @@ -150,41 +171,71 @@ def setup_s390x_secure_ipl(self): =20 # Shutdown temp vm temp_vm.shutdown() + S390xSecureIpl._setup_done =3D True =20 - @skipBigDataTest() - def test_s390x_secure_ipl(self): + def verify_s390x_secure_ipl(self, boot_dev_bus: str): """ Verify secure boot validation during s390x guest boot. =20 Expects two "Verified component" messages and confirms /sys/firmware/ipl/secure reports secure boot is active. """ - self.require_accelerator('kvm') - self.setup_s390x_secure_ipl() - - self.set_machine('s390-ccw-virtio') - - self.vm.set_console() - self.vm.add_args('-nographic', - '-machine', 's390-ccw-virtio,secure-boot=3Don,' - f'boot-certs.0.path=3D{self.cert_path}', - '-accel', 'kvm', - '-m', '1024', - '-drive', - f'id=3Ddrive1,if=3Dnone,format=3Dqcow2,file=3D{se= lf.qcow2_path}', - '-device', 'virtio-blk-ccw,drive=3Ddrive1,bootind= ex=3D1') - self.vm.launch() + if boot_dev_bus not in ['ccw', 'pci']: + raise ValueError( + f"boot_dev_bus must be 'ccw' or 'pci', got {boot_dev_bus}") + + vm =3D self.get_vm(name=3Df'sipl_test_vblk_{boot_dev_bus}') + vm.set_machine('s390-ccw-virtio') + + vm.set_console() + vm.add_args('-nographic', + '-machine', 's390-ccw-virtio,secure-boot=3Don,' + f'boot-certs.0.path=3D{S390xSecureIpl._cert_path}', + '-accel', 'kvm', + '-m', '1024', + '-drive', + f'id=3Ddrive1,if=3Dnone,format=3Dqcow2,' + f'file=3D{S390xSecureIpl._qcow2_path}', + '-device', + f'virtio-blk-{boot_dev_bus},drive=3Ddrive1,bootindex= =3D1') + vm.launch() =20 # Expect two verified components verified_output =3D "Verified component" - wait_for_console_pattern(self, verified_output) - wait_for_console_pattern(self, verified_output) + wait_for_console_pattern(self, verified_output, vm=3Dvm) + wait_for_console_pattern(self, verified_output, vm=3Dvm) =20 # Login and verify the vm is booted using secure boot - wait_for_console_pattern(self, 'localhost login:') - exec_command_and_wait_for_pattern(self, 'root', 'Password:') - exec_command_and_wait_for_pattern(self, self.root_password, self.p= rompt) - exec_command_and_wait_for_pattern(self, 'cat /sys/firmware/ipl/sec= ure', '1') + wait_for_console_pattern(self, 'localhost login:', vm=3Dvm) + exec_command_and_wait_for_pattern(self, 'root', 'Password:', vm=3D= vm) + exec_command_and_wait_for_pattern( + self, S390xSecureIpl._root_password, S390xSecureIpl._prompt, v= m=3Dvm) + exec_command_and_wait_for_pattern( + self, 'cat /sys/firmware/ipl/secure', '1', vm=3Dvm) + + vm.shutdown() + + @skipBigDataTest() + def test_s390x_secure_ipl_ccw(self): + """Test secure IPL with a virtio-blk-ccw boot device.""" + self.require_accelerator('kvm') + if S390xSecureIpl._host_lacks_sipl_support: + self.skipTest("Host CPU does not support Secure IPL. " + "Secure IPL requires a z16+ host.") + if not S390xSecureIpl._setup_done: + self.setup_s390x_secure_ipl() + self.verify_s390x_secure_ipl('ccw') + + @skipBigDataTest() + def test_s390x_secure_ipl_pci(self): + """Test secure IPL with a virtio-blk-pci boot device.""" + self.require_accelerator('kvm') + if S390xSecureIpl._host_lacks_sipl_support: + self.skipTest("Host CPU does not support Secure IPL. " + "Secure IPL requires a z16+ host.") + if not S390xSecureIpl._setup_done: + self.setup_s390x_secure_ipl() + self.verify_s390x_secure_ipl('pci') =20 if __name__ =3D=3D '__main__': QemuSystemTest.main() --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021485; cv=none; d=zohomail.com; s=zohoarc; b=hA5qrNlKnOm1IeYQRLGPHKldgHS/PuAp6Lz1XBzGmllUzND7S22VLdXRKWCsANqjp1LT2fzQp4TCRr1v7HnlFd36Jqf32chWHAw6A8kIO4oNxTnEU7UUviWW8Z3yoqd31H6DprCPLWpOOTBCm1bru882vJCX28NJxcBPNQR7JHk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021485; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=4Z38P4OupDQscBXCPAeMX+qM2B60MlQgO0RQFGt4TQ4=; b=SJ2AmYwSpHMJLWk9ciInKLgkeLkivseIft9sz6+3EJgtNfuFB7XueJAJAaL1kUzKDxoPRe2jvzW0tga3NMYEPpZzJaHQzkl12ePnDQmnsjthX/C0vp2IRtHZAeWi3KxV+gfwAKFA6zH++DYjbZ/qiopsp41AZRYNO96GSePEEgM= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021485211387.78351788737734; Mon, 21 Sep 2026 13:11:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKH-0006IF-Sh; Mon, 21 Sep 2026 16:09:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kK9-00066l-Qt; Mon, 21 Sep 2026 16:09:13 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kK7-0005O8-A1; Mon, 21 Sep 2026 16:09:13 -0400 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8ZLt703577; Mon, 21 Sep 2026 20:08:48 GMT Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskgqa9e0-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:48 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJSllt2399662; Mon, 21 Sep 2026 20:08:48 GMT Received: from smtprelay01.wdc07v.mail.ibm.com ([172.16.1.68]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gt7dy6nbq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:48 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay01.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8kjk53019066 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:46 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 39CA25805E; Mon, 21 Sep 2026 20:08:46 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BAE8E58055; Mon, 21 Sep 2026 20:08:45 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:45 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=4Z38P4OupDQscBXCP AeMX+qM2B60MlQgO0RQFGt4TQ4=; b=EiLhdOjlFkKImDfujM9CMsxMvhZ14MxWe s3vodgb3T/U/496u42CGWaG92mp36B7UF94PURGIqv2YDKR4tZ39yIBLWlckyb9E O6wmw1IDJTm+3GjRPlqbLjAcyODWaSlxyY4qdpSZOuogQ55pAClWmdyEWW5YDN1h tAJM5CXxrm9DcTte03lrR8X4BNodV4iPQBWzDD4TIm2DETTbzfO1ROhGL/immHk8 sY2ONQL2i/HAdXVCw1591Bm4JBoMP3dDFPh0SpNLT5LY1YfH/EoiGt36sm1JWCIT r3Uh9LzazWW52KScQrD+0aj/YvFxk/1Bcz4V+5pe3Si/LtlUp5kbg== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Jared Rossi , Eric Farman Subject: [PULL 24/33] pc-bios/s390-ccw: Check if a PCI function is already enabled before trying to enable it Date: Mon, 21 Sep 2026 16:08:21 -0400 Message-ID: <20260921200830.1302919-25-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=G+OJgNk5 c=1 sm=1 tr=0 ts=6ab18ed0 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=rOHUGBc37_MNbdIC:21 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=NApzFvG8OdL9Xanj_wQA:9 a=O8hF6Hzn-FEA:10 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX35+oPeR6j03T Nw/R6jgrRwZl5e2mFYXWUPcXmF+P+7FLXAzLrV02AQ5NC/Sy5/A6yQbjElgT/qTZaMPky6AtwDX Lox0UTMsG5qnI1rq7ZrcWaWOtxxAgzowseScc6QtgRPdiFqnBiVgZUUpryV8a96Zex4B6qEGy4U Zcx4z1ubfud1LBPKtIluczB4YMMqFw9aIY9owi1gQrjH1ThqieAKugqhO7pcIf9jn+iGna2MMUZ IsLKunL8E7ZOBl5HxcWOHQ+LFPXMetYMxgu7/WMnaBtoEj2kkLZjXtuYBiDLWacFWtWa3vb8jSK /GMhPlggqhPztQHhmlpsdCHCyfQcapFGg+49emh+tSLAs5mgiX2HzSI5U/LmTXbstNvmqsvAZbE oCoY6bvUn84QwwikE/g3nj9KQB05h2PtEaa4KEUpV2WsXcL32Uc6cCtlnfmfA3Bkg9Y+woF9t78 KaUVt9uFk351Msw1ggA== X-Proofpoint-ORIG-GUID: 3q5dNCWM83aAjZoVM_HnXbQA-kwITUHW X-Proofpoint-GUID: 3q5dNCWM83aAjZoVM_HnXbQA-kwITUHW X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX79PGhWKaJb0U /9/8h6H8Qbk67I+TwXeVKxRpHN7K06v48GJrSLcsSTIGt+lrtyHmJIhDshDg8CTnXWd8z9LgwdW rL0VPpXtOZHL9LtEW3Igrl5nKkX9xvY= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 phishscore=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 priorityscore=1501 clxscore=1015 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021487125158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Enabling a PCI function that is already configured will result in an error. Simply check if the device has already been enabled, and if so, return without doing anything further; otherwise, enable it as usual. Also, because enable_pci_function() prints its own message, let's remove the duplicate message emitted during the virtio PCI setup steps. Reviewed-by: Zhuoying Cai Reviewed-by: Eric Farman Signed-off-by: Jared Rossi Reviewed-by: Jason J. Herne Link: https://lore.kernel.org/qemu-devel/20260831194919.3830270-2-jrossi@li= nux.ibm.com Signed-off-by: Eric Farman --- pc-bios/s390-ccw/clp.c | 4 ++++ pc-bios/s390-ccw/virtio-pci.c | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/pc-bios/s390-ccw/clp.c b/pc-bios/s390-ccw/clp.c index ca9565d8de..7917f13345 100644 --- a/pc-bios/s390-ccw/clp.c +++ b/pc-bios/s390-ccw/clp.c @@ -82,6 +82,10 @@ int enable_pci_function(uint32_t *fhandle) { ClpReqRspSetPci rrb; =20 + if (*fhandle & CLP_FHLIST_MASK_CONFIG) { + return 0; /* already enabled */ + } + rrb.request.hdr.len =3D sizeof(ClpReqSetPci); rrb.request.hdr.cmd =3D 0x05; rrb.request.fh =3D *fhandle; diff --git a/pc-bios/s390-ccw/virtio-pci.c b/pc-bios/s390-ccw/virtio-pci.c index f501252c81..231ab6e04d 100644 --- a/pc-bios/s390-ccw/virtio-pci.c +++ b/pc-bios/s390-ccw/virtio-pci.c @@ -452,7 +452,6 @@ int virtio_pci_setup_device(void) VDev *vdev =3D virtio_get_device(); =20 if (enable_pci_function(&vdev->pci_fh)) { - puts("Failed to enable PCI function"); return -ENODEV; } =20 --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021496; cv=none; d=zohomail.com; s=zohoarc; b=YAJCQzl6y5xAT0yZrJFopCIZ2ZtRvkZkwF1rQfJ3S+QpkwT2FwjhlypqVijeiNmhB8E2regoJwBp3zeEJ8btR6oKHMsZLNaGFTni+yz2lAOjcMupnTkFw+XBnYpbKJaMz1m3Mr010X9HHRDeeoXCXdeZVgqXN/9x30QgiEZiK/A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021496; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=tug2xrafeNLvl2Zt6S+y8PyY7tv16UHANxLi69pQyck=; b=VdTzmLTZOAEBrMzyV3+AyqkPJ/4XaL2XJaHuDx50pyOAoI7wGWXV2x0gQSDEnZ4qgBTocqAk7AozTQ6YqTI2NzCKIhbPfSgx0TWHRViyzMbCCXJYJ22566ZCENYDRtnvqtjG0EmohF0T7lq9IGuyMyFuPS2Z0Db3r9wf54AjFZE= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 179002149619669.24284730630313; Mon, 21 Sep 2026 13:11:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKO-0006bf-S4; Mon, 21 Sep 2026 16:09:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKJ-0006ME-9a; Mon, 21 Sep 2026 16:09:23 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKH-0005Oy-JX; Mon, 21 Sep 2026 16:09:23 -0400 Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8TSV1903178; Mon, 21 Sep 2026 20:08:49 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskdv2be0-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:49 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJET9G1489468; Mon, 21 Sep 2026 20:08:48 GMT Received: from smtprelay01.wdc07v.mail.ibm.com ([172.16.1.68]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gt4qq71u1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:48 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay01.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8kkj64881064 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:47 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D82A158059; Mon, 21 Sep 2026 20:08:46 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 54AAC58055; Mon, 21 Sep 2026 20:08:46 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:46 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=tug2xrafeNLvl2Zt6 S+y8PyY7tv16UHANxLi69pQyck=; b=JueFpaimayLqcq4ExZA15QH1aecVOmC7H l/J53TaL00HKc17DlzCjiW0jOwmaxSbJ7KpCtIhIU9sPBWrgpqB8eEOWMRTHq58e RidTaAYBCjVLqGNUNrYwzYKeAY/J8nTd+xsKxavZDLzplLIMQyoNNHKEe3VmxUMH hT9rcb5F9M09klVICSUPa4R2TYg5WV3sDMFrANfBZSiXRn9+Apx+IvVP8dQ+XujU NCT6cF6jVP1SQrnYal6KPbuc5Rv9dN6M2ASKsjjPeBzWNdqQAtb5X3MUFru+vw3D ECiE8+0Ht07CYAfDpUhJJguRxosJen9F1qseMD/l02l7hDNI94cbA== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Jared Rossi , qemu-stable@nongnu.org, Eric Farman Subject: [PULL 25/33] hw/s390x/ipl: Fix incorrect PCI IPL block lengths Date: Mon, 21 Sep 2026 16:08:22 -0400 Message-ID: <20260921200830.1302919-26-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: OISg6mIS0LHnL4gZLCn2GJqbbQWQfYOp X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX03jqlJEw8cn4 W6tzhh5BfdpL0H7C0/JMW/zHNIxVh0aJMqThdwQ6HtMKZeIrNG2hSZ6nehaOleZAWrLVlP6Q0+K LVRVuRVbMKROS5tqKdSX/EzsvwXuq6o= X-Authority-Analysis: v=2.4 cv=FLiOVOos c=1 sm=1 tr=0 ts=6ab18ed1 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=69wJf7TsAAAA:8 a=oWrvFdo7ebCuo4saDU8A:9 a=Fg1AiH1G6rFz08G2ETeA:22 X-Proofpoint-GUID: OISg6mIS0LHnL4gZLCn2GJqbbQWQfYOp X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXzHN79tLj10VX hPMqWnvC5DjIEoCgBPStrNwJZh45cD+FMorahkfe2DJqrb3kxH82z3hBOA5cYVXOyNgv4Qf+Sh/ J3UmRnqjKdyMmZkWUWYqxaGFZONxfnQtCe6BJjl1qDA3jAx0qvYZoRpiMHcItx3E8Wvyw0lEf5s o+h+d1pTmu0Wpb0QFB7UP0QR0jNF2s0X5hsD3mQuz+AmPTFEgTdXemYTrToCJRRJKxydoX1UEVU kc4mO6oO59DJIlHLdIdLE5SW0VkYFGBUmeT1XGoF0lkxc7c9Wpgux1VUIPiXlisRYfHeh/AS1S3 3fJ8IAZkyYndLYg5HCA3tk+apGp9YPNMg4t1PnXK2XirLvBT55RoTn0zYgn+Do42ePlHNyitQ4v e039zqHHkr87BH/QEcChsRIHyAgHP0vjAaH+aXIe8+5hcQqcJQvKcwJlScvruVl8kgeZt6rpuIV EW9MjFao2rl0NRVZWfg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 phishscore=0 spamscore=0 clxscore=1015 suspectscore=0 bulkscore=0 lowpriorityscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021497179158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi The length of the PCI IPLB is calculated by size of the IplBlockPci struct plus the number of bytes used for common IPLB fields. Fix the S390_IPLB_MIN_PCI_LEN to reflect this, and assign a valid blk0_len while we are at it. Cc: qemu-stable@nongnu.org Fixes: 395116781df5 ("s390x: Build IPLB for virtio-pci devices") Signed-off-by: Jared Rossi Reviewed-by: Matthew Rosato Reviewed-by: Jason J. Herne Reviewed-by: Eric Farman Link: https://lore.kernel.org/qemu-devel/20260831194919.3830270-3-jrossi@li= nux.ibm.com Signed-off-by: Eric Farman --- hw/s390x/ipl.c | 2 ++ include/hw/s390x/ipl/qipl.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index b0da3cbb27..b2b87beefd 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -610,6 +610,8 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPar= ameterBlock *iplb) switch (devtype) { case PCI_DEVTYPE_VIRTIO: iplb->len =3D cpu_to_be32(S390_IPLB_MIN_PCI_LEN); + iplb->blk0_len =3D + cpu_to_be32(S390_IPLB_MIN_PCI_LEN - S390_IPLB_HEADER_LEN); iplb->pbt =3D S390_IPL_TYPE_PCI; iplb->pci.fid =3D cpu_to_be32(pbdev->fid); break; diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index 3fa9649112..69b0023ea3 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -39,7 +39,7 @@ typedef enum S390IplType S390IplType; #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_PCI_LEN (offsetof(IplParameterBlock, pci) + sizeof(I= plBlockPci)) #define S390_IPLB_MIN_QEMU_SCSI_LEN 200 #define S390_IPLB_MAX_LEN 4096 =20 --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021559; cv=none; d=zohomail.com; s=zohoarc; b=ijSv5H45N7DBT6sA5kEFB7T7Vl6b/vMF8sz5m3yJQq01oUCCS+38a5WHnEbwUynxnvXzNbXM7eYFDUs8rEVPvVa5nv6wsv9lyPQvYyOMGYhDjRrP0TDvod8CT1J8zqmFnpZ7WBPXyjzehObkl14m0IAKt3HdwJATa7AFfe3TtNc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021559; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=8f67zb8Ln5umEixsmylUBWTEtbHQlAuJGdPD9CvQhmc=; b=Y3NB4Qm9XEf7NWP+VZokK+HtmGsm89MVOOnS1ZQf3a5e0v6Nd0cmH9+e9OIYgxueO/YNvQbzV+TjG5mjGC55Tvc7Z+t+5y+65byNJRY6HvrFJ0wixnTJsD1tsVbDdVIaD0KRjkT+7Vhko0564ZPzzeGZPHg3qLOAtLy76jG24ZA= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021559283701.3391526186622; Mon, 21 Sep 2026 13:12:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKK-0006OA-Rp; Mon, 21 Sep 2026 16:09:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKC-0006Cc-JX; Mon, 21 Sep 2026 16:09:16 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKA-0005PA-GZ; Mon, 21 Sep 2026 16:09:16 -0400 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8Yom703543; Mon, 21 Sep 2026 20:08:50 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskgqa9e1-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:49 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJGO1i167243; Mon, 21 Sep 2026 20:08:49 GMT Received: from smtprelay02.wdc07v.mail.ibm.com ([172.16.1.69]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gu5bk9f17-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:49 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay02.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8lpQ24904430 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:47 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 74A2058059; Mon, 21 Sep 2026 20:08:47 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F349C58055; Mon, 21 Sep 2026 20:08:46 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:46 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=8f67zb8Ln5umEixsm ylUBWTEtbHQlAuJGdPD9CvQhmc=; b=QSDoN1hmuBFRW4buviUtY6l3dqbo3TRb+ 6MuKQRk/srNv2xWcO2YtT3wcNBg4ZVupeTFd/MujkzJhr2/d5ZbsDddhHkcYDqUV NITwuESaYLtBCap5XGQzowjcWdHZ2mAGXA0Aw8TbVzrglijoaxQWx1/M3wQTAnr1 VL4TbnS2Ld1WjSw9mm44IKkMYt0J/h7FmgS/PKznKLZQhQu/7dQuFTvLcd/dog8B 6L3/pJnM+bPm1f6NM2E/ZTDsnReZlWT3bGeai7+CBuMF0N5EsHsEGcivif+m8kgf AldFunb+1SqiYnu6mZPEUXNoiQ4qmAMyRxvyB5iCYU3yALVmd0tyg== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Jared Rossi , Eric Farman Subject: [PULL 26/33] pc-bios/s390-ccw: Use bus specific IPL_TYPE directly for scsi IPL Date: Mon, 21 Sep 2026 16:08:23 -0400 Message-ID: <20260921200830.1302919-27-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=G+OJgNk5 c=1 sm=1 tr=0 ts=6ab18ed1 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=9ItSZUHxVnaaG6JHy3sA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX2fcOf0s54nZl 21T82+OKkNe2fT3xvNy7uQTGLxEm1k+SXrrlGP4MbU8v5pqF6EbPPXqfQovb4DuuWq+BpExC4X0 L5s2sKnLHupTYuQDxiqpdeVFFgWtAvzo/gGfZv32+b6psovyFwY9dVwp57bRrf2pRkP6y+O2QiE c57yBL7jUtcWHu6cQXauF/hf9ngB02xxC5uliPc2BGoVqAsWPmDhrc/F//B/tjXi0UMS1b+Z/kY hhO9dZw37HG4kUAgdEbLPUyWgUXhEblBoE+/OeXslPwposOn0aR7HYLTbxsyX6iMBCde64dZAOc IsL0ncnRw+yX64EyixnBXS2TFS2UKOnx1oh/HxXIE61z8xv2qHlRVu7D60WxbG4jolu0Op2dNwm y7sul9x9vxDVB5EyjsxI8zktrnT5eI2EES1Ip5rwszI6xSQH7betTqLjNEMKvnid9ccEdQO0mxw 6nB5oDxY18W2LmoNn+A== X-Proofpoint-ORIG-GUID: E0Cy-jUCr_PMYiH-XFGcYXUbXvX3VKIp X-Proofpoint-GUID: E0Cy-jUCr_PMYiH-XFGcYXUbXvX3VKIp X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX/+n+45RR3lUm z1r5x/RE7/wh0kOwicQWbfMAR8voS8v7gXxs0+ft/M4yiBYQRpORinqBYZ2RiEGxWpDv8j7ftAT IaYNSg6BrCUVyDD/xPb/UjlehfChH0U= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 phishscore=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 priorityscore=1501 clxscore=1015 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021559569158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi All existing switch cases that handle S390_IPL_TYPE_QEMU_SCSI directly fall through to S390_IPL_TYPE_CCW. Rather than always fall through, reassign vdev->ipl_type to the appropriate bus for the scsi controller and proceed as usual, where the bus is designated by the "bus" field and set during the IPLB build. Because S390_IPL_TYPE_QEMU_SCSI should not appear as an ipl_type once the device is found, remove that specific case from other existing switches and allow it to land in the default case, which will generally result in an immediate error. Reviewed-by: Eric Farman Signed-off-by: Jared Rossi Reviewed-by: Jason J. Herne Link: https://lore.kernel.org/qemu-devel/20260831194919.3830270-4-jrossi@li= nux.ibm.com Signed-off-by: Eric Farman --- pc-bios/s390-ccw/main.c | 13 ++++++++++--- pc-bios/s390-ccw/virtio-blkdev.c | 1 - pc-bios/s390-ccw/virtio.c | 5 ----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 8fc1cbf653..6ab2b8f75b 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -261,8 +261,16 @@ static bool find_boot_device(void) vdev->selected_scsi_device.channel =3D iplb->scsi.channel; vdev->selected_scsi_device.target =3D iplb->scsi.target; vdev->selected_scsi_device.lun =3D iplb->scsi.lun; - blk_schid.ssid =3D iplb->scsi.ssid & 0x3; - found =3D find_subch(iplb->scsi.devno); + vdev->ipl_type =3D iplb->scsi.bus; + switch (vdev->ipl_type) { + case S390_IPL_TYPE_CCW: + blk_schid.ssid =3D iplb->scsi.ssid & 0x3; + found =3D find_subch(iplb->scsi.devno); + break; + default: + puts("Unrecognized SCSI controller"); + break; + } break; case S390_IPL_TYPE_PCI: found =3D find_fid(iplb->pci.fid); @@ -346,7 +354,6 @@ static void ipl_pci_device(void) 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; diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blk= dev.c index 98b6cec3a0..83a1185dd5 100644 --- a/pc-bios/s390-ccw/virtio-blkdev.c +++ b/pc-bios/s390-ccw/virtio-blkdev.c @@ -253,7 +253,6 @@ int virtio_blk_setup_device(VDev *vdev) puts("Using virtio-blk."); =20 switch (vdev->ipl_type) { - case S390_IPL_TYPE_QEMU_SCSI: case S390_IPL_TYPE_CCW: return virtio_ccw_setup(vdev); case S390_IPL_TYPE_PCI: diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index a0d249db24..0b33544144 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -61,7 +61,6 @@ char *virtio_get_ring_area(int ring_num) int drain_irqs(void) { switch (vdev.ipl_type) { - case S390_IPL_TYPE_QEMU_SCSI: case S390_IPL_TYPE_CCW: return drain_irqs_ccw(vdev.schid); default: @@ -109,7 +108,6 @@ void vring_init(VRing *vr, VqInfo *info) bool vring_notify(VRing *vr) { 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; @@ -130,7 +128,6 @@ bool vring_notify(VRing *vr) 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: @@ -231,7 +228,6 @@ int vring_wait_reply(void) int virtio_reset(VDev *vdev) { switch (vdev->ipl_type) { - case S390_IPL_TYPE_QEMU_SCSI: case S390_IPL_TYPE_CCW: return virtio_ccw_reset(vdev); case S390_IPL_TYPE_PCI: @@ -244,7 +240,6 @@ int virtio_reset(VDev *vdev) bool virtio_is_supported(VDev *vdev) { switch (vdev->ipl_type) { - case S390_IPL_TYPE_QEMU_SCSI: case S390_IPL_TYPE_CCW: return virtio_ccw_is_supported(vdev); case S390_IPL_TYPE_PCI: --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021417; cv=none; d=zohomail.com; s=zohoarc; b=Ehr7251v/YwLgnxe/SIJty1U9GRJXL/Mm/Ih4E6hma2dY5zsUXlAOehx8fdTTHJd4M5Kgzo5ygKqsNEWALPEH6vjsd2UyZi+KLcx1SVG61SOhSp3x3LoCGmTtyF0nETARscig7xn9S0hsPJU3q6vLOaHu35g1LBAALLYcX7B2V4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021417; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ZOITuEInNY2RZ+hG03fPrZlU9dBVEsWBaMd5vkXquTc=; b=ePT71mhXnSyyTwVPclLW8kJnwbSubNS3gSGrtwy+5xw//VTB+h0UTsmeCvl7XXN+MmpLudcp5hb4MzfSmD5OL/nraPQ6e3Yn5R9Irk1sCgyHqMQ52YXOM/lgOf4sv3aWi0HUecl+n0d6PQ6yA24q63EG0ipPsg/TZufsXi+OXBU= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021417931428.7856139507345; Mon, 21 Sep 2026 13:10:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kK6-0005w3-ED; Mon, 21 Sep 2026 16:09:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJt-0005mm-Cr; Mon, 21 Sep 2026 16:08:57 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kJq-0005P6-EE; Mon, 21 Sep 2026 16:08:56 -0400 Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8Ewp4193462; Mon, 21 Sep 2026 20:08:50 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gske1jh6x-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:49 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJIMrF1489425; Mon, 21 Sep 2026 20:08:49 GMT Received: from smtprelay04.dal12v.mail.ibm.com ([172.16.1.6]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gt4qq71u3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:49 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay04.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8mHe13042220 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:48 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1E2D358059; Mon, 21 Sep 2026 20:08:48 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 903A55805D; Mon, 21 Sep 2026 20:08:47 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:47 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=ZOITuEInNY2RZ+hG0 3fPrZlU9dBVEsWBaMd5vkXquTc=; b=iawaiepJEaJDkjChZpvOR6MJUFjfv+MW5 w1vtFycjkIrN4Z4duySizEf08BdkTfZU7oHcjlet9tNButHHAuhmGeijhyinZPzD d+LE3ItELDyQN4dQP8zGhgmfTRyud4u+JRuWdWiU7iMaitjUOhKeaZlUIuWSH1BZ NOnHSPYT8BbSOL688jIg5a8rqznHZ/pYhdimmPsn9d61pA3+cI8r3Vb1MtuCD4l4 FogDRjPqtpvcJmwlT4Fu0MmWCkF7jPbvu7/mRkcWfhD1LLwGEXw6bDE6yGkwAx4f Qx4J3xm+uAYn5wL1Gjqb05P2oeK2lSuqPI8+KOzlfvYGa5h96oaoA== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Jared Rossi , Eric Farman Subject: [PULL 27/33] s390x/ipl: Add PCI and bus fields to IplBlockQemuScsi Date: Mon, 21 Sep 2026 16:08:24 -0400 Message-ID: <20260921200830.1302919-28-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: mm5EPjJlN8guTglS9Wrvk5xtk9JeqIUw X-Authority-Analysis: v=2.4 cv=EOCTQFZC c=1 sm=1 tr=0 ts=6ab18ed1 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=omE_1ZJ1-raI6ZwwQhYA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXz6O21X6F7Tjo ha69NtnZ7uqQi1skB8hIAmtN9rN/KXLosSu3Cpail5DRCQw9kZ8R6LebA89ro15glqDobsEFW2t 5qSnSQrxDoLewNrtaXVK3/kfN6PGpOg= X-Proofpoint-GUID: mm5EPjJlN8guTglS9Wrvk5xtk9JeqIUw X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX9pxpFRbNtgjF B74TCmmF9bGNuVOLdK6GmTMJ4sTYRNvXKVefL9wMDg/+RmTEvZimv/diO3nDgc+yt2Wqz2Fa+Qu 1aI6TG2zCR13f7jqy97Sj4/Wj2fIu0NhCOZQg5tfkUvOcEWU61sZjTYsplMKfqizf1mzzs3R6Zp dXlIX9rzHE2ZvMoqqDaHddNbKJWyMGe6R31HZai2CKywUXfPiZZl6Bo7NUXW0iwbygIjhFkJtp4 cu5jGSqK6lfRO0yy9WlD7JVRq5Jy5RWHhCBXMfgJb58M9Nz05biXDULNX6CA+K3g48gyvztZfH6 PsFSxBtDfE2x5zTbvBHvZCE/r1T8vpeubzgJF9KtsNW4QVHG3OMBg3/0u3+5bInmaMGWFl8P8n5 AVEJZeNrKGzXj3IpYU4wCDsAjItppTpZ9xbApp52F9Nwi/6PPAm+jxJ14jRP8aBP52NxCGpKBPY NLXbakfsBQmI7cfxGcQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 phishscore=0 priorityscore=1501 clxscore=1015 spamscore=0 adultscore=0 impostorscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021418895158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Rather than add a second non-architected IPLB type for scsi-pci devices, let's add the relevant fields to the existing struct so that it can handle both PCI and CCW scsi controllers. The PCI and CCW fields of the IplBlockQemuScsi are aligned with same offsets as the corresponding fields in IplBlockPci and IplBlockCcw for potential union access. Add comments for PCI/CCW specifics and also denote that the S390IplType enum values must fit in uint8_t. Reviewed-by: Eric Farman Signed-off-by: Jared Rossi Reviewed-by: Jason J. Herne Link: https://lore.kernel.org/qemu-devel/20260831194919.3830270-5-jrossi@li= nux.ibm.com Signed-off-by: Eric Farman --- hw/s390x/ipl.c | 1 + hw/s390x/ipl.h | 2 ++ include/hw/s390x/ipl/qipl.h | 13 +++++++++---- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index b2b87beefd..4fa8124f92 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -563,6 +563,7 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPar= ameterBlock *iplb) iplb->scsi.lun =3D cpu_to_be32(sd->lun); iplb->scsi.target =3D cpu_to_be16(sd->id); iplb->scsi.channel =3D cpu_to_be16(sd->channel); + iplb->scsi.bus =3D S390_IPL_TYPE_CCW; iplb->scsi.devno =3D cpu_to_be16(ccw_dev->sch->devno); iplb->scsi.ssid =3D ccw_dev->sch->ssid & 3; break; diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h index 772566bb11..580f42aa4a 100644 --- a/hw/s390x/ipl.h +++ b/hw/s390x/ipl.h @@ -86,6 +86,8 @@ struct S390IPLState { uint16_t devno; }; QEMU_BUILD_BUG_MSG(offsetof(S390IPLState, iplb) & 3, "alignment of iplb wr= ong"); +QEMU_BUILD_BUG_MSG(offsetof(IplBlockQemuScsi, fid) !=3D offsetof(IplBlockP= ci, fid), + "iplb fields misaligned across bus types"); =20 static inline bool iplb_valid_len(IplParameterBlock *iplb) { diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index 69b0023ea3..e733c6ce31 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -29,7 +29,7 @@ enum S390IplType { 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 + S390_IPL_TYPE_QEMU_SCSI =3D 0xff /* Max value, must fit in uint8_t */ }; typedef enum S390IplType S390IplType; =20 @@ -123,9 +123,14 @@ struct IplBlockQemuScsi { uint32_t lun; uint16_t target; uint16_t channel; - uint8_t reserved0[77]; - uint8_t ssid; - uint16_t devno; + uint8_t bus; + uint8_t reserved0[76]; + uint8_t ssid; /* CCW only */ + uint16_t devno; /* CCW only */ + uint8_t reserved1[216]; + uint8_t opt; /* PCI only */ + uint8_t reserved2[3]; + uint32_t fid; /* PCI only */ } QEMU_PACKED; typedef struct IplBlockQemuScsi IplBlockQemuScsi; =20 --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021402; cv=none; d=zohomail.com; s=zohoarc; b=JW8HkVA6LLYJm8Va8FV6xy//w3usxDjm1UPhJ+hiSfqYmDSZVSyiktCsqa3Wq0eRbWykGOjdSjOo6DfIZMnMZyhXBUhkdEB2bz1svx8Oni7pt0Ko7OGFL62wFJ+aR0+GOhhOhWFPSRIpjOmfUW6hICmivPli5yIU7lS3a6K3Hak= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021402; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=6d9xzvsVRtXXMEMmqeJv7dmZV7NSgM+UQYeH4PMjA2Y=; b=lNpgIePalXEq9POahEM/2F5FdRhcL2gLj1RkUuuc13ScOix1t80EZZxd4c3LjyducBp4fAaw5fzHjPMx/f33prgwyU7kyOm7CZWNkm0NqNE0V8A4TKsbAPUK9AMOcUX15sTwyaIdDb52EQPv8AVchXgi5HJog0tvaaRTnn3eLeA= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021402112907.3470207405088; Mon, 21 Sep 2026 13:10:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKM-0006Tp-P2; Mon, 21 Sep 2026 16:09:26 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKC-0006D4-Ql; Mon, 21 Sep 2026 16:09:16 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKA-0005PH-Gg; Mon, 21 Sep 2026 16:09:16 -0400 Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8NVF1869625; Mon, 21 Sep 2026 20:08:50 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskgs2h2s-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:50 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJKJMx167161; Mon, 21 Sep 2026 20:08:49 GMT Received: from smtprelay04.dal12v.mail.ibm.com ([172.16.1.6]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gu5bk9f18-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:49 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay04.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8m6b55247158 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:48 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AE72158043; Mon, 21 Sep 2026 20:08:48 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3B39A58055; Mon, 21 Sep 2026 20:08:48 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:48 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=6d9xzvsVRtXXMEMmq eJv7dmZV7NSgM+UQYeH4PMjA2Y=; b=azV22Li51mGerXmeoigL+HBuAK2Y7nzcp CU/xRyyzCIt63I68ayS1wChMr2f7dLlamExdpnuubWh9Th4Zy50ve1ysnEodac9u X94re9Ye9YxVqmJmitpVwLwY7dTln5MBI3oO+CmquhFZDeV52MLnMgjf6+lLsjDn HGv3iF0APeUUfbUjIa+3cpg1HG3ZqFHnvAYDChZTZyANePAuNTJ6GbO65gterYey 0IVtr9rMJfQ64DXV5xgpjnkwfTVL1kqWtj87YJ5ZlykkesrsDeE0PFe3ekBDU0Oi qrrx3JsNKiUwtkThUwsGSXaM9kJH7ULsMbsOyvbQqtZ0xa+nkhW6A== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Jared Rossi , Eric Farman Subject: [PULL 28/33] pc-bios/s390-ccw: Abstract virtio_run() for generic use Date: Mon, 21 Sep 2026 16:08:25 -0400 Message-ID: <20260921200830.1302919-29-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=V/XoQuni c=1 sm=1 tr=0 ts=6ab18ed2 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=0PGiSlKGR9UV7cgr1PYA:9 X-Proofpoint-ORIG-GUID: bnC2ybh97jtiEWxWCTFUOPOwXUYEezh6 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX/SotjiKaqqDf 00jAoM4FzEb9HG7UN3IycfnBQ77jIz57VRtLzc59UgbKaHmcvNHm8eDJrB3eL94ZLib2xKLvPUI 7K7kW9Fmc/XvOOFY8OfbpD9svcPOf8fC7nUt6ub1dlyABxyNsTR5d/JVuDLZICGjP7yIGesRqjk QguGW8ENlct9tqQiUHeIsxaUna/4JWqv+KgFHHO34JdWVNvXEjAdPKiaiBDAznE/ei0K61D0l0B ktxDwx/uAhVc7v/JRjWtXbrc8irwtyWAC4Ay+Bx4viVN8HSekDaw95HgjXeo2nqITGMY5yBQWw3 O/3IqHP/HZHmpyfaMYMncvXBuEmm1GoNd+a2I7GbXSkWHkvWdXUSIv6U8gZsBD7WbYPw13RtizX FtTLMoF5l5vPOsG6qOn2cAHV7KiQ1NHCy1DLZYIF2KHd0z5ylP7IK6gZvH6UWe+1ho5OJW+GNL7 RiZKqxk4Ql9pxKXskAQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXxN2JYgLJpZ8O 1OIbEBRdJwVQl2r6jOZpFp3uq1yLsZmfGJYvQWaVeg2ysOfB1aWFC06Wra3/rcv/0PzlSWCKvld N/13lAlzGsM4Npsyrvhf4lrmsPHK2r8= X-Proofpoint-GUID: bnC2ybh97jtiEWxWCTFUOPOwXUYEezh6 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 malwarescore=0 clxscore=1015 phishscore=0 bulkscore=0 adultscore=0 lowpriorityscore=0 impostorscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021402858158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi The existing virtio_ccw_run() actually has no dependency on CCW. Rather than add a case for non-ccw devices, we can just put the main logic right in the virtio_run() call so that it can be used for other bus types directly. Reviewed-by: Eric Farman Signed-off-by: Jared Rossi Reviewed-by: Jason J. Herne Link: https://lore.kernel.org/qemu-devel/20260831194919.3830270-6-jrossi@li= nux.ibm.com Signed-off-by: Eric Farman --- pc-bios/s390-ccw/virtio-ccw.c | 17 ----------------- pc-bios/s390-ccw/virtio-ccw.h | 1 - pc-bios/s390-ccw/virtio.c | 16 +++++++++++----- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/pc-bios/s390-ccw/virtio-ccw.c b/pc-bios/s390-ccw/virtio-ccw.c index 5cb2158ed2..ea5dbc2857 100644 --- a/pc-bios/s390-ccw/virtio-ccw.c +++ b/pc-bios/s390-ccw/virtio-ccw.c @@ -107,23 +107,6 @@ long virtio_ccw_notify(SubChannelId schid, int vq_idx,= long cookie) vq_idx, cookie); } =20 -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); diff --git a/pc-bios/s390-ccw/virtio-ccw.h b/pc-bios/s390-ccw/virtio-ccw.h index a506767eaa..43d21906e5 100644 --- a/pc-bios/s390-ccw/virtio-ccw.h +++ b/pc-bios/s390-ccw/virtio-ccw.h @@ -16,7 +16,6 @@ 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); diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index 0b33544144..34c5e6ee22 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -70,13 +70,19 @@ int drain_irqs(void) =20 int virtio_run(VDev *vdev, int vqid, VirtioCmd *cmd) { - switch (vdev->ipl_type) { - case S390_IPL_TYPE_QEMU_SCSI: - case S390_IPL_TYPE_CCW: - return virtio_ccw_run(vdev, vqid, cmd); - default: + 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; } =20 void vring_init(VRing *vr, VqInfo *info) --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021467; cv=none; d=zohomail.com; s=zohoarc; b=RitzcvypfoOZv5E6djnMBVnFA0QN4dJqLS5tQADY05eswkkk2DCR+acpfMAcVg+zdWswq1Wx55M6Knaqw1DbbN+J2BByfcT9s1llfziCcvtVckutz/WOyfHifVUZxOltZtFJRj7hE2usuoR05gCrTOLBp8aevP0qsGmqFd0KksM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021467; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Rz4dgk8kfR9oiKX1UFY0Jf53lKvK5ABW6bwWPfMj1t4=; b=NE6M5XEhcEqXdW65jRO0gOQ0ln/ujl4hRapIb3dxGZm1GJmdU8R7oeCjDImFEfxXTOXI0SteALVSh3j+n8jCZtQdHC8IFMIJj4ALuHLtnbTisyiRzv9G6xBJ48Gu8i25QqMSVemWlS+s82x9LWn9nU6vO/WxVAe2UAb1NTD8ZXU= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021467597678.28910883222; Mon, 21 Sep 2026 13:11:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKJ-0006Lx-8j; Mon, 21 Sep 2026 16:09:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKC-0006CK-G7; Mon, 21 Sep 2026 16:09:16 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKA-0005PX-Fu; Mon, 21 Sep 2026 16:09:16 -0400 Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8YQr1711881; Mon, 21 Sep 2026 20:08:51 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gske1abwc-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:50 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJK5UB1451389; Mon, 21 Sep 2026 20:08:50 GMT Received: from smtprelay05.dal12v.mail.ibm.com ([172.16.1.7]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt67gpu5c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:50 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay05.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8nvq32113324 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:49 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4A0F05805E; Mon, 21 Sep 2026 20:08:49 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C8D4B58059; Mon, 21 Sep 2026 20:08:48 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:48 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=Rz4dgk8kfR9oiKX1U FY0Jf53lKvK5ABW6bwWPfMj1t4=; b=pG9yev1nqWOaIGCWGOaoZZQSzXRrvkIU+ mNP+ntUiTmfpyLKq3LoMr519HSxsImq5Zz5FmZ6UnjDKSMJNcMe3BfNza07SwVfY ZESrtfB7V6q4EmaqQjYjhfmrSpHF6EbvBLdC0yLUWYOZdkOcVfn3+Tqz75LFY7bY mw/NUyAxEmDcihPt4T2gpcgasLXLWmQwHNX5GCs//JYqsl8LFl0++mWdQ8rdBp6r ipLzCh9d3jhGA4QEgeQeMrjEzr6ojKkCUlBqn3cJrFo0zAqWl3fKWPbiO/Pr5Drn MAWf+0unakQw5aBNfPnlg9OJW3wvCzy6fbK0g1jUbR6dC3AcJOhwQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Jared Rossi , Eric Farman Subject: [PULL 29/33] pc-bios/s390-ccw: Add support for virtio-scsi-pci IPL Date: Mon, 21 Sep 2026 16:08:26 -0400 Message-ID: <20260921200830.1302919-30-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: CZIqQGhBpyQ0QJlD7NRZ1QVzsQ6Jfpbb X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX5hfrq6tFaHrx 0sHZT7V013SN8ykDBuRXSfqae/Vda/1fpJPJDjPrKUaJhMFaC0K5Tap0zGe+y9Ku1utZWhOwLVy 38cO8mcAmY7mnKGyHSvoBKeRa+nA/SEUnJeGAxajzEYZgoECBktSmJl0VDbao72gLegMBhFPSg9 DyYxFQlSD49LMnz3h5Qoe89WQEmep/6TrrqPuTRSk8wRRQJKWN+LPg8r8gpxwxvPGhq6Q4Hfp8O s4rDAuKneyp7Sj3JycgSrLnNmCpsTpJEHyFO4sbIatzgUCTZbTUrAon6xISnUd/zljUP9/tCXZf ZO1eos5QhtNsjaWYboFOW4OyrsNF0p58bHqJSfKuYzNEzoafyC+WjK0+uRmBrbieXWwtPaHJBwL a5z91QaQOE8uvzuuJGhNoXz5fDomuY9m0XAckQIZn8JF3v9v2ME5BPvMlb0Otf2U6S2dTn9hzIg IFYJ20l/93yvbZQupvQ== X-Authority-Analysis: v=2.4 cv=O/KsLx9W c=1 sm=1 tr=0 ts=6ab18ed2 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=_aD-10DgKkLGNpmbtU8A:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX6TM4yGsxAVfl 1xRGIYLArtvSBjZzeiLmUItieSXeRQc1DALnwnEGTASU8/6WYWHav4gEw38kfRuqNjAiNdNP9hI SiYOOYLAp6AJGGZDh+GtRJm1Ab00a5o= X-Proofpoint-GUID: CZIqQGhBpyQ0QJlD7NRZ1QVzsQ6Jfpbb X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 malwarescore=0 phishscore=0 impostorscore=0 suspectscore=0 bulkscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021469090158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Read virtio-pci configuration and configure virt-queue for scsi devices. Also add check for virtio setup failures when doing scsi setup and return early if it fails instead of waiting for subsequent failure. Signed-off-by: Jared Rossi Reviewed-by: Jason J. Herne Reviewed-by: Eric Farman Link: https://lore.kernel.org/qemu-devel/20260831194919.3830270-7-jrossi@li= nux.ibm.com Signed-off-by: Eric Farman --- pc-bios/s390-ccw/main.c | 3 ++- pc-bios/s390-ccw/virtio-pci.c | 30 ++++++++++++++++++++++++++++++ pc-bios/s390-ccw/virtio-scsi.c | 18 +++++++++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 6ab2b8f75b..a2a24b024f 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -273,6 +273,7 @@ static bool find_boot_device(void) } break; case S390_IPL_TYPE_PCI: + vdev->scsi_device_selected =3D false; found =3D find_fid(iplb->pci.fid); break; default: @@ -333,13 +334,13 @@ static void ipl_pci_device(void) { VDev *vdev =3D virtio_get_device(); vdev->is_cdrom =3D false; - vdev->scsi_device_selected =3D false; =20 if (virtio_pci_setup_device()) { return; } =20 switch (vdev->dev_type) { + case VIRTIO_ID_SCSI: case VIRTIO_ID_BLOCK: if (virtio_setup() =3D=3D 0) { zipl_load(); /* only return on error */ diff --git a/pc-bios/s390-ccw/virtio-pci.c b/pc-bios/s390-ccw/virtio-pci.c index 231ab6e04d..277c3ea68d 100644 --- a/pc-bios/s390-ccw/virtio-pci.c +++ b/pc-bios/s390-ccw/virtio-pci.c @@ -52,6 +52,10 @@ void virtio_pci_id2type(VDev *vdev, uint16_t device_id) case 0x1001: vdev->dev_type =3D VIRTIO_ID_BLOCK; break; + case 0x1048: + case 0x1004: + vdev->dev_type =3D VIRTIO_ID_SCSI; + break; default: vdev->dev_type =3D 0; } @@ -199,6 +203,26 @@ static int virtio_pci_get_blk_config(void) return rc; } =20 +static int virtio_pci_get_scsi_config(void) +{ + VirtioScsiConfig *cfg =3D &virtio_get_device()->config.scsi; + int rc =3D vpci_read_flex(d_cap.off, d_cap.bar, cfg, sizeof(VirtioScsi= Config)); + + /* all fields of scsi config must be byte swapped */ + cfg->num_queues =3D bswap32(cfg->num_queues); + cfg->seg_max =3D bswap32(cfg->seg_max); + cfg->max_sectors =3D bswap32(cfg->max_sectors); + cfg->cmd_per_lun =3D bswap32(cfg->cmd_per_lun); + cfg->event_info_size =3D bswap32(cfg->event_info_size); + cfg->sense_size =3D bswap32(cfg->sense_size); + cfg->cdb_size =3D bswap32(cfg->cdb_size); + cfg->max_channel =3D bswap16(cfg->max_channel); + cfg->max_target =3D bswap16(cfg->max_target); + cfg->max_lun =3D bswap32(cfg->max_lun); + + return rc; +} + static int virtio_pci_negotiate(void) { int i, rc; @@ -330,6 +354,7 @@ bool virtio_pci_is_supported(VDev *vdev) if (vdev->vendor_id =3D=3D PCI_VENDOR_VIRTIO) { switch (vdev->dev_type) { case VIRTIO_ID_BLOCK: + case VIRTIO_ID_SCSI: return true; default: return false; @@ -384,6 +409,11 @@ int virtio_pci_setup(VDev *vdev) vdev->cmd_vr_idx =3D 0; virtio_pci_get_blk_config(); break; + case VIRTIO_ID_SCSI: + vdev->nr_vqs =3D 3; + vdev->cmd_vr_idx =3D 2; + virtio_pci_get_scsi_config(); + break; default: puts("Unsupported virtio device"); return -ENODEV; diff --git a/pc-bios/s390-ccw/virtio-scsi.c b/pc-bios/s390-ccw/virtio-scsi.c index 9ea00c6fe6..ca02ff5989 100644 --- a/pc-bios/s390-ccw/virtio-scsi.c +++ b/pc-bios/s390-ccw/virtio-scsi.c @@ -16,6 +16,7 @@ #include "scsi.h" #include "virtio-scsi.h" #include "virtio-ccw.h" +#include "virtio-pci.h" #include "s390-time.h" #include "helper.h" =20 @@ -479,7 +480,22 @@ static int virtio_scsi_setup(VDev *vdev) =20 int virtio_scsi_setup_device(VDev *vdev) { - virtio_ccw_setup(vdev); + switch (vdev->ipl_type) { + case S390_IPL_TYPE_CCW: + if (virtio_ccw_setup(vdev)) { + puts("Setup failed for virtio-scsi-ccw"); + return 1; + } + break; + case S390_IPL_TYPE_PCI: + if (virtio_pci_setup(vdev)) { + puts("Setup failed for virtio-scsi-pci"); + return 1; + } + break; + default: + return 1; + } =20 if (vdev->config.scsi.sense_size !=3D VIRTIO_SCSI_SENSE_SIZE) { puts("Config: sense size mismatch"); --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021549; cv=none; d=zohomail.com; s=zohoarc; b=C2rE5hiTRiqQMoJqQgxlsVW7flZaC+pBZZuV5M8kREnOq4M4WuH84b58Zccr1LfjBxfzvPbQjA8NOyFF3709o3UWmjXCQ8Bq5j+y/cij0eQlTYnYFbFMrLATerBOlPojrWu7BT+esv1EQZMO7doaq/VWeB66ZAIMHIwImuq3zdQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021549; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=xjqVqIPmym2GlI74zmW8Ff0A+CbToZFr9gKX2l/c5d8=; b=RVz7y5U5qQxBSVGvJ2DuWMnnfdjYwBHMkKD73LgMhrUfj8D0cQpyHfkapyaz03YryGjodLiVtw63r0EkZaax8AMu0y55xFbLW+ZROlwgcS2wR5QT4m2fkhx0SylOBlrp8aijnhpI0L4h++widmDunmH8djkfjoZPvU6UqMhWs4k= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021549372269.2612448497447; Mon, 21 Sep 2026 13:12:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKM-0006S0-6U; Mon, 21 Sep 2026 16:09:26 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKC-0006Cx-N6; Mon, 21 Sep 2026 16:09:16 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKA-0005Pg-FX; Mon, 21 Sep 2026 16:09:16 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8D9A1860555; Mon, 21 Sep 2026 20:08:51 GMT Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskg2ah52-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:51 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJHhnx2399621; Mon, 21 Sep 2026 20:08:50 GMT Received: from smtprelay05.dal12v.mail.ibm.com ([172.16.1.7]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gt7dy6nby-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:50 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay05.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8nun22610660 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:50 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D72045805D; Mon, 21 Sep 2026 20:08:49 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6782F58059; Mon, 21 Sep 2026 20:08:49 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:49 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=xjqVqIPmym2GlI74z mW8Ff0A+CbToZFr9gKX2l/c5d8=; b=LUHo2Jd5PF2bwJiP2tNnDOhysGNREP2La 0jn98s6hJ2Elv21lZsyn6F8wT7BJkwqciybpHtJUX9vO0QhbkzxLoibbqVGW2kXJ oIASwVtKz82oAqttnbq3U0U+bhaF55N3+RLUxCmZ483O2n0dAu61Yg4RRtJejX3+ PVB1KBt8W111ilNV+EEmhdS/lmHY3LBZAwOxI+51QvEOxA7C9ylIXcHbCVaO2VF8 Hc4R9fNhLsJpLzxb9c30BHgIFpWTUDCPudKhU+eTdyULvbdqLld/meNpVGZEO63g 21S+g/T27C8o/WwMy06NQUgEjD+fJalRg2e5+JxFna66xPuQET7SQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Jared Rossi , Eric Farman Subject: [PULL 30/33] s390x: Find scsi-pci boot device and build IPLB Date: Mon, 21 Sep 2026 16:08:27 -0400 Message-ID: <20260921200830.1302919-31-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: rMsbeefY-c-Q8J1RPmeQL8w7bmnV1PIx X-Authority-Analysis: v=2.4 cv=I43w19gg c=1 sm=1 tr=0 ts=6ab18ed3 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=GdLXXov1tT0adLAbiZYA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXzHMbYKl4DpQm USmDRpAtzqENQqNbc0B+enlwgNE/FHSvMpFxRphXd22Yji1wGEbCbgapiznpOielc2UkWLp1+YB lo4j06i2TfCDTPPwXPixhArDT1d8a+Amh4WZX9PZgYP6K2H7rws3mBUQxNxVPoY5H0v6vP3Y6Ty EoQwway2V4DqCTbqQJKdoXDpKMOf06x9y81L76IiHyddAWanB0w4zc1CuUV4t5KcBqKF1tWMOBl DvaudrSp3cxjk07UYQzGxaG4Wolds0RzpaGeVGc84c/+HpaaqQvBEV+hbbFD86VDwUlNTGqmFLF Dua+NiuGGtiIWkllg41MFNeHRw+Zh9oZtR1fjHkJjsCwMTedFgHq/Hm09Jk11z7RRFve6W4ZAwC Ql9ZWQkxfSJKrgNUbVMezec+V6GN8O5Ffe8SydnEGGYDzHK4xemajZ7FyUc1ezWvD18A5RMmwOr mad9DnlRHTcAhJ+zHQQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX7B2r0UauaBSu RmDx1DE/s0UEmv3glgUPcMx/h2X0+ddJN0sbWLIHtgV4XYjsZYuDWdk8dJyImv6v2D7EE+/mQyF N7304afOe4tDBlSs06U11o7QK6yCkVM= X-Proofpoint-GUID: rMsbeefY-c-Q8J1RPmeQL8w7bmnV1PIx X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 phishscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021549456158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Add logic to identify a virtio-pci scsi controller and target lun with assigned bootindex, then build IPLB for it. Unfence PCI case for scsi devices in BIOS. Signed-off-by: Jared Rossi Reviewed-by: Jason J. Herne Tested-by: Eric Farman Reviewed-by: Eric Farman Link: https://lore.kernel.org/qemu-devel/20260831194919.3830270-8-jrossi@li= nux.ibm.com Signed-off-by: Eric Farman --- hw/s390x/ipl.c | 37 +++++++++++++++++++++++++++++++++++++ pc-bios/s390-ccw/main.c | 3 +++ 2 files changed, 40 insertions(+) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 4fa8124f92..1add11ad7b 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -402,6 +402,7 @@ static CcwDevice *s390_get_ccw_device(DeviceState *dev_= st, int *devtype) } =20 #define PCI_DEVTYPE_VIRTIO 0x05 +#define PCI_DEVTYPE_SCSI 0x06 =20 static S390PCIBusDevice *s390_get_pci_device(DeviceState *dev_st, int *dev= type) { @@ -417,6 +418,26 @@ static S390PCIBusDevice *s390_get_pci_device(DeviceSta= te *dev_st, int *devtype) if (pbdev) { tmp_dt =3D PCI_DEVTYPE_VIRTIO; } + } else { + SCSIDevice *sd =3D (SCSIDevice *) + object_dynamic_cast(OBJECT(dev_st), TYPE_SCSI_DEVICE); + if (sd) { + SCSIBus *sbus =3D scsi_bus_from_device(sd); + VirtIODevice *vdev =3D (VirtIODevice *) + object_dynamic_cast(OBJECT(sbus->qbus.parent), + TYPE_VIRTIO_DEVICE); + if (vdev) { + pci_dev =3D (PCIDevice *) + object_dynamic_cast(OBJECT(qdev_get_parent_bus(DEV= ICE(vdev))->parent), + TYPE_PCI_DEVICE); + if (pci_dev) { + pbdev =3D s390_pci_find_dev_by_pci(s390_get_phb(),= pci_dev); + if (pbdev) { + tmp_dt =3D PCI_DEVTYPE_SCSI; + } + } + } + } } } if (devtype) { @@ -616,6 +637,22 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPa= rameterBlock *iplb) iplb->pbt =3D S390_IPL_TYPE_PCI; iplb->pci.fid =3D cpu_to_be32(pbdev->fid); break; + case PCI_DEVTYPE_SCSI: + sd =3D SCSI_DEVICE(dev_st); + scsi_lp =3D object_property_get_str(OBJECT(sd), "loadparm", NU= LL); + if (scsi_lp && strlen(scsi_lp) > 0) { + lp =3D scsi_lp; + } + iplb->len =3D cpu_to_be32(S390_IPLB_MIN_PCI_LEN); + iplb->blk0_len =3D + cpu_to_be32(S390_IPLB_MIN_PCI_LEN - S390_IPLB_HEADER_LEN); + iplb->pbt =3D S390_IPL_TYPE_QEMU_SCSI; + iplb->scsi.lun =3D cpu_to_be32(sd->lun); + iplb->scsi.target =3D cpu_to_be16(sd->id); + iplb->scsi.channel =3D cpu_to_be16(sd->channel); + iplb->scsi.bus =3D S390_IPL_TYPE_PCI; + iplb->scsi.fid =3D cpu_to_be32(pbdev->fid); + break; default: return false; } diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index a2a24b024f..d2a2ac3138 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -267,6 +267,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->scsi.fid); + break; default: puts("Unrecognized SCSI controller"); break; --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021558; cv=none; d=zohomail.com; s=zohoarc; b=H06+cpcOxGmJLh3z7iw4i3ZArAFrWLzf0n3SPTA/4js8c/xeuZJx8i6vWdA0gjb0dtq1h84FVDskufHXv5g9PtgD+pszX3C/3pCTgX8vD3izrFJ+YQEb1e52V7F8NEGFmgZUoVW/Rz9BcEYSD2qUwNzeAECh3gYL4mhM2F0aEr4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021558; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=3EaIYq8QwESfXJXRoG9EGq4rgguZJ+sE14l8I5toFHo=; b=Ommql3X3ETptX2vXGab+QmTjX53mwAWM5K27s+zPoH47+ciu/duFzFu2Cr2FN2hy3j+G0VNRmZDq+f4gWPVtn32Qv719EHcUdL/0qvzvIR6L1T/rtyo9tbilc53vr0hKlnF7kQFIe2vzdtIySQDyJ+8KCBsrayfZkv/4zbtE1sg= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021558502847.4564282617209; Mon, 21 Sep 2026 13:12:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKN-0006XO-DY; Mon, 21 Sep 2026 16:09:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKD-0006Dq-08; Mon, 21 Sep 2026 16:09:17 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKA-0005Pq-Hc; Mon, 21 Sep 2026 16:09:16 -0400 Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8Zu61869974; Mon, 21 Sep 2026 20:08:53 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskgs2h2y-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:52 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJK2C21431700; Mon, 21 Sep 2026 20:08:51 GMT Received: from smtprelay02.dal12v.mail.ibm.com ([172.16.1.4]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt53vf033-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:51 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay02.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8oWI4981344 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:50 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 83C6A5805D; Mon, 21 Sep 2026 20:08:50 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0BA0F58043; Mon, 21 Sep 2026 20:08:50 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:49 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=3EaIYq8QwESfXJXRo G9EGq4rgguZJ+sE14l8I5toFHo=; b=S5qSMM+caCAl1isuuXSoQSs3HsFzd6JXB DAB9HQ54clJSA8MO9lbNerOBL3xsPyrkVP81O/RH1+fOl79+G55u6pfbHYMUnpCO JTFhhydrgQbr2sTUc7oJcyPGX7cwtXLhP1OwZKFVGPXqymHm+5Ld5JkBp5Rv9TWo RV7LmDhcDr8cF8j5NSwCe/x9zdZTc4v8Vcduh2+gHu7bwaNKE2CGrtDW410Cfmdj DfwLaRDad4gblo322ZngAMG+WVX2zzx6KDX53rcwuGl+l6dTAZyTxQAHBEoq0W2e GAaKEn3xHsJCJ9oDDC6TmkcAoHA1zB2S7mGDmA9HxoJ4/YE7JOTWQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Jared Rossi , Eric Farman Subject: [PULL 31/33] tests/qtest: Add s390x PCI SCSI fallback test to cdrom-test.c Date: Mon, 21 Sep 2026 16:08:28 -0400 Message-ID: <20260921200830.1302919-32-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=V/XoQuni c=1 sm=1 tr=0 ts=6ab18ed4 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=MvDj_lKWWGcuVSP3geIA:9 X-Proofpoint-ORIG-GUID: pXqsVlFPtgOxwj9VELEVMA-xnHQg0mCD X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX63W9P/5TsIHV tnohdOcE27aU6zAf3QOmcts1vMAEtGW46U6Q4srQuIJ218m29KV6TrTb67/YiA1cr1D4oazEtQv rsf0h4N6o942zY5jM4asEA6chSYvBVSeuCSm60omdKhTdGXFwxr8sb5LEakSaR5+0522Lwk8UGh K3mmfnAkvHPxQnbBKlDpn8G7x0p+jldJ0TXaGsGMuMF7bfSsfOuQ36bm4b7cchIZrm3k97IdX9V i/5Qk6JtrmPxNJkKb0P30m26rAQlpeqU3jjdMPoeA1MtdXtzgWjPCZ5Lo8dRQKjPXhfCebLSC9D lr/KWUNnjok+QDI84PIwtnDZfUdmn0TZaKtLZ1ootSVSdiwaWBuhLNXt9y0A/5BbsC0xSbWpzbo qw8rcm7h6AugnbKBXwKEctjy/dfsFJ49fZuN4RQGiLEhSRRnb4VjnJxU65jXf6UDawXBJ7Hcp1H v8K5vEZBL8hE5iV78/g== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX+IUQwmGMPYNW 9+6v5eddIls7HKgC+6/8vf1A26ghvczy3qRstHlat+tv3kaSSaUgUcMWlm6AAbcZnw5oYrSToyr eIJwvb3Dgxsdzx30rVKliPlyxZVIZ8A= X-Proofpoint-GUID: pXqsVlFPtgOxwj9VELEVMA-xnHQg0mCD X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 malwarescore=0 clxscore=1015 phishscore=0 bulkscore=0 adultscore=0 lowpriorityscore=0 impostorscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=farman@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021559534158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Add a test to verify that a guest can use a PCI controlled CD as a fallback= boot device after a failed CCW IPL. Signed-off-by: Jared Rossi Tested-by: Eric Farman Reviewed-by: Eric Farman Tested-by: Joshua Daley Link: https://lore.kernel.org/qemu-devel/20260831194919.3830270-9-jrossi@li= nux.ibm.com Signed-off-by: Eric Farman --- tests/qtest/cdrom-test.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/qtest/cdrom-test.c b/tests/qtest/cdrom-test.c index bf997be6d6..9e725126cf 100644 --- a/tests/qtest/cdrom-test.c +++ b/tests/qtest/cdrom-test.c @@ -272,6 +272,14 @@ static void add_s390x_tests(void) "-drive if=3Dnone,id=3Dd1,media=3Dcdrom,file= =3D", test_cdboot); } + if (qtest_has_device("virtio-scsi-pci")) { + qtest_add_data_func("cdrom/boot/pci-scsi-fallback-from-blk-ccw", + "-device virtio-scsi-pci -device virtio-serial= " + "-device virtio-blk-ccw,drive=3Dd1,bootindex= =3D1 " + "-drive driver=3Dnull-co,read-zeroes=3Don,if= =3Dnone,id=3Dd1 " + "-device scsi-cd,drive=3Dd2,bootindex=3D2 " + "-drive if=3Dnone,id=3Dd2,media=3Dcdrom,file= =3D", test_cdboot); + } } =20 int main(int argc, char **argv) --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021413; cv=none; d=zohomail.com; s=zohoarc; b=Kqqri6WQZC8JoObRls//IDf7SXk7kkpsvsK7WZ/e9epOjiOyHSGCmCVzAdtST0WOgxw8GinmPJdOc/iLa1c07aeO0yI3bmIyIpvRuQr4AYdzGiwXlplfyNTle1uNwZVe+E7ZaqaQ3ktdW/WjJkGdjWzjWQkGVGLs0mryd1fd1oc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021413; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=NdUWY3U0Vhsf8HWZHiMs0eXyxmC4M014KnY9KH+3Rzc=; b=BSkVNP9wF3X9hPVAvbUo5vXotCCP/H9N1GxAhKG3BsK2QK0R/P6a6nQmTtx1ZNaqSQmvLa83iB68ljpP9z9mA+j5kDpTRfhklldIXo7oE0qcy7+4SbP2dcW1W7pXbgnq8MNKDhyFq/r+S1DscJRXCmmjXStBwYnbxCflpr4itpA= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021413187466.6638085907923; Mon, 21 Sep 2026 13:10:13 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKU-0006eu-SZ; Mon, 21 Sep 2026 16:09:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKM-0006UL-Ne; Mon, 21 Sep 2026 16:09:26 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKK-0005Pt-Qp; Mon, 21 Sep 2026 16:09:26 -0400 Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8VaH1711825; Mon, 21 Sep 2026 20:08:53 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gske1abwe-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:52 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJUIMj1408451; Mon, 21 Sep 2026 20:08:52 GMT Received: from smtprelay03.dal12v.mail.ibm.com ([172.16.1.5]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt5qjpvmr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:52 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay03.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8pgT33293018 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:51 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2ECD758055; Mon, 21 Sep 2026 20:08:51 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A0BC358043; Mon, 21 Sep 2026 20:08:50 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:50 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=NdUWY3U0Vhsf8HWZH iMs0eXyxmC4M014KnY9KH+3Rzc=; b=CNr8mCoEeKOjq5+ARO45rM+06sdGTKyH+ AlTkFqTKPAaAQu3ZB76q2p++CqB2cOwEv9kSCX1mV0W9Rl7sbgm7bkfnQKb5s2fZ 2WM+i9rQKN8InDZm03mGHIxZnH1LsPKo3NneZJbe8w44rH/ZYl2XoiQ3hwvTJCtb PQcBAjKXs9cARtGInwjrmVwDmrs8tCTMVNSIIq2LczNzBmDFn+womRMTvrUilIzk Je4WEF+VnO82Af5q/RZvBF/RSBygVm3Bn9w28FF+ijb2zOTbC1X+A/cuFq3HD4HK yVszoiOSe02k0guV36aKv8NtmlyRKLYHE8a2D161EEc+Hjt7IXJAQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Omar Elghoul , qemu-stable@nongnu.org, Eric Farman Subject: [PULL 32/33] s390x/pci: fix DMA slot leak on I/O TLB entry replacement Date: Mon, 21 Sep 2026 16:08:29 -0400 Message-ID: <20260921200830.1302919-33-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: ZiwbUp7QrkusjK4cYH_X7l4NOGm-5s9T X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfXxHh/Qjh8deXk BpE5oIsxNllsvDZHGGvW53/5ZbOqXXVyYG27bJgcWj6muh+GWIPeXMizvIj3IltdbG4HOH5A1Hr RKMR2xqxJrjnYCBT33ClyWisCo99+yZuC+sYDk6DEJ2ell17JDXiWSD9usOuWxUdXvEnrSBsIGe WFXkKyhIatm6L/LLoyJ6aq+ZKEw0+9mua/0CasAcrpHBTzLsM3Rz0ZlDVtnuLXAwZ6lOXSZa9wd Br/d5U1AUWKr5wLdZE0fU398EMxt2QqM7FCYcRwf34nIlESSZV1Ib3fLavVs/Zl8cA+fE5nAGpk MJv/Ikn2xg1Edu4s62Hoh79zYPBsEw3JnhYB7RgDtsLr0yMYoMK4hu7ocyBP2fgdbOt9lKWSHaB 3r0tXAPqvvKXplVMYKMJcOGCzpXpziJXRTem5G694NNRbjybBiSDQY4AXayzd/fkNuf8O71cpa1 +HRTN2nRvO6jjYrR03g== X-Authority-Analysis: v=2.4 cv=O/KsLx9W c=1 sm=1 tr=0 ts=6ab18ed4 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=69wJf7TsAAAA:8 a=9xhCHi5sD7DbSV9palMA:9 a=Fg1AiH1G6rFz08G2ETeA:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX+GTj0sh1EF0C XcRQeEBmisr944R1IGdqYU5Ut7NW17pQU7/jKEALDvM/XDlELAhzAvHMI51TD0YVQk1sUh7KQ7u 2xdpTW312gKMMsEMF6gaEYEANwbjj7o= X-Proofpoint-GUID: ZiwbUp7QrkusjK4cYH_X7l4NOGm-5s9T X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 malwarescore=0 phishscore=0 impostorscore=0 suspectscore=0 bulkscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021414810158500 Content-Type: text/plain; charset="utf-8" From: Omar Elghoul When s390_pci_update_iotlb() does a mapping update for an IOVA that has an already-existing TLB entry with different permissions or translated address, it unmaps then remaps it. However, at the end of the map path, it unconditionally decrements the available DMA slot counter without a corresponding increment in the intermediate unmap branch. This causes the DMA slot count to be decremented on every remapping of an active IOVA, leading to a permanent DMA slot leak. This remapping without a prior invalidation and sync is not seen today in well-behaved guests but is allowed by the architecture. Fix it by only decrementing available DMA slots when inserting a brand new mapping. Cc: qemu-stable@nongnu.org Fixes: 37fa32de70 ("s390x/pci: Honor DMA limits set by vfio") Signed-off-by: Omar Elghoul Reviewed-by: Farhan Ali Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260917140431.45343-1-oelghoul@li= nux.ibm.com Signed-off-by: Eric Farman --- hw/s390x/s390-pci-inst.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c index b7de23c7d2..652e1712ec 100644 --- a/hw/s390x/s390-pci-inst.c +++ b/hw/s390x/s390-pci-inst.c @@ -655,6 +655,7 @@ static uint32_t s390_pci_update_iotlb(S390PCIIOMMU *iom= mu, goto out; } else { if (cache) { + /* valid->valid transitions reuse the DMA slot */ if (cache->perm =3D=3D entry->perm && cache->translated_addr =3D=3D entry->translated_addr) { goto out; @@ -665,6 +666,9 @@ static uint32_t s390_pci_update_iotlb(S390PCIIOMMU *iom= mu, memory_region_notify_iommu(&iommu->iommu_mr, 0, event); event.type =3D IOMMU_NOTIFIER_MAP; event.entry.perm =3D entry->perm; + } else { + /* invalid->valid transitions consume a new DMA slot */ + dec_dma_avail(iommu); } =20 cache =3D g_new(S390IOTLBEntry, 1); @@ -673,7 +677,6 @@ static uint32_t s390_pci_update_iotlb(S390PCIIOMMU *iom= mu, cache->len =3D TARGET_PAGE_SIZE; cache->perm =3D entry->perm; g_hash_table_replace(iommu->iotlb, &cache->iova, cache); - dec_dma_avail(iommu); } =20 /* --=20 2.55.0 From nobody Sat Sep 26 20:00:16 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790021426; cv=none; d=zohomail.com; s=zohoarc; b=kMowlHM+PjuJkj3JtHJK3jaTovcUpC1ML+RdiRk/zXSE5T4sz3DcIOAwKPjjYaA/l3Nv4mqrybe6IlYXfzAXIB/vCzGGiALx3KbDfPSmEK5BAdXBxjJDS6UOiRQUkIMXWKWPtVyLXUIjlHH9o4x/6IZC9qCjB1KC1FDedQwqz9E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790021426; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=eNb03NWVbyuA91r7K9Er61ZvK6J9im0Vz75vNHWToNg=; b=ZBHSAorFNtpuzecyPcliRP8mt8NYA4p/XOcCl9MyZyB/ODWk/0giVxhkgnRgn9Iuj1gz7o2qFDGAviQ2XpBA0LSrHEFN8uWH9fYCdt/1CNHrdBg5B74nxkdm5GBIQTbjEHkc+tGthxq8ByqrCmiOM0x4Q2vCtqtOIUiJjgjy5es= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790021426492995.1384908607305; Mon, 21 Sep 2026 13:10:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x8kKN-0006Z2-N3; Mon, 21 Sep 2026 16:09:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKH-0006HI-66; Mon, 21 Sep 2026 16:09:21 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x8kKA-0005Py-Qn; Mon, 21 Sep 2026 16:09:20 -0400 Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68LF8Jrb1902982; Mon, 21 Sep 2026 20:08:53 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskdv2be7-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:53 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68LJ78A81489431; Mon, 21 Sep 2026 20:08:52 GMT Received: from smtprelay03.dal12v.mail.ibm.com ([172.16.1.5]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gt4qq71u9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 21 Sep 2026 20:08:52 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay03.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68LK8p8I19726944 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Sep 2026 20:08:51 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B748B58055; Mon, 21 Sep 2026 20:08:51 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 48A9A58043; Mon, 21 Sep 2026 20:08:51 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.69.195]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 21 Sep 2026 20:08:51 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=eNb03NWVbyuA91r7K 9Er61ZvK6J9im0Vz75vNHWToNg=; b=rewXePx9MhDj0Mog9IDSdnFGxr97n070/ Wy4UWnlXCbSAnbDBpX5H9oZqeeyleg4lMYPX0454usC3zpmchVfOtmiDxwgCXEOL 12loKMPHirvxw1/KPuJZ8c3GvcOr/l13hVMwlZmbutzb9n35IokwWjqCSmDH/G2Y D/OzC51LRMCRMzIkTVdUUecy10QENGBi2cCk/anA0nI9frtW2XBxvnU3AcZwomjJ CYqBmSEbmgiWA0Cy20L38S/80MaO5kNyVlXCVWvlWgfUcWiyrEHgqrZQuVCPmQ8b L1y7mFLDVME8gGTP2H3OdqsjfIyVzRbyCQUNeY8gk/tgmL4eynOzw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Eric Farman Subject: [PULL 33/33] pc-bios/s390-ccw.img: update s390x bios Date: Mon, 21 Sep 2026 16:08:30 -0400 Message-ID: <20260921200830.1302919-34-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260921200830.1302919-1-farman@linux.ibm.com> References: <20260921200830.1302919-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: ciSQeJSLQtS5DkupKnKPESQ4pmXix9Hx X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX3Yaw7lHnJcgr F7Qj+0bX9uE1lKpSfHghYa+y1J2ZezYMycsvqkYGyg4I4vj5N8jzIQ4RmSciJcP0bsMEDlTpLVg RmBRkdaiRkY41QsGDa265ykkaFdOi/k= X-Authority-Analysis: v=2.4 cv=FLiOVOos c=1 sm=1 tr=0 ts=6ab18ed5 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VnNF1IyMAAAA:8 a=03GOOeAzeaUctCruwhgA:9 X-Proofpoint-GUID: ciSQeJSLQtS5DkupKnKPESQ4pmXix9Hx X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIxMDI5NCBTYWx0ZWRfX7dqRbL50YAlL CtvH6FBWpPHU5WsPCsTdUFpdn3pwyKu0r4t9PmiDKpleNJXvUAOZLRj+nIPC0H1LpEg4uyKaSA3 RbHQK0R3Nz4/U6c7O+kJChgHMlxa/1kFlCa8r0llGR8CDDHNdm8OG4zUj35cloepzO3ItTu2zfT 4tzLZoam+jkY8JlhQk+GXW0+tfpiSvAslIhyzLZqReYcQLQnnUoym+yvCucHWoLE8HxToScV+9Y 3tIkM9eNZqks5mooaPQXAdcaVpSthpk33RgN7e0+LNidx5mN7cT//nAUfFajW0CNuObVIXvX+7T +Bt7DsooUotswEwfZl+OOO51bvgENrRWZvLFLsDHArEkhdtOdjk/vAK9yXu7jAvVsdnYb0re8wT 0GxRBtKBpXsb0/IJzaNM84EJ/RLCkwgXJelGmWDLD+RrEYsW8tds0nyLzRcwpn4YMBr8/ngs+zA /p/ThVtq9fW+5Ao/KAg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-21_05,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 phishscore=0 spamscore=0 clxscore=1015 suspectscore=0 bulkscore=0 lowpriorityscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609210294 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=farman@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790021428926158500 Content-Type: text/plain; charset="utf-8" Rebuild bios to include: - 20260903155805.1881366-1-jdaley@linux.ibm.com - 20260831194919.3830270-1-jrossi@linux.ibm.com Signed-off-by: Eric Farman --- pc-bios/s390-ccw.img | Bin 112408 -> 112408 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img index de4f45180a46d19e2452743a1fbc2cd8a11462ab..7dd262b8992bb68718c1f1a5fe9= 6727e230b3868 100644 GIT binary patch delta 25226 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 Y60`Oln)2L#DZo0=3Dpo-1!(Dn5H0N8SvX8-^I --=20 2.55.0