From nobody Sat Sep 26 21:35:37 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=1787748823; cv=none; d=zohomail.com; s=zohoarc; b=MtFdsmcY6NT8/8Ge7za9pkONG6+VcFLDlVMezHEuP0jUGkGjawRr4gWKi3wH/BBaRffheF8gVCf2uHSMLNw/nSrvOamZZMVmvRI9jKQGx5klBvmoalw94tIuiImYW4dzsQKNIrjFXHp5XGoDNkMBuM21l4IM/lAtKqxuwKPLCcA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748823; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=6Shfh9vTJKoV0bBFCmiG9sCE/nJNtFFKoJbrorzcNVo=; b=bkBr0lfhuc4IlQaTTpCRs1jbEwCTClvNvmfsnUAAH7oqO34vk2DCec8dNU1uzP/Y1XCOzv4AfsytIJke66jS5XJgB87onip30W3ChtWA1/BF50aWxp3FhxSNocDjQQuBHTDK0HpWFgcUkMKbkUrS9P7pvxVna3QB7KadbOh7SQo= 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 1787748823282461.98619836916384; Wed, 26 Aug 2026 05:53:43 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7B-0007Um-FJ; Wed, 26 Aug 2026 08:52: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 1wzD7A-0007Ts-5v; Wed, 26 Aug 2026 08:52:24 -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 1wzD78-0002PK-96; Wed, 26 Aug 2026 08:52: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 67QCW5Ex4057711; Wed, 26 Aug 2026 12:52:19 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 4g73dxeby1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:19 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfOuc003065; Wed, 26 Aug 2026 12:52:18 GMT Received: from smtprelay03.wdc07v.mail.ibm.com ([172.16.1.70]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7p3qa5jp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:18 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay03.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCpbQc29885086 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:51:37 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 214335805C; Wed, 26 Aug 2026 12:52:17 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4830D58059; Wed, 26 Aug 2026 12:52:16 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:16 +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=6Shfh9vTJKoV0bBFC miG9sCE/nJNtFFKoJbrorzcNVo=; b=MTSrJonlVBzuXjDe44xuM6pS31xfZy+A2 /CLif33W86eg45yGCxyXLL/5CL7iAUi9HvfsufSAqlBG/hHmHGKwqHvjm8pi4YHz vOV+4BU2iGcjvwe0joW0uNrOMJoVR9fxt7mx3K1b0iV473Y5RSqV7wP3w3EtlN93 e2+z03VRZAj2LHJuy1ITqyTtg1xq76wXkjJkthTCbPf+oxLrjXOVqifIlSS5he6o /Nuq72TppF/LRm5uKHy4gQUjAGfOgGPqk1Mkdlo8mkZLVuXHZndc6rNawJCZTmmp DuN8IpydAiGbNRsmCSrBEYugfTf07pwN3VJWjdmvHxFktC29AB8OQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Christian Borntraeger , Eric Farman Subject: [PULL 01/37] s390x/sclp: pv: only copy the original SCCB buffer Date: Wed, 26 Aug 2026 08:51:36 -0400 Message-ID: <20260826125213.1901252-2-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX/dJrHYrL2G8C JROaSPv6OA5inVEkbB/upCP+8i+bFHNCMtyOdzC3PyD0V1ozZUlDiojBayRvR8NCnYBoJ3HM9Qv /qrQU+D5a0VBgyy4bECa6xtX2b0ctH8= X-Authority-Analysis: v=2.4 cv=AYuB2XXG c=1 sm=1 tr=0 ts=6a8ee183 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=wqyRmatkV8wIHynnhxEA:9 X-Proofpoint-ORIG-GUID: ZAY-FrjshmUzznr-F7IQifcj05qxtbPT X-Proofpoint-GUID: ZAY-FrjshmUzznr-F7IQifcj05qxtbPT X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX9OtOjdwosGDn 43J8O6WHGOsWas1ScQnPZ7zpey822dBKTI8hLESti+LILDIk7LQGHb6/2HhnZE3HKpcN3MbYnH4 3LMvq6+C5jgNXn73HfH3zv460CU63a3aW/UBpYJ2A8Sl1IyA7T+KOHBdoNAS9TUjDhuxqSxo3+V JfLtrjZR4Q5SCTHo7g4izYmiLeBubFvie403RwmkXNi1vAXpkd2IqTeSlN2zZC9uWePDXkw11bc CoaVCf6E1i0kmh2imtjVIfTwOW4kA7FoBlyXvHnRyCevQhjmyQaT2aHog8nFrQ39UaJc+cL+H5s 4tnSVw7Zg882JcTzmwwsSSPhhJQVlPhQEuSmj1lth39R/h79O925sm2riBS2q0wubQfOd4Gmsa3 H2NK2Vu6v8cOfuhYRdA7jjRQWOT+giMyMSMJwcGjre5mHydEUY+gO5zUHaPfdnXcfCQ1L2vBQRs EFFJ/78NoVlYAWZyC0w== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 clxscore=1015 adultscore=0 bulkscore=0 impostorscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748825030158500 Content-Type: text/plain; charset="utf-8" From: Christian Borntraeger With variable length and EXTENDED_LENGTH_SCCB, some callbacks might change the length field. For example read SCP info might write a new length into the SCCB header. We must not use that new length for the buffer copy, since the buffer was allocated with the original length. Only the length field in the work SCCB is changed, to indicate the "necessary" size. Using the new length reads past the allocation, so tools like ASAN might detect a buffer overrun. Secure guests do not have EXTENDED_LENGTH_SCCB, and the ultravisor checks and sanitizes the length field, so no qemu heap contents are exposed to the guest and the non pv-path already has the same header.length. Fixes: 0f73c5b30b8b ("s390x: protvirt: SCLP interpretation") Signed-off-by: Christian Borntraeger Reviewed-by: Matthew Rosato Reviewed-by: Eric Farman Link: https://lore.kernel.org/qemu-devel/20260814125857.1729543-1-borntraeg= er@de.ibm.com Signed-off-by: Eric Farman --- hw/s390x/sclp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c index 3c8cb16488..b452f2ce54 100644 --- a/hw/s390x/sclp.c +++ b/hw/s390x/sclp.c @@ -287,7 +287,7 @@ int sclp_service_call_protected(S390CPU *cpu, uint64_t = sccb, uint32_t code) sclp_c->execute(sclp, work_sccb, code); out_write: s390_cpu_pv_mem_write(env_archcpu(env), 0, work_sccb, - be16_to_cpu(work_sccb->h.length)); + be16_to_cpu(header.length)); sclp_c->service_interrupt(sclp, SCLP_PV_DUMMY_ADDR); return 0; } --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787749001; cv=none; d=zohomail.com; s=zohoarc; b=Swc0HfS0Gr9EUFIsDSak0Kq8n4MnvEU9UlS+tTiB5dYcSuj6fA8Ub+xQocatfMjTCz9gxOdqXDb+R13WIfuD2CaLGvoKwjd2EWaLRl2oePLcAPqz7ad4euUtOJezhhwkiPtAkJ4/63QXSSQQtyuptJpWv4vf65KSAFhkutin+Ms= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787749001; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=q/ZGOiLJ2Ccr78S57fQ+pSEFowklo0XtSq1MOXog/bM=; b=SY+lZBkSI5nj4teTM5JQpjBrM60bNJGpNJG4CYzqJ9hdRyZEs8f41kqhxqn5vp3foIaAw7Eq2nxoeW6I7fm8s66cViMT+y6TKlEOzaSDMLDb1qJcg4FkkWe4ZrKZGG04qnvnP1EiEiL6XFiOPPHDZfhbAkpP4EjSiEAiIs61XX8= 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 1787749001009232.83916814793213; Wed, 26 Aug 2026 05:56:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7D-0007WG-8H; Wed, 26 Aug 2026 08:52: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 1wzD7B-0007Ut-In; Wed, 26 Aug 2026 08:52:25 -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 1wzD78-0002PY-UP; Wed, 26 Aug 2026 08:52:25 -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 67QCWY1G2128669; Wed, 26 Aug 2026 12:52:21 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 4g73eqxm72-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:20 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfKLA032664; Wed, 26 Aug 2026 12:52:19 GMT Received: from smtprelay04.wdc07v.mail.ibm.com ([172.16.1.71]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7qkh9vke-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:19 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay04.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqIA035979928 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:18 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 462DF58059; Wed, 26 Aug 2026 12:52:18 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4F9015805B; Wed, 26 Aug 2026 12:52:17 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:17 +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=q/ZGOiLJ2Ccr78S57 fQ+pSEFowklo0XtSq1MOXog/bM=; b=b4ZmSvza3wvs3KsQvGKmwXGRTqswTfb/e MwXLbhZd4tai3uI1wkDweNOUXBy16+GOXdBHnnJ4iKdmTVQ9gD0lmsS6j1KieNS3 nPxP8jGmLI35zp1GcWFPne7DId/+qd17RhNrT84dJadl7Hi5nXSQxFgp6y1kVnE2 BRoICXmuIfiWZ08OG1C3RT0IFojBfz8/dmEugbBfdcakQWieN0UkjRcfbwdsqD2Y lXFhsBbTQhf4vL39+ceXP0YKdCdU7OYjqAzBaWPL/DftBCrLr94zf4/1F8RkcNt1 60D/4EhJb6xJjllgBmRo3ZxvpgLTtQjFFCNGK2wNTikegI4dUFRvg== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Christian Borntraeger , Eric Farman Subject: [PULL 02/37] s390x/css: Fix css stsch detection to go beyond 8192 devices Date: Wed, 26 Aug 2026 08:51:37 -0400 Message-ID: <20260826125213.1901252-3-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: nBKeKWQeSmEvhovJ8iEe7dhtXz6XYVFw X-Proofpoint-ORIG-GUID: nBKeKWQeSmEvhovJ8iEe7dhtXz6XYVFw X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX5tkObZqpot6r rsc4BKwgNAfBA8YfbQFXhgDEvlYTLWjYi8vgYT9xBfxI1QbZy8qssy0mqxYAJRwlWVHn5zobSBZ 6T51QvOIQ5lR5+suLevoO+6FYyPTqtN6tI/MLB+m8WDSYQJgWjOGFlxaDQ73oAzWdtspupJqvMV rKqcgb1vlzrpZg9iAjEDRsR1hBYMlL5ftiByqk9o7Zznj6II4gEzZyiMLHNerf8eEYwT2jo8ItD 9Z4oLPNjCX2cGZRCZlnZ1/9XxPkskObzeNQzj4mnKMCPHApmdDhLooblq7GctvLPEPiofszXbbe rfzz0nFyk4zJeSqZta/sFf1kdK/sjYGcE38wSzsPi02Bi+jq7mhwGRW0fsw/6gynayim/vvtB5w HGBPo5Wgoh2lQy50H5Ah/02vQ8+3aEK+fO7v4G3FyYIGqB1ded0aJSF3ZmKnxTKFFu1i9KpaGzY vSj6Fg+5VE0jvtMwYpw== X-Authority-Analysis: v=2.4 cv=QsRuG1yd c=1 sm=1 tr=0 ts=6a8ee185 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=WHrucGKVQccoiEeWISEA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX4NVFzpEAXUdf o0xrVFMn/D3Uv34MF/7U5YJhzJoyEYWN/EGr7fzw2rYFGItjTOcSULlBjjXXEAwxEGqEWnGhLyx RMgS5jgwE+qdBwYgQ57TsV4fcOv4icw= 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 suspectscore=0 priorityscore=1501 impostorscore=0 spamscore=0 lowpriorityscore=0 clxscore=1015 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787749002011158500 Content-Type: text/plain; charset="utf-8" From: Christian Borntraeger find_last_bit expects a size in bits and not in words. the calculation limits the number of guest devices to 8192. This probably does not matter in reality, its wrong anyway. Fixes: df1fe5bb49241 ("s390: Virtual channel subsystem support") Signed-off-by: Christian Borntraeger Reviewed-by: Matthew Rosato Reviewed-by: Eric Farman Link: https://lore.kernel.org/qemu-devel/20260814152226.1834819-1-borntraeg= er@de.ibm.com Signed-off-by: Eric Farman --- hw/s390x/css.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hw/s390x/css.c b/hw/s390x/css.c index 3a67b67053..76dbca3bb9 100644 --- a/hw/s390x/css.c +++ b/hw/s390x/css.c @@ -2023,8 +2023,7 @@ bool css_schid_final(int m, uint8_t cssid, uint8_t ss= id, uint16_t schid) return true; } set =3D channel_subsys.css[real_cssid]->sch_set[ssid]; - return schid > find_last_bit(set->schids_used, - (MAX_SCHID + 1) / sizeof(unsigned long)); + return schid > find_last_bit(set->schids_used, (MAX_SCHID + 1)); } =20 unsigned int css_find_free_chpid(uint8_t cssid) --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748985; cv=none; d=zohomail.com; s=zohoarc; b=bzr1d+1VRdY5zXUF0+savXUFbt4nks1YLd6LKjvO0gKYR5HaiigX5fjcsKcKZZIOWkMODEFlr1kYLKPZkWRKK3FisbHXS3zT0sgFi0CN+mlMHNw//VO31iwQnxQvGYbag6FCcSmMglEKqm9ENVERNVQvQ2SDnecHA/5wmzNJiBg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748985; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=wHYEaBxFh0/mbQVsXa6DUoo01RuP/VvJMdDPd3mCDjg=; b=B2JtOT1qRK7uC/UunaNjvnmijfOlzvCTQ/No/3Lv8fmfC1deY2eKAyHfUFhEpeLsOv737RIHHt0cg3znaDZfExSa/2fA4Yc8Pfk3OMTV2lVbx3YZDqhjBadPVwEc00TX836oh0KeJGYsZKTjk/i5ItW6Aez5lmNuc2kJ+mT0IbE= 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 1787748985956744.1962207358905; Wed, 26 Aug 2026 05:56:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7G-0007Yh-MN; Wed, 26 Aug 2026 08:52:30 -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 1wzD7C-0007Vl-6p; Wed, 26 Aug 2026 08:52:26 -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 1wzD79-0002Pk-QT; Wed, 26 Aug 2026 08:52:25 -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 67QCWUYY4003966; Wed, 26 Aug 2026 12:52:21 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 4g73g4xpc1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:21 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfVXs032736; Wed, 26 Aug 2026 12:52:20 GMT Received: from smtprelay05.wdc07v.mail.ibm.com ([172.16.1.72]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7qkh9vkf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:20 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay05.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqJkV30212634 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:19 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 59C975805C; Wed, 26 Aug 2026 12:52:19 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 749755805B; Wed, 26 Aug 2026 12:52:18 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:18 +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=wHYEaBxFh0/mbQVsX a6DUoo01RuP/VvJMdDPd3mCDjg=; b=XYK2BqDBdhFtZNoX0ErcH22I4i+xKMc9z TVnEfpI39DG85Ig66g/tCMKRoH+unEZHxlcDA6WhG+vmDYeEguL6Jupv8MRnK9di 5+RYlFgzih4WEqU0e1s/mmmPzMlmG2U30NLnqMUZwikDdyllbZOm8aeNSnOE/nSJ mB1/czrttgx5/GYR25y4yN9h4HZycB4p3nvSrsUucksFO3ZnZgUj2vEFNmSU7vnK s4FT4TdbXNFxOK6Ol9x88ccHeKmwZwazd0GEGJP8RNbXYXb0e4kvxbfO7dDiQFtw 3U/drYFJBnjPmtWgKD0bupldAcNojznRxfTlLSMoV/DOMEzmy/Qgg== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Markus Armbruster , Eric Farman Subject: [PULL 03/37] Add boot-certs to s390-ccw-virtio machine type option Date: Wed, 26 Aug 2026 08:51:38 -0400 Message-ID: <20260826125213.1901252-4-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: e4R-QozNRmFSEZ2Dl-iZOZ93BI3Y13-T X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXw8DDBuFnNbGZ Ui8BwQC2iyAHdNkQBROIzCzcHoXAe4qMJPrZsh9pYaflV55TbHQzUWVV8IQBvAf88K6Nq3PFFDo 8FGy3KG4w2uVACVZVI3vKAtHZ9iNPj8= X-Proofpoint-GUID: e4R-QozNRmFSEZ2Dl-iZOZ93BI3Y13-T X-Authority-Analysis: v=2.4 cv=JZyMa0KV c=1 sm=1 tr=0 ts=6a8ee185 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=wzXgNLvc2PBhCEj-crYA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX2QRsTWUErHbe rHvgfKFys/nBndXE9l/kW6IINk65E4BG6BJWHKA1ZdZaCqTSf4oVgnFOM9D08qvNnrhrW7VfZD0 x8oSjiZnNFMO7UVQnGUhtM+o8N7EbxO5356cEvXQUQwMj6NCmj2xTPH59jEFZnicwzulWmUTJx8 De49YGsynfbnCt6zKIZSRMLVDoCeP+0GyadGf5sAtKOmaCJud645wNxK7eAMM7uz7lHAkCk7L/6 5jtZiQ10CDumtNYRcGp0HPekAFV3al1GKu9COOZ2bQhwK/ppI3Hn0Kcu29v7iNvMDUA6A8cnSeY gsvS87s+HKBhHAR04ncFLj4swLa23rQlVg2/mp3l+ZgIklhPu21JO1Vwj890oIzZbBrnRiD+HoS S12rtnZs3gPX9dEmLLyQvu7omiPt8k1RDWOaEfrZPF8r+MoVjLzNbK+BV8qnxG8WUPb+NnKTlUY GhMY3ENYVAFA4A78cFg== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748988000158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Introduce a new `boot-certs` machine type option for the s390-ccw-virtio machine. This allows users to specify one or more certificate file paths or directories to be used during secure boot. Each entry is specified using the syntax: boot-certs..path=3D/path/to/cert.pem Multiple paths can be specify using array properties: boot-certs.0.path=3D/path/to/cert.pem, boot-certs.1.path=3D/path/to/cert-dir, boot-certs.2.path=3D/path/to/another-dir... Signed-off-by: Zhuoying Cai Acked-by: Markus Armbruster Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-2-zycai@lin= ux.ibm.com Signed-off-by: Eric Farman --- docs/system/s390x/secure-ipl.rst | 20 +++++++++++++++ docs/system/target-s390x.rst | 1 + hw/s390x/s390-virtio-ccw.c | 41 ++++++++++++++++++++++++++++++ include/hw/s390x/s390-virtio-ccw.h | 3 +++ qapi/machine-s390x.json | 23 +++++++++++++++++ qapi/pragma.json | 1 + qemu-options.hx | 6 ++++- 7 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 docs/system/s390x/secure-ipl.rst diff --git a/docs/system/s390x/secure-ipl.rst b/docs/system/s390x/secure-ip= l.rst new file mode 100644 index 0000000000..88df52ce2f --- /dev/null +++ b/docs/system/s390x/secure-ipl.rst @@ -0,0 +1,20 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +Secure IPL Command Line Options +------------------------------- + +The s390-ccw-virtio machine type supports secure IPL. These parameters all= ow +users to provide certificates and enable secure IPL directly via the comma= nd +line. + +Providing Certificates +^^^^^^^^^^^^^^^^^^^^^^ + +The certificate store can be populated by supplying a list of X.509 certif= icate +file paths or directories containing certificate files on the command-line: + +Note: certificate files must have a .pem extension. + +.. code-block:: shell + + qemu-system-s390x -machine s390-ccw-virtio,boot-certs.0.path=3D/.../qe= mu/certs,boot-certs.1.path=3D/another/path/cert.pem ... diff --git a/docs/system/target-s390x.rst b/docs/system/target-s390x.rst index 94c981e732..8938a13d10 100644 --- a/docs/system/target-s390x.rst +++ b/docs/system/target-s390x.rst @@ -35,3 +35,4 @@ Architectural features s390x/bootdevices s390x/protvirt s390x/cpu-topology + s390x/secure-ipl diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index 06e5def909..fe3a84f238 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -44,6 +44,7 @@ #include "target/s390x/kvm/pv.h" #include "migration/blocker.h" #include "qapi/visitor.h" +#include "qapi/qapi-visit-machine-s390x.h" #include "hw/s390x/cpu-topology.h" #include "kvm/kvm_s390x.h" #include "hw/virtio/virtio-md-pci.h" @@ -786,6 +787,36 @@ static void machine_set_loadparm(Object *obj, Visitor = *v, g_free(val); } =20 +static void machine_get_boot_certs(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + S390CcwMachineState *ms =3D S390_CCW_MACHINE(obj); + BootCertificatesList **certs =3D &ms->boot_certs; + + visit_type_BootCertificatesList(v, name, certs, errp); +} + +static void machine_set_boot_certs(Object *obj, Visitor *v, const char *na= me, + void *opaque, Error **errp) +{ + S390CcwMachineClass *s390mc =3D S390_CCW_MACHINE_GET_CLASS(obj); + S390CcwMachineState *ms =3D S390_CCW_MACHINE(obj); + BootCertificatesList *cert_list =3D NULL; + + if (!s390mc->use_certs) { + error_setg(errp, "boot-certs is not supported by this machine vers= ion"); + return; + } + + visit_type_BootCertificatesList(v, name, &cert_list, errp); + if (!cert_list) { + return; + } + + ms->boot_certs =3D cert_list; +} + /* * S390x-specific global compatibility properties. * @@ -811,6 +842,7 @@ static void ccw_machine_class_init(ObjectClass *oc, con= st void *data) =20 s390mc->max_threads =3D 1; s390mc->use_cpi =3D true; + s390mc->use_certs =3D true; mc->reset =3D s390_machine_reset; mc->block_default_type =3D IF_VIRTIO; mc->no_cdrom =3D 1; @@ -854,6 +886,11 @@ static void ccw_machine_class_init(ObjectClass *oc, co= nst void *data) "Up to 8 chars in set of [A-Za-z0-9. ] (lower case chars conve= rted" " to upper case) to pass to machine loader, boot manager," " and guest kernel"); + + object_class_property_add(oc, "boot-certs", "BootCertificatesList", + machine_get_boot_certs, machine_set_boot_cer= ts, NULL, NULL); + object_class_property_set_description(oc, "boot-certs", + "provide paths to a directory and/or a certificate file for se= cure boot"); } =20 static inline void s390_machine_initfn(Object *obj) @@ -939,6 +976,10 @@ static void ccw_machine_11_1_instance_options(MachineS= tate *machine) =20 static void ccw_machine_11_1_class_options(MachineClass *mc) { + S390CcwMachineClass *s390mc =3D S390_CCW_MACHINE_CLASS(mc); + + s390mc->use_certs =3D false; + ccw_machine_11_2_class_options(mc); compat_props_add(mc->compat_props, hw_compat_11_1, hw_compat_11_1_len); } diff --git a/include/hw/s390x/s390-virtio-ccw.h b/include/hw/s390x/s390-vir= tio-ccw.h index f1f06119d6..d30f1fcc4c 100644 --- a/include/hw/s390x/s390-virtio-ccw.h +++ b/include/hw/s390x/s390-virtio-ccw.h @@ -14,6 +14,7 @@ #include "hw/core/boards.h" #include "qom/object.h" #include "hw/s390x/sclp.h" +#include "qapi/qapi-types-machine-s390x.h" =20 #define TYPE_S390_CCW_MACHINE "s390-ccw-machine" =20 @@ -31,6 +32,7 @@ struct S390CcwMachineState { uint8_t loadparm[8]; uint64_t memory_limit; uint64_t max_pagesize; + BootCertificatesList *boot_certs; =20 SCLPDevice *sclp; }; @@ -55,6 +57,7 @@ struct S390CcwMachineClass { /*< public >*/ int max_threads; bool use_cpi; + bool use_certs; }; =20 #endif diff --git a/qapi/machine-s390x.json b/qapi/machine-s390x.json index ea430e1b88..f79864f417 100644 --- a/qapi/machine-s390x.json +++ b/qapi/machine-s390x.json @@ -140,3 +140,26 @@ { 'event': 'SCLP_CPI_INFO_AVAILABLE', 'features': [ 'unstable' ] } + +## +# @BootCertificates: +# +# Boot certificates for secure IPL. +# +# @path: path to an X.509 certificate file or a directory containing +# certificate files. +# +# Since: 11.2 +## +{ 'struct': 'BootCertificates', + 'data': {'path': 'str'} } + +## +# @DummyBootCertificates: +# +# Not used by QMP; hack to let us use BootCertificatesList internally. +# +# Since: 11.2 +## +{ 'struct': 'DummyBootCertificates', + 'data': {'unused-boot-certs': ['BootCertificates'] } } diff --git a/qapi/pragma.json b/qapi/pragma.json index 24aebbe8f5..342cedc42e 100644 --- a/qapi/pragma.json +++ b/qapi/pragma.json @@ -49,6 +49,7 @@ 'DisplayProtocol', 'DriveBackupWrapper', 'DummyBlockCoreForceArrays', + 'DummyBootCertificates', 'DummyForceArrays', 'DummyVirtioForceArrays', 'HotKeyMod', diff --git a/qemu-options.hx b/qemu-options.hx index 34970fffc9..107f74aeb5 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -46,7 +46,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ " memory-backend=3D'backend-id' specifies explicitly pr= ovided backend for main RAM (default=3Dnone)\n" " cxl-fmw.0.targets.0=3Dfirsttarget,cxl-fmw.0.targets.1= =3Dsecondtarget,cxl-fmw.0.size=3Dsize[,cxl-fmw.0.interleave-granularity=3Dg= ranularity]\n" " sgx-epc.0.memdev=3Dmemid,sgx-epc.0.node=3Dnumaid\n" - " smp-cache.0.cache=3Dcachename,smp-cache.0.topology=3D= topologylevel\n", + " smp-cache.0.cache=3Dcachename,smp-cache.0.topology=3D= topologylevel\n" + " boot-certs.0.path=3D/path/directory,boot-certs.1.path= =3D/path/file provides paths to a directory and/or a certificate file\n", QEMU_ARCH_ALL) SRST ``-machine [type=3D]name[,prop=3Dvalue[,...]]`` @@ -214,6 +215,9 @@ SRST :: =20 -machine smp-cache.0.cache=3Dl1d,smp-cache.0.topology=3Dcore,s= mp-cache.1.cache=3Dl1i,smp-cache.1.topology=3Dcore + + ``boot-certs.0.path=3D/path/directory,boot-certs.1.path=3D/path/file`` + Provide paths to a directory and/or a certificate file on the host= [s390x only]. ERST =20 DEF("M", HAS_ARG, QEMU_OPTION_M, --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748995; cv=none; d=zohomail.com; s=zohoarc; b=Bop5izWn8vhYYrt/24+u2tx4AGUFNtTsyiatwDbBEHfjnZd/XozPU0mGkTbfnTC5vGlR0cJVEYsu8a4yxjvTiPupZy9lEi1GtMa2+4gvKo65yI5qEEI6QpS3w9X8Vz/gaBL8UsP00vSN4l6ubiCFg+2HJ4SAvW+H1VGQrlND3NU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748995; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=JicaosYU3UlWKpJj9iA8PFjeQl5/FgsKzYpNyzhIFSY=; b=a12wFqp1OSmAAwH+eBJ5DwCBulut5u0WkFd/AbpxZlEgE4bEZmwCxnWZg9faNn5TifHgA2SDRzx6HiWu0uTeifzHuc+ABfYcp+AbAUoZ4XMQsg44BmzEbWoZ/qVonMHA5t0N4I9POrGQoHH88VxzrdaEadlmA5lvNzJJMYHwK+o= 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 1787748995419165.6645758675752; Wed, 26 Aug 2026 05:56:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7G-0007Y2-0O; Wed, 26 Aug 2026 08:52:30 -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 1wzD7C-0007WF-UA; Wed, 26 Aug 2026 08:52:27 -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 1wzD7A-0002QI-FZ; Wed, 26 Aug 2026 08:52:26 -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 67QCVxvO2877675; Wed, 26 Aug 2026 12:52:23 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 4g726epkjd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:23 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfHF0018820; Wed, 26 Aug 2026 12:52:22 GMT Received: from smtprelay06.wdc07v.mail.ibm.com ([172.16.1.73]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7rsy9pw4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:22 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay06.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqKuO38797606 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:20 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A138758059; Wed, 26 Aug 2026 12:52:20 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 891975805D; Wed, 26 Aug 2026 12:52:19 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:19 +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=Jicaos YU3UlWKpJj9iA8PFjeQl5/FgsKzYpNyzhIFSY=; b=k3dbF6SVH58ilX/L1i7t9j MyzDGkLrXs6IopPIYDT1JIcxCMcggQz8QYTp1RpukHd12nKABFKwpSiowx2KyCsS iDXQSDpTvP1DlgH+/Ql5lyOJHsF2N12TjZaA1bbxIvtUQX7h9CZ+vn6Hz9KIIHBZ MjJEel7iDgypjSSpKHrzyvdkeJJt/DJ+4/CPz6tc1IEJfWrTWL1NpJy1WRQSBk/a LjVwwgch1i6K0eQpeixorHICJQXxDOW7m3/KUYIoUyx91PuaUD+oKf6GJ6g5ZuTj 39gByV0haD6s/Q0J/rQ9AGIZFHkM/y+6i6VoZFXX7nAucr4UJGUknG6FchTRtMUA == From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Farhan Ali , Thomas Huth , Eric Farman Subject: [PULL 04/37] crypto/x509-utils: Refactor with GNUTLS fallback Date: Wed, 26 Aug 2026 08:51:39 -0400 Message-ID: <20260826125213.1901252-5-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-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-Authority-Analysis: v=2.4 cv=TfimcxQh c=1 sm=1 tr=0 ts=6a8ee187 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=3W9wVZ4Fm9HbvhgxqdAA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX6iDFDb1hR1o9 2iBxYoBKFtflJcScp/nB2gNntqnKo84MF+3mVFVmbFQ5Ypd9eqewjPE6XAriuBDldOVCxBkQYmG hsvd/eylA0OYUCTPrCm/7SMYj19Igsg= X-Proofpoint-GUID: xIxv7ERfREyodsl6wd89Xo1njj807OqF X-Proofpoint-ORIG-GUID: xIxv7ERfREyodsl6wd89Xo1njj807OqF X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXw0i/fOhC6j3b uc8SczfXMUEwM9hoP5iEL6F3r1kTAxeTp5M0I6+9Mcs5ISR9QLHhPMalqrTU0lYScmQlBg774+P gcdPeuUsw4WBBdV2Ay2/t5LvNTMOVI0kyE4KMJLe8S9xHsvpBu8jlpqn74oTnggtQ0DMutkgAPi sJF9ErJmGveKnLBBnEYEtx+Tt4QU02LkF5DjMKkq18ggWe/qMJ9SRuPPKAgWt4950+xSnvNeShO WVYm/UgsxWvI/R/P8qdpf2n7l+dMNQ90AJgPNW+gUhSuuH/nQdsOQ1uSTMaTay25dExIMBDlNSZ I3/Qj8guK9K39GVdIMh7A/Po72q+KVyMI1ORPMfKTub3XGL8ejjapQfUvsp5jRtrOzp89YOExNs rISNUzfFDdq8FAtpsyg8beNBS6+sUt+ZWmkMdk5mKzfcYkdAWg7G99w3dGzRpdVVO4QdzvZAbqR ZKk7vox6mzHOWN2rouQ== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 bulkscore=0 malwarescore=0 priorityscore=1501 lowpriorityscore=0 clxscore=1015 phishscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748996048158500 From: Zhuoying Cai Always compile x509-utils.c and add a fallback when GNUTLS is unavailable. These functions will be needed in the s390x code regardless of whether GNUTLS is available. Signed-off-by: Zhuoying Cai Acked-by: Daniel P. Berrang=C3=A9 Reviewed-by: Daniel P. Berrang=C3=A9 Reviewed-by: Farhan Ali Reviewed-by: Thomas Huth Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-3-zycai@lin= ux.ibm.com Signed-off-by: Eric Farman --- crypto/meson.build | 2 +- crypto/x509-utils.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/crypto/meson.build b/crypto/meson.build index 6ac83857aa..15f0bc72e2 100644 --- a/crypto/meson.build +++ b/crypto/meson.build @@ -22,12 +22,12 @@ crypto_ss.add(files( 'tlscredsx509.c', 'tlssession.c', 'rsakey.c', + 'x509-utils.c', )) =20 if gnutls.found() crypto_ss.add(files( 'tlscredsbox.c', - 'x509-utils.c', )) endif =20 diff --git a/crypto/x509-utils.c b/crypto/x509-utils.c index 1843488bca..1b497caae8 100644 --- a/crypto/x509-utils.c +++ b/crypto/x509-utils.c @@ -11,6 +11,8 @@ #include "qemu/osdep.h" #include "qapi/error.h" #include "crypto/x509-utils.h" + +#ifdef CONFIG_GNUTLS #include #include #include @@ -79,3 +81,17 @@ int qcrypto_get_x509_cert_fingerprint(uint8_t *cert, siz= e_t size, gnutls_x509_crt_deinit(crt); return ret; } + +#else /* ! CONFIG_GNUTLS */ + +int qcrypto_get_x509_cert_fingerprint(uint8_t *cert, size_t size, + QCryptoHashAlgo hash, + uint8_t *result, + size_t *resultlen, + Error **errp) +{ + error_setg(errp, "GNUTLS is required to get fingerprint"); + return -1; +} + +#endif /* ! CONFIG_GNUTLS */ --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748982; cv=none; d=zohomail.com; s=zohoarc; b=G+OiqH021ad63YHzzo/W1cYeM8d5hhpkkhe8HTYIdIy9N/CfV1LRhYedxOgexfjH/mpWMQpNgZLBPdCndBs2lnbtyXFswEcPYxnfCudQlNp88XbgR93uDTEgxbFGf811Muir7wFPQrBu4OuotKSHhOS0nhaa6Z/iDJLI3M/BeCc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748982; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=3qT8/TvKVN2eBp/bmmADAW3dCJWTTLMLC0e3i6BtHew=; b=CnB2cFkb2TnPyEZtNKSaJQY13WPUPUvYV+MHeT6YQQC1FUKNyRY4MSqSc2gIrsNJHcfhhU1ekDQ7PD5O68tRGsylGwPyfzXRk9M6zec0skDZ02Vva0LBXwL9V8FvycbcEs7uDsqrReZXos6jgBVtytOQ6llTZ8KpOzuNHnvlI5w= 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 1787748982384447.8662560823067; Wed, 26 Aug 2026 05:56:22 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7G-0007Yw-Nn; Wed, 26 Aug 2026 08:52:30 -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 1wzD7D-0007WM-A6; Wed, 26 Aug 2026 08:52:27 -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 1wzD7A-0002Qg-WA; Wed, 26 Aug 2026 08:52:27 -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 67QCW2NY2877774; Wed, 26 Aug 2026 12:52:23 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 4g726epkje-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:23 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfGfI002326; Wed, 26 Aug 2026 12:52:23 GMT Received: from smtprelay07.wdc07v.mail.ibm.com ([172.16.1.74]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7q3k1xvp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:23 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay07.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqL5r42729818 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:22 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E69EF5805B; Wed, 26 Aug 2026 12:52:21 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D018158059; Wed, 26 Aug 2026 12:52:20 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:20 +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=3qT8/T vKVN2eBp/bmmADAW3dCJWTTLMLC0e3i6BtHew=; b=Q6oDQ3peZL+/kkOqrstB3P +4DaMqXMvsUwrNZLZ3zcOVL3d1gGbZr0bQzK9IGQIgnsNS576mCrEB06O3gF2SEZ 2JTjLD5ZyVH7u8kOAS4OXHe2depBXxdk/vkvmpZ7Co3xkSKvLLCpFsKfTSs/Jxo9 NuGDfRcDsOOT9DGgf0cxcO4l/AqZJuZdsGqzEw7gdoYk/JYq5Fq+o19YX7Jf4Y/6 yqJ4KL9Tkl0iklWIUU4okdAUI/SaKMufLUNT8SjSoJIUafsmAAFK2oOpZQsUlJNE kXSDPxmGD+CFtpG7JfLdeFGW+gLTZaiaqRTi9ZKq3YD/lfVJyAATSPYxTPsZexZg == From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Farhan Ali , Thomas Huth , Eric Farman Subject: [PULL 05/37] crypto/x509-utils: Add helper functions for certificate store Date: Wed, 26 Aug 2026 08:51:40 -0400 Message-ID: <20260826125213.1901252-6-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-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-Authority-Analysis: v=2.4 cv=TfimcxQh c=1 sm=1 tr=0 ts=6a8ee187 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=GV1Vcjpo_iY7pHGplTMA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX5SLgJ6CwwsfH 2d2f8loOBoFwCT8sz45XJTSGJ7mSVC1VuzSXToUPXthh0pmT9pn4oqf/j9vF8hALOGx1ATgwWmJ YDgLKMGKPF0oWtQ84OJ1kidXAjps7fQ= X-Proofpoint-GUID: vK--Bq6tqAsYE-38wEMqB2P7-wscJvti X-Proofpoint-ORIG-GUID: vK--Bq6tqAsYE-38wEMqB2P7-wscJvti X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXw8BMVs5thHmx Djg2FH1UWP6In4fQtX/bavjJ8krUoM+GQJl8nqtB8mRVLu6zg38h58c0xm7JWPA6AjhlJAW70gd TuWcnhSIMJQ4a5qesLKYbI+JKb90/0WDsegC0+i3O3b3tvu7lpEYsw8eQAI6ATxOlO6Lq8b3iHQ Z7+XMiDAW4fSSli4nfvtsiAJcBRbKyPKjDTSwjbE5XH8S51GdaYph6W/fp16qXyMyz+HyAYu6MB l32O86C9tuKlXxqlTFBozd64mguIhQYxuEn9TXdO+0BaknLZ+BTKswVKvM4ZZofNRH5ugD5htao 5Re2iS6OXigW18Uqcm22ErH+NtquELTB3JzzeFpBFULTefbJm5kAi7WqI2F+w1ZC11rOeWQFnCv AyhOQg3Wj8w3tnmNZARelikF+H+yec3qWPzPkQYDiP4VIX59QR9cZajBR23lXiLC/4PMkAbJXUi jOQ6ktr0oFAdfr/ALaw== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 bulkscore=0 malwarescore=0 priorityscore=1501 lowpriorityscore=0 clxscore=1015 phishscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748983929158500 From: Zhuoying Cai Introduce new helper functions for x509 certificate, which will be used by the certificate store: qcrypto_x509_convert_cert_der() - converts a certificate from PEM to DER fo= rmat These functions provide support for certificate format conversion. Signed-off-by: Zhuoying Cai Acked-by: Daniel P. Berrang=C3=A9 Reviewed-by: Daniel P. Berrang=C3=A9 Reviewed-by: Farhan Ali Reviewed-by: Thomas Huth Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-4-zycai@lin= ux.ibm.com Signed-off-by: Eric Farman --- crypto/x509-utils.c | 49 +++++++++++++++++++++++++++++++++++++ include/crypto/x509-utils.h | 21 ++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/crypto/x509-utils.c b/crypto/x509-utils.c index 1b497caae8..369e7ca6af 100644 --- a/crypto/x509-utils.c +++ b/crypto/x509-utils.c @@ -82,6 +82,46 @@ int qcrypto_get_x509_cert_fingerprint(uint8_t *cert, siz= e_t size, return ret; } =20 +int qcrypto_x509_convert_cert_der(uint8_t *cert, size_t size, + uint8_t **result, size_t *resultlen, + Error **errp) +{ + int ret =3D -1; + int rc; + gnutls_x509_crt_t crt; + gnutls_datum_t datum =3D {.data =3D cert, .size =3D size}; + gnutls_datum_t datum_der =3D {.data =3D NULL, .size =3D 0}; + + rc =3D gnutls_x509_crt_init(&crt); + if (rc < 0) { + error_setg(errp, "Failed to initialize certificate: %s", gnutls_st= rerror(rc)); + return ret; + } + + rc =3D gnutls_x509_crt_import(crt, &datum, GNUTLS_X509_FMT_PEM); + if (rc !=3D 0) { + error_setg(errp, "Failed to import certificate: %s", gnutls_strerr= or(rc)); + goto cleanup; + } + + rc =3D gnutls_x509_crt_export2(crt, GNUTLS_X509_FMT_DER, &datum_der); + if (rc !=3D 0) { + error_setg(errp, "Failed to convert certificate to DER format: %s", + gnutls_strerror(rc)); + goto cleanup; + } + + *resultlen =3D datum_der.size; + *result =3D g_memdup2(datum_der.data, datum_der.size); + + ret =3D 0; + +cleanup: + gnutls_x509_crt_deinit(crt); + g_free(datum_der.data); + return ret; +} + #else /* ! CONFIG_GNUTLS */ =20 int qcrypto_get_x509_cert_fingerprint(uint8_t *cert, size_t size, @@ -94,4 +134,13 @@ int qcrypto_get_x509_cert_fingerprint(uint8_t *cert, si= ze_t size, return -1; } =20 +int qcrypto_x509_convert_cert_der(uint8_t *cert, size_t size, + uint8_t **result, + size_t *resultlen, + Error **errp) +{ + error_setg(errp, "GNUTLS is required to export X.509 certificate"); + return -1; +} + #endif /* ! CONFIG_GNUTLS */ diff --git a/include/crypto/x509-utils.h b/include/crypto/x509-utils.h index 1e99661a71..91ae79fb03 100644 --- a/include/crypto/x509-utils.h +++ b/include/crypto/x509-utils.h @@ -19,4 +19,25 @@ int qcrypto_get_x509_cert_fingerprint(uint8_t *cert, siz= e_t size, size_t *resultlen, Error **errp); =20 +/** + * qcrypto_x509_convert_cert_der + * @cert: pointer to the raw certificate data in PEM format + * @size: size of the certificate + * @result: output location for the allocated buffer for the certificate + * in DER format + * (the function allocates memory which must be freed by the call= er) + * @resultlen: pointer to the size of the buffer (will be updated with the + * actual size of the DER-encoded certificate) + * @errp: error pointer + * + * Convert the given @cert from PEM to DER format. + * + * Returns: 0 on success, + * -1 on error. + */ +int qcrypto_x509_convert_cert_der(uint8_t *cert, size_t size, + uint8_t **result, + size_t *resultlen, + Error **errp); + #endif --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748885; cv=none; d=zohomail.com; s=zohoarc; b=SS0hvraAXfxB6ZvnslSA8WDVGpw1n1eFDF8jbK7q9H8lGyaIVY90A2/WatUdHq9mO+Hwrbjfu1G3jC/KaxiKzOE1x8Gp75wWUWKAmlNX3KuA04gqae1bJwbKtb/CJfcDr7AIivlwBvhb1k94l0jR2bX933orojrp0e2LvAf9rqQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748885; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=HLAVhHaGtBYZiK74VCgXbrLTxEX3RtyF0xoE/b/ysz4=; b=glZX20u6d1fFScME0sPEHm0POIB+SNzbuYFBGOiTJoVatEw39XhXYU8mHqJeTEsHRLnRW8Xk4vSrNQ4Kgx4wy/AIXhXiuhLnF6po52k0RN7ts4Je2J65jNg+EgQyKxGtSeDHPNCS738IoOAJ7gph+aUU8T3nLuuWmpmGnzj9F/s= 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 1787748885407540.4505318288834; Wed, 26 Aug 2026 05:54:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7I-0007ZJ-5G; Wed, 26 Aug 2026 08:52:32 -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 1wzD7F-0007Xb-1k; Wed, 26 Aug 2026 08:52:29 -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 1wzD7C-0002RY-Ky; Wed, 26 Aug 2026 08:52:28 -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 67QCW23s4057514; Wed, 26 Aug 2026 12:52:25 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 4g73dxebyh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:25 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfKLB032664; Wed, 26 Aug 2026 12:52:24 GMT Received: from smtprelay03.dal12v.mail.ibm.com ([172.16.1.5]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7qkh9vks-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:24 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay03.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqNc766388322 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:23 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1F6C35805C; Wed, 26 Aug 2026 12:52:23 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2280A5805B; Wed, 26 Aug 2026 12:52:22 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:22 +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=HLAVhHaGtBYZiK74V CgXbrLTxEX3RtyF0xoE/b/ysz4=; b=ESDeGnGgwUh6ghazt7LcsdYA7jPLLxrgf ypSQke3/gen+MGp6gPwlaJkn+jFPX+5bEWDFSwQQkOIihOqnGGd+vkUPBNsd8GwE TcIFU58akx+MQFtE3mt46O3bmKbPaRyJPc3umtm0+YwWeo+D5rxxj/hH2OzKQBzC 7W/uPQJhWvBoBaBxETNoYsovCjYRJYNfs0ynpKBR734nesLvtnX20aNZX43ES9GQ YZqW0EMkyqVabb2AsPgNZR2dyVfOPCEMzAT2n1GN6SHRlG9CjvqSghr1WsRNodqQ /oNWe/2A89rRNES6JP7xGPlau8c/R0rt2TjgiBuMY3iHIw0zlYyJg== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Farhan Ali , Eric Farman Subject: [PULL 06/37] hw/s390x/ipl: Create certificate store Date: Wed, 26 Aug 2026 08:51:41 -0400 Message-ID: <20260826125213.1901252-7-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX6MavFXngov6T tlL1ctxftpeQSai1/EXmWL6NsCl0iGELvvz2qAdmEw1X9uMAmUQa7HRYzDuj4OhgmzBvLv5/ptP qvlVh5ofZJhVHDPyuCnDYPaaBNanxw8= X-Authority-Analysis: v=2.4 cv=AYuB2XXG c=1 sm=1 tr=0 ts=6a8ee189 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=U0tahsH2YktMir8Gk2YA:9 X-Proofpoint-ORIG-GUID: lsuScfasziadNflzNH-AR3F-TNnzq_x0 X-Proofpoint-GUID: lsuScfasziadNflzNH-AR3F-TNnzq_x0 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX3JiXJOh9R9Rl MnefXYtHO4F8u9lRLPGWUYRRYaahX4h7xu3ccz08K+skgovGfNohn0jKZwzpqi/oKMxNS9F5Cmv 2h1mSB4z66hjQds83J3bv88N/eGNTsDkCK3Vnv4ggPHu+HlCmMDnqEt0t8YMzGyURp6sG8eFFMW 9PEnO/ge41KJrVpzwfM4adbi4kOIeQvenzaQ9joG1uqXNBuLdHSeVmX+yEauY5QeMKm0XgPGCub ud8AEYlCIGn5w7suZIQX9Xn+Tx1CaLR4x7x3C0pc3pYsjqk0gfMoQHucHKjI4y7o7ojwgljqYBG SagdRKXryhvL9WgGpc9/2/XP8X7KKOghUGKmUdp06VVAGTGzkpNt062ehv58rfyABBR2efnq7kv 7UlX07yhrLgTEGgxnN4fUoIXkqoxOxlhAWgTUaHlA6pKBePKIqmgV1SIMQGMAqJpRiTF3oRMeSr 7k8qD6OjxDunZXnMGYQ== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 clxscore=1015 adultscore=0 bulkscore=0 impostorscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748887460158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Create a certificate store for boot certificates used for secure IPL. Load certificates from the `boot-certs` parameter of s390-ccw-virtio machine type option into the cert store. Currently, only X.509 certificates in PEM format are supported, as the QEMU command line accepts certificates in PEM format only. The raw Base64 data is stored, as well as the certificate's size. The binary (DER) size is stored as well, which may later be utilized for secure boot (signature verification). Signed-off-by: Zhuoying Cai Reviewed-by: Farhan Ali Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-5-zycai@lin= ux.ibm.com Signed-off-by: Eric Farman --- docs/specs/index.rst | 1 + docs/specs/s390x-secure-ipl.rst | 20 +++ hw/s390x/cert-store.c | 238 ++++++++++++++++++++++++++++++++ hw/s390x/cert-store.h | 39 ++++++ hw/s390x/ipl.c | 10 ++ hw/s390x/ipl.h | 3 + hw/s390x/meson.build | 1 + include/hw/s390x/ipl/qipl.h | 2 + 8 files changed, 314 insertions(+) create mode 100644 docs/specs/s390x-secure-ipl.rst create mode 100644 hw/s390x/cert-store.c create mode 100644 hw/s390x/cert-store.h diff --git a/docs/specs/index.rst b/docs/specs/index.rst index 3cdf242661..7c7282b425 100644 --- a/docs/specs/index.rst +++ b/docs/specs/index.rst @@ -41,3 +41,4 @@ guest hardware that is specific to QEMU. riscv-aia aspeed-intc iommu-testdev + s390x-secure-ipl diff --git a/docs/specs/s390x-secure-ipl.rst b/docs/specs/s390x-secure-ipl.= rst new file mode 100644 index 0000000000..9222ad9c12 --- /dev/null +++ b/docs/specs/s390x-secure-ipl.rst @@ -0,0 +1,20 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +s390 Certificate Store and Functions +------------------------------------ + +s390 Certificate Store +^^^^^^^^^^^^^^^^^^^^^^ + +A certificate store is implemented for s390-ccw guests to retain within +memory all certificates provided by the user via the command-line, which +are expected to be stored somewhere on the host's file system. The store +will keep track of the number of certificates, their respective size, +and a summation of the sizes. + +Each certificate is stored in an S390IPLCertificate struct, which has a +name (converted to EBCDIC), size fields of PEM and DER data, and the raw +PEM Base64 data. + +Note: A maximum of 64 certificates are allowed to be stored in the certifi= cate +store. diff --git a/hw/s390x/cert-store.c b/hw/s390x/cert-store.c new file mode 100644 index 0000000000..c679406c2c --- /dev/null +++ b/hw/s390x/cert-store.c @@ -0,0 +1,238 @@ +/* + * S390 certificate store implementation + * + * Copyright 2025 IBM Corp. + * Author(s): Zhuoying Cai + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "cert-store.h" +#include "qapi/error.h" +#include "qemu/error-report.h" +#include "qemu/option.h" +#include "qemu/config-file.h" +#include "hw/s390x/ebcdic.h" +#include "hw/s390x/s390-virtio-ccw.h" +#include "qemu/cutils.h" +#include "crypto/x509-utils.h" +#include "qapi/qapi-types-machine-s390x.h" + +static BootCertificatesList *s390_get_boot_certs(void) +{ + return S390_CCW_MACHINE(qdev_get_machine())->boot_certs; +} + +static S390IPLCertificate *init_cert(char *path, Error **errp) +{ + int rc; + size_t size; + size_t der_len; + char name[CERT_NAME_MAX_LEN]; + g_autofree char *buf =3D NULL; + g_autofree gchar *filename =3D NULL; + S390IPLCertificate *cert =3D NULL; + g_autofree uint8_t *cert_der =3D NULL; + Error *local_err =3D NULL; + + filename =3D g_path_get_basename(path); + + if (!g_file_get_contents(path, &buf, &size, NULL)) { + error_setg(errp, "Failed to load certificate: %s", path); + return NULL; + } + + rc =3D qcrypto_x509_convert_cert_der((uint8_t *)buf, size, + &cert_der, &der_len, &local_err); + if (rc !=3D 0) { + error_propagate_prepend(errp, local_err, + "Failed to initialize certificate: %s: ", = path); + return NULL; + } + + cert =3D g_new0(S390IPLCertificate, 1); + cert->size =3D size; + /* + * Store DER length only - reused for size calculation. + * cert_der is discarded because DER certificate data will be used once + * and can be regenerated from cert->raw. + */ + cert->der_size =3D der_len; + /* store raw pointer - ownership transfers to cert */ + cert->raw =3D (uint8_t *)g_steal_pointer(&buf); + + /* + * Left justified certificate name with padding on the right with blan= ks. + * Convert certificate name to EBCDIC. + */ + strpadcpy(name, CERT_NAME_MAX_LEN, filename, ' '); + ebcdic_put(cert->name, name, CERT_NAME_MAX_LEN); + + return cert; +} + +static int update_cert_store(S390IPLCertificateStore *cert_store, + S390IPLCertificate *cert) +{ + size_t data_buf_size; + size_t keyid_buf_size; + size_t hash_buf_size; + size_t cert_buf_size; + + if (cert_store->count >=3D MAX_CERTIFICATES) { + error_report("Cert store is full"); + return -1; + } + + /* length field is word aligned for later DIAG use */ + keyid_buf_size =3D ROUND_UP(CERT_KEY_ID_LEN, 4); + hash_buf_size =3D ROUND_UP(CERT_HASH_LEN, 4); + cert_buf_size =3D ROUND_UP(cert->der_size, 4); + data_buf_size =3D keyid_buf_size + hash_buf_size + cert_buf_size; + + if (cert_store->largest_cert_size < data_buf_size) { + cert_store->largest_cert_size =3D data_buf_size; + } + + cert_store->certs[cert_store->count] =3D *cert; + cert_store->total_bytes +=3D data_buf_size; + cert_store->count++; + + return 0; +} + +static GPtrArray *get_cert_paths(Error **errp) +{ + struct stat st; + BootCertificatesList *path_list =3D NULL; + BootCertificatesList *list =3D NULL; + gchar *cert_path; + GDir *dir =3D NULL; + const gchar *filename; + bool is_empty; + g_autoptr(GError) err =3D NULL; + g_autoptr(GPtrArray) cert_path_builder =3D g_ptr_array_new_full(0, g_f= ree); + + path_list =3D s390_get_boot_certs(); + + for (list =3D path_list; list; list =3D list->next) { + cert_path =3D list->value->path; + + if (g_strcmp0(cert_path, "") =3D=3D 0) { + error_setg(errp, "Empty path in certificate path list is not a= llowed"); + goto fail; + } + + if (stat(cert_path, &st) !=3D 0) { + error_setg(errp, "Failed to stat path '%s': %s", + cert_path, g_strerror(errno)); + goto fail; + } + + if (S_ISREG(st.st_mode)) { + if (!g_str_has_suffix(cert_path, ".pem")) { + error_setg(errp, "Certificate file '%s' must have a .pem e= xtension", + cert_path); + goto fail; + } + + g_ptr_array_add(cert_path_builder, g_strdup(cert_path)); + } else if (S_ISDIR(st.st_mode)) { + dir =3D g_dir_open(cert_path, 0, &err); + if (dir =3D=3D NULL) { + error_setg(errp, "Failed to open directory '%s': %s", + cert_path, err->message); + + goto fail; + } + + is_empty =3D true; + while ((filename =3D g_dir_read_name(dir))) { + is_empty =3D false; + + if (g_str_has_suffix(filename, ".pem")) { + g_ptr_array_add(cert_path_builder, + g_build_filename(cert_path, filename, = NULL)); + } else { + warn_report("skipping '%s': not a .pem file", filename= ); + } + } + + if (is_empty) { + warn_report("'%s' directory is empty", cert_path); + } + + g_dir_close(dir); + } else { + error_setg(errp, "Path '%s' is neither a file nor a directory"= , cert_path); + goto fail; + } + } + + qapi_free_BootCertificatesList(path_list); + return g_steal_pointer(&cert_path_builder); + +fail: + qapi_free_BootCertificatesList(path_list); + return NULL; +} + +static void s390_ipl_destroy_cert_store(S390IPLCertificateStore *cert_stor= e) +{ + for (int i =3D 0; i < cert_store->count; i++) { + g_free(cert_store->certs[i].raw); + } + memset(cert_store, 0, sizeof(*cert_store)); +} + +void s390_ipl_create_cert_store(S390IPLCertificateStore *cert_store) +{ + GPtrArray *cert_path_builder; + Error *err =3D NULL; + + /* If cert store is already populated, then no work to do */ + if (cert_store->count) { + return; + } + + cert_path_builder =3D get_cert_paths(&err); + if (cert_path_builder =3D=3D NULL) { + error_report_err(err); + exit(1); + } + + if (cert_path_builder->len =3D=3D 0) { + g_ptr_array_free(cert_path_builder, TRUE); + return; + } + + if (cert_path_builder->len > MAX_CERTIFICATES) { + error_report("Cert store exceeds maximum of %d certificates", MAX_= CERTIFICATES); + g_ptr_array_free(cert_path_builder, TRUE); + exit(1); + } + + cert_store->largest_cert_size =3D 0; + cert_store->total_bytes =3D 0; + + for (int i =3D 0; i < cert_path_builder->len; i++) { + g_autofree S390IPLCertificate *cert =3D + init_cert((char *) cert_path_builder->pdata[i], + &err); + if (!cert) { + error_report_err(err); + g_ptr_array_free(cert_path_builder, TRUE); + s390_ipl_destroy_cert_store(cert_store); + exit(1); + } + + if (update_cert_store(cert_store, cert)) { + g_ptr_array_free(cert_path_builder, TRUE); + s390_ipl_destroy_cert_store(cert_store); + exit(1); + } + } + + g_ptr_array_free(cert_path_builder, TRUE); +} diff --git a/hw/s390x/cert-store.h b/hw/s390x/cert-store.h new file mode 100644 index 0000000000..7fc9503cb9 --- /dev/null +++ b/hw/s390x/cert-store.h @@ -0,0 +1,39 @@ +/* + * S390 certificate store + * + * Copyright 2025 IBM Corp. + * Author(s): Zhuoying Cai + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HW_S390_CERT_STORE_H +#define HW_S390_CERT_STORE_H + +#include "hw/s390x/ipl/qipl.h" +#include "crypto/x509-utils.h" + +#define CERT_NAME_MAX_LEN 64 + +#define CERT_KEY_ID_LEN QCRYPTO_HASH_DIGEST_LEN_SHA256 +#define CERT_HASH_LEN QCRYPTO_HASH_DIGEST_LEN_SHA256 + +struct S390IPLCertificate { + uint8_t name[CERT_NAME_MAX_LEN]; + size_t size; + size_t der_size; + uint8_t *raw; +}; +typedef struct S390IPLCertificate S390IPLCertificate; + +struct S390IPLCertificateStore { + uint16_t count; + size_t largest_cert_size; + size_t total_bytes; + S390IPLCertificate certs[MAX_CERTIFICATES]; +}; +typedef struct S390IPLCertificateStore S390IPLCertificateStore; + +void s390_ipl_create_cert_store(S390IPLCertificateStore *cert_store); + +#endif diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index d5fdc3ea0f..2cae089d98 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -38,6 +38,7 @@ #include "qemu/option.h" #include "qemu/ctype.h" #include "standard-headers/linux/virtio_ids.h" +#include "cert-store.h" =20 #define KERN_IMAGE_START 0x010000UL #define LINUX_MAGIC_ADDR 0x010008UL @@ -454,6 +455,13 @@ void s390_ipl_convert_loadparm(char *ascii_lp, uint8_t= *ebcdic_lp) } } =20 +S390IPLCertificateStore *s390_ipl_get_certificate_store(void) +{ + S390IPLState *ipl =3D get_ipl_device(); + + return &ipl->cert_store; +} + static bool s390_build_iplb(DeviceState *dev_st, IplParameterBlock *iplb) { CcwDevice *ccw_dev =3D NULL; @@ -768,6 +776,8 @@ void s390_ipl_prepare_cpu(S390CPU *cpu) cpu->env.psw.addr =3D ipl->start_addr; cpu->env.psw.mask =3D IPL_PSW_MASK; =20 + s390_ipl_create_cert_store(&ipl->cert_store); + if (!ipl->kernel || ipl->iplb_valid) { cpu->env.psw.addr =3D ipl->bios_start_addr; if (!ipl->iplb_valid) { diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h index ef9c063d90..ec8ab153dc 100644 --- a/hw/s390x/ipl.h +++ b/hw/s390x/ipl.h @@ -13,6 +13,7 @@ #ifndef HW_S390_IPL_H #define HW_S390_IPL_H =20 +#include "cert-store.h" #include "target/s390x/cpu.h" #include "exec/target_page.h" #include "system/address-spaces.h" @@ -35,6 +36,7 @@ int s390_ipl_pv_unpack(struct S390PVResponse *pv_resp); void s390_ipl_prepare_cpu(S390CPU *cpu); IplParameterBlock *s390_ipl_get_iplb(void); IplParameterBlock *s390_ipl_get_iplb_pv(void); +S390IPLCertificateStore *s390_ipl_get_certificate_store(void); =20 enum s390_reset { /* default is a reset not triggered by a CPU e.g. issued by QMP */ @@ -63,6 +65,7 @@ struct S390IPLState { IplParameterBlock iplb; IplParameterBlock iplb_pv; QemuIplParameters qipl; + S390IPLCertificateStore cert_store; uint64_t start_addr; uint64_t compat_start_addr; uint64_t bios_start_addr; diff --git a/hw/s390x/meson.build b/hw/s390x/meson.build index 57cc2a6be3..6b39ad012f 100644 --- a/hw/s390x/meson.build +++ b/hw/s390x/meson.build @@ -17,6 +17,7 @@ s390x_ss.add(files( 'sclpcpu.c', 'sclpquiesce.c', 'tod.c', + 'cert-store.c', )) s390x_ss.add(when: 'CONFIG_KVM', if_true: files( 'tod-kvm.c', diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index b390f2f112..0ec6a6d1a7 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -33,6 +33,8 @@ typedef enum S390IplType S390IplType; =20 #define QEMU_DEFAULT_IPL S390_IPL_TYPE_CCW =20 +#define MAX_CERTIFICATES 64 + /* * The QEMU IPL Parameters will be stored at absolute address * 204 (0xcc) which means it is 32-bit word aligned but not --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748832; cv=none; d=zohomail.com; s=zohoarc; b=WIVhgIvLuAFRfdDIsv5TfuWPTeL8khHVDilJ7/sD+Ve/aapEfPDI99OIhn/TMGYkvrc0UjpdluPambWZWd8hiykLUJMVZNMPxbson6douwpv+KhctjDpMaRw96+F2PoIfBsRrpUkN/ecsFCmxVn0BaTZkTUZf529pqMbA/jayTY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748832; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ODWfyQsciXIdDvOktoiw40t9WrjIkYSly538ln9X6GU=; b=F34jny0FncDeUE5tgpnyqsyRfGZyaxQKKOLdeC/qwQK876RqCf18YqXTcYhbatKP6X3bUb+jj9AYhT1/MDN0ipTC6bgI4lAm/aJKS7a/MCjHfI3grsHRFEiQ6TAe3E9J4cWnL2r3K8uHmHo+o56/pcUlHwrKufupgTSIzfpFu/o= 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 1787748832420822.9924419270208; Wed, 26 Aug 2026 05:53:52 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7L-0007af-19; Wed, 26 Aug 2026 08:52: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 1wzD7G-0007ZA-T0; Wed, 26 Aug 2026 08:52:31 -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 1wzD7E-0002SH-DZ; Wed, 26 Aug 2026 08:52:30 -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 67QCVvim2127741; Wed, 26 Aug 2026 12:52:26 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 4g73eqxm7g-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:26 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfHCa018808; Wed, 26 Aug 2026 12:52:25 GMT Received: from smtprelay04.dal12v.mail.ibm.com ([172.16.1.6]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7raghsxd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:25 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay04.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqOc211797096 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:24 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 75C2A5805B; Wed, 26 Aug 2026 12:52:24 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4F76658059; Wed, 26 Aug 2026 12:52:23 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:23 +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=ODWfyQsciXIdDvOkt oiw40t9WrjIkYSly538ln9X6GU=; b=WUQfYTh+NjeDSMHUaKDMDWsx3EqZPEXLS Mts9LFstXG04iB/QisyB/33shBMFK+Ivu/Cl1tXroZXbIdwVOLEcaLmGBIi1Ymi6 bT0CZhhp+P8i1qIQCiR10URnui8ILqlKQFRTzWelrpiZPmCbQ6DHqWaApgpWboR6 q+tLMWe8tEtpgtqkbGcj9u4MefncmaivjVqdh8W+PIOlbkb4B12z6WGpPrDJZdz/ B2vjynMgrL3bEIi6s7WqomX21bCDReP+Dak5nnSaMGdwh6K5AHhR6mOloOu72iEp 86joJrMkRR+KybXpEbaXmea2xuiAntGRY0x/zRU8X6bPjVW1tV5Vw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Collin Walling , Farhan Ali , Thomas Huth , Eric Farman Subject: [PULL 07/37] s390x/diag: Introduce DIAG 320 for Certificate Store Facility Date: Wed, 26 Aug 2026 08:51:42 -0400 Message-ID: <20260826125213.1901252-8-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: LMHfC8ULFlxma7a0DZjBfC20oiB5VjLM X-Proofpoint-ORIG-GUID: LMHfC8ULFlxma7a0DZjBfC20oiB5VjLM X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXzsRSvvovypoZ soX3IW/LJhpQiny3Xv3fI7pRsw5ekXbnZ+LtJHVr76zTANpkbn2yUSf+x/+0kv/BcTvXtdY4fBi UImtTPMYqWNH5lib9so7/LaDFxMl6Pwhs/BznacBo52Jqj1aV5wPWyAUXNh7n91elLrMKKItSSk cwe6GTX7KO+sh4dJuYEc9Tc89BCvC51NM5nmZVlvhIOl2iRzP+QWIt1SiwGJdUHsd+/jUTGBeMI xaw1yJMeJMTchI65iZaR7r0OjkXf0XoBSiXprnXCHb1NneKdL4E2GChHfA84tgxlqYOPEoH9p0A fbkfC85HkFFn3gBMH+/UlqClB7s7Kqj8Dz4tZPPBc/OzXqFOACHUCVlyJ7IgpiHoOUPCTTxUX19 bO8CXcuAak7jlrEnMM8yQcQecldB3NvSYWQcXVogr39kDoReTRRiSOm2KiDNp/qE0Sx1wMOvu4c zsWzM9uNkpFYYh/ymkQ== X-Authority-Analysis: v=2.4 cv=QsRuG1yd c=1 sm=1 tr=0 ts=6a8ee18a cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=mM8oulnVqnlOJU-pfAMA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX6hlkw1p08qLE BrUm7eaPjg13yZcX0j7HV4fUaHG5o1EPHv5zHWx5ULljzzia2ndj8XLbcbvn7fO8lroPSfyaSnm pXMyKiqwo85RCOETYBj4K5XylczzhsM= 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 suspectscore=0 priorityscore=1501 impostorscore=0 spamscore=0 lowpriorityscore=0 clxscore=1015 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748833238158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai DIAGNOSE 320 is introduced to support Certificate Store (CS) Facility, which includes operations such as query certificate storage information and provide certificates in the certificate store. Currently, only subcode 0 is supported with this patch, which is used to query the Installed Subcodes Mask (ISM). This subcode is only supported when the CS facility is enabled. Availability of CS facility is determined by byte 134 bit 5 of the SCLP Read Info block. Byte 134's facilities cannot be represented without the availability of the extended-length-SCCB, so add it as a check for consistency. Note: secure IPL is not available for Secure Execution (SE) guests, as their images are already integrity protected, and an additional protection of the kernel by secure IPL is not necessary. This feature is available starting with the gen16 CPU model. Signed-off-by: Zhuoying Cai Reviewed-by: Collin Walling Reviewed-by: Farhan Ali Reviewed-by: Thomas Huth Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-6-zycai@lin= ux.ibm.com Signed-off-by: Eric Farman --- docs/specs/s390x-secure-ipl.rst | 12 +++++++++ include/hw/s390x/ipl/diag320.h | 20 ++++++++++++++ target/s390x/cpu_features.c | 1 + target/s390x/cpu_features_def.h.inc | 1 + target/s390x/cpu_models.c | 2 ++ target/s390x/diag.c | 42 +++++++++++++++++++++++++++++ target/s390x/gen-features.c | 3 +++ target/s390x/kvm/kvm.c | 16 +++++++++++ target/s390x/s390x-internal.h | 2 ++ target/s390x/tcg/misc_helper.c | 7 +++++ 10 files changed, 106 insertions(+) create mode 100644 include/hw/s390x/ipl/diag320.h diff --git a/docs/specs/s390x-secure-ipl.rst b/docs/specs/s390x-secure-ipl.= rst index 9222ad9c12..cc497ea09a 100644 --- a/docs/specs/s390x-secure-ipl.rst +++ b/docs/specs/s390x-secure-ipl.rst @@ -18,3 +18,15 @@ PEM Base64 data. =20 Note: A maximum of 64 certificates are allowed to be stored in the certifi= cate store. + +DIAGNOSE function code 'X'320' - Certificate Store Facility +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +DIAGNOSE 'X'320' is used to provide support for guest code to directly +query the s390 certificate store. Guest code may be the s390-ccw BIOS or +the guest kernel. + +Subcode 0 - query installed subcodes + Returns a 256-bit installed subcodes mask (ISM) stored in the installed + subcodes block (ISB). This mask indicates which subcodes are currently + installed and available for use. diff --git a/include/hw/s390x/ipl/diag320.h b/include/hw/s390x/ipl/diag320.h new file mode 100644 index 0000000000..aa04b699c6 --- /dev/null +++ b/include/hw/s390x/ipl/diag320.h @@ -0,0 +1,20 @@ +/* + * S/390 DIAGNOSE 320 definitions and structures + * + * Copyright 2025 IBM Corp. + * Author(s): Zhuoying Cai + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef S390X_DIAG320_H +#define S390X_DIAG320_H + +#define DIAG_320_SUBC_QUERY_ISM 0 + +#define DIAG_320_RC_OK 0x0001 +#define DIAG_320_RC_NOT_SUPPORTED 0x0102 + +#define DIAG_320_ISM_QUERY_SUBCODES 0x80000000 + +#endif diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c index 896914888a..c6cd411e04 100644 --- a/target/s390x/cpu_features.c +++ b/target/s390x/cpu_features.c @@ -147,6 +147,7 @@ void s390_fill_feat_block(const S390FeatBitmap features= , S390FeatType type, break; case S390_FEAT_TYPE_SCLP_FAC134: clear_be_bit(s390_feat_def(S390_FEAT_DIAG_318)->bit, data); + clear_be_bit(s390_feat_def(S390_FEAT_CERT_STORE)->bit, data); break; case S390_FEAT_TYPE_SCLP_FAC139: clear_be_bit(s390_feat_def(S390_FEAT_SIE_ASTFLEIE2)->bit, data); diff --git a/target/s390x/cpu_features_def.h.inc b/target/s390x/cpu_feature= s_def.h.inc index a822f0f2fe..ae96f2381f 100644 --- a/target/s390x/cpu_features_def.h.inc +++ b/target/s390x/cpu_features_def.h.inc @@ -138,6 +138,7 @@ DEF_FEAT(SIE_IBS, "ibs", SCLP_CONF_CHAR_EXT, 10, "SIE: = Interlock-and-broadcast-s =20 /* Features exposed via SCLP SCCB Facilities byte 134 (bit numbers relativ= e to byte-134) */ DEF_FEAT(DIAG_318, "diag318", SCLP_FAC134, 0, "Control program name and ve= rsion codes") +DEF_FEAT(CERT_STORE, "cstore", SCLP_FAC134, 5, "Certificate Store function= s") =20 /* Features exposed via SCLP SCCB Facilities byte 139 (bit numbers relativ= e to byte-139) */ DEF_FEAT(SIE_ASTFLEIE2, "astfleie2", SCLP_FAC139, 1, "SIE: ASTFLE interpre= tation execution facility 2") diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c index f292af7ad0..5e2c8b2b82 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c @@ -248,6 +248,7 @@ bool s390_has_feat(S390Feat feat) if (s390_is_pv()) { switch (feat) { case S390_FEAT_DIAG_318: + case S390_FEAT_CERT_STORE: case S390_FEAT_HPMA2: case S390_FEAT_SIE_F2: case S390_FEAT_SIE_SKEY: @@ -506,6 +507,7 @@ static void check_consistency(const S390CPUModel *model) { S390_FEAT_PTFF_STOUE, S390_FEAT_MULTIPLE_EPOCH }, { S390_FEAT_AP_QUEUE_INTERRUPT_CONTROL, S390_FEAT_AP }, { S390_FEAT_DIAG_318, S390_FEAT_EXTENDED_LENGTH_SCCB }, + { S390_FEAT_CERT_STORE, S390_FEAT_EXTENDED_LENGTH_SCCB }, { S390_FEAT_NNPA, S390_FEAT_VECTOR }, { S390_FEAT_RDP, S390_FEAT_LOCAL_TLB_CLEARING }, { S390_FEAT_UV_FEAT_AP, S390_FEAT_AP }, diff --git a/target/s390x/diag.c b/target/s390x/diag.c index 46d191b87d..c0df0c4bfc 100644 --- a/target/s390x/diag.c +++ b/target/s390x/diag.c @@ -18,6 +18,7 @@ #include "hw/watchdog/wdt_diag288.h" #include "system/cpus.h" #include "hw/s390x/ipl.h" +#include "hw/s390x/ipl/diag320.h" #include "hw/s390x/s390-virtio-ccw.h" #include "system/kvm.h" #include "kvm/kvm_s390x.h" @@ -199,3 +200,44 @@ out: return false; } } + +void handle_diag_320(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr= _t ra) +{ + S390CPU *cpu =3D env_archcpu(env); + uint64_t subcode =3D env->regs[r3]; + uint64_t addr =3D env->regs[r1]; + uint32_t ism_word0; + + if (env->psw.mask & PSW_MASK_PSTATE) { + s390_program_interrupt(env, PGM_PRIVILEGED, ra); + return; + } + + if (!s390_has_feat(S390_FEAT_CERT_STORE) || + (subcode & ~0x000ffULL) || + (r1 & 1)) { + s390_program_interrupt(env, PGM_SPECIFICATION, ra); + return; + } + + switch (subcode) { + case DIAG_320_SUBC_QUERY_ISM: + /* + * The Installed Subcode Block (ISB) can be up 8 words in size, + * but the current set of subcodes can fit within a single word + * for now. + */ + ism_word0 =3D cpu_to_be32(DIAG_320_ISM_QUERY_SUBCODES); + + if (s390_cpu_virt_mem_write(cpu, addr, r1, &ism_word0, sizeof(ism_= word0))) { + s390_cpu_virt_mem_handle_exc(cpu, ra); + return; + } + + env->regs[r1 + 1] =3D DIAG_320_RC_OK; + break; + default: + env->regs[r1 + 1] =3D DIAG_320_RC_NOT_SUPPORTED; + break; + } +} diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index a309dc2c09..e6a586bce7 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -721,6 +721,7 @@ static uint16_t full_GEN16_GA1[] =3D { S390_FEAT_UV_FEAT_AP, S390_FEAT_UV_FEAT_AP_INTR, S390_FEAT_SIE_ASTFLEIE2, + S390_FEAT_CERT_STORE, }; =20 static uint16_t full_GEN17_GA1[] =3D { @@ -920,6 +921,8 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_KIMD_SHA_512, S390_FEAT_KLMD_SHA_512, S390_FEAT_PRNO_TRNG, + S390_FEAT_EXTENDED_LENGTH_SCCB, + S390_FEAT_CERT_STORE, }; =20 /****** END FEATURE DEFS ******/ diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c index 803b878b4f..70ef92f5ab 100644 --- a/target/s390x/kvm/kvm.c +++ b/target/s390x/kvm/kvm.c @@ -99,6 +99,7 @@ #define DIAG_TIMEREVENT 0x288 #define DIAG_IPL 0x308 #define DIAG_SET_CONTROL_PROGRAM_CODES 0x318 +#define DIAG_CERT_STORE 0x320 #define DIAG_KVM_HYPERCALL 0x500 #define DIAG_KVM_BREAKPOINT 0x501 =20 @@ -1531,6 +1532,16 @@ static void handle_diag_318(S390CPU *cpu, struct kvm= _run *run) } } =20 +static void kvm_handle_diag_320(S390CPU *cpu, struct kvm_run *run) +{ + uint64_t r1, r3; + + r1 =3D (run->s390_sieic.ipa & 0x00f0) >> 4; + r3 =3D run->s390_sieic.ipa & 0x000f; + + handle_diag_320(&cpu->env, r1, r3, RA_IGNORED); +} + #define DIAG_KVM_CODE_MASK 0x000000000000ffff =20 static int handle_diag(S390CPU *cpu, struct kvm_run *run, uint32_t ipb) @@ -1561,6 +1572,9 @@ static int handle_diag(S390CPU *cpu, struct kvm_run *= run, uint32_t ipb) case DIAG_KVM_BREAKPOINT: r =3D handle_sw_breakpoint(cpu, run); break; + case DIAG_CERT_STORE: + kvm_handle_diag_320(cpu, run); + break; default: trace_kvm_insn_diag(func_code); kvm_s390_program_interrupt(cpu, PGM_SPECIFICATION); @@ -2472,6 +2486,8 @@ bool kvm_s390_get_host_cpu_model(S390CPUModel *model,= Error **errp) set_bit(S390_FEAT_DIAG_318, model->features); } =20 + set_bit(S390_FEAT_CERT_STORE, model->features); + /* Test for Ultravisor features that influence secure guest behavior */ query_uv_feat_guest(model->features); =20 diff --git a/target/s390x/s390x-internal.h b/target/s390x/s390x-internal.h index 35d1e34ef4..1945bdf40c 100644 --- a/target/s390x/s390x-internal.h +++ b/target/s390x/s390x-internal.h @@ -388,6 +388,8 @@ int handle_diag_288(CPUS390XState *env, uint64_t r1, ui= nt64_t r3); /* Return whether a CPU reset is pending */ bool handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra); +void handle_diag_320(CPUS390XState *env, uint64_t r1, uint64_t r3, + uintptr_t ra); =20 =20 /* translate.c */ diff --git a/target/s390x/tcg/misc_helper.c b/target/s390x/tcg/misc_helper.c index 09a45e58a5..403388145e 100644 --- a/target/s390x/tcg/misc_helper.c +++ b/target/s390x/tcg/misc_helper.c @@ -147,6 +147,13 @@ void HELPER(diag)(CPUS390XState *env, uint32_t r1, uin= t32_t r3, uint32_t num) /* time bomb (watchdog) */ r =3D handle_diag_288(env, r1, r3); break; + case 0x320: + /* cert store */ + bql_lock(); + handle_diag_320(env, r1, r3, GETPC()); + bql_unlock(); + r =3D 0; + break; default: r =3D -1; break; --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748790; cv=none; d=zohomail.com; s=zohoarc; b=UpXhEvwlIR+69kv1g3d3aT6bSIvoPLBf2aOWE+kW71IWC4vZYbkMYHzg6Uk8AvIdt8wCx3vSRAPOL32pjIKLrq/Vygety8RUsQUwnIKEhA32/YvUfO7tiNE14YCcMIeFx2JlEK0kDy7aHYx6TfwVlfZPM1Yz59FyQRSZXLZ5yNU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748790; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=uGzC4byWsE2PlyFD7EUbZGUr2xp0dTO180JqtLWXO6s=; b=ddLpFyvXuXF2VPySYHVl/T0tCrrt7XDP9ESA2ILhHM4R0Teg3ojnrQo7fRF8tletV8Ec6/1zGhK3SU/p2k9Xpwni4L3428J7r1AqE6yedNEWq1kQcdEb+gyZyN2YRWDHadwHDEvtoujjsxZVeZCA07XNYtnSm3oPR5MYINRsVTs= 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 1787748790112542.3656223928349; Wed, 26 Aug 2026 05:53:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7M-0007by-JN; Wed, 26 Aug 2026 08:52:36 -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 1wzD7H-0007ZN-Vv; Wed, 26 Aug 2026 08:52:32 -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 1wzD7G-0002Sq-73; Wed, 26 Aug 2026 08:52:31 -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 67QCVtRq2127719; Wed, 26 Aug 2026 12:52:28 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 4g73eqxm7j-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:28 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfRxn002404; Wed, 26 Aug 2026 12:52:27 GMT Received: from smtprelay05.dal12v.mail.ibm.com ([172.16.1.7]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7q3k1xvx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:27 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay05.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqPRM31392262 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:26 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D212F5805E; Wed, 26 Aug 2026 12:52:25 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A49E058059; Wed, 26 Aug 2026 12:52:24 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:24 +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=uGzC4byWsE2PlyFD7 EUbZGUr2xp0dTO180JqtLWXO6s=; b=G1xktwoHGBL+O4ZH+w72SoSm78xfXbENp 9qjK8Zf/VPJfsV18jr6NjXis7MBnSkH7a/BAVVwuoFoGlxu4QqsHgibP2jHG1XKL ZkxZuo1XsCWBiBlnHlN62sHG9KAs+S9B16Tn+S48T2RXP/e19E7PrScQ6KaO9+2v MmnbSXCu9gsK16pI/ulPUynH4VDcvki6X6uS4msdqrbcNLsKTU6phi2NCd2LKglS WrxlGy9ScZXPigK0Aw7oreZv5jzODnIyTnD9TkExZp2vzbQ7hbdgdFK7FIcreSuN KyC81qx02JBGB6KOrYBik8xgWsEu0/D5t4pqGOB2DUQcTP+vzPPaQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Farhan Ali , Collin Walling , Hendrik Brueckner , Thomas Huth , Eric Farman Subject: [PULL 08/37] s390x/diag: Refactor address validation check from diag308_parm_check Date: Wed, 26 Aug 2026 08:51:43 -0400 Message-ID: <20260826125213.1901252-9-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: -pDRMt-rTp25O6pZIBQJtWeNDkT8mk9X X-Proofpoint-ORIG-GUID: -pDRMt-rTp25O6pZIBQJtWeNDkT8mk9X X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX9KNTzmm5bFo/ xPhwf2I+HSkfu2Vjkiz1rEPEa5w3iOMzK5i16eYOnGQvT2nMrcJdPd2hf5X+5+oWWxrw1KkMN0H KzDVgXzXhXDhziDWqhg1djuMd0YGmpMvPgM7ut90T6DGFfTJKNIjXyyHuy5iujThDrFkZSEvcuY 5sMlQGONSh8TJcHm7ztasYmbNgHgZQU/H+3s8kkfnl0OjbffPMZPMaNWCRQJ2hW85I7FlQJIKIS zHKvKxY1btuL282zPzpN8LCixGNN9YSBMrU7s2KE//+vRm5AOJEfDang/UJzg7TowQ0+0rWsQog /QGh8k7QDawGNX6poKC1ejHNTGkSXfT7YPbssKBvwAvp2aMM9P4rU/pUyFTV4k1sDBSgOd+3+gT 3pkCJt1n7BNpDw4wPyvKzED5jMN7/PCMEd2A8Fad+HF9UYLFwb/kCp8X/00YICPyUbWn50dnVbG W+AzfUfMNFqbkkTC0sA== X-Authority-Analysis: v=2.4 cv=QsRuG1yd c=1 sm=1 tr=0 ts=6a8ee18c cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=130TwiEZxdn8fhqcL5YA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX4gT/djoFmYDr GwcZiVyjGIxCVWSI12FXZffB1Agu0jVCavWIq3So1o0qkJNYxP36HXADgrnv/KfmpaRr4itrBrn jvYja1LS4eGu3QGqraB+SCp+gVkBjRc= 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 suspectscore=0 priorityscore=1501 impostorscore=0 spamscore=0 lowpriorityscore=0 clxscore=1015 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748790929158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Create a function to validate the address parameter of DIAGNOSE. Refactor the function for reuse in the next patch, which allows address validation in read or write operation of DIAGNOSE. Signed-off-by: Zhuoying Cai Reviewed-by: Farhan Ali Reviewed-by: Collin Walling Reviewed-by: Hendrik Brueckner Reviewed-by: Thomas Huth Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-7-zycai@lin= ux.ibm.com Signed-off-by: Eric Farman --- target/s390x/diag.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/target/s390x/diag.c b/target/s390x/diag.c index c0df0c4bfc..15e36ce458 100644 --- a/target/s390x/diag.c +++ b/target/s390x/diag.c @@ -26,6 +26,12 @@ #include "qemu/error-report.h" =20 =20 +static inline bool diag_parm_addr_valid(uint64_t addr, size_t size, bool w= rite) +{ + return address_space_access_valid(&address_space_memory, addr, + size, write, MEMTXATTRS_UNSPECIFIED); +} + int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3) { uint64_t func =3D env->regs[r1]; @@ -65,9 +71,7 @@ static int diag308_parm_check(CPUS390XState *env, uint64_= t r1, uint64_t addr, s390_program_interrupt(env, PGM_SPECIFICATION, ra); return -1; } - if (!address_space_access_valid(&address_space_memory, addr, - sizeof(IplParameterBlock), write, - MEMTXATTRS_UNSPECIFIED)) { + if (!diag_parm_addr_valid(addr, sizeof(IplParameterBlock), write)) { s390_program_interrupt(env, PGM_ADDRESSING, ra); return -1; } --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748789; cv=none; d=zohomail.com; s=zohoarc; b=kLw1mFG4Et0VKF/GtXrqMODAfhjU5LopCB1KBzzs97mGaFSeu6/j1BvtU4Z9q8wMLnjx9fAPUVzMYfSt/aRQib1x0tSEmun3ig03mmHKMdyWS16jeYpXRqKyEQCJDTg8kOT5mv3O5M2yx4Qo9c6Aze1tXmCcw85+S/P4WxMFWCE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748789; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=oajcwm2b35rSTqg8N4JR9068GPkfbdz4g/Dr1Rq0mSI=; b=Tk4L4PfiOqIpt1MtIjkEcXoATAjNrqWT36UtPKLk7566PmeNnSRC0+r4OqQvNuSgcWqpyxgTFheW/e/h0IPIDqN2eoCw2eycTzWw2FWT0TgYaDtEchhhOKUPwy1+SpMpXD3WXG5gleD8IDbFZu46kQP0paIeZMx+EZ25Cw4G2kA= 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 1787748789499481.8860066385646; Wed, 26 Aug 2026 05:53:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7M-0007cF-Sa; Wed, 26 Aug 2026 08:52:36 -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 1wzD7K-0007aR-5u; Wed, 26 Aug 2026 08:52:34 -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 1wzD7G-0002TK-VZ; Wed, 26 Aug 2026 08:52:33 -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 67QCW4Q82127921; Wed, 26 Aug 2026 12:52:29 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 4g73eqxm7p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:29 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfGNT002972; Wed, 26 Aug 2026 12:52:28 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7p3qa5ke-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:28 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqRnY16122520 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:27 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1440058059; Wed, 26 Aug 2026 12:52:27 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0BCC05805B; Wed, 26 Aug 2026 12:52:26 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:25 +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=oajcwm2b35rSTqg8N 4JR9068GPkfbdz4g/Dr1Rq0mSI=; b=ror2XELwFHPDuHM5Rwx+qpgjKGzBmktZz Lu/AX3Q+ALA8TtPIZpe43KhA/sGEebKz1Ak8rKEtdzI6O1LS3mvDQMY0OFuk8jFv OuG1fvAEWmb5N1EAtLcPBiV9hGuDS0WDZQjDwwkfqMM/hPtaJhOTOVNC19AE769j ASTDcmk/foMLPT3eOnGtmmZD3nqg/5tU3nCjLyX4NumAWCbGWAF76oZR8JzMn5Wi ICOR5yLF0cjAB8EkdsMtNUHbIWntLzH+A1lFdvW7sC9y6ITsjHvkLGA54VQhX0v2 iaEV1kxOjSy6MJtTvXNG9X4FWVgCnpL2kiV907vGrXRorIRxSjD/g== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Farhan Ali , Collin Walling , Eric Farman Subject: [PULL 09/37] s390x/diag: Implement DIAG 320 subcode 1 Date: Wed, 26 Aug 2026 08:51:44 -0400 Message-ID: <20260826125213.1901252-10-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: ACntdBQ0V7MV-LKFf0U-u10J0QmfR155 X-Proofpoint-ORIG-GUID: ACntdBQ0V7MV-LKFf0U-u10J0QmfR155 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX59TAuFeQ8FD3 CqhriE1h/eN4RNjJUeEB2rliZEpxX09SmeHSfHNnc4SDmNjNznX1N+hX+xSyiz0T212HCTu1l8E WQe4DyhzVe3tGvSGPw+KGRutPMNMVkdh0SPFSGQKkcsOiii6A6hPY4T9YZsds8HA8Ult+m7cGo5 NeUot3se73OaZ7sM3oD4V/2y7jagKfMsBHlevmUJIXka/xq17dhf55Hc8a3aeohyhogxnLo2wcF GgET9RsMeAfzpLt0PBC8mdwyeSBbAiZosxfIYcg3e0tTzpIK0Dt8laFyyciKA9gCozsHVa7sDCc Nua3eGiwNa1UV7PSdzNBlKDTLQO0++RC4qABBTjOK8QMCrHuT2R+xsDQpyXKJQiWpeQkQh8O2Hf JI6FEkFwY3dhKys3zZn4adFyTxgkmjOG1IuJfUOi3c2uX9Z7PGNBHksB6y6cBIW1HVcm/yCQ/zm CQ6U8TRtWgU4FgpMj4g== X-Authority-Analysis: v=2.4 cv=QsRuG1yd c=1 sm=1 tr=0 ts=6a8ee18d cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=vmMecypGgfY46-6BI3YA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX3sUxIMj5Ubo/ SQUSmtT07I2d2+dxFfs2J3fPPcjZMbYFIaH574X4Hb4m4ItIoCxAtzW2GofVcGTSdjvmHZapE7V zaP5KqJGZHEVR4v26PfHfDzjS9k2SGI= 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 suspectscore=0 priorityscore=1501 impostorscore=0 spamscore=0 lowpriorityscore=0 clxscore=1015 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748790937158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai DIAG 320 subcode 1 provides information needed to determine the amount of storage to store one or more certificates from the certificate store. Upon successful completion, this subcode returns information of the current cert store, such as the number of certificates stored and allowed in the ce= rt store, amount of space may need to be allocate to store a certificate, etc for verification-certificate blocks (VCBs). The subcode value is denoted by setting the left-most bit of an 8-byte field. The verification-certificate-storage-size block (VCSSB) contains the output data when the operation completes successfully. A VCSSB length of 4 indicates that no certificate are available in the cert store. Signed-off-by: Zhuoying Cai Reviewed-by: Farhan Ali Reviewed-by: Collin Walling Reviewed-by: Eric Farman Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-8-zycai@lin= ux.ibm.com Signed-off-by: Eric Farman --- docs/specs/s390x-secure-ipl.rst | 12 +++++++ hw/s390x/cert-store.h | 3 +- include/hw/s390x/ipl/diag320.h | 57 ++++++++++++++++++++++++++++++ target/s390x/diag.c | 61 ++++++++++++++++++++++++++++++++- 4 files changed, 130 insertions(+), 3 deletions(-) diff --git a/docs/specs/s390x-secure-ipl.rst b/docs/specs/s390x-secure-ipl.= rst index cc497ea09a..201cc74c7c 100644 --- a/docs/specs/s390x-secure-ipl.rst +++ b/docs/specs/s390x-secure-ipl.rst @@ -30,3 +30,15 @@ Subcode 0 - query installed subcodes Returns a 256-bit installed subcodes mask (ISM) stored in the installed subcodes block (ISB). This mask indicates which subcodes are currently installed and available for use. + +Subcode 1 - query verification certificate storage information + Provides the information required to determine the amount of memory ne= eded + to store one or more verification-certificates (VCs) from the certific= ate + store (CS). + + Upon successful completion, this subcode returns various storage size = values + for verification-certificate blocks (VCBs). + + The output is returned in the verification-certificate-storage-size bl= ock + (VCSSB). A VCSSB length of 4 indicates that no certificates are availa= ble + in the CS. diff --git a/hw/s390x/cert-store.h b/hw/s390x/cert-store.h index 7fc9503cb9..6f5ee63177 100644 --- a/hw/s390x/cert-store.h +++ b/hw/s390x/cert-store.h @@ -11,10 +11,9 @@ #define HW_S390_CERT_STORE_H =20 #include "hw/s390x/ipl/qipl.h" +#include "hw/s390x/ipl/diag320.h" #include "crypto/x509-utils.h" =20 -#define CERT_NAME_MAX_LEN 64 - #define CERT_KEY_ID_LEN QCRYPTO_HASH_DIGEST_LEN_SHA256 #define CERT_HASH_LEN QCRYPTO_HASH_DIGEST_LEN_SHA256 =20 diff --git a/include/hw/s390x/ipl/diag320.h b/include/hw/s390x/ipl/diag320.h index aa04b699c6..d37d8eaa86 100644 --- a/include/hw/s390x/ipl/diag320.h +++ b/include/hw/s390x/ipl/diag320.h @@ -11,10 +11,67 @@ #define S390X_DIAG320_H =20 #define DIAG_320_SUBC_QUERY_ISM 0 +#define DIAG_320_SUBC_QUERY_VCSI 1 =20 #define DIAG_320_RC_OK 0x0001 #define DIAG_320_RC_NOT_SUPPORTED 0x0102 +#define DIAG_320_RC_INVAL_VCSSB_LEN 0x0202 =20 #define DIAG_320_ISM_QUERY_SUBCODES 0x80000000 +#define DIAG_320_ISM_QUERY_VCSI 0x40000000 + +#define VCSSB_NO_VC 4 +#define VCSSB_LEN_VALID 128 + +#define CERT_NAME_MAX_LEN 64 + +struct VCStorageSizeBlock { + uint32_t length; + uint8_t reserved0[3]; + uint8_t version; + uint32_t reserved1[6]; + uint16_t total_vc_ct; + uint16_t max_vc_ct; + uint32_t reserved3[11]; + uint32_t max_single_vcb_len; + uint32_t total_vcb_len; + uint32_t reserved4[10]; +}; +typedef struct VCStorageSizeBlock VCStorageSizeBlock; + +struct VCEntryHeader { + uint32_t len; + uint8_t flags; + uint8_t key_type; + uint16_t cert_idx; + uint8_t name[CERT_NAME_MAX_LEN]; + uint8_t format; + uint8_t reserved0; + uint16_t keyid_len; + uint8_t reserved1; + uint8_t hash_type; + uint16_t hash_len; + uint32_t reserved2; + uint32_t cert_len; + uint32_t reserved3[2]; + uint16_t hash_offset; + uint16_t cert_offset; + uint32_t reserved4[7]; +}; +typedef struct VCEntryHeader VCEntryHeader; + +struct VCBlockHeader { + uint32_t in_len; + uint32_t reserved0; + uint16_t first_vc_index; + uint16_t last_vc_index; + uint32_t reserved1[5]; + uint32_t out_len; + uint8_t reserved2[4]; + uint16_t stored_ct; + uint16_t remain_ct; + uint32_t reserved3[5]; +}; +typedef struct VCBlockHeader VCBlockHeader; =20 #endif diff --git a/target/s390x/diag.c b/target/s390x/diag.c index 15e36ce458..1e9d63ceba 100644 --- a/target/s390x/diag.c +++ b/target/s390x/diag.c @@ -205,12 +205,53 @@ out: } } =20 +static int handle_diag320_query_vcsi(S390CPU *cpu, uint64_t addr, uint64_t= r1, + uintptr_t ra, S390IPLCertificateStore= *cs) +{ + g_autofree VCStorageSizeBlock *vcssb =3D NULL; + + vcssb =3D g_new0(VCStorageSizeBlock, 1); + if (s390_cpu_virt_mem_read(cpu, addr, r1, vcssb, sizeof(*vcssb))) { + s390_cpu_virt_mem_handle_exc(cpu, ra); + return -1; + } + + if (be32_to_cpu(vcssb->length) !=3D VCSSB_LEN_VALID) { + return DIAG_320_RC_INVAL_VCSSB_LEN; + } + + if (!cs->count) { + vcssb->length =3D cpu_to_be32(VCSSB_NO_VC); + } else { + vcssb->version =3D 0; + vcssb->total_vc_ct =3D cpu_to_be16(cs->count); + vcssb->max_vc_ct =3D cpu_to_be16(MAX_CERTIFICATES); + vcssb->max_single_vcb_len =3D cpu_to_be32(sizeof(VCBlockHeader) + + sizeof(VCEntryHeader) + + cs->largest_cert_size); + vcssb->total_vcb_len =3D cpu_to_be32(sizeof(VCBlockHeader) + + cs->count * sizeof(VCEntryHeade= r) + + cs->total_bytes); + } + + if (s390_cpu_virt_mem_write(cpu, addr, r1, vcssb, be32_to_cpu(vcssb->l= ength))) { + s390_cpu_virt_mem_handle_exc(cpu, ra); + return -1; + } + return DIAG_320_RC_OK; +} + +QEMU_BUILD_BUG_MSG(sizeof(VCStorageSizeBlock) !=3D VCSSB_LEN_VALID, + "size of VCStorageSizeBlock is wrong"); + void handle_diag_320(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr= _t ra) { S390CPU *cpu =3D env_archcpu(env); + S390IPLCertificateStore *cs =3D s390_ipl_get_certificate_store(); uint64_t subcode =3D env->regs[r3]; uint64_t addr =3D env->regs[r1]; uint32_t ism_word0; + int rc; =20 if (env->psw.mask & PSW_MASK_PSTATE) { s390_program_interrupt(env, PGM_PRIVILEGED, ra); @@ -231,7 +272,8 @@ void handle_diag_320(CPUS390XState *env, uint64_t r1, u= int64_t r3, uintptr_t ra) * but the current set of subcodes can fit within a single word * for now. */ - ism_word0 =3D cpu_to_be32(DIAG_320_ISM_QUERY_SUBCODES); + ism_word0 =3D cpu_to_be32(DIAG_320_ISM_QUERY_SUBCODES | + DIAG_320_ISM_QUERY_VCSI); =20 if (s390_cpu_virt_mem_write(cpu, addr, r1, &ism_word0, sizeof(ism_= word0))) { s390_cpu_virt_mem_handle_exc(cpu, ra); @@ -240,6 +282,23 @@ void handle_diag_320(CPUS390XState *env, uint64_t r1, = uint64_t r3, uintptr_t ra) =20 env->regs[r1 + 1] =3D DIAG_320_RC_OK; break; + case DIAG_320_SUBC_QUERY_VCSI: + if (addr & 0x7) { + s390_program_interrupt(env, PGM_SPECIFICATION, ra); + return; + } + + if (!diag_parm_addr_valid(addr, sizeof(VCStorageSizeBlock), true))= { + s390_program_interrupt(env, PGM_ADDRESSING, ra); + return; + } + + rc =3D handle_diag320_query_vcsi(cpu, addr, r1, ra, cs); + if (rc =3D=3D -1) { + return; + } + env->regs[r1 + 1] =3D rc; + break; default: env->regs[r1 + 1] =3D DIAG_320_RC_NOT_SUPPORTED; break; --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748932; cv=none; d=zohomail.com; s=zohoarc; b=SLHRn/sKYTp1RaaHV7pSx220bZNkxQcbpfIUA+a/hwTkbTn8iAOp+Af7aeX6KCwVOAI0VY3oafn6Rg/69hrBywqpasYrO3vfNU98clcaMjYA/lDpc1GK/9e5BFaVl1ZCScYvcVkt0nDLvxcSULxb4TqkcnuF8FSL9JHPU6pljUU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748932; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=pGo2wwDi+R9W/ULa7G6T1wTOa2Lq+MnnT7bHEP54Quk=; b=GBr2FD/Sr32625FfiCxxUUWt9BhxJwKu1fQ06TGsrumUJGYBfqnbouEbP5Z8ISFtXdsvVxFgk8I97FYzJgiOnMcHC729MlYvz7Pu2WZFsm1oiHpddnFnRgyUchQs+trVEsc/h3iqt/8FtizYfLmMbP3ZlKodG+mqzOjYotCD/FA= 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 1787748932658338.95496124138754; Wed, 26 Aug 2026 05:55:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7N-0007cT-HZ; Wed, 26 Aug 2026 08:52:37 -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 1wzD7K-0007ah-Ll; Wed, 26 Aug 2026 08:52:34 -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 1wzD7I-0002Tl-1m; Wed, 26 Aug 2026 08:52:34 -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 67QCW2Dl2877837; Wed, 26 Aug 2026 12:52:30 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 4g726epkk2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:30 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfNPQ018852; Wed, 26 Aug 2026 12:52:29 GMT Received: from smtprelay01.wdc07v.mail.ibm.com ([172.16.1.68]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7raghsxq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:29 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay01.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqSL165929538 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:28 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3A7235805D; Wed, 26 Aug 2026 12:52:28 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4087F5805B; Wed, 26 Aug 2026 12:52:27 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:27 +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=pGo2ww Di+R9W/ULa7G6T1wTOa2Lq+MnnT7bHEP54Quk=; b=QNPozL/M6h57XF9Boc2hAq tPwRDVKqwLOOxauVJqUA54nsdVTLAkDsTlXL3cIaksoin8QFieNGgATNNCmxUWyt oOSmLhQgVuDGvydrWL587eCMolXRueZjwMxCzlUet2oZD8jGQmu1McHr/zIXOgW2 EzHqNwPAg5TmdVPYmlEfCtu1wSFeLgdJkmJv2hzJYDdHQYkjGrzWjYHPe9TStWDI I79pU3fTwpwZ9hlSkkjtbJPoSjaAJJdEOwB4yuMRhxIttDXBlHr0nQqqfqQqXTBq iDuu56Zl3ISoKgK+trk0BVQNCN9H3tZhiZyED6nTFpjmCRe/qlsP0zz2gGy3HrAg == From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Farhan Ali , Eric Farman Subject: [PULL 10/37] crypto/x509-utils: Add helper functions for DIAG 320 subcode 2 Date: Wed, 26 Aug 2026 08:51:45 -0400 Message-ID: <20260826125213.1901252-11-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-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-Authority-Analysis: v=2.4 cv=TfimcxQh c=1 sm=1 tr=0 ts=6a8ee18e cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=cx8EP_J7U0ANkHmDKVUA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX11KTyV80oj7M PnVMVVDIoc1LzystopMdl+ft4NBmU8hk1XYue+t1VvX/29xr56L3FFN8wW7r+LgLM1URCHoKuPR Qblal5mliCEAPHKI3hXJHpRUOZCnfGM= X-Proofpoint-GUID: 0LcfH4uum7qrrO1cL3Uhk4NlujU_0HyT X-Proofpoint-ORIG-GUID: 0LcfH4uum7qrrO1cL3Uhk4NlujU_0HyT X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX3dwDcEs1Q2hG Novm5soNTeovCh/L0hpTK9d/aJ2MmwX5Aa99YNqJJTrWagYR15sn++SYjIBrUopaE13gAy1TTDa IaDvKYtmzjLX3c2Q4YREKC2vtzyitSGlJkjdz5l5q09UeWnMoqxltXKyhLFgOxfXQz9h5Xjhehb QUCRI4X+NWYpf+o4UnrFW3muvuqYBfiRWcykVUlNgU4IiWERyqyVAfFuio0BAjpIIP3UyWSiVe9 10NCtJKWusRgRXKSWzGve0gY2PcWWkuld6lmZJiq8HEdj4TduW3Ib+oyl/wRHswQpbDd3X5wPHs ek+zPMyxVTp/8+MNyPRrEbc4Gmt3nQuPoW0V3UVrcsr00oS2K2ZSGbH/ZwYiciCVBLyzW+h2nyP vMrb2jEj4Ye48JpYvxUDjGLtWTr5j+W5p+xy2AHzPFz50eZO43UvIwFKp6XX5anWKOSyh58aLs6 lvf7Uhe8e6OtJQsPp9g== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 bulkscore=0 malwarescore=0 priorityscore=1501 lowpriorityscore=0 clxscore=1015 phishscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748933945158500 From: Zhuoying Cai Introduce new helper functions to extract certificate metadata: qcrypto_x509_check_cert_times() - validates the certificate's validity peri= od against the current time qcrypto_x509_get_cert_key_id() - extracts the key ID from the certificate qcrypto_x509_check_ecc_curve_p521() - determines the ECC public key algorit= hm uses P-521 curve These functions provide support for metadata extraction and validity checki= ng for X.509 certificates. Signed-off-by: Zhuoying Cai Acked-by: Daniel P. Berrang=C3=A9 Reviewed-by: Daniel P. Berrang=C3=A9 Reviewed-by: Farhan Ali Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-9-zycai@lin= ux.ibm.com Signed-off-by: Eric Farman --- crypto/x509-utils.c | 236 ++++++++++++++++++++++++++++++++++++ include/crypto/x509-utils.h | 51 ++++++++ 2 files changed, 287 insertions(+) diff --git a/crypto/x509-utils.c b/crypto/x509-utils.c index 369e7ca6af..543fc3007d 100644 --- a/crypto/x509-utils.c +++ b/crypto/x509-utils.c @@ -27,6 +27,16 @@ static const int qcrypto_to_gnutls_hash_alg_map[QCRYPTO_= HASH_ALGO__MAX] =3D { [QCRYPTO_HASH_ALGO_RIPEMD160] =3D GNUTLS_DIG_RMD160, }; =20 +static const int qcrypto_to_gnutls_keyid_flags_map[] =3D { + [QCRYPTO_HASH_ALGO_MD5] =3D -1, + [QCRYPTO_HASH_ALGO_SHA1] =3D GNUTLS_KEYID_USE_SHA1, + [QCRYPTO_HASH_ALGO_SHA224] =3D -1, + [QCRYPTO_HASH_ALGO_SHA256] =3D GNUTLS_KEYID_USE_SHA256, + [QCRYPTO_HASH_ALGO_SHA384] =3D -1, + [QCRYPTO_HASH_ALGO_SHA512] =3D GNUTLS_KEYID_USE_SHA512, + [QCRYPTO_HASH_ALGO_RIPEMD160] =3D -1, +}; + int qcrypto_get_x509_cert_fingerprint(uint8_t *cert, size_t size, QCryptoHashAlgo alg, uint8_t *result, @@ -122,6 +132,210 @@ cleanup: return ret; } =20 +int qcrypto_x509_check_cert_times(uint8_t *cert, size_t size, Error **errp) +{ + int rc; + int ret =3D -1; + gnutls_x509_crt_t crt; + gnutls_datum_t datum =3D {.data =3D cert, .size =3D size}; + time_t now =3D time(NULL); + time_t exp_time; + time_t act_time; + + if (now =3D=3D ((time_t)-1)) { + error_setg_errno(errp, errno, "Cannot get current time"); + return ret; + } + + rc =3D gnutls_x509_crt_init(&crt); + if (rc < 0) { + error_setg(errp, "Failed to initialize certificate: %s", gnutls_st= rerror(rc)); + return ret; + } + + rc =3D gnutls_x509_crt_import(crt, &datum, GNUTLS_X509_FMT_PEM); + if (rc !=3D 0) { + error_setg(errp, "Failed to import certificate: %s", gnutls_strerr= or(rc)); + goto cleanup; + } + + exp_time =3D gnutls_x509_crt_get_expiration_time(crt); + if (exp_time =3D=3D ((time_t)-1)) { + error_setg(errp, "Failed to get certificate expiration time"); + goto cleanup; + } + if (exp_time < now) { + error_setg(errp, "The certificate has expired"); + goto cleanup; + } + + act_time =3D gnutls_x509_crt_get_activation_time(crt); + if (act_time =3D=3D ((time_t)-1)) { + error_setg(errp, "Failed to get certificate activation time"); + goto cleanup; + } + if (act_time > now) { + error_setg(errp, "The certificate is not yet active"); + goto cleanup; + } + + ret =3D 0; + +cleanup: + gnutls_x509_crt_deinit(crt); + return ret; +} + +static int qcrypto_x509_get_pk_algorithm(uint8_t *cert, size_t size, Error= **errp) +{ + int rc; + int ret =3D -1; + unsigned int bits; + gnutls_x509_crt_t crt; + gnutls_datum_t datum =3D {.data =3D cert, .size =3D size}; + + rc =3D gnutls_x509_crt_init(&crt); + if (rc < 0) { + error_setg(errp, "Failed to initialize certificate: %s", gnutls_st= rerror(rc)); + return ret; + } + + rc =3D gnutls_x509_crt_import(crt, &datum, GNUTLS_X509_FMT_PEM); + if (rc !=3D 0) { + error_setg(errp, "Failed to import certificate: %s", gnutls_strerr= or(rc)); + goto cleanup; + } + + rc =3D gnutls_x509_crt_get_pk_algorithm(crt, &bits); + if (rc < 0) { + error_setg(errp, "Unknown public key algorithm %d", rc); + goto cleanup; + } + + ret =3D rc; + +cleanup: + gnutls_x509_crt_deinit(crt); + return ret; +} + +int qcrypto_x509_get_cert_key_id(uint8_t *cert, size_t size, + QCryptoHashAlgo hash_alg, + uint8_t **result, + size_t *resultlen, + Error **errp) +{ + int rc; + int ret =3D -1; + gnutls_x509_crt_t crt; + gnutls_datum_t datum =3D {.data =3D cert, .size =3D size}; + + if (hash_alg >=3D G_N_ELEMENTS(qcrypto_to_gnutls_hash_alg_map)) { + error_setg(errp, "Unknown hash algorithm %d", hash_alg); + return ret; + } + + if (hash_alg >=3D G_N_ELEMENTS(qcrypto_to_gnutls_keyid_flags_map) || + qcrypto_to_gnutls_keyid_flags_map[hash_alg] =3D=3D -1) { + error_setg(errp, "Unsupported key id flag %d", hash_alg); + return ret; + } + + rc =3D gnutls_x509_crt_init(&crt); + if (rc < 0) { + error_setg(errp, "Failed to initialize certificate: %s", gnutls_st= rerror(rc)); + return ret; + } + + rc =3D gnutls_x509_crt_import(crt, &datum, GNUTLS_X509_FMT_PEM); + if (rc !=3D 0) { + error_setg(errp, "Failed to import certificate: %s", gnutls_strerr= or(rc)); + goto cleanup; + } + + *resultlen =3D gnutls_hash_get_len(qcrypto_to_gnutls_hash_alg_map[hash= _alg]); + if (*resultlen =3D=3D 0) { + error_setg(errp, "Failed to get hash algorithm length: %s", gnutls= _strerror(rc)); + goto cleanup; + } + + *result =3D g_malloc0(*resultlen); + if (gnutls_x509_crt_get_key_id(crt, + qcrypto_to_gnutls_keyid_flags_map[hash_= alg], + *result, resultlen) !=3D 0) { + error_setg(errp, "Failed to get key ID from certificate"); + g_clear_pointer(result, g_free); + goto cleanup; + } + + ret =3D 0; + +cleanup: + gnutls_x509_crt_deinit(crt); + return ret; +} + +static int qcrypto_x509_get_ecc_curve(uint8_t *cert, size_t size, Error **= errp) +{ + int rc; + int ret =3D -1; + gnutls_x509_crt_t crt; + gnutls_datum_t datum =3D {.data =3D cert, .size =3D size}; + gnutls_ecc_curve_t curve_id; + gnutls_datum_t x =3D {.data =3D NULL, .size =3D 0}; + gnutls_datum_t y =3D {.data =3D NULL, .size =3D 0}; + + rc =3D gnutls_x509_crt_init(&crt); + if (rc < 0) { + error_setg(errp, "Failed to initialize certificate: %s", gnutls_st= rerror(rc)); + return ret; + } + + rc =3D gnutls_x509_crt_import(crt, &datum, GNUTLS_X509_FMT_PEM); + if (rc !=3D 0) { + error_setg(errp, "Failed to import certificate: %s", gnutls_strerr= or(rc)); + goto cleanup; + } + + rc =3D gnutls_x509_crt_get_pk_ecc_raw(crt, &curve_id, &x, &y); + if (rc !=3D 0) { + error_setg(errp, "Failed to get ECC public key curve: %s", gnutls_= strerror(rc)); + goto cleanup; + } + + ret =3D curve_id; + +cleanup: + gnutls_x509_crt_deinit(crt); + g_free(x.data); + g_free(y.data); + return ret; +} + +int qcrypto_x509_check_ecc_curve_p521(uint8_t *cert, size_t size, Error **= errp) +{ + int algo; + int curve_id; + + algo =3D qcrypto_x509_get_pk_algorithm(cert, size, errp); + if (algo !=3D GNUTLS_PK_ECDSA) { + return 0; + } + + curve_id =3D qcrypto_x509_get_ecc_curve(cert, size, errp); + if (curve_id =3D=3D -1) { + error_setg(errp, "Failed to get ECC curve"); + return -1; + } + + if (curve_id =3D=3D GNUTLS_ECC_CURVE_INVALID) { + error_setg(errp, "Invalid ECC curve"); + return -1; + } + + return curve_id =3D=3D GNUTLS_ECC_CURVE_SECP521R1; +} + #else /* ! CONFIG_GNUTLS */ =20 int qcrypto_get_x509_cert_fingerprint(uint8_t *cert, size_t size, @@ -143,4 +357,26 @@ int qcrypto_x509_convert_cert_der(uint8_t *cert, size_= t size, return -1; } =20 +int qcrypto_x509_check_cert_times(uint8_t *cert, size_t size, Error **errp) +{ + error_setg(errp, "GNUTLS is required to get certificate times"); + return -1; +} + +int qcrypto_x509_get_cert_key_id(uint8_t *cert, size_t size, + QCryptoHashAlgo hash_alg, + uint8_t **result, + size_t *resultlen, + Error **errp) +{ + error_setg(errp, "GNUTLS is required to get key ID"); + return -1; +} + +int qcrypto_x509_check_ecc_curve_p521(uint8_t *cert, size_t size, Error **= errp) +{ + error_setg(errp, "GNUTLS is required to determine ecc curve"); + return -1; +} + #endif /* ! CONFIG_GNUTLS */ diff --git a/include/crypto/x509-utils.h b/include/crypto/x509-utils.h index 91ae79fb03..fcace73c49 100644 --- a/include/crypto/x509-utils.h +++ b/include/crypto/x509-utils.h @@ -40,4 +40,55 @@ int qcrypto_x509_convert_cert_der(uint8_t *cert, size_t = size, size_t *resultlen, Error **errp); =20 +/** + * qcrypto_x509_check_cert_times + * @cert: pointer to the raw certificate data + * @size: size of the certificate + * @errp: error pointer + * + * Check whether the activation and expiration times of @cert + * are valid at the current time. + * + * Returns: 0 if the certificate times are valid, + * -1 on error. + */ +int qcrypto_x509_check_cert_times(uint8_t *cert, size_t size, Error **errp= ); + +/** + * qcrypto_x509_get_cert_key_id + * @cert: pointer to the raw certificate data + * @size: size of the certificate + * @hash_alg: the hash algorithm flag + * @result: output location for the allocated buffer for key ID + * (the function allocates memory which must be freed by the call= er) + * @resultlen: pointer to the size of the buffer + * (will be updated with the actual size of key id) + * @errp: error pointer + * + * Retrieve the key ID from the @cert based on the specified @hash_alg. + * + * Returns: 0 if key ID was successfully stored in @result, + * -1 on error. + */ +int qcrypto_x509_get_cert_key_id(uint8_t *cert, size_t size, + QCryptoHashAlgo hash_alg, + uint8_t **result, + size_t *resultlen, + Error **errp); + +/** + * qcrypto_x509_check_ecc_curve_p521 + * @cert: pointer to the raw certificate data + * @size: size of the certificate + * @errp: error pointer + * + * Determine whether the ECC public key in the given certificate uses the = P-521 + * curve. + * + * Returns: 0 if ECC public key does not use P521 curve. + * 1 if ECC public key uses P521 curve. + * -1 on error. + */ +int qcrypto_x509_check_ecc_curve_p521(uint8_t *cert, size_t size, Error **= errp); + #endif --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748845; cv=none; d=zohomail.com; s=zohoarc; b=kERxV3Xdzn2G0sYTd1GJJizn2FPxY7SmqD9CBFh0ctFlKZWPrSW3FeCJZNDpWpG+YJ1t9ZTtpCoHT3Jlu0D1fo1zIZYvQ+x8agXd4Hk+zJRrSs3kCRN2JtUcMpfjiP0QFczTf867x6oqGx9TkAeLKy+Jb13n2PFwpkHNhqeXSA8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748845; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=sVRJjsaJOygbvj0UahH2KgrdPS+WdN7vqE3zBNyKKcQ=; b=fcxUYTm0UlUUOK4mSgoi53WHl/2zm9eNFXL4mlzaROdeNzgYNwfFwhmmMmUEp9qRPiubIbXe4eedgerbGigObOW6pSFasRFusVyv42EstWYeLw2XMLDILxrjnwQwe+DTtUpXNdQkNsxV26ZgrgHBA6vIlFYgsgVmpcECUehBovk= 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 1787748845950218.00766406225466; Wed, 26 Aug 2026 05:54:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7R-0007fD-E9; Wed, 26 Aug 2026 08:52:41 -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 1wzD7M-0007cG-Ua; Wed, 26 Aug 2026 08:52:37 -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 1wzD7J-0002UC-U2; Wed, 26 Aug 2026 08:52:36 -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 67QCVrte3977437; Wed, 26 Aug 2026 12:52:32 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 4g73946pbc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:31 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfGFF032650; Wed, 26 Aug 2026 12:52:30 GMT Received: from smtprelay02.wdc07v.mail.ibm.com ([172.16.1.69]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7qkh9vma-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:30 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay02.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqTZK22414002 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:29 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 86A245805E; Wed, 26 Aug 2026 12:52:29 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6902F58059; Wed, 26 Aug 2026 12:52:28 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:28 +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=sVRJjsaJOygbvj0Ua hH2KgrdPS+WdN7vqE3zBNyKKcQ=; b=NVxtA3Ns8xDjVArTRsy+nSYVCByLbcaho I5njPKas6HqxLDhJWnW1jm6pQ/V7aWIuN1EO/akISyb19BZfB8QTNu4hTuQVgkv6 +NeW5FfxV1QETWL4OPWpSnc2ZQ+JgjFIvNNwbOROklae7rVBsyOV6Zol4xpPpUdH 6mtPmVjjhqeqWJ3J8CjqoZ/lcFZ05Q8vfJp3vB0lJO/Ipwp4szYD3taq41PRwQeH gsluKF5Fuj3Twfmx1fJE6qAJXmdsWwlrSfbQLR3R8R2Ot93LjQLTEmNt2oNak2mO r2xEWkoWEFQr1YOCTXOJH+MFXYDYzzVbGpC6IGgw8DOHgoqzPz2/g== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Eric Farman , Jared Rossi , Collin Walling Subject: [PULL 11/37] s390x/diag: Implement DIAG 320 subcode 2 Date: Wed, 26 Aug 2026 08:51:46 -0400 Message-ID: <20260826125213.1901252-12-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: SdF_2DqOC2TxeIEO665bmrqvuaNzz9_q X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX8ctHbmoVymaB 31qnNGLMQL+/GSz6bv3nKo5OailL/2KYfPzwWGfF+ZZPuIdj87bJIM9jyTaAZ0+s0XBrVFr2K4X wZto1TglskQraK4ryWnKLjUIu9J6NiwulJgRuG0EKV0DIdGjCjgWXOFsLomJUHNVOuWyfwbdUoW ZWYWOVVAucZvvgf0fRvtP0Lknrx/6oSWutyeOiaX7wNLFgI42bggXkaVOS/7L9SXYG8Fb4+D7g5 0ul4Wm1HOniDHQ1P6aQl0aCOHKXnhxxC+PeVFFK0Tjn0wFa7HBY0T7Jix2cC/YAHAOHHy9LV02H aWp0+EKUgfNZ2jHs1If8utf8S1zotlyybmE1KGNy7wjvJgVTFHrMh/rS+i+gxMmTBta2a7jnbUG dP/ZG1Gs+8tbJQOHTTlN4eft25fsg9sN0Eln5tsKE12ADfNyaH9LzL7Nj8/OUWqlaWhsBKlH+qr C7YQ1PCFFqcUXbn0Hmw== X-Authority-Analysis: v=2.4 cv=Y/nIdBeN c=1 sm=1 tr=0 ts=6a8ee190 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=yb4F8fGd1MjoyQfLk7gA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX3a2PasBu6e9a CbAp49AmcmWTS1ZEMDaVCXkR2RpJLbTrcTG9GXasZgUbnhV34ZLnnK8KBsEIEZ8guSokAOfwiF2 uaKzFcYztekjK+kABAIl6GDzwQIdQek= X-Proofpoint-ORIG-GUID: SdF_2DqOC2TxeIEO665bmrqvuaNzz9_q 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 impostorscore=0 priorityscore=1501 adultscore=0 bulkscore=0 suspectscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748847239158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai DIAG 320 subcode 2 provides verification-certificates (VCs) that are in the certificate store. Only X509 certificates in DER format and SHA-256 hash type are recognized. The subcode value is denoted by setting the second-left-most bit of an 8-byte field. The Verification Certificate Block (VCB) contains the output data when the operation completes successfully. It includes a common header followed by zero or more Verification Certificate Entries (VCEs), depending on the VCB input length and the VC range (from the first VC index to the last VC index) in the certificate store. Each VCE contains information about a certificate retrieved from the S390IPLCertificateStore, such as the certificate name, key type, key ID length, hash length, and the raw certificate data. The key ID and hash are extracted from the raw certificate by the crypto AP= I. Note: SHA2-256 VC hash type is required for retrieving the hash (fingerprint) of the certificate. Signed-off-by: Zhuoying Cai Reviewed-by: Eric Farman Reviewed-by: Jared Rossi Reviewed-by: Collin Walling Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-10-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- docs/specs/s390x-secure-ipl.rst | 24 +++ include/hw/s390x/ipl/diag320.h | 38 ++++ target/s390x/diag.c | 316 +++++++++++++++++++++++++++++++- 3 files changed, 377 insertions(+), 1 deletion(-) diff --git a/docs/specs/s390x-secure-ipl.rst b/docs/specs/s390x-secure-ipl.= rst index 201cc74c7c..99052041c1 100644 --- a/docs/specs/s390x-secure-ipl.rst +++ b/docs/specs/s390x-secure-ipl.rst @@ -42,3 +42,27 @@ Subcode 1 - query verification certificate storage infor= mation The output is returned in the verification-certificate-storage-size bl= ock (VCSSB). A VCSSB length of 4 indicates that no certificates are availa= ble in the CS. + +Subcode 2 - store verification certificates + Provides VCs that are in the certificate store. + + The output is provided in a VCB, which includes a common header follow= ed by + zero or more verification-certificate entries (VCEs). + + The instruction expects the cert store to maintain an origin of 1 for = the + index (i.e. a retrieval of the first certificate in the store should be + denoted by setting first-VC to 1). + + The first-VC and last-VC fields of the VCB specify the index range of + VCs to be stored in the VCB. Certs are stored sequentially, starting + with first-VC index. As each cert is stored, a "stored count" is + incremented. If there is not enough space to store all certs requested + by the index range, a "remaining count" will be recorded and no more + certificates will be stored. + + Each VCE contains a header followed by information extracted from a + certificate within the certificate store. The information includes: + key-id, hash, and certificate data. This information is stored + contiguously in a VCE (with zero-padding). Following the header, the + key-id is immediately stored. The hash and certificate data follow and + may be accessed via the respective offset fields stored in the VCE. diff --git a/include/hw/s390x/ipl/diag320.h b/include/hw/s390x/ipl/diag320.h index d37d8eaa86..7fda2d44fd 100644 --- a/include/hw/s390x/ipl/diag320.h +++ b/include/hw/s390x/ipl/diag320.h @@ -12,19 +12,45 @@ =20 #define DIAG_320_SUBC_QUERY_ISM 0 #define DIAG_320_SUBC_QUERY_VCSI 1 +#define DIAG_320_SUBC_STORE_VC 2 =20 #define DIAG_320_RC_OK 0x0001 #define DIAG_320_RC_NOT_SUPPORTED 0x0102 #define DIAG_320_RC_INVAL_VCSSB_LEN 0x0202 +#define DIAG_320_RC_INVAL_VCB_LEN 0x0204 +#define DIAG_320_RC_BAD_RANGE 0x0302 =20 #define DIAG_320_ISM_QUERY_SUBCODES 0x80000000 #define DIAG_320_ISM_QUERY_VCSI 0x40000000 +#define DIAG_320_ISM_STORE_VC 0x20000000 =20 #define VCSSB_NO_VC 4 #define VCSSB_LEN_VALID 128 =20 #define CERT_NAME_MAX_LEN 64 =20 +/* + * If the VCE flags indicate an invalid certificate, + * the VCE length is set to 72, containing only the + * first five fields of VCEntry. + */ +#define VCE_INVALID_LEN 72 + +#define DIAG_320_VCE_FLAGS_VALID 0x80 + +typedef enum Diag320VceKeyType { + DIAG_320_VCE_KEYTYPE_SELF_DESCRIBING =3D 0, + DIAG_320_VCE_KEYTYPE_ECDSA_P521 =3D 1, +} Diag320VceKeyType; + +typedef enum Diag320VceFormat { + DIAG_320_VCE_FORMAT_X509_DER =3D 1, +} Diag320VceFormat; + +typedef enum Diag320VceHashType { + DIAG_320_VCE_HASHTYPE_SHA2_256 =3D 1, +} Diag320VceHashType; + struct VCStorageSizeBlock { uint32_t length; uint8_t reserved0[3]; @@ -60,6 +86,12 @@ struct VCEntryHeader { }; typedef struct VCEntryHeader VCEntryHeader; =20 +struct VCEntry { + VCEntryHeader vce_hdr; + uint8_t cert_buf[]; +}; +typedef struct VCEntry VCEntry; + struct VCBlockHeader { uint32_t in_len; uint32_t reserved0; @@ -74,4 +106,10 @@ struct VCBlockHeader { }; typedef struct VCBlockHeader VCBlockHeader; =20 +struct VCBlock { + VCBlockHeader vcb_hdr; + uint8_t vce_buf[]; +}; +typedef struct VCBlock VCBlock; + #endif diff --git a/target/s390x/diag.c b/target/s390x/diag.c index 1e9d63ceba..4105ba299b 100644 --- a/target/s390x/diag.c +++ b/target/s390x/diag.c @@ -17,13 +17,16 @@ #include "s390x-internal.h" #include "hw/watchdog/wdt_diag288.h" #include "system/cpus.h" +#include "hw/s390x/cert-store.h" #include "hw/s390x/ipl.h" #include "hw/s390x/ipl/diag320.h" #include "hw/s390x/s390-virtio-ccw.h" #include "system/kvm.h" #include "kvm/kvm_s390x.h" #include "target/s390x/kvm/pv.h" +#include "qapi/error.h" #include "qemu/error-report.h" +#include "crypto/x509-utils.h" =20 =20 static inline bool diag_parm_addr_valid(uint64_t addr, size_t size, bool w= rite) @@ -241,8 +244,306 @@ static int handle_diag320_query_vcsi(S390CPU *cpu, ui= nt64_t addr, uint64_t r1, return DIAG_320_RC_OK; } =20 +static bool is_cert_valid(const S390IPLCertificate *cert) +{ + int rc; + Error *err =3D NULL; + + rc =3D qcrypto_x509_check_cert_times(cert->raw, cert->size, &err); + if (rc !=3D 0) { + error_report_err(err); + return false; + } + + return true; +} + +static int handle_key_id(VCEntry *vce, const S390IPLCertificate *cert) +{ + int rc; + g_autofree unsigned char *key_id_data =3D NULL; + size_t key_id_len; + Error *err =3D NULL; + + rc =3D qcrypto_x509_get_cert_key_id(cert->raw, cert->size, + QCRYPTO_HASH_ALGO_SHA256, + &key_id_data, &key_id_len, &err); + if (rc < 0) { + error_report_err(err); + return 0; + } + + if (sizeof(VCEntryHeader) + key_id_len > be32_to_cpu(vce->vce_hdr.len)= ) { + error_report("Unable to write key ID: exceeds buffer bounds"); + return 0; + } + + vce->vce_hdr.keyid_len =3D cpu_to_be16(key_id_len); + + memcpy(vce->cert_buf, key_id_data, key_id_len); + + return ROUND_UP(key_id_len, 4); +} + +static int handle_hash(VCEntry *vce, const S390IPLCertificate *cert, + uint16_t keyid_field_len) +{ + int rc; + uint16_t hash_offset; + g_autofree void *hash_data =3D NULL; + size_t hash_len; + Error *err =3D NULL; + + hash_len =3D CERT_HASH_LEN; + hash_data =3D g_malloc0(hash_len); + rc =3D qcrypto_get_x509_cert_fingerprint(cert->raw, cert->size, + QCRYPTO_HASH_ALGO_SHA256, + hash_data, &hash_len, &err); + if (rc < 0) { + error_report_err(err); + return 0; + } + + hash_offset =3D sizeof(VCEntryHeader) + keyid_field_len; + if (hash_offset + hash_len > be32_to_cpu(vce->vce_hdr.len)) { + error_report("Unable to write hash: exceeds buffer bounds"); + return 0; + } + + vce->vce_hdr.hash_len =3D cpu_to_be16(hash_len); + vce->vce_hdr.hash_type =3D DIAG_320_VCE_HASHTYPE_SHA2_256; + vce->vce_hdr.hash_offset =3D cpu_to_be16(hash_offset); + + memcpy((uint8_t *)vce + hash_offset, hash_data, hash_len); + + return ROUND_UP(hash_len, 4); +} + +static int handle_cert(VCEntry *vce, const S390IPLCertificate *cert, + uint16_t hash_field_len) +{ + int rc; + uint16_t cert_offset; + g_autofree uint8_t *cert_der =3D NULL; + size_t der_size; + Error *err =3D NULL; + + rc =3D qcrypto_x509_convert_cert_der(cert->raw, cert->size, + &cert_der, &der_size, &err); + if (rc < 0) { + error_report_err(err); + return 0; + } + + cert_offset =3D be16_to_cpu(vce->vce_hdr.hash_offset) + hash_field_len; + if (cert_offset + der_size > be32_to_cpu(vce->vce_hdr.len)) { + error_report("Unable to write certificate: exceeds buffer bounds"); + return 0; + } + + vce->vce_hdr.format =3D DIAG_320_VCE_FORMAT_X509_DER; + vce->vce_hdr.cert_len =3D cpu_to_be32(der_size); + vce->vce_hdr.cert_offset =3D cpu_to_be16(cert_offset); + + memcpy((uint8_t *)vce + cert_offset, cert_der, der_size); + + return ROUND_UP(der_size, 4); +} + +static int get_key_type(const S390IPLCertificate *cert) +{ + int rc; + Error *err =3D NULL; + + rc =3D qcrypto_x509_check_ecc_curve_p521(cert->raw, cert->size, &err); + if (rc =3D=3D -1) { + error_report_err(err); + return -1; + } + + return (rc =3D=3D 1) ? DIAG_320_VCE_KEYTYPE_ECDSA_P521 : + DIAG_320_VCE_KEYTYPE_SELF_DESCRIBING; +} + +static int build_vce_header(VCEntry *vce, const S390IPLCertificate *cert, = int idx) +{ + int key_type; + + vce->vce_hdr.len =3D cpu_to_be32(sizeof(VCEntryHeader)); + vce->vce_hdr.cert_idx =3D cpu_to_be16(idx + 1); + memcpy(vce->vce_hdr.name, cert->name, CERT_NAME_MAX_LEN); + + if (!is_cert_valid(cert)) { + return -1; + } + + key_type =3D get_key_type(cert); + if (key_type =3D=3D -1) { + return -1; + } + vce->vce_hdr.key_type =3D key_type; + + return 0; +} + +static int build_vce_data(VCEntry *vce, const S390IPLCertificate *cert, + uint32_t vce_max_len) +{ + uint16_t keyid_field_len; + uint16_t hash_field_len; + uint32_t cert_field_len; + uint32_t vce_len; + + vce->vce_hdr.len =3D cpu_to_be32(vce_max_len); + + keyid_field_len =3D handle_key_id(vce, cert); + if (!keyid_field_len) { + return -1; + } + + hash_field_len =3D handle_hash(vce, cert, keyid_field_len); + if (!hash_field_len) { + return -1; + } + + cert_field_len =3D handle_cert(vce, cert, hash_field_len); + if (!cert_field_len) { + return -1; + } + + vce_len =3D sizeof(VCEntryHeader) + keyid_field_len + hash_field_len += cert_field_len; + if (vce_len > vce_max_len) { + return -1; + } + + vce->vce_hdr.flags |=3D DIAG_320_VCE_FLAGS_VALID; + + /* Update vce length to reflect the actual size used by vce */ + vce->vce_hdr.len =3D cpu_to_be32(vce_len); + + return 0; +} + +static int handle_diag320_store_vc(S390CPU *cpu, uint64_t addr, uint64_t r= 1, uintptr_t ra, + S390IPLCertificateStore *cs) +{ + g_autofree VCBlockHeader *vcb_hdr =3D NULL; + size_t remaining_space; + uint16_t first_vc_index; + uint16_t last_vc_index; + int cs_start_index; + int cs_end_index; + uint32_t vce_max_len; + uint32_t vce_len; + uint32_t in_len; + + vcb_hdr =3D g_new0(VCBlockHeader, 1); + if (s390_cpu_virt_mem_read(cpu, addr, r1, vcb_hdr, sizeof(*vcb_hdr))) { + s390_cpu_virt_mem_handle_exc(cpu, ra); + return -1; + } + + in_len =3D be32_to_cpu(vcb_hdr->in_len); + first_vc_index =3D be16_to_cpu(vcb_hdr->first_vc_index); + last_vc_index =3D be16_to_cpu(vcb_hdr->last_vc_index); + + if (in_len % TARGET_PAGE_SIZE !=3D 0) { + return DIAG_320_RC_INVAL_VCB_LEN; + } + + if (first_vc_index > last_vc_index) { + return DIAG_320_RC_BAD_RANGE; + } + + vcb_hdr->out_len =3D sizeof(VCBlockHeader); + + /* + * DIAG 320 subcode 2 expects to query a certificate store that + * maintains an index origin of 1. However, the S390IPLCertificateStore + * maintains an index origin of 0. Thus, the indices must be adjusted + * for correct access into the cert store. A couple of special cases + * must also be accounted for. + */ + + /* Both indices are 0; return header with no certs */ + if (first_vc_index =3D=3D 0 && last_vc_index =3D=3D 0) { + goto out; + } + + /* Normalize indices */ + cs_start_index =3D (first_vc_index =3D=3D 0) ? 0 : first_vc_index - 1; + cs_end_index =3D last_vc_index - 1; + + /* Requested range is outside the cert store; return header with no ce= rts */ + if (cs_start_index >=3D cs->count || cs_end_index >=3D cs->count) { + goto out; + } + + remaining_space =3D in_len - sizeof(VCBlockHeader); + + for (int i =3D cs_start_index; i <=3D cs_end_index; i++) { + const S390IPLCertificate *cert =3D &cs->certs[i]; + /* + * Each field of the VCE is word-aligned. + * Allocate enough space for the largest possible size for this VC= E. + * As the certificate fields (key-id, hash, data) are parsed, the + * VCE's length field will be updated accordingly. + */ + vce_max_len =3D sizeof(VCEntryHeader) + ROUND_UP(CERT_KEY_ID_LEN, = 4) + + ROUND_UP(CERT_HASH_LEN, 4) + ROUND_UP(cert->der_size= , 4); + g_autofree VCEntry *vce =3D g_malloc0(vce_max_len); + + /* + * Bit 0 of the VCE flags indicates whether the certificate is val= id. + * The caller of DIAG320 subcode 2 is responsible for verifying th= at + * the VCE contains a valid certificate. + */ + if (build_vce_header(vce, cert, i) || build_vce_data(vce, cert, vc= e_max_len)) { + /* + * Error occurs - VCE does not contain a valid certificate. + * Bit 0 of the VCE flags is 0 and the VCE length is set. + */ + vce->vce_hdr.len =3D cpu_to_be32(VCE_INVALID_LEN); + } + vce_len =3D be32_to_cpu(vce->vce_hdr.len); + + /* + * If there is no more space to store the cert, + * set the remaining verification cert count and + * break early. + */ + if (remaining_space < vce_len) { + vcb_hdr->remain_ct =3D cpu_to_be16(last_vc_index - i); + break; + } + + /* Write VCE */ + if (s390_cpu_virt_mem_write(cpu, addr + vcb_hdr->out_len, r1, vce,= vce_len)) { + s390_cpu_virt_mem_handle_exc(cpu, ra); + return -1; + } + + vcb_hdr->out_len +=3D vce_len; + remaining_space -=3D vce_len; + vcb_hdr->stored_ct++; + } + vcb_hdr->stored_ct =3D cpu_to_be16(vcb_hdr->stored_ct); + +out: + vcb_hdr->out_len =3D cpu_to_be32(vcb_hdr->out_len); + + if (s390_cpu_virt_mem_write(cpu, addr, r1, vcb_hdr, sizeof(VCBlockHead= er))) { + s390_cpu_virt_mem_handle_exc(cpu, ra); + return -1; + } + + return DIAG_320_RC_OK; +} + QEMU_BUILD_BUG_MSG(sizeof(VCStorageSizeBlock) !=3D VCSSB_LEN_VALID, "size of VCStorageSizeBlock is wrong"); +QEMU_BUILD_BUG_MSG(sizeof(VCBlock) !=3D 64, "size of VCBlock is wrong"); +QEMU_BUILD_BUG_MSG(sizeof(VCEntry) !=3D 128, "size of VCEntry is wrong"); =20 void handle_diag_320(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr= _t ra) { @@ -273,7 +574,8 @@ void handle_diag_320(CPUS390XState *env, uint64_t r1, u= int64_t r3, uintptr_t ra) * for now. */ ism_word0 =3D cpu_to_be32(DIAG_320_ISM_QUERY_SUBCODES | - DIAG_320_ISM_QUERY_VCSI); + DIAG_320_ISM_QUERY_VCSI | + DIAG_320_ISM_STORE_VC); =20 if (s390_cpu_virt_mem_write(cpu, addr, r1, &ism_word0, sizeof(ism_= word0))) { s390_cpu_virt_mem_handle_exc(cpu, ra); @@ -299,6 +601,18 @@ void handle_diag_320(CPUS390XState *env, uint64_t r1, = uint64_t r3, uintptr_t ra) } env->regs[r1 + 1] =3D rc; break; + case DIAG_320_SUBC_STORE_VC: + if (addr & ~TARGET_PAGE_MASK) { + s390_program_interrupt(env, PGM_SPECIFICATION, ra); + return; + } + + rc =3D handle_diag320_store_vc(cpu, addr, r1, ra, cs); + if (rc =3D=3D -1) { + return; + } + env->regs[r1 + 1] =3D rc; + break; default: env->regs[r1 + 1] =3D DIAG_320_RC_NOT_SUPPORTED; break; --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748972; cv=none; d=zohomail.com; s=zohoarc; b=AZIjWLKQz3fa/gAy/FaKTxnHjA/gk0HfEa+qWZ1yfpNDEU0ZB3LUnAFcJSJg4KNspkTifKR/7yddvPSo9F9T6Fnv8skYSctrOD/rv6QNbuSIInPlX2v0Mun9vQfr6MGp8X9L5KQmYDAP65g9zNo5tMtCqjMxvtT4Vaa7PLYV0z4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748972; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=3t7RBxm4Imxo8WcrX9e0/oyCeU2lf3/0iltDJC50VKw=; b=WNQWzQT7ADFexZ+UguYPToys6AC3hQQeEYbNNCx2KFBJm8RJS1alCtGOyE3AIfozJHa8zNm63c0NHLl9MmG+W0wClCP3DYl3KbLS6MkKAksY6ttsAbXqJNLI2wq0jToMXr5uugnfcR5Vqt0dQFr8UGOTa/U/AsUd84UEbdtMCus= 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 1787748972969202.301389698295; Wed, 26 Aug 2026 05:56:12 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7N-0007cZ-K7; Wed, 26 Aug 2026 08:52:37 -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 1wzD7L-0007b2-Ss; Wed, 26 Aug 2026 08:52:35 -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 1wzD7J-0002UG-Re; Wed, 26 Aug 2026 08:52:35 -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 67QCWHK72878255; Wed, 26 Aug 2026 12:52:32 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 4g726epkk6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:32 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfIv1002343; Wed, 26 Aug 2026 12:52:31 GMT Received: from smtprelay03.wdc07v.mail.ibm.com ([172.16.1.70]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7q3k1xwb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:31 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay03.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCpodt20382346 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:51:50 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 972665805B; Wed, 26 Aug 2026 12:52:30 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B3F8D58059; Wed, 26 Aug 2026 12:52:29 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:29 +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=3t7RBxm4Imxo8WcrX 9e0/oyCeU2lf3/0iltDJC50VKw=; b=SLPafclqQNen/273ehexOuEVkhPEgkS9w 2dlGc9U0PMdtRmnG6x77ZsYJOLPrjegjNQ7nxmOJRu0pqnLPUnzcguq29GuxCivI 1Yz5NX+KkQTg1r1JTQPqlx13FVffn4469SMaQXPeAbBBXCTyebgBGmrU1xROnj8e M6qhPZlgSWUjz/UsVBufnnTBqP2+pclS0ZfbBkknHvR7CIvrN188d2NwnVKmYWnq TC5fXEGfeheInyHST2SgdhLNHziBkbxOWR/0JE8wVvxAJRNt1GkdhjlaEk3VN33z X+Jv4rWsIMrBW6BA+s1+UICuwFNSDGJo6i4r/oVXUMHmLbOUPQlzw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Eric Farman Subject: [PULL 12/37] hw/s390x: Define finite size for single entry VCEntry Date: Wed, 26 Aug 2026 08:51:47 -0400 Message-ID: <20260826125213.1901252-13-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-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=TfimcxQh c=1 sm=1 tr=0 ts=6a8ee190 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=HeWPiYe96b1ufxwsDYQA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX+I1HDZeiZHEb Vhfr+4+vH876weaMCL56heGJL0QVDytZIDfGk4MbVVV2vzhXsSvXh6RUai6RB1+hhFh/zKR60ky 4fVR43WlmjXkQj0uUHa33QRFrYS41VY= X-Proofpoint-GUID: 2sFh8LuB4pcVvzp8dIWi9INc9w1GUAav X-Proofpoint-ORIG-GUID: 2sFh8LuB4pcVvzp8dIWi9INc9w1GUAav X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX8vimKCRSQd5h gA1TFM0oqES5GM0M0Yih1GPbgbI42bzu9MJbAgjB2yRm95bOlJLzFpJZnDm+q6yMwYtYNzYpN0q iZuVMq/bFvlacVYSOoaBmVUGDioBZllRWktIqX33ybTaA41PYBsMXljO8p9fYza3j3jwxYan/M3 /xs7hMaj4AgMCfHDKf82J8Lws7+XrFq0p0970fvvmeQIfH7aUBHjnPp5bgiIazRz1UGD7KZTb/t bhM5MlJtudk/5Kb/5UDh3nrraKRLHU/FXKzIDSKgbvlmDIStllmn6InI9aQPWO7uA2Ueaj0ysiO F144RcBwsM6WZNuPFdMHgQz1dfeiqFUhNCf2IFN0wsWLXm343YXb1ADO9BsYSHhMIttDuxL9JB4 1RJ1C9IGDHrrosU65tmcgm9maOYagJOdBenogcwZyDt6XK2dKWlamzQH01urOZFdQFfedQYInqk /Nh/sbVsh1L+tZoDZ6Q== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 bulkscore=0 malwarescore=0 priorityscore=1501 lowpriorityscore=0 clxscore=1015 phishscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748973918158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Define MAX_VCENTRY_SIZE(8KB) and CERT_BUF_MAX_LEN to establish a finite size for a single entry VCEntry. Add validation in update_cert_store() to ensure certificate data does not exceed this limit. This finite size definition is needed for proper memory allocation and will be used in a later commit to handle VCEntry structures with known size constraints. Signed-off-by: Zhuoying Cai Reviewed-by: Matthew Rosato Reviewed-by: Eric Farman Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-11-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- hw/s390x/cert-store.c | 6 ++++++ include/hw/s390x/ipl/diag320.h | 3 +++ 2 files changed, 9 insertions(+) diff --git a/hw/s390x/cert-store.c b/hw/s390x/cert-store.c index c679406c2c..c086e75f75 100644 --- a/hw/s390x/cert-store.c +++ b/hw/s390x/cert-store.c @@ -91,6 +91,12 @@ static int update_cert_store(S390IPLCertificateStore *ce= rt_store, cert_buf_size =3D ROUND_UP(cert->der_size, 4); data_buf_size =3D keyid_buf_size + hash_buf_size + cert_buf_size; =20 + if (data_buf_size > CERT_BUF_MAX_LEN) { + error_report("Certificate data size %zu exceeds maximum buffer siz= e %zu", + data_buf_size, CERT_BUF_MAX_LEN); + return -1; + } + if (cert_store->largest_cert_size < data_buf_size) { cert_store->largest_cert_size =3D data_buf_size; } diff --git a/include/hw/s390x/ipl/diag320.h b/include/hw/s390x/ipl/diag320.h index 7fda2d44fd..f3c23a3176 100644 --- a/include/hw/s390x/ipl/diag320.h +++ b/include/hw/s390x/ipl/diag320.h @@ -92,6 +92,9 @@ struct VCEntry { }; typedef struct VCEntry VCEntry; =20 +#define MAX_VCENTRY_SIZE (8 * 1024) +#define CERT_BUF_MAX_LEN (MAX_VCENTRY_SIZE - sizeof(VCEntryHeader)) + struct VCBlockHeader { uint32_t in_len; uint32_t reserved0; --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787749013; cv=none; d=zohomail.com; s=zohoarc; b=P2m7PThUVIkDhSYILglw48UUmCeEXJa1kETNp8vTp1sjQ/BMYiuJDVgYT9PgSNkiLb3V1HisKUvf5sHT10D50GGozLzqFMxN1qvNqg2ZgxOakHuoqChv6ZnGL3BGaDyCzL/v8aFaUKiTe10VzhkNsaEkIMB/io/e/hZ3aFPBOPk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787749013; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=HH4l1ggSylDSfHc3fpEVFK7ZDxx9vMZH7iFqrp3lVQs=; b=I7Y4zkORYhIh190mKF+UmVwiJM0yFYZhMI6GHeHjWqhuKMjhUaVpVjl10ykMjDEHZJHq341kQgELx29tn9lVjEMlAbo0tlC+psDt8N0kRImzKdrjzx3mMaCP4jmVEfUHWps3VBWFBfVTK1sUBSvPFkp1Xj+kwXpnPjWNH+QlA48= 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 1787749013299246.51738850626623; Wed, 26 Aug 2026 05:56:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7X-0007pO-F5; Wed, 26 Aug 2026 08:52: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 1wzD7S-0007hi-9N; Wed, 26 Aug 2026 08:52:42 -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 1wzD7L-0002Uu-N5; Wed, 26 Aug 2026 08:52:42 -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 67QCW3o83893871; Wed, 26 Aug 2026 12:52:34 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 4g716hxs96-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:34 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfNPR018852; Wed, 26 Aug 2026 12:52:33 GMT Received: from smtprelay04.wdc07v.mail.ibm.com ([172.16.1.71]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7raghsxx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:33 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay04.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqVtb56492388 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:31 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C44705805B; Wed, 26 Aug 2026 12:52:31 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C64E458059; Wed, 26 Aug 2026 12:52:30 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:30 +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=HH4l1ggSylDSfHc3f pEVFK7ZDxx9vMZH7iFqrp3lVQs=; b=tYrJvcJNZiGsv3Z/kC6YydUqG3SI4ftpS M5TqK5uUd7HifkB3Ffd7ZR8UDI18Yivyewjzi14SB4KWUsmEfXufBr74aMH0G9cM MKMmn5nTQcpjnmjgccWEmC3525FTyEF2HRPNkfdqBrQCDqju4nBS/z/mFUTtxtFJ ZcfnOWypDsGTVrKpLnzi6eUN2/GfiKE7s/aDSIksyEAAz5NsWgXLLQRueMKB8x35 JnGz/bl8bYTwSzp383AqxqY8T6k/39eCOy2mDfG2XgCz5SR8nLzQaQ93BXIy5GrD o8js1gQasbreX7PvTZ1GXMjDYK9B1r8hR54P2AW+GOco7NgX7jYMQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Collin Walling , Farhan Ali , Thomas Huth , Eric Farman Subject: [PULL 13/37] s390x/diag: Introduce DIAG 508 for secure IPL operations Date: Wed, 26 Aug 2026 08:51:48 -0400 Message-ID: <20260826125213.1901252-14-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXxM8IjYgiyi13 gDmBihxxHl5cVMibvgqFJ66tQceprFNd+N/wJLp81HBFVxYob1lVBKNWrEkfNKWjj/3nrcEhYcE A23Wf3LcJ5SdFramcNn/EERoY7Eh/Og= X-Proofpoint-GUID: bd4giohPy7TjszdF7slFvunL45GemFub X-Proofpoint-ORIG-GUID: bd4giohPy7TjszdF7slFvunL45GemFub X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXzHFs3CWpYTNo ZSvuAihdj/oldKLg2hfuajgfv2Q9vhbrUz4F3I7o33K/LLpMfX+fYqwQRSPGmVrM6jauhQnAQOo iJ2OuCQR3i9z3CBX06Qpl/QESev/IMihnKM3TYmWuyS56s1xK7eOaDZuPrsRkBvjzG1E2GmwNV9 p5eqt+5vm008L9jz0SkOhF6kRz4GdxNDQwG+ikIFO8mjv3Xb4otonPuRTEoJdDaTKAzwbvmwyaP u31HZaVY/LRvjiR5BSLZMY8BXUkf7o9OwGUgRy9zIjU/u5YmoNdqi4h4V3STJtnRfSsoJ1F11kX sqjiHjWCfVfjNsJIg+2+H5L7ZP7ep7n3q7W1uON+VfiJBIcMN6I/ethhhKXVvo3VbCBJjcQv2kN rKI8De2/vfRR7WF+xLyBQVBHRJuT/Yb5PnL73mEvNc3Qd/X4IAQQpCrBhzCAM3t6WqCjLMEZ29N eXuU6UXWDJdM96UbBZg== X-Authority-Analysis: v=2.4 cv=H7brBeYi c=1 sm=1 tr=0 ts=6a8ee192 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=hXQcL9AfcS-IPDpH2m0A:9 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 lowpriorityscore=0 impostorscore=0 spamscore=0 bulkscore=0 adultscore=0 priorityscore=1501 clxscore=1015 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787749014164158500 Content-Type: text/plain; charset="utf-8" From: Collin Walling In order to support secure IPL (aka secure boot) for the s390-ccw BIOS, a new s390 DIAGNOSE instruction is introduced to leverage QEMU for handling operations such as signature verification and certificate retrieval. Currently, only subcode 0 is supported with this patch, which is used to query a bitmap of which subcodes are supported. Signed-off-by: Collin Walling Reviewed-by: Farhan Ali Reviewed-by: Thomas Huth Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-12-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- docs/specs/s390x-secure-ipl.rst | 18 ++++++++++++++++++ include/hw/s390x/ipl/diag508.h | 15 +++++++++++++++ target/s390x/diag.c | 27 +++++++++++++++++++++++++++ target/s390x/kvm/kvm.c | 14 ++++++++++++++ target/s390x/s390x-internal.h | 2 ++ target/s390x/tcg/misc_helper.c | 7 +++++++ 6 files changed, 83 insertions(+) create mode 100644 include/hw/s390x/ipl/diag508.h diff --git a/docs/specs/s390x-secure-ipl.rst b/docs/specs/s390x-secure-ipl.= rst index 99052041c1..776270d816 100644 --- a/docs/specs/s390x-secure-ipl.rst +++ b/docs/specs/s390x-secure-ipl.rst @@ -66,3 +66,21 @@ Subcode 2 - store verification certificates contiguously in a VCE (with zero-padding). Following the header, the key-id is immediately stored. The hash and certificate data follow and may be accessed via the respective offset fields stored in the VCE. + + +Secure IPL Data Structures, Facilities, and Functions +----------------------------------------------------- + +DIAGNOSE function code 'X'508' - IPL extensions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +DIAGNOSE 'X'508' is reserved for guest use in order to facilitate communic= ation +of additional IPL operations that cannot be handled by guest code, such as +signature verification for secure IPL. + +If the function code specifies 0x508, IPL extension functions are performe= d. +These functions are meant to provide extended functionality for s390 guest= boot +that requires assistance from QEMU. + +Subcode 0 - query installed subcodes + Returns a 64-bit mask indicating which subcodes are supported. diff --git a/include/hw/s390x/ipl/diag508.h b/include/hw/s390x/ipl/diag508.h new file mode 100644 index 0000000000..6281ad8299 --- /dev/null +++ b/include/hw/s390x/ipl/diag508.h @@ -0,0 +1,15 @@ +/* + * S/390 DIAGNOSE 508 definitions and structures + * + * Copyright 2025 IBM Corp. + * Author(s): Collin Walling + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef S390X_DIAG508_H +#define S390X_DIAG508_H + +#define DIAG_508_SUBC_QUERY_SUBC 0x0000 + +#endif diff --git a/target/s390x/diag.c b/target/s390x/diag.c index 4105ba299b..3e5ddc8c9a 100644 --- a/target/s390x/diag.c +++ b/target/s390x/diag.c @@ -20,6 +20,7 @@ #include "hw/s390x/cert-store.h" #include "hw/s390x/ipl.h" #include "hw/s390x/ipl/diag320.h" +#include "hw/s390x/ipl/diag508.h" #include "hw/s390x/s390-virtio-ccw.h" #include "system/kvm.h" #include "kvm/kvm_s390x.h" @@ -618,3 +619,29 @@ void handle_diag_320(CPUS390XState *env, uint64_t r1, = uint64_t r3, uintptr_t ra) break; } } + +void handle_diag_508(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr= _t ra) +{ + uint64_t subcode =3D env->regs[r3]; + int rc; + + if (env->psw.mask & PSW_MASK_PSTATE) { + s390_program_interrupt(env, PGM_PRIVILEGED, ra); + return; + } + + if ((subcode & ~0x0ffffULL) || (r1 & 1)) { + s390_program_interrupt(env, PGM_SPECIFICATION, ra); + return; + } + + switch (subcode) { + case DIAG_508_SUBC_QUERY_SUBC: + rc =3D 0; + break; + default: + s390_program_interrupt(env, PGM_SPECIFICATION, ra); + return; + } + env->regs[r1 + 1] =3D rc; +} diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c index 70ef92f5ab..10cee19860 100644 --- a/target/s390x/kvm/kvm.c +++ b/target/s390x/kvm/kvm.c @@ -102,6 +102,7 @@ #define DIAG_CERT_STORE 0x320 #define DIAG_KVM_HYPERCALL 0x500 #define DIAG_KVM_BREAKPOINT 0x501 +#define DIAG_SECURE_IPL 0x508 =20 #define ICPT_INSTRUCTION 0x04 #define ICPT_PROGRAM 0x08 @@ -1542,6 +1543,16 @@ static void kvm_handle_diag_320(S390CPU *cpu, struct= kvm_run *run) handle_diag_320(&cpu->env, r1, r3, RA_IGNORED); } =20 +static void kvm_handle_diag_508(S390CPU *cpu, struct kvm_run *run) +{ + uint64_t r1, r3; + + r1 =3D (run->s390_sieic.ipa & 0x00f0) >> 4; + r3 =3D run->s390_sieic.ipa & 0x000f; + + handle_diag_508(&cpu->env, r1, r3, RA_IGNORED); +} + #define DIAG_KVM_CODE_MASK 0x000000000000ffff =20 static int handle_diag(S390CPU *cpu, struct kvm_run *run, uint32_t ipb) @@ -1575,6 +1586,9 @@ static int handle_diag(S390CPU *cpu, struct kvm_run *= run, uint32_t ipb) case DIAG_CERT_STORE: kvm_handle_diag_320(cpu, run); break; + case DIAG_SECURE_IPL: + kvm_handle_diag_508(cpu, run); + break; default: trace_kvm_insn_diag(func_code); kvm_s390_program_interrupt(cpu, PGM_SPECIFICATION); diff --git a/target/s390x/s390x-internal.h b/target/s390x/s390x-internal.h index 1945bdf40c..81da207a5f 100644 --- a/target/s390x/s390x-internal.h +++ b/target/s390x/s390x-internal.h @@ -390,6 +390,8 @@ bool handle_diag_308(CPUS390XState *env, uint64_t r1, u= int64_t r3, uintptr_t ra); void handle_diag_320(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra); +void handle_diag_508(CPUS390XState *env, uint64_t r1, uint64_t r3, + uintptr_t ra); =20 =20 /* translate.c */ diff --git a/target/s390x/tcg/misc_helper.c b/target/s390x/tcg/misc_helper.c index 403388145e..f1c8563af0 100644 --- a/target/s390x/tcg/misc_helper.c +++ b/target/s390x/tcg/misc_helper.c @@ -154,6 +154,13 @@ void HELPER(diag)(CPUS390XState *env, uint32_t r1, uin= t32_t r3, uint32_t num) bql_unlock(); r =3D 0; break; + case 0x508: + /* secure ipl operations */ + bql_lock(); + handle_diag_508(env, r1, r3, GETPC()); + bql_unlock(); + r =3D 0; + break; default: r =3D -1; break; --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787749010; cv=none; d=zohomail.com; s=zohoarc; b=O+YaXOEzJ7xOX52ChxRyVUYcmWx+yu6PEtaTstw8p7iooAHyjByv40CsZnukPC0tKleizI9dEqjSdEGvSJbk+CnQRpll6NEQr9KeNBFITphOmi8ZUKV8UqSf1sSYAhfQAYuh3qbbZWABVK46GprBlZ6ZsdtmQHSiXAzuZl0Jc+c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787749010; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=+gWEuuI2p7v4vYtykPazXlelUs/4ptkPhub3oxlZ3p0=; b=lrISYdR7EMqSTKb+V+zyA9F6o2/so3xiB+VopVSPA8TddaZin8SenCdRPFnMEIcfN5CuEBgS0mJHSOnrqmjjjCGZBQK9eYGP8PWV/JHOMS7qtfqdYa0WrzYEjuSAqPVHFzWIHD+B/8u3R5U6z1D21w4xbhlVPM0kFmGgFt+mbfc= 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 1787749010951688.5341761168119; Wed, 26 Aug 2026 05:56:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7U-0007jk-Gm; Wed, 26 Aug 2026 08:52:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzD7Q-0007ei-3M; Wed, 26 Aug 2026 08:52: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 1wzD7N-0002WG-Ml; Wed, 26 Aug 2026 08:52: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 67QCW8Og3978118; Wed, 26 Aug 2026 12:52:36 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 4g73946pbm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:35 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfLmw018839; Wed, 26 Aug 2026 12:52:35 GMT Received: from smtprelay06.wdc07v.mail.ibm.com ([172.16.1.73]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7raghsy0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:34 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay06.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqX7h59375876 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:33 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5312F5805C; Wed, 26 Aug 2026 12:52:33 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 02B2758059; Wed, 26 Aug 2026 12:52:32 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:31 +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=+gWEuu I2p7v4vYtykPazXlelUs/4ptkPhub3oxlZ3p0=; b=ceoKGjmPsq2lh/f9fdkOp1 Kn47wOBGI4hukmSPhVZEXddGowgCf1tQQ9UCVZaDx4aTz7jSWLoQ3iEbfaC7Z5R+ 6jV2h3qV3DZAcUg9+9FkvheWs0Brl74ZM2nki1wVf7JaWNe6bEeCECi/U57UfY54 tjVSiA3IFDRNVsfAXA0QgHhfOIbjWB7RmvhByjlM0bJ7WZCQFXxVTqnCdPBEvPKJ B3wZi+Ql2lB4OMt3Gny3lINmle7wtlTMpx3x7oKCq789RQJfcvM3doZluPLGqpj1 0HGEHnufW2kCWWTwDlYRWCPAKsNrl53LY5DXiCAcNHYWu4ErEpqBE9j7I91W1MUg == From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Farhan Ali , Thomas Huth , Eric Farman Subject: [PULL 14/37] crypto/x509-utils: Add helper functions for DIAG 508 subcode 1 Date: Wed, 26 Aug 2026 08:51:49 -0400 Message-ID: <20260826125213.1901252-15-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-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-GUID: McbLN6ooVNIPTQG9YA9DY7uWL--oMZd8 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXwaxrl67+qK1b mP7uoCBDPjPUuidsC3kKEDTbpFGf2SIghVImyOsaY4PIcipYY16IvvERuUrxP+WBW0d35NZVSWO mhEoDpX477hUFWNk0v4fLjdONi68r00hUZ9cP/Awz7gN7WA6LwII/d5AItKK11Mszwvni8DMKSq 5qqeHJU5DaqEqnyhkGjsq8iAIEzfqHoPFoEv1cppDRKWZ2iyyOjRIEudMmI2iOl7TfEqMt9q+MM 0yXDhJeP3+K0ENmQavCZzaq67Nc2HIwSRdlmSbgqkiL0nYyhhf8D8M7vUDvFGCHbbhPJssd5Yjc dCYWgpJsGj4DEDznB4t9hUhd+k/E53ewWWWw8l4++DkRYpPuFilw3aTOMcM/Vyn7IdTPSGntXi2 6nCthT+taR9pE91pubziUeKGqbsBmx7JgpM8cuq1rg4AZ5SW6FSoUtusVt3/G4SLSOb0UMG9LgM HWX4jF8dS0EAzhRpnbg== X-Authority-Analysis: v=2.4 cv=Y/nIdBeN c=1 sm=1 tr=0 ts=6a8ee193 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=zt4pQtjzIfgCBjXpw2wA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX6b++6uCA7XRt BqINp8NDbvIa8mnmO+IfvnG+JAMhUDC+oBej6bE8FOv0LROn3XxQUYE0gtkwpUbNoGn9Ra47sfr oEevNCBIrgBI/nMyHohzVAAu8yFqkN8= X-Proofpoint-ORIG-GUID: McbLN6ooVNIPTQG9YA9DY7uWL--oMZd8 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 impostorscore=0 priorityscore=1501 adultscore=0 bulkscore=0 suspectscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787749012134158500 From: Zhuoying Cai Introduce helper functions to support signature verification required by DIAG 508 subcode 1: qcrypto_pkcs7_convert_sig_pem() =E2=80=93 converts a signature from DER to = PEM format qcrypto_x509_verify_sig() =E2=80=93 verifies the provided data against the = given signature These functions enable basic signature verification support. Signed-off-by: Zhuoying Cai Acked-by: Daniel P. Berrang=C3=A9 Reviewed-by: Daniel P. Berrang=C3=A9 Reviewed-by: Farhan Ali Reviewed-by: Thomas Huth Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-13-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- crypto/x509-utils.c | 108 ++++++++++++++++++++++++++++++++++++ include/crypto/x509-utils.h | 41 ++++++++++++++ 2 files changed, 149 insertions(+) diff --git a/crypto/x509-utils.c b/crypto/x509-utils.c index 543fc3007d..e4767f9838 100644 --- a/crypto/x509-utils.c +++ b/crypto/x509-utils.c @@ -16,6 +16,7 @@ #include #include #include +#include =20 static const int qcrypto_to_gnutls_hash_alg_map[QCRYPTO_HASH_ALGO__MAX] = =3D { [QCRYPTO_HASH_ALGO_MD5] =3D GNUTLS_DIG_MD5, @@ -336,6 +337,96 @@ int qcrypto_x509_check_ecc_curve_p521(uint8_t *cert, s= ize_t size, Error **errp) return curve_id =3D=3D GNUTLS_ECC_CURVE_SECP521R1; } =20 +int qcrypto_pkcs7_convert_sig_pem(uint8_t *sig, size_t sig_size, + uint8_t **result, size_t *resultlen, + Error **errp) +{ + int ret =3D -1; + int rc; + gnutls_pkcs7_t signature; + gnutls_datum_t sig_datum_der =3D {.data =3D sig, .size =3D sig_size}; + gnutls_datum_t sig_datum_pem =3D {.data =3D NULL, .size =3D 0}; + + rc =3D gnutls_pkcs7_init(&signature); + if (rc < 0) { + error_setg(errp, "Failed to initialize pkcs7 data: %s", gnutls_str= error(rc)); + return ret; + } + + rc =3D gnutls_pkcs7_import(signature, &sig_datum_der, GNUTLS_X509_FMT_= DER); + if (rc !=3D 0) { + error_setg(errp, "Failed to import signature: %s", gnutls_strerror= (rc)); + goto cleanup; + } + + rc =3D gnutls_pkcs7_export2(signature, GNUTLS_X509_FMT_PEM, &sig_datum= _pem); + if (rc !=3D 0) { + error_setg(errp, "Failed to convert signature to PEM format: %s", + gnutls_strerror(rc)); + goto cleanup; + } + + *resultlen =3D sig_datum_pem.size; + *result =3D g_memdup2(sig_datum_pem.data, sig_datum_pem.size); + + ret =3D 0; + +cleanup: + gnutls_pkcs7_deinit(signature); + g_free(sig_datum_pem.data); + return ret; +} + +int qcrypto_x509_verify_sig(uint8_t *cert, size_t cert_size, + uint8_t *comp, size_t comp_size, + uint8_t *sig, size_t sig_size, Error **errp) +{ + int rc; + int ret =3D -1; + gnutls_x509_crt_t crt =3D NULL; + gnutls_pkcs7_t signature =3D NULL; + gnutls_datum_t cert_datum =3D {.data =3D cert, .size =3D cert_size}; + gnutls_datum_t data_datum =3D {.data =3D comp, .size =3D comp_size}; + gnutls_datum_t sig_datum =3D {.data =3D sig, .size =3D sig_size}; + + rc =3D gnutls_x509_crt_init(&crt); + if (rc < 0) { + error_setg(errp, "Failed to initialize certificate: %s", gnutls_st= rerror(rc)); + goto cleanup; + } + + rc =3D gnutls_x509_crt_import(crt, &cert_datum, GNUTLS_X509_FMT_PEM); + if (rc !=3D 0) { + error_setg(errp, "Failed to import certificate: %s", gnutls_strerr= or(rc)); + goto cleanup; + } + + rc =3D gnutls_pkcs7_init(&signature); + if (rc < 0) { + error_setg(errp, "Failed to initialize pkcs7 data: %s", gnutls_str= error(rc)); + goto cleanup; + } + + rc =3D gnutls_pkcs7_import(signature, &sig_datum, GNUTLS_X509_FMT_PEM); + if (rc !=3D 0) { + error_setg(errp, "Failed to import signature: %s", gnutls_strerror= (rc)); + goto cleanup; + } + + rc =3D gnutls_pkcs7_verify_direct(signature, crt, 0, &data_datum, 0); + if (rc !=3D 0) { + error_setg(errp, "Failed to verify signature: %s", gnutls_strerror= (rc)); + goto cleanup; + } + + ret =3D 0; + +cleanup: + gnutls_x509_crt_deinit(crt); + gnutls_pkcs7_deinit(signature); + return ret; +} + #else /* ! CONFIG_GNUTLS */ =20 int qcrypto_get_x509_cert_fingerprint(uint8_t *cert, size_t size, @@ -379,4 +470,21 @@ int qcrypto_x509_check_ecc_curve_p521(uint8_t *cert, s= ize_t size, Error **errp) return -1; } =20 +int qcrypto_pkcs7_convert_sig_pem(uint8_t *sig, size_t sig_size, + uint8_t **result, + size_t *resultlen, + Error **errp) +{ + error_setg(errp, "GNUTLS is required to export pkcs7 signature"); + return -1; +} + +int qcrypto_x509_verify_sig(uint8_t *cert, size_t cert_size, + uint8_t *comp, size_t comp_size, + uint8_t *sig, size_t sig_size, Error **errp) +{ + error_setg(errp, "GNUTLS is required for signature-verification suppor= t"); + return -1; +} + #endif /* ! CONFIG_GNUTLS */ diff --git a/include/crypto/x509-utils.h b/include/crypto/x509-utils.h index fcace73c49..c256d7bfad 100644 --- a/include/crypto/x509-utils.h +++ b/include/crypto/x509-utils.h @@ -91,4 +91,45 @@ int qcrypto_x509_get_cert_key_id(uint8_t *cert, size_t s= ize, */ int qcrypto_x509_check_ecc_curve_p521(uint8_t *cert, size_t size, Error **= errp); =20 +/** + * qcrypto_pkcs7_convert_sig_pem + * @sig: pointer to the PKCS#7 signature in DER format + * @sig_size: size of the signature + * @result: output location for the allocated buffer for the signature in + * PEM format + * (the function allocates memory which must be freed by the call= er) + * @resultlen: pointer to the size of the buffer + * (will be updated with the actual size of the PEM-encoded + * signature) + * @errp: error pointer + * + * Convert given PKCS#7 @sig from DER to PEM format. + * + * Returns: 0 if PEM-encoded signature was successfully stored in @result, + * -1 on error. + */ +int qcrypto_pkcs7_convert_sig_pem(uint8_t *sig, size_t sig_size, + uint8_t **result, + size_t *resultlen, + Error **errp); + +/** + * qcrypto_x509_verify_sig + * @cert: pointer to the raw certificate data + * @cert_size: size of the certificate + * @comp: pointer to the component to be verified + * @comp_size: size of the component + * @sig: pointer to the signature + * @sig_size: size of the signature + * @errp: error pointer + * + * Verify the provided @comp against the @sig and @cert. + * + * Returns: 0 on success, + * -1 on error. + */ +int qcrypto_x509_verify_sig(uint8_t *cert, size_t cert_size, + uint8_t *comp, size_t comp_size, + uint8_t *sig, size_t sig_size, Error **errp); + #endif --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748956; cv=none; d=zohomail.com; s=zohoarc; b=h/MuCMUy41/LlIFLeGrEGnknmlLVc91CV0G4In/6AZOW6XBAoWhyT/W4ISIG6VlcvfJYdWils60lIQSd1X3b5oqD/a++nxJrKUqXGMJ/vgv/n/OYtIIizCpyrWkwlhLIOPnNlKOQKsBWUn7swrmW3eNb8Jko1VZFiJ3xInz44H8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748956; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=mXzOIxGi5lfJ91FOSro9OgeUzRisu61uPJFw+zSIanE=; b=LO42h+Lip5Hx+PahWog8BsU6WkjbpekC8LtP2lfRY/sbvR0XugGjVvyMbSFWa0Zvy157YNKXR9cg7vHt6VzvqUsWQYqbucDfFYBTQTr5faVPewc2BMxMtGrVD4DUovPwboU94hy+NqA1ZmGiIKv+HzPUVu0qzz8Jd9pmEVmgOZc= 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 1787748956117502.9076359052084; Wed, 26 Aug 2026 05:55:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7T-0007i3-63; Wed, 26 Aug 2026 08:52:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzD7R-0007fC-9m; Wed, 26 Aug 2026 08:52: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 1wzD7O-0002YS-Qg; Wed, 26 Aug 2026 08:52:40 -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 67QCVvIo4002711; Wed, 26 Aug 2026 12:52: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 4g73g4xpd9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52: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.7/8.18.1.7) with ESMTP id 67QCfJc1019158; Wed, 26 Aug 2026 12:52:36 GMT Received: from smtprelay07.wdc07v.mail.ibm.com ([172.16.1.74]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7rsy9px7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:36 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay07.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqYc16095490 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:34 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A18765805D; Wed, 26 Aug 2026 12:52:34 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BEDDB58059; Wed, 26 Aug 2026 12:52:33 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52: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=mXzOIxGi5lfJ91FOS ro9OgeUzRisu61uPJFw+zSIanE=; b=qIY984GRa32HCRxnV9dCVRENFkPvzM1Hy CIPIgq99yk1ZgjKYhjX4ZbQ6xo3rapTA0HIOQ7xyCJE9ziEwcZoTznohhoVbF3/2 1Nl1rl4HWzu2RWQ7nksyrUDkkEmuyS39kF6ryNLa4Q4oYJDDc3tKBMaDmAZcxUO1 Avq+u/sL+M2wGdnRGwIQ3pyiEP24tnvSCCEi56Qu5J4k2NTWxlP45jfJ5m+obPpP nRL6vQIpQ0jYLmE1NOcFnQ/KeA8MIcIg0y5WioauxsQnr7HeoBVdZigI+qRPgIUw pgzr68hVPr+NMV6MueYIxhbgPuE1v/OGeNwhpxZHTDKXM9D1+4iVg== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Jared Rossi , Eric Farman Subject: [PULL 15/37] s390x/diag: Generalize s390_ipl_read/write to accept void * Date: Wed, 26 Aug 2026 08:51:50 -0400 Message-ID: <20260826125213.1901252-16-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: WSOTDJ5yimfbEqFo3SusSJLYMOKzBvOA X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX9D3AOeMbU9eO Ut9xEFR97exNV2KrB9cwodB5SP4Z9eKH325iqCfVEqghM6gbzisEHcG/POvJJog2wVuZ22CWFNO Zireh5wxwRmj5F9FZVYF98ORjIXkCpk= X-Proofpoint-GUID: WSOTDJ5yimfbEqFo3SusSJLYMOKzBvOA X-Authority-Analysis: v=2.4 cv=JZyMa0KV c=1 sm=1 tr=0 ts=6a8ee195 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=CkZHjoNxVx3BTC6vW7wA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX1DtpYnd4ofLa hf2F6uCZt3XPQAALzFkZkydviXDkfRHfbASAnH99LDlBXs35BmzaaT0twwF4cOMKtNHtf+E1W9y 7GiwVwK9xy6QDHnTKX3ngO58x9dm5NAqJB0p0cJ/IZB6Y+LD0rfLQZ8CziNGgzZdB1sROeEwcqM zoFc+o+U4F6x/QAhKzdL46QMBy2ACC/kwbw6iQlOaPLu9Q110rXJAYeG+09nsYK+JMUzqt4z9BA 9ZPcEoje70UgEez1cEoAVDRw94t4PD+xfLDVK/H2125o/yn5OCgyL/rpuHpkdob0bXre6raf1q8 2fR+LOjA0NpbYLPnOtVrz0UF4YW6VAJT+C8kbB9JdUAtyQVNqA9NXSalGG6tn9xAsHs2CTfGK14 aOpbGwpiGQc+cfyMTRVk7Koua/ubbq4cO3o2hSnOSOeS/oY0aANOrn+JfYDSJRpcrdBXy+xsP0S AWLr6vCsyfVd/uurfYA== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748957695158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Change the data parameter of s390_ipl_read() and s390_ipl_write() from IplParameterBlock * to void *, so the helpers can be reused beyond DIAG 308. Signed-off-by: Zhuoying Cai Reviewed-by: Jared Rossi Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-14-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- target/s390x/diag.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/target/s390x/diag.c b/target/s390x/diag.c index 3e5ddc8c9a..c71c1a7769 100644 --- a/target/s390x/diag.c +++ b/target/s390x/diag.c @@ -83,24 +83,24 @@ static int diag308_parm_check(CPUS390XState *env, uint6= 4_t r1, uint64_t addr, } =20 static void s390_ipl_read(CPUS390XState *env, uint64_t addr, - IplParameterBlock *iplb, size_t size) + void *data, size_t size) { if (s390_is_pv()) { - s390_cpu_pv_mem_read(env_archcpu(env), 0, iplb, size); + s390_cpu_pv_mem_read(env_archcpu(env), 0, data, size); } else { address_space_read(cpu_get_address_space(env_cpu(env), 0), addr, - MEMTXATTRS_UNSPECIFIED, iplb, size); + MEMTXATTRS_UNSPECIFIED, data, size); } } =20 static void s390_ipl_write(CPUS390XState *env, uint64_t addr, - IplParameterBlock *iplb, size_t size) + void *data, size_t size) { if (s390_is_pv()) { - s390_cpu_pv_mem_write(env_archcpu(env), 0, iplb, size); + s390_cpu_pv_mem_write(env_archcpu(env), 0, data, size); } else { address_space_write(cpu_get_address_space(env_cpu(env), 0), addr, - MEMTXATTRS_UNSPECIFIED, iplb, size); + MEMTXATTRS_UNSPECIFIED, data, size); } } =20 --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748887; cv=none; d=zohomail.com; s=zohoarc; b=gjP7IrfCjDy4Cv6pJEl4rkKj/lJIatbANJ2j+7KrdsAlG19qVzBQSKISw7xRcPMJQvVPgP1tCh0iWh8EuBs0WSWrQDhdsaUDB2XVGT/FF58JdQiSZp53057omMCzzTBfF+8pv0gmVR+ikPyGIStzrsKTmtJMz3fWzqqEE3wUoYY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748887; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=/uQBjSgWH54YKv3K2hhdaBbfA23PoYGzJaBdrAFdtcQ=; b=l/kfW+LzIsS0qejV/pv3RMhS9VFB0NyzWKGzY8Br6UOSkoBCSec3AUTRYphM/aHX421pPImN8ON7riiLGpQtqPFrkIfQVZ7o988E39AU7q61hHYJDF9Qsau8xEyb4+5RvZtPgbEXXuUMyIB4bRKp8cROFMKWu5hqIpUBqtHA2YQ= 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 17877488872071017.7721943198528; Wed, 26 Aug 2026 05:54:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7W-0007o4-7g; Wed, 26 Aug 2026 08:52:46 -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 1wzD7T-0007in-OO; Wed, 26 Aug 2026 08:52:43 -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 1wzD7Q-0002bK-Sa; Wed, 26 Aug 2026 08:52:43 -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 67QCWJtV3978311; Wed, 26 Aug 2026 12:52: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 4g73946pbw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52: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.7/8.18.1.7) with ESMTP id 67QCfGv0032639; Wed, 26 Aug 2026 12:52:37 GMT Received: from smtprelay03.dal12v.mail.ibm.com ([172.16.1.5]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7qkh9vmp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:37 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay03.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqaDu2556460 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:36 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 03BE35805E; Wed, 26 Aug 2026 12:52:36 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CF8FD58059; Wed, 26 Aug 2026 12:52:34 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52: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=/uQBjSgWH54YKv3K2 hhdaBbfA23PoYGzJaBdrAFdtcQ=; b=JZ4r6O2tVj4Z4BRKWdZo+qAiEUPJIill+ byytKoak9bwzzq8Q50BaASgo/kFreSWzm/Y66BG7L4JQQsfQOiI/Dckx/um35guT MB9Wou0jxtYry390cKbYwL0bcENgABs4rqkogIObwtrdXOHbMpjETXsUUAlen+/C rv0X5xvpRBafEeg5QiaazJmsq+a5JOwoJqxzO4745xrjcKv56DL1Vh6wE+7IJP/5 jf56wVl0iVuJK17rdBeJxoqXBnKK2ZUNWEXVbkeo6XwxYsSC32snCZn/tnaN4M9z gQPcFnPNl1KmpzBVRtnfM2lT5z8deYOSNvbT6ij9fi0bjs1Ukwo2A== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Collin Walling , Zhuoying Cai , Thomas Huth , Farhan Ali , Eric Farman Subject: [PULL 16/37] s390x/diag: Implement DIAG 508 subcode 1 for signature verification Date: Wed, 26 Aug 2026 08:51:51 -0400 Message-ID: <20260826125213.1901252-17-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: Yk-qz_4Wz_oFYLg0pQxD24_qYpiMN99X X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXyLAwuAKWw1MZ Rmqmkhq8xeeN2lCrGuqaEHwBtuaFzluFrRLl7UfozNPQQMyVQKss7/8+l4U/24yWgAz1JyjyyOv 6KI5eo/s9m6yAG7LKUGAPTOjnvo1+TSbetWJ40J1ac5oWJUZPgXJG+yPiIrOx5rR6aW2Wim5cRy Gtk2ryeWTf59fFN2fBaEc1UwvX03YhU2Lj5LScFQ0XINA136QeBBD8+ViOCNvv92QTyI43BhlV7 NmnvUEUjHX1wEtdfbJMFj1Mfq0E+ulsBz1rLAggBLAkbdfCng/2TOlFYwqSZB5J62Hh756ko5Fh Q74cYsdJ7WIRH7EEqt7DzUw36nf6yHqqAFHi+l1HoxG7ryDFE/iroMFVXCXyCai8wipkkuBhR7H 4cFpBCsfKAMQKX6p/8isWDPset6a+hZShXie+hPj9p5Jc7oeAVIVJiyDEZCk+3A+fgz5j2Lkp4T c05bWNBT1r7Ccx8LQZA== X-Authority-Analysis: v=2.4 cv=Y/nIdBeN c=1 sm=1 tr=0 ts=6a8ee197 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=K66z3tz1c1WH2lCF3KIA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX9Oi7iur72TWr Q4kAH7dn54X1zvORRdiXoZ/44PvLBGwcmNA8WK5r1CpJ3avKj+h0RoV3LliyqUWPNuI8Gn6DnGC Z4LDwoJ+odIj6WJzIKottlS4fPyTfTw= X-Proofpoint-ORIG-GUID: Yk-qz_4Wz_oFYLg0pQxD24_qYpiMN99X 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 impostorscore=0 priorityscore=1501 adultscore=0 bulkscore=0 suspectscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748889457158500 Content-Type: text/plain; charset="utf-8" From: Collin Walling DIAG 508 subcode 1 performs signature-verification on signed components. A signed component may be a Linux kernel image, or any other signed binary. **Verification of initrd is not supported.** The instruction call expects two item-pairs: an address of a device component, an address of the analogous signature file (in PKCS#7 DER format= ), and their respective lengths. All of this data should be encapsulated within a Diag508SigVerifBlock. The DIAG handler will read from the provided addresses to retrieve the necessary data, parse the signature file, then perform the signature-verification. Because there is no way to correlate a specific certificate to a component, each certificate in the store is tried until either verification succeeds, or all certs have been exhausted. A return code of 1 indicates success, and the index and length of the corresponding certificate will be set in the Diag508SigVerifBlock. The following values indicate failure: 0x0102: no certificates are available in the store 0x0202: component data is invalid 0x0302: PKCS#7 format signature is invalid 0x0402: signature-verification failed 0x0502: length of Diag508SigVerifBlock is invalid Signed-off-by: Collin Walling Signed-off-by: Zhuoying Cai Reviewed-by: Thomas Huth Reviewed-by: Farhan Ali Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-15-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- docs/specs/s390x-secure-ipl.rst | 17 +++++ include/hw/s390x/ipl/diag508.h | 30 +++++++++ target/s390x/diag.c | 114 +++++++++++++++++++++++++++++++- 3 files changed, 160 insertions(+), 1 deletion(-) diff --git a/docs/specs/s390x-secure-ipl.rst b/docs/specs/s390x-secure-ipl.= rst index 776270d816..d8dcc77ba2 100644 --- a/docs/specs/s390x-secure-ipl.rst +++ b/docs/specs/s390x-secure-ipl.rst @@ -84,3 +84,20 @@ that requires assistance from QEMU. =20 Subcode 0 - query installed subcodes Returns a 64-bit mask indicating which subcodes are supported. + +Subcode 1 - perform signature verification + Perform signature-verification on a signed component, using certificat= es + from the certificate store and leveraging qcrypto libraries to perform + this operation. + + Note: verification of initrd is not supported. + + A return code of 1 indicates success, and the index and length of the + corresponding certificate will be set in the Diag508SigVerifBlock. + The following values indicate failure: + + * ``0x0102``: no certificates are available in the store + * ``0x0202``: component data is invalid + * ``0x0302``: PKCS#7 format signature is invalid + * ``0x0402``: signature-verification failed + * ``0x0502``: length of Diag508SigVerifBlock is invalid diff --git a/include/hw/s390x/ipl/diag508.h b/include/hw/s390x/ipl/diag508.h index 6281ad8299..bd967954b9 100644 --- a/include/hw/s390x/ipl/diag508.h +++ b/include/hw/s390x/ipl/diag508.h @@ -11,5 +11,35 @@ #define S390X_DIAG508_H =20 #define DIAG_508_SUBC_QUERY_SUBC 0x0000 +#define DIAG_508_SUBC_SIG_VERIF 0x8000 + +#define DIAG_508_RC_OK 0x0001 +#define DIAG_508_RC_NO_CERTS 0x0102 +#define DIAG_508_RC_INVAL_COMP_DATA 0x0202 +#define DIAG_508_RC_INVAL_PKCS7_SIG 0x0302 +#define DIAG_508_RC_FAIL_VERIF 0x0402 +#define DIAG_508_RC_INVAL_LEN 0x0502 + +/* + * Maximum component and signature sizes for current secure boot implement= ation + * Not architecturally defined and may need to revisit if increased + */ +#define DIAG_508_MAX_COMP_LEN 0x10000000 +#define DIAG_508_MAX_SIG_LEN 4096 + +struct Diag508SigVerifBlock { + uint32_t length; + uint8_t reserved0[3]; + uint8_t version; + uint32_t reserved[2]; + uint8_t cert_store_index; + uint8_t reserved1[7]; + uint64_t cert_len; + uint64_t comp_len; + uint64_t comp_addr; + uint64_t sig_len; + uint64_t sig_addr; +}; +typedef struct Diag508SigVerifBlock Diag508SigVerifBlock; =20 #endif diff --git a/target/s390x/diag.c b/target/s390x/diag.c index c71c1a7769..f465a2eed2 100644 --- a/target/s390x/diag.c +++ b/target/s390x/diag.c @@ -12,6 +12,7 @@ * GNU General Public License for more details. */ =20 +#include #include "qemu/osdep.h" #include "cpu.h" #include "s390x-internal.h" @@ -620,9 +621,112 @@ void handle_diag_320(CPUS390XState *env, uint64_t r1,= uint64_t r3, uintptr_t ra) } } =20 +static bool diag_508_verify_sig(uint8_t *cert, size_t cert_size, + uint8_t *comp, size_t comp_size, + uint8_t *sig, size_t sig_size) +{ + g_autofree uint8_t *sig_pem =3D NULL; + size_t sig_size_pem; + int rc; + + /* + * PKCS#7 signature with DER format + * Convert to PEM format for signature verification + * + * Ignore errors during qcrypto signature format conversion and verifi= cation + * Return false on any error, treating it as a verification failure + */ + rc =3D qcrypto_pkcs7_convert_sig_pem(sig, sig_size, &sig_pem, &sig_siz= e_pem, NULL); + if (rc < 0) { + return false; + } + + rc =3D qcrypto_x509_verify_sig(cert, cert_size, + comp, comp_size, + sig_pem, sig_size_pem, NULL); + if (rc < 0) { + return false; + } + + return true; +} + +static int handle_diag508_sig_verif(CPUS390XState *env, uint64_t addr) +{ + int verified; + uint32_t svb_len; + uint64_t comp_len, comp_addr; + uint64_t sig_len, sig_addr; + g_autofree uint8_t *comp =3D NULL; + g_autofree uint8_t *sig =3D NULL; + g_autofree Diag508SigVerifBlock *svb =3D NULL; + size_t svb_size =3D sizeof(Diag508SigVerifBlock); + S390IPLCertificateStore *cs =3D s390_ipl_get_certificate_store(); + + if (!cs->count) { + return DIAG_508_RC_NO_CERTS; + } + + svb =3D g_new0(Diag508SigVerifBlock, 1); + s390_ipl_read(env, addr, svb, svb_size); + + svb_len =3D be32_to_cpu(svb->length); + if (svb_len !=3D svb_size) { + return DIAG_508_RC_INVAL_LEN; + } + + comp_len =3D be64_to_cpu(svb->comp_len); + comp_addr =3D be64_to_cpu(svb->comp_addr); + sig_len =3D be64_to_cpu(svb->sig_len); + sig_addr =3D be64_to_cpu(svb->sig_addr); + + if (!comp_len || !comp_addr || comp_len > DIAG_508_MAX_COMP_LEN) { + if (comp_len > DIAG_508_MAX_COMP_LEN) { + warn_report("DIAG 0x508: component length %" PRIu64 + " exceeds current maximum %u", + comp_len, DIAG_508_MAX_COMP_LEN); + } + return DIAG_508_RC_INVAL_COMP_DATA; + } + + if (!sig_len || !sig_addr || sig_len > DIAG_508_MAX_SIG_LEN) { + if (sig_len > DIAG_508_MAX_SIG_LEN) { + warn_report("DIAG 0x508: signature length %" PRIu64 + " exceeds current maximum %u", + sig_len, DIAG_508_MAX_SIG_LEN); + } + return DIAG_508_RC_INVAL_PKCS7_SIG; + } + + comp =3D g_malloc0(comp_len); + s390_ipl_read(env, comp_addr, comp, comp_len); + + sig =3D g_malloc0(sig_len); + s390_ipl_read(env, sig_addr, sig, sig_len); + + for (int i =3D 0; i < cs->count; i++) { + verified =3D diag_508_verify_sig(cs->certs[i].raw, + cs->certs[i].size, + comp, comp_len, + sig, sig_len); + if (verified) { + svb->cert_store_index =3D i; + svb->cert_len =3D cpu_to_be64(cs->certs[i].der_size); + s390_ipl_write(env, addr, svb, svb_size); + return DIAG_508_RC_OK; + } + } + + return DIAG_508_RC_FAIL_VERIF; +} + +QEMU_BUILD_BUG_MSG(sizeof(Diag508SigVerifBlock) !=3D 64, + "size of Diag508SigVerifBlock is wrong"); + void handle_diag_508(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr= _t ra) { uint64_t subcode =3D env->regs[r3]; + uint64_t addr =3D env->regs[r1]; int rc; =20 if (env->psw.mask & PSW_MASK_PSTATE) { @@ -637,7 +741,15 @@ void handle_diag_508(CPUS390XState *env, uint64_t r1, = uint64_t r3, uintptr_t ra) =20 switch (subcode) { case DIAG_508_SUBC_QUERY_SUBC: - rc =3D 0; + rc =3D DIAG_508_SUBC_SIG_VERIF; + break; + case DIAG_508_SUBC_SIG_VERIF: + if (!diag_parm_addr_valid(addr, sizeof(Diag508SigVerifBlock), true= )) { + s390_program_interrupt(env, PGM_ADDRESSING, ra); + return; + } + + rc =3D handle_diag508_sig_verif(env, addr); break; default: s390_program_interrupt(env, PGM_SPECIFICATION, ra); --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748871; cv=none; d=zohomail.com; s=zohoarc; b=Qd9M7NKLqDFaMu8UWSGtYIs8bTR3IAU85uiU2W/18rc41jQg2H2wdX95LVKg69MhElslzDn4hhSzAjWsXWSKcL1hhsJ34I/k0GmL595xXC+f3qHIP8FL4RvmqWcxXH9aBKU0+Rdc52n5y9/0lcoAU2YCxWII372EInmDXoBhJU8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748871; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=w/jC++J0n/f/K+phumqfP9X2FW+B59+gZMz3nKE3RP4=; b=bDzNWpoeZNh2PwzN+M88cGer6fVrDFYfY5sHuMK2CekHnLEFanwdgri5K19kGslR1Eaw9v3kagcFazXtcfGSEKbe7zdKbclX00p35Z/tOMGo1Jf4nWC3/mbmPphOh29Pd+5r7pJA9GkDO/VWqGlEmGwJ74KGEG58wo7RXveA/ck= 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 1787748871317108.51213784180902; Wed, 26 Aug 2026 05:54:31 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7b-0007rv-VL; Wed, 26 Aug 2026 08:52:51 -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 1wzD7U-0007jg-8H; Wed, 26 Aug 2026 08:52:44 -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 1wzD7R-0002cA-Br; Wed, 26 Aug 2026 08:52:43 -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 67QCW79T3893912; Wed, 26 Aug 2026 12:52:39 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 4g716hxs9k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:39 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfHXj002980; Wed, 26 Aug 2026 12:52:38 GMT Received: from smtprelay04.dal12v.mail.ibm.com ([172.16.1.6]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7p3qa5m8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:38 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay04.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqbBu21561910 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:37 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2DA385805D; Wed, 26 Aug 2026 12:52:37 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 312A558059; Wed, 26 Aug 2026 12:52:36 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:36 +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=w/jC++ J0n/f/K+phumqfP9X2FW+B59+gZMz3nKE3RP4=; b=FgGdmtvyRrwep6HAoX7BSl 5xt5dot1tgD0T0zP+ipWYj4kOKMf0VoB7FMHvRKpw9P2MbVWzHxgynT7JjHaiHZL QV5hw3ewoezGukvwPHO4YFVZQzIBDDCFhxTsGFGxpeOruIRIz4rOCkxqTzQjKwph iEQswKy8iwESq3jOw6jeEz3bs6rRpBeVjOlRUzXWC3v+k6b4e/WLIFL8oYF9VHlu VUkWUVyXTJXLVZAoKxj5SFXXHw49FCL3MshmHH+kePAebRqpQqJnnRUZAl+taRUW eJGZ0X0OULcQVCjtxgZ+n2LoBQioMhctFu49MvJz0i+H8Xm2GoFQjAowz4Thzpag == From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Farhan Ali , Collin Walling , Eric Farman Subject: [PULL 17/37] s390x/ipl: Introduce IPL Information Report Block (IIRB) Date: Wed, 26 Aug 2026 08:51:52 -0400 Message-ID: <20260826125213.1901252-18-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-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-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX+cFBoKAeOCOQ dTr/l4eWe8tyMDQYE++7Fs3te8FYZvtxDH4Z0VHXkG6oYg6YL4fP3nTEsDLGFZJit6pIOo4F5ZQ SHwvZbxn70yv6Wl5eSDv9/h/fSek/no= X-Proofpoint-GUID: wYk82r9gR5KxwZA9pMTtflQEfJRbVMxm X-Proofpoint-ORIG-GUID: wYk82r9gR5KxwZA9pMTtflQEfJRbVMxm X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX9hiCYPvrVnGM EDqYlFYUeNMnlYh+2SsPMozWzY3DiKfojBEQ3uL9giJZ7LafM5HpjEAXEFkB8EF647XhgHO2JEj n96CBKOe+qpBQdn3CetYlt4fyQWaYduQX/IE4puaZyXPJiia6oQd52pth/F+HyZFoUWNs4NpzFe bNOSZE6wszF2A14ovzWZihl8GV/BLtMOpYyUjTJvkgrA6nHFw4NoyKUPcmE/eQVCHqi2dQ7cpBt ftoBF9Eop8y2Z87VjoChOxE9vhM28LnDcexaXNn41+WC9Mx1g29BA3PxHyok8CfFAO71yb/RB4J WiqtGlAKDmHF3m9eueisbl04d5W7TqX0Vkuk9tSZWBBR+sbWggC8+knAZP30wacAzYJGDToSkj3 zpN/ARqEofsQNShwF2rwLNqDHSKDIIcm0Hr0yFYmc2XOS+OOtRJvTtkngdoOrxO/wJy6IR0vYdd zLu4jVP5zSVYN0LLVjg== X-Authority-Analysis: v=2.4 cv=H7brBeYi c=1 sm=1 tr=0 ts=6a8ee197 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=1NTGDykL02WXTEG3Jz0A:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 lowpriorityscore=0 impostorscore=0 spamscore=0 bulkscore=0 adultscore=0 priorityscore=1501 clxscore=1015 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748873317158500 From: Zhuoying Cai The IPL information report block (IIRB) contains information used to locate IPL records and to report the results of signature verification of one or more secure components of the load device. IIRB is stored immediately following the IPL Parameter Block. Results on component verification in any case (failure or success) are stored. The IIRB data is reserved and protected by the guest kernel during early boot to prevent it from being overwritten before the certificate data is permanently saved. Signed-off-by: Zhuoying Cai Reviewed-by: Farhan Ali Reviewed-by: Collin Walling Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-16-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- docs/specs/s390x-secure-ipl.rst | 21 +++++++++++ include/hw/s390x/ipl/qipl.h | 62 +++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/docs/specs/s390x-secure-ipl.rst b/docs/specs/s390x-secure-ipl.= rst index d8dcc77ba2..113acbeda9 100644 --- a/docs/specs/s390x-secure-ipl.rst +++ b/docs/specs/s390x-secure-ipl.rst @@ -101,3 +101,24 @@ Subcode 1 - perform signature verification * ``0x0302``: PKCS#7 format signature is invalid * ``0x0402``: signature-verification failed * ``0x0502``: length of Diag508SigVerifBlock is invalid + +IPL Information Report Block +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The IPL Parameter Block (IPLB), utilized for IPL operation, is extended wi= th an +IPL Information Report Block (IIRB), which contains the results from secur= e IPL +operations such as: + +* component data +* verification results +* certificate data + +During early boot, the guest kernel reserves the memory region +containing the IIRB. This preserves the data while the guest kernel is +operating and during re-IPL. + +The guest kernel uses the contents in the IIRB for: + +* Boot logging: reports which components were loaded and verified. +* kexec operations: builds the next kernel=E2=80=99s IPL report from the e= xisting one. +* Keying: installs IPL certificates into the platform trusted keyring. diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index 0ec6a6d1a7..571f831780 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -34,6 +34,9 @@ typedef enum S390IplType S390IplType; #define QEMU_DEFAULT_IPL S390_IPL_TYPE_CCW =20 #define MAX_CERTIFICATES 64 +/* largest supported block size - same as VIRTIO_DASD_DEFAULT_BLOCK_SIZE */ +#define VIRTIO_MAX_BLOCK_SIZE 4096 +#define MAX_COMP_ENTRIES ((VIRTIO_MAX_BLOCK_SIZE - 32) / 32) =20 /* * The QEMU IPL Parameters will be stored at absolute address @@ -148,4 +151,63 @@ union IplParameterBlock { } QEMU_PACKED; typedef union IplParameterBlock IplParameterBlock; =20 +struct IplInfoReportBlockHeader { + uint32_t len; + uint8_t flags; + uint8_t reserved1[11]; +}; +typedef struct IplInfoReportBlockHeader IplInfoReportBlockHeader; + +struct IplInfoBlockHeader { + uint32_t len; + uint8_t type; + uint8_t reserved1[11]; +}; +typedef struct IplInfoBlockHeader IplInfoBlockHeader; + +enum IplInfoBlockType { + IPL_INFO_BLOCK_TYPE_CERTIFICATES =3D 1, + IPL_INFO_BLOCK_TYPE_COMPONENTS =3D 2, +}; + +struct IplSignatureCertificateEntry { + uint64_t addr; + uint64_t len; +}; +typedef struct IplSignatureCertificateEntry IplSignatureCertificateEntry; + +struct IplSignatureCertificateList { + IplInfoBlockHeader ipl_info_header; + IplSignatureCertificateEntry cert_entries[MAX_CERTIFICATES]; +}; +typedef struct IplSignatureCertificateList IplSignatureCertificateList; + +#define S390_IPL_DEV_COMP_FLAG_SC 0x80 +#define S390_IPL_DEV_COMP_FLAG_CSV 0x40 + +struct IplDeviceComponentEntry { + uint64_t addr; + uint64_t len; + uint8_t flags; + uint8_t reserved1[5]; + uint16_t cert_index; + uint8_t reserved2[8]; +}; +typedef struct IplDeviceComponentEntry IplDeviceComponentEntry; + +struct IplDeviceComponentList { + IplInfoBlockHeader ipl_info_header; + IplDeviceComponentEntry device_entries[MAX_COMP_ENTRIES]; +}; +typedef struct IplDeviceComponentList IplDeviceComponentList; + +#define COMP_LIST_MAX sizeof(IplDeviceComponentList) +#define CERT_LIST_MAX sizeof(IplSignatureCertificateList) + +struct IplInfoReportBlock { + IplInfoReportBlockHeader hdr; + uint8_t info_blks[COMP_LIST_MAX + CERT_LIST_MAX]; +}; +typedef struct IplInfoReportBlock IplInfoReportBlock; + #endif --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748932; cv=none; d=zohomail.com; s=zohoarc; b=ni2aM6fP4J8kkGh4CPkGgY0xpwCSSfFQ37OWU/+MbFd0OxkZccjuLmzUcM4zFUJtdEhoD2/bci7UzVPlJpSAkvng+11oDwkn6KiBMeJDGAo3rE7dDWlTiUairfLpVYbiBPjDo/qwVuuSQG+T8JvSca3G7RUyL5peLEtQqn8u5MA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748932; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=p8bGW1+TcqwEcOUansBkkryZSENC5mMKRWg/9vXzM3c=; b=leCo+667rs9fens6e9VYoZ9CfONsOo9dVkCUDVTACVZl5lYh4tV7P0srWKWIhiB3O2VE7s4Emlj/3HhGF5Vx6PJ0L3WRBh+P+Eo/1Vlff/z1objaYjOW2OcMhQhwluQ6WR1TNDkBgm2aXWEcxZK4U/ExS7df3s/zhsyts7ECNOI= 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 1787748932670153.88094984919132; Wed, 26 Aug 2026 05:55:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7d-0007tw-Vg; Wed, 26 Aug 2026 08:52:54 -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 1wzD7V-0007nK-Mx; Wed, 26 Aug 2026 08:52:45 -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 1wzD7S-0002e3-6e; Wed, 26 Aug 2026 08:52:45 -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 67QCW10n4057407; Wed, 26 Aug 2026 12:52:40 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 4g73dxec0q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:40 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfGNW002972; Wed, 26 Aug 2026 12:52:39 GMT Received: from smtprelay05.dal12v.mail.ibm.com ([172.16.1.7]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7p3qa5md-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:39 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay05.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqcuV31982302 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:38 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7929E5805B; Wed, 26 Aug 2026 12:52:38 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5D6BE5805E; Wed, 26 Aug 2026 12:52:37 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52: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=p8bGW1+TcqwEcOUan sBkkryZSENC5mMKRWg/9vXzM3c=; b=Cy+Z6ATYdBRklChEkuXNgQnB59/NO4XH8 CUjOfJ9vyhL/jR8tyWRnu6BxjN2uFKIqSQlqR7iR0c7OX36Kdw6UVQxEju28Lpts SuTTjUn/BjE0aJ2JxFLslQlurB28xIjpD3oDGFVMSztKDbwmIXoB9waatiWlLyo7 AGzEvDLc5DC9tuC9XWpdcIAFSpSHfwO/jk5fZDE2BOoErgmjeDqc+KPXV3mqs83c joXCAaaiKBXL6mNXUNbh3867lW2ja+eb0qn+UAw98BPrIb27Rj+bHDUZhhg8R9px HRnXiq2zAIVJhHQuxB8shUKpQrZdRhKjAmVhNaZ/HCAMNfOHMzS1w== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Thomas Huth , Farhan Ali , Jared Rossi , Eric Farman Subject: [PULL 18/37] pc-bios/s390-ccw: Define memory for IPLB and convert IPLB to pointers Date: Wed, 26 Aug 2026 08:51:53 -0400 Message-ID: <20260826125213.1901252-19-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX43Dyapss0LuR AolZ5HszoySsjvLAZFXMuH6/6NMMOEMWv1ETa5W8TPOUJDiKo5C26wxPpIBVkcUsOgvitwo3jfA na9b4KvHSXWf7qs6kDy6HZZUVE3Ne+Q= X-Authority-Analysis: v=2.4 cv=AYuB2XXG c=1 sm=1 tr=0 ts=6a8ee198 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=_GZQR2ZoBes7ElOevS0A:9 X-Proofpoint-ORIG-GUID: ZK8_tjdqRSuiTVUaxBs0FT92Yydx5r8v X-Proofpoint-GUID: ZK8_tjdqRSuiTVUaxBs0FT92Yydx5r8v X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX60TBI0e7Gb+3 iG18/jCud+1SsrN+xuVTjvowtxWT2GlPlgP2YqLFwoEM5xwWKTpdjm93UHQSZSyUwqIdCVzYlvz lTK65q7hUuoUZoyTM4MB3r85dEyYqwfYqfo5enOoT2ohHjz0QVE29/oVsNAKWe3O8bMnDORgRAc hFp9wDPmEHwfexqdfHziJxfCTHk0snLGxAQc/F8DcJ0LoSvPKCjCgAxX63o00yYEUWHvuuD1+S6 qwqhCkoQFoyil9uYLnbF5SNClTn0fXBxoRZwI/6wkadg3mn4y+UewmiEkuszrTJ4wyyyxcjBF+o hJgMUo68aUdUXCCvyIw3pEb36QkSNhfaoM2qDJ4iWMrUi9YX2cP6dWVte2WgVqTrJ8s3My5AmUO 1eOhqgdwlXGibTzpXvDVi30g92SXnn40F1iI9wM5DODJ2YGOIdztWB9aiGoqicx/vnPhgJI0eCH wKkWcxLCNCyf8A+E9Mw== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 clxscore=1015 adultscore=0 bulkscore=0 impostorscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748933904158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Define a memory space for both IPL Parameter Block (IPLB) and IPL Information Report Block (IIRB) since IIRB is stored immediately following IPLB. Convert IPLB to pointer and it points to the start of the defined memory sp= ace. IIRB points to the end of IPLB. Signed-off-by: Zhuoying Cai Reviewed-by: Thomas Huth Reviewed-by: Farhan Ali Reviewed-by: Jared Rossi Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-17-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- include/hw/s390x/ipl/qipl.h | 6 ++++++ pc-bios/s390-ccw/iplb.h | 5 +++-- pc-bios/s390-ccw/jump2ipl.c | 6 +++--- pc-bios/s390-ccw/main.c | 34 +++++++++++++++++++--------------- pc-bios/s390-ccw/netmain.c | 8 ++++---- 5 files changed, 35 insertions(+), 24 deletions(-) diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index 571f831780..39017fbba8 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -210,4 +210,10 @@ struct IplInfoReportBlock { }; typedef struct IplInfoReportBlock IplInfoReportBlock; =20 +struct IplBlocks { + IplParameterBlock iplb; + IplInfoReportBlock iirb; +}; +typedef struct IplBlocks IplBlocks; + #endif diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h index 926e8eed5d..c92a3d0f0c 100644 --- a/pc-bios/s390-ccw/iplb.h +++ b/pc-bios/s390-ccw/iplb.h @@ -20,8 +20,9 @@ #include =20 extern QemuIplParameters qipl; -extern IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE))); +extern IplParameterBlock *iplb; extern bool have_iplb; +extern IplBlocks ipl_blocks; =20 static inline bool manage_iplb(IplParameterBlock *iplb, bool store) { @@ -61,7 +62,7 @@ static inline bool load_next_iplb(void) =20 qipl.index++; next_iplb =3D (IplParameterBlock *) qipl.next_iplb; - memcpy(&iplb, next_iplb, sizeof(IplParameterBlock)); + memcpy(iplb, next_iplb, sizeof(IplParameterBlock)); =20 qipl.chain_len--; qipl.next_iplb =3D qipl.next_iplb + sizeof(IplParameterBlock); diff --git a/pc-bios/s390-ccw/jump2ipl.c b/pc-bios/s390-ccw/jump2ipl.c index 86321d0f46..fa2ca5cbe1 100644 --- a/pc-bios/s390-ccw/jump2ipl.c +++ b/pc-bios/s390-ccw/jump2ipl.c @@ -43,11 +43,11 @@ int jump_to_IPL_code(uint64_t address) * The IPLB for QEMU SCSI type devices must be rebuilt during re-ipl. = The * iplb.devno is set to the boot position of the target SCSI device. */ - if (iplb.pbt =3D=3D S390_IPL_TYPE_QEMU_SCSI) { - iplb.devno =3D qipl.index; + if (iplb->pbt =3D=3D S390_IPL_TYPE_QEMU_SCSI) { + iplb->devno =3D qipl.index; } =20 - if (have_iplb && !set_iplb(&iplb)) { + if (have_iplb && !set_iplb(iplb)) { panic("Failed to set IPLB"); } =20 diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 8bc6e8eaa3..44888e0c5c 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -24,7 +24,9 @@ static SubChannelId blk_schid =3D { .one =3D 1 }; static char loadparm_str[LOADPARM_LEN + 1]; QemuIplParameters qipl; -IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE))); +/* Ensure that IPLB and IIRB are page aligned and sequential in memory */ +IplBlocks ipl_blocks __attribute__((__aligned__(PAGE_SIZE))); +IplParameterBlock *iplb; bool have_iplb; static uint16_t cutype; LowCore *lowcore; /* Yes, this *is* a pointer to address 0 */ @@ -54,7 +56,7 @@ void write_iplb_location(void) { if (virtio_is_supported(virtio_get_device()) && virtio_get_device_type() !=3D VIRTIO_ID_NET) { - lowcore->ptr_iplb =3D ptr2u32(&iplb); + lowcore->ptr_iplb =3D ptr2u32(iplb); } } =20 @@ -216,14 +218,14 @@ static void boot_setup(void) char lpmsg[] =3D "LOADPARM=3D[________]\n"; VDev *vdev =3D virtio_get_device(); =20 - if (have_iplb && memcmp(iplb.loadparm, NO_LOADPARM, LOADPARM_LEN) !=3D= 0) { - ebcdic_to_ascii((char *) iplb.loadparm, loadparm_str, LOADPARM_LEN= ); + if (have_iplb && memcmp(iplb->loadparm, NO_LOADPARM, LOADPARM_LEN) != =3D 0) { + ebcdic_to_ascii((char *) iplb->loadparm, loadparm_str, LOADPARM_LE= N); } else { sclp_get_loadparm_ascii(loadparm_str); } =20 if (have_iplb) { - vdev->ipl_type =3D iplb.pbt; + vdev->ipl_type =3D iplb->pbt; menu_setup(vdev); } else { vdev->ipl_type =3D QEMU_DEFAULT_IPL; @@ -247,21 +249,21 @@ static bool find_boot_device(void) switch (vdev->ipl_type) { case S390_IPL_TYPE_CCW: vdev->scsi_device_selected =3D false; - debug_print_int("device no. ", iplb.ccw.devno); - blk_schid.ssid =3D iplb.ccw.ssid & 0x3; + debug_print_int("device no. ", iplb->ccw.devno); + blk_schid.ssid =3D iplb->ccw.ssid & 0x3; debug_print_int("ssid ", blk_schid.ssid); - found =3D find_subch(iplb.ccw.devno); + found =3D find_subch(iplb->ccw.devno); break; case S390_IPL_TYPE_QEMU_SCSI: vdev->scsi_device_selected =3D true; - 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->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); break; case S390_IPL_TYPE_PCI: - found =3D find_fid(iplb.pci.fid); + found =3D find_fid(iplb->pci.fid); break; default: puts("Unsupported IPLB"); @@ -380,10 +382,12 @@ static void probe_boot_device(void) =20 void main(void) { + iplb =3D &ipl_blocks.iplb; + copy_qipl(); sclp_setup(); css_setup(); - have_iplb =3D store_iplb(&iplb); + have_iplb =3D store_iplb(iplb); if (!have_iplb) { boot_setup(); probe_boot_device(); diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c index 791854fce0..ccd1c30013 100644 --- a/pc-bios/s390-ccw/netmain.c +++ b/pc-bios/s390-ccw/netmain.c @@ -531,11 +531,11 @@ static bool virtio_setup(void) */ enable_mss_facility(); =20 - if (have_iplb || store_iplb(&iplb)) { - IPL_assert(iplb.pbt =3D=3D S390_IPL_TYPE_CCW, "IPL_TYPE_CCW expect= ed"); - dev_no =3D iplb.ccw.devno; + if (have_iplb || store_iplb(iplb)) { + IPL_assert(iplb->pbt =3D=3D S390_IPL_TYPE_CCW, "IPL_TYPE_CCW expec= ted"); + dev_no =3D iplb->ccw.devno; debug_print_int("device no. ", dev_no); - net_schid.ssid =3D iplb.ccw.ssid & 0x3; + net_schid.ssid =3D iplb->ccw.ssid & 0x3; debug_print_int("ssid ", net_schid.ssid); found =3D find_net_dev(&schib, dev_no); } else { --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748789; cv=none; d=zohomail.com; s=zohoarc; b=j95msmU8oxFaaIOQnf10vxVoEyHn0maP5iDh4da08UcJ52mOew4X9ulfHut87dkAS0QOSZC8PX+toYxQX9AND4mTffqzv0zNj/KXStLe6/0Ai8NY40GWoZHHcawnURPenJ1wqxhcF9x64BjpTUXAxzhDpnxmUZkTVTSF5bOhACs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748789; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=semDCzLkOI8fXXMpMDeIaY6EI7Q7Ey9Hvyag8eei41s=; b=nlSmNJGHgPRjY/H4vDJ+f4rryLh8Tfv2mMy82/JRwKnSYYCjn1pW2nNfR7u96YWiZ2AxVdRxVD6rZDlHRepBFTJCwNazPSrBhUG2w6sb9VNf1uRj0vGsbS1xGFGHEZBMKAdzbK4vT/0u8YjUplt0O7cTYaFgcTN/B24X0DMhGVM= 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 1787748789212266.018919678388; Wed, 26 Aug 2026 05:53:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7b-0007rq-II; Wed, 26 Aug 2026 08:52:51 -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 1wzD7X-0007pA-46; Wed, 26 Aug 2026 08:52:47 -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 1wzD7U-0002h2-HK; Wed, 26 Aug 2026 08:52: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 67QCVtRs2127719; Wed, 26 Aug 2026 12:52:42 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 4g73eqxm93-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:42 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfGfQ002326; Wed, 26 Aug 2026 12:52:41 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7q3k1xx5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:41 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqeLJ18088546 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:40 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id ED56358059; Wed, 26 Aug 2026 12:52:39 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A7F145805C; Wed, 26 Aug 2026 12:52:38 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52: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=semDCzLkOI8fXXMpM DeIaY6EI7Q7Ey9Hvyag8eei41s=; b=qjXgjTytqj8SoVJUd+vlWFV1woTaWNbMO aOJZsZ6ofxzjdGS2W1OYEAvUeNSO/KhRzWh6+K3J+PJDImN6/ta8Tkj4lpH2RqCL o9NwB3hW8ZiFMszn+w/8oBZqAEyv4UeUAKEMLaRkj0fh5GRYmSeTVC+yTI+Q+yya x3BWOvH7CBPJ8dcPSE++Yfi48kwav5fBH3A98kO8S3VbvoWZl4JyaGFaMVevkKR/ w0TBRjXftLzXNIfCOGgFA4qYHBnAu/f0xPa0FheEP2oZZZtcwJ0q/QK/D8AUvHDe mPtPLWFeC/Kpxrtc5HznLczD7o24uGgbA6cudUm0oskLedOqFzsNA== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Thomas Huth , Collin Walling , Jared Rossi , Eric Farman Subject: [PULL 19/37] hw/s390x/ipl: Add IPIB flags to IPL Parameter Block Date: Wed, 26 Aug 2026 08:51:54 -0400 Message-ID: <20260826125213.1901252-20-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: ekrd5Lc0OmkRukDJ_cNx2IutIimhGRwt X-Proofpoint-ORIG-GUID: ekrd5Lc0OmkRukDJ_cNx2IutIimhGRwt X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX0MDsmFgjQDiV HThXpwLAHs+ZODGIaaAedCzRCQy+pjLF8/00OzgmyklW6Zd79sgyrVY918HkV3QCF0DDNfOm/Pj VCRpe+cZGSL67DCCYHM8VZe6NTCdB8Lm81ngJGYfIgU/kPUA7kVKTgf4wf51GdOWRNqtX9X0tEf Aoj85MCHp6us6Rlv7GlnCpsMw0UdphLSfLRoW8Y6IkI7s0P/a7bB573oN7atUj0GfTJZO3zaJGW 3Q9GLlzZ3BKVKZVM8zamhI5oIkCkP5G19E+RuKc1FVJqkLqgV+G5XvXZ/KmIOSnr3CkK7ZT5Ock ioO0Rrw2zsUjgx6t3rj+sUmLXOzV1RVEGCkLbzW4MG+Fo0WgSKcaZQN4VnsZPhNychTrWWvpkkI nIKW1RJxpbvmXyu9NrrIAHADWiIEG9Rwni2F6RkbvhVC9englU6EoF61a6RBz2B1yOwZyE8FgVe M+Z6u241eu9fR3o533w== X-Authority-Analysis: v=2.4 cv=QsRuG1yd c=1 sm=1 tr=0 ts=6a8ee19a cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=W_WZRTZ8rNWSny1drpEA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX8SEma5/BIDjx 1KBv/9Q52I81yLpzF4wsYnNFaLGKXXvx6veu3NP/K8YvrK3s9IVL06x2wirpTfx5WFaj16csNEF 4Ew1htpQcB6vPDfRjnjHFEPtJ4WW5CI= 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 suspectscore=0 priorityscore=1501 impostorscore=0 spamscore=0 lowpriorityscore=0 clxscore=1015 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748790935158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Add IPIB flags to IPL Parameter Block to determine if IPL needs to perform securely and if IPL Information Report Block (IIRB) exists. Move DIAG308 flags to a separated header file and add flags for secure IPL. Move IPLB length related definitions to include/hw/s390x/ipl/qipl.h and add a maximum length constant to support secure IPL. Secure boot in audit mode will perform if certificate(s) exist in the key store. IIRB will exist and results of verification will be stored in IIRB. To ensure proper alignment of the IIRB and prevent overlap, set iplb->len to the maximum length of the IPLB, allowing alignment constraints to be determined based on its size. Signed-off-by: Zhuoying Cai Reviewed-by: Thomas Huth Reviewed-by: Collin Walling Reviewed-by: Jared Rossi Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-18-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- hw/s390x/ipl.c | 36 ++++++++++++++++++++++++++++++++++ hw/s390x/ipl.h | 24 ----------------------- include/hw/s390x/ipl/diag308.h | 34 ++++++++++++++++++++++++++++++++ include/hw/s390x/ipl/qipl.h | 13 +++++++++++- 4 files changed, 82 insertions(+), 25 deletions(-) create mode 100644 include/hw/s390x/ipl/diag308.h diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 2cae089d98..627544b361 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -462,6 +462,34 @@ S390IPLCertificateStore *s390_ipl_get_certificate_stor= e(void) return &ipl->cert_store; } =20 +static bool s390_has_certificate(void) +{ + S390IPLState *ipl =3D get_ipl_device(); + + return ipl->cert_store.count > 0; +} + +static void s390_set_secure_boot_flags(IplParameterBlock *iplb, + bool audit_mode) +{ + if (!audit_mode) { + return; + } + + /* + * For audit mode, enable the IPL Information + * Report (IPLIR) flag so that the firmware generates an IPL + * Information Report Block (IIRB). + * + * Results of secure boot will be stored in IIRB. + * + * Extend the IPL parameter block to its maximum length to ensure + * sufficient space for the BIOS to populate the IIRB. + */ + iplb->hdr_flags |=3D DIAG308_IPIB_FLAGS_IPLIR; + iplb->len =3D cpu_to_be32(S390_IPLB_MAX_LEN); +} + static bool s390_build_iplb(DeviceState *dev_st, IplParameterBlock *iplb) { CcwDevice *ccw_dev =3D NULL; @@ -518,6 +546,8 @@ 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_set_secure_boot_flags(iplb, s390_has_certificate()); + return true; } =20 @@ -654,6 +684,12 @@ void s390_ipl_update_diag308(IplParameterBlock *iplb) } else { ipl->iplb =3D *iplb; ipl->iplb_valid =3D true; + + /* + * The kernel does not preserve secure boot flags across a reboot. + * Re-apply them here based on the current machine configuration. + */ + s390_set_secure_boot_flags(&ipl->iplb, s390_has_certificate()); } =20 update_machine_ipl_properties(iplb); diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h index ec8ab153dc..5d54827b52 100644 --- a/hw/s390x/ipl.h +++ b/hw/s390x/ipl.h @@ -23,7 +23,6 @@ #include "qom/object.h" #include "target/s390x/kvm/pv.h" =20 -#define DIAG308_FLAGS_LP_VALID 0x80 #define MAX_BOOT_DEVS 8 /* Max number of devices that may have a bootindex= */ =20 void s390_ipl_convert_loadparm(char *ascii_lp, uint8_t *ebcdic_lp); @@ -90,29 +89,6 @@ struct S390IPLState { }; QEMU_BUILD_BUG_MSG(offsetof(S390IPLState, iplb) & 3, "alignment of iplb wr= ong"); =20 -#define DIAG_308_RC_OK 0x0001 -#define DIAG_308_RC_NO_CONF 0x0102 -#define DIAG_308_RC_INVALID 0x0402 -#define DIAG_308_RC_NO_PV_CONF 0x0902 -#define DIAG_308_RC_INVAL_FOR_PV 0x0a02 - -#define DIAG308_RESET_MOD_CLR 0 -#define DIAG308_RESET_LOAD_NORM 1 -#define DIAG308_LOAD_CLEAR 3 -#define DIAG308_LOAD_NORMAL_DUMP 4 -#define DIAG308_SET 5 -#define DIAG308_STORE 6 -#define DIAG308_PV_SET 8 -#define DIAG308_PV_STORE 9 -#define DIAG308_PV_START 10 - -#define S390_IPLB_HEADER_LEN 8 -#define S390_IPLB_MIN_PV_LEN 148 -#define S390_IPLB_MIN_CCW_LEN 200 -#define S390_IPLB_MIN_FCP_LEN 384 -#define S390_IPLB_MIN_PCI_LEN 376 -#define S390_IPLB_MIN_QEMU_SCSI_LEN 200 - static inline bool iplb_valid_len(IplParameterBlock *iplb) { return be32_to_cpu(iplb->len) <=3D sizeof(IplParameterBlock); diff --git a/include/hw/s390x/ipl/diag308.h b/include/hw/s390x/ipl/diag308.h new file mode 100644 index 0000000000..6e62f29215 --- /dev/null +++ b/include/hw/s390x/ipl/diag308.h @@ -0,0 +1,34 @@ +/* + * S/390 DIAGNOSE 308 definitions and structures + * + * Copyright 2025 IBM Corp. + * Author(s): Zhuoying Cai + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef S390X_DIAG308_H +#define S390X_DIAG308_H + +#define DIAG_308_RC_OK 0x0001 +#define DIAG_308_RC_NO_CONF 0x0102 +#define DIAG_308_RC_INVALID 0x0402 +#define DIAG_308_RC_NO_PV_CONF 0x0902 +#define DIAG_308_RC_INVAL_FOR_PV 0x0a02 + +#define DIAG308_RESET_MOD_CLR 0 +#define DIAG308_RESET_LOAD_NORM 1 +#define DIAG308_LOAD_CLEAR 3 +#define DIAG308_LOAD_NORMAL_DUMP 4 +#define DIAG308_SET 5 +#define DIAG308_STORE 6 +#define DIAG308_PV_SET 8 +#define DIAG308_PV_STORE 9 +#define DIAG308_PV_START 10 + +#define DIAG308_FLAGS_LP_VALID 0x80 + +#define DIAG308_IPIB_FLAGS_SIPL 0x40 +#define DIAG308_IPIB_FLAGS_IPLIR 0x20 + +#endif diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index 39017fbba8..6dccc74a9e 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -12,6 +12,8 @@ #ifndef S390X_QIPL_H #define S390X_QIPL_H =20 +#include "diag308.h" + /* Boot Menu flags */ #define QIPL_FLAG_BM_OPTS_CMD 0x80 #define QIPL_FLAG_BM_OPTS_ZIPL 0x40 @@ -33,6 +35,14 @@ typedef enum S390IplType S390IplType; =20 #define QEMU_DEFAULT_IPL S390_IPL_TYPE_CCW =20 +#define S390_IPLB_HEADER_LEN 8 +#define S390_IPLB_MIN_PV_LEN 148 +#define S390_IPLB_MIN_CCW_LEN 200 +#define S390_IPLB_MIN_FCP_LEN 384 +#define S390_IPLB_MIN_PCI_LEN 376 +#define S390_IPLB_MIN_QEMU_SCSI_LEN 200 +#define S390_IPLB_MAX_LEN 4096 + #define MAX_CERTIFICATES 64 /* largest supported block size - same as VIRTIO_DASD_DEFAULT_BLOCK_SIZE */ #define VIRTIO_MAX_BLOCK_SIZE 4096 @@ -127,7 +137,8 @@ typedef struct IplBlockPci IplBlockPci; union IplParameterBlock { struct { uint32_t len; - uint8_t reserved0[3]; + uint8_t hdr_flags; + uint8_t reserved0[2]; uint8_t version; uint32_t blk0_len; uint8_t pbt; --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748806; cv=none; d=zohomail.com; s=zohoarc; b=D6fSy1d127nzm36xRPKzD3IAIP6w+cW9O3R3oCOG1CVL4sLvm76rioVdme13Jvur8YO9zu31z3jzxqxtA+r3HiJU29SdgM1P2h4IhullCK4yIStwHUceYYiuTocUKKKn4N3UMQw01/SC0cplBXgSxUtRHyiShyu+BNLJlGtsFKI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748806; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=uH0dNJNktRtebbtBvuDlrdsnCdx1Uyoq8CvPxJde8DA=; b=G0fE8eOzscrtDsKBXdxnQsBX6hNS74klBiC5IXwY0icGKhP3T7yJL6UDm125s5fF+6NlnSEuanP23Y+PX+komA6AoNkIyzAHbWDbDwIIX5Iqd9ad5XYggDnShxye+gUHAoRRAE9bsJ23LKLFkhPzcDA2Hd15iU2jhgzTt3BnO9A= 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 1787748806199930.3324813100364; Wed, 26 Aug 2026 05:53:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7g-0007wd-7F; Wed, 26 Aug 2026 08:52: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 1wzD7b-0007ry-FW; Wed, 26 Aug 2026 08:52:51 -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 1wzD7V-0002i7-CD; Wed, 26 Aug 2026 08:52:51 -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 67QCW1pe3893756; Wed, 26 Aug 2026 12:52:44 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 4g716hxsa0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:43 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfMMw019298; Wed, 26 Aug 2026 12:52:42 GMT Received: from smtprelay01.wdc07v.mail.ibm.com ([172.16.1.68]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7rsy9pxu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:42 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay01.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqf6X11600204 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:41 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 408355805E; Wed, 26 Aug 2026 12:52:41 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 48DE25805B; Wed, 26 Aug 2026 12:52:40 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52: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=uH0dNJNktRtebbtBv uDlrdsnCdx1Uyoq8CvPxJde8DA=; b=ZneQvb4vJ1RRkCH1BCPmSFp0/fk9CLJK6 PebqfmD7ppvy/dXQngX4XVA/70NX3JmSQtWI1YnyfqnXfG51N1nCkgJBQMeJ/y1C Hbv7t14Yz43yEb2S7Z06Vpa1SyHl8CoVHcudyiX+63/YQhkVQdvi6wb/t9oc53sI qVfOSxicaYzamhqY59btnycJhTldFoUVK2khiXVHv6e+lzELWNOyfJETUoVTzYgp FC6JjrAJeP/5io18Qy5oE/IUW40HkhrbDuxfE0UJsOvnuC5hm5Itrkh/ssDs7/DO s3ZeP1oS+wp1+6NhrVaeG2AYb9YNekahb8gZnxClXcY1xDaQwfbmw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Eric Farman Subject: [PULL 20/37] hw/s390x/ipl: Rework s390_ipl_map_iplb_chain for certificate storage Date: Wed, 26 Aug 2026 08:51:55 -0400 Message-ID: <20260826125213.1901252-21-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXxEqu/BPiFcPG xz6tyYXgehCXwP7IuLZniRJEKQiN+qX7dAKsE9c6u1nysJhRhVooN6joNOAb+5Ef1koncyuE4OX 6HFhe25RTkdhohsJGA3eT4mI+kLnSsU= X-Proofpoint-GUID: F-eqfSskbckM0mdUCIq_twZvcQEZHvjJ X-Proofpoint-ORIG-GUID: F-eqfSskbckM0mdUCIq_twZvcQEZHvjJ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXwZLKSMw/uAtj +aLkEUjA31lkDGB0Swu9xIrjUsmGnTCoN9nPpsrae7L5QT8RZDGUQhjxcB2GaAkLdJ92UYB5e0a wlPYQV17yi/ysk2IoeX0NQjwa9TkF7EjZiKPYtzOMacciiclCws+UjHwKVOHKwFcvIMlKiVbCwL iUdxvdSMhQ+i5tSk/2Ov5jQw85Z/KdGuamXFWqHZwaogfyw2IAj1RXK+TJDc/rQmmZwrhoKqKL4 /PWDtVORsLYk8/jNPyfseOe6fTQOOrjjCX5u5ftOqdnCGVYA3vUDNwPRgufVz6w6sWbbkqC/zZQ mjdeVrhUbWLN/jYslh80srSv9U/pjvVjWtMRhOJu7lmhLvaGUwcZVpTKIQi7B1SvHneqhzD71f2 W9lgOBY9//lgTlkvCbQTItvsoPi5B/Cushiwnr4s6pej+MkG00OHbayfW1ShEMJtA2iNStO0vSm QDxivBYp+58kqZ82SqA== X-Authority-Analysis: v=2.4 cv=H7brBeYi c=1 sm=1 tr=0 ts=6a8ee19b cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=6n7imOYxnT_JOqVJOMMA:9 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 lowpriorityscore=0 impostorscore=0 spamscore=0 bulkscore=0 adultscore=0 priorityscore=1501 clxscore=1015 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748807135158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Rework s390_ipl_map_iplb_chain to always allocate maximum memory for the IPLB chain, regardless of the number of boot devices. This space is also used to store certificates during secure boot, providing a safe location for certificates until the kernel reads them during boot. Rename next_iplb to ipl_data to better reflect its multiple purposes: storing both IPLB chains and certificate data. Signed-off-by: Zhuoying Cai Reviewed-by: Eric Farman Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-19-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- hw/s390x/ipl.c | 18 ++++++++++++++---- hw/s390x/ipl.h | 2 -- include/hw/s390x/ipl/qipl.h | 5 ++++- pc-bios/s390-ccw/iplb.h | 4 ++-- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 627544b361..85fe2d3cb4 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -426,10 +426,9 @@ static S390PCIBusDevice *s390_get_pci_device(DeviceSta= te *dev_st, int *devtype) return pbdev; } =20 -static uint64_t s390_ipl_map_iplb_chain(IplParameterBlock *iplb_chain) +static uint64_t s390_ipl_map_iplb_chain(IplParameterBlock *iplb_chain, uin= t16_t count) { S390IPLState *ipl =3D get_ipl_device(); - uint16_t count =3D be16_to_cpu(ipl->qipl.chain_len); uint64_t len =3D sizeof(IplParameterBlock) * count; uint64_t chain_addr =3D find_iplb_chain_addr(ipl->bios_start_addr, cou= nt); =20 @@ -593,7 +592,7 @@ void s390_rebuild_iplb(uint16_t dev_index, IplParameter= Block *iplb) static bool s390_init_all_iplbs(S390IPLState *ipl) { int iplb_num =3D 0; - IplParameterBlock iplb_chain[7]; + IplParameterBlock iplb_chain[MAX_BOOT_DEVS - 1] =3D { 0 }; DeviceState *dev_st =3D get_boot_device(0); Object *machine =3D qdev_get_machine(); =20 @@ -639,13 +638,24 @@ static bool s390_init_all_iplbs(S390IPLState *ipl) dev_st =3D get_boot_device(i); s390_build_iplb(dev_st, &iplb_chain[i - 1]); } + } =20 - ipl->qipl.next_iplb =3D cpu_to_be64(s390_ipl_map_iplb_chain(iplb_c= hain)); + /* + * Allocate maximum space for IPLB chain and/or certificate storage. + * Once a valid boot device is found, this space will be used to store + * certificates if secure boot is enabled. + */ + if (iplb_num > 1 || s390_has_certificate()) { + ipl->qipl.ipl_data =3D cpu_to_be64(s390_ipl_map_iplb_chain(iplb_ch= ain, + MAX_BOOT_= DEVS - 1)); } =20 return iplb_num; } =20 +QEMU_BUILD_BUG_MSG(sizeof(IplParameterBlock) * (MAX_BOOT_DEVS - 1) !=3D CE= RT_BUF_SIZE, + "certificate buffer size is wrong"); + static void update_machine_ipl_properties(IplParameterBlock *iplb) { Object *machine =3D qdev_get_machine(); diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h index 5d54827b52..772566bb11 100644 --- a/hw/s390x/ipl.h +++ b/hw/s390x/ipl.h @@ -23,8 +23,6 @@ #include "qom/object.h" #include "target/s390x/kvm/pv.h" =20 -#define MAX_BOOT_DEVS 8 /* Max number of devices that may have a bootindex= */ - void s390_ipl_convert_loadparm(char *ascii_lp, uint8_t *ebcdic_lp); void s390_ipl_fmt_loadparm(uint8_t *loadparm, char *str, Error **errp); void s390_rebuild_iplb(uint16_t index, IplParameterBlock *iplb); diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index 6dccc74a9e..5d560a433a 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -43,7 +43,10 @@ typedef enum S390IplType S390IplType; #define S390_IPLB_MIN_QEMU_SCSI_LEN 200 #define S390_IPLB_MAX_LEN 4096 =20 +#define MAX_BOOT_DEVS 8 /* Max number of devices that may have a bootindex= */ + #define MAX_CERTIFICATES 64 +#define CERT_BUF_SIZE ((MAX_BOOT_DEVS - 1) * 4096) /* largest supported block size - same as VIRTIO_DASD_DEFAULT_BLOCK_SIZE */ #define VIRTIO_MAX_BLOCK_SIZE 4096 #define MAX_COMP_ENTRIES ((VIRTIO_MAX_BLOCK_SIZE - 32) / 32) @@ -63,7 +66,7 @@ struct QemuIplParameters { uint32_t boot_menu_timeout; uint8_t reserved3[2]; uint16_t chain_len; - uint64_t next_iplb; + uint64_t ipl_data; } QEMU_PACKED; typedef struct QemuIplParameters QemuIplParameters; =20 diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h index c92a3d0f0c..c807e7f49b 100644 --- a/pc-bios/s390-ccw/iplb.h +++ b/pc-bios/s390-ccw/iplb.h @@ -61,11 +61,11 @@ static inline bool load_next_iplb(void) } =20 qipl.index++; - next_iplb =3D (IplParameterBlock *) qipl.next_iplb; + next_iplb =3D (IplParameterBlock *) qipl.ipl_data; memcpy(iplb, next_iplb, sizeof(IplParameterBlock)); =20 qipl.chain_len--; - qipl.next_iplb =3D qipl.next_iplb + sizeof(IplParameterBlock); + qipl.ipl_data =3D qipl.ipl_data + sizeof(IplParameterBlock); =20 return true; } --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748894; cv=none; d=zohomail.com; s=zohoarc; b=CXLY8H658GrrP/h7ZiP/C6THvGKtTkvB9zPovgO72lRy7hASNNVsToLn72igBTlu9JabvUXSMH+osMfe8CWWsc9Gynphxh7q0kdJMqhEX25cK9ZZbuIz9/lkeTRM5sCKx5ec4kLuf9/EX1JA3RKmom4cbEv2NLPsvLNbX8BIdns= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748894; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ndHFSVBSR6mBsz1vvTaMoQ3ozFrMEtLzkNufBBvqJQ4=; b=OY/q3Dlf5WY1FmXRaozEwPHxEYJcgEoy9wz7pZCWgPR0puvUO5OlSBt07iK55x5eMuEbcT7cbQCHN/lf9EbnDrkoluzqxbdmdrYmSThTsMNn2YhZ2p4yJRrq7rfQxkyY3nepJsn2kJMHW5C7CFYhnoG7QHvzjwBbtwu9eZgBoe4= 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 178774889482993.64987384077926; Wed, 26 Aug 2026 05:54:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7j-000815-CE; Wed, 26 Aug 2026 08:52: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 1wzD7h-0007zR-L6; Wed, 26 Aug 2026 08:52:57 -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 1wzD7X-0002l5-6D; Wed, 26 Aug 2026 08:52:57 -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 67QCW2Ml3893861; Wed, 26 Aug 2026 12:52:44 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 4g716hxsa2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:44 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfOFd032690; Wed, 26 Aug 2026 12:52:43 GMT Received: from smtprelay02.wdc07v.mail.ibm.com ([172.16.1.69]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7qkh9vn4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:43 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay02.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqgDb18612880 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:42 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6C2D45805B; Wed, 26 Aug 2026 12:52:42 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6E2C958059; Wed, 26 Aug 2026 12:52:41 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52: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=ndHFSVBSR6mBsz1vv TaMoQ3ozFrMEtLzkNufBBvqJQ4=; b=Vw2ZqgTrk5vL3WEvu2kglV82umBoo1sOZ EFrM/RKDAkfvDrvsZnRnAfxvKcScR5UrzZx3ivSpz6ubZRY8kmXyvBFpsXW2dujT H3fvGMElmS/guqvSJ8VTlIczhem7cgSByEpLArm35TWiaBT+afzVTl8tHqSeKNHf IonY/7oEa9lH2QrEBVXl2RQ2/QCs44zz1FDkXnP68Y7+jWfRtUhahGIySw/QlKOH XcGxLMpDwnVA1q1UPNqYBYnTUWacRU96oSKGHrPv05p3PPuvL6Y2/XnKF+A//tli 4sKIwmnaP88g2KWGHmcI4UxtVDk8sFx8FfksuXG10+XamrYjgwyGA== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Collin Walling , Thomas Huth , Eric Farman Subject: [PULL 21/37] s390x: Guest support for Secure-IPL Facility Date: Wed, 26 Aug 2026 08:51:56 -0400 Message-ID: <20260826125213.1901252-22-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX4fKVGk7amJyS efwSaMqGjJH52rmvDVJK3hGqN5l01GrWbmNwOZ11kw8hJHnnAF/l8Kwyvl/cD55ADxhV+1J2yf9 OskyTZKi+JqrzbxCZSoavOpvYEmRKQc= X-Proofpoint-GUID: Pqls370mKhW7wZgEhzq4RE8Lp20xZXwm X-Proofpoint-ORIG-GUID: Pqls370mKhW7wZgEhzq4RE8Lp20xZXwm X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX9I7wcNZk2KZ0 4ZF8Vz668gFuSMUQLHZPkcCubEqJwSN1m+fqU0uYviZLmaBPVIpZMwVgac8huRHImPm945rgOhs SfqLGU7SoMAGfiIkmowwcC3w8820V5xT4wMdjHjEGawVgIS9pKpW+0kCe7aphn5povdIg72+MWw ygo2rZ5J4Xnmy3rzIpGzwsooA3+uIolQhS6UCnPKbKUxZz/JHc28nOo+AnzLuiELWrqwWhMGuTf GhTB5FehVfsHlBnH+z8vn8uuXNv+Ldkp7pax4jflmbRou9KnvhRGPgPqm0G/uh50cIUqSC3KelY Znzn+K1dDr0ExcvB8XTLtNI34XcCPMoZnA7s7lcREu8c1XOyrgoKeGYVsi6f16lkbyNmdUR0Xli XfG2WHfYdj5F/n8uQZmfb9AXdi9P+XHwzKgirA7l3eYrpCJfxSKD4N6Qz1m1H6vZCViyVX5b/lc 3oPgmow12mEtBseCllA== X-Authority-Analysis: v=2.4 cv=H7brBeYi c=1 sm=1 tr=0 ts=6a8ee19c cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=CXJoAi2tXuPy8ufjJC0A:9 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 lowpriorityscore=0 impostorscore=0 spamscore=0 bulkscore=0 adultscore=0 priorityscore=1501 clxscore=1015 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748895506158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Introduce Secure-IPL (SIPL) facility. Use fac_ipl to represent bytes 136 and 137 for IPL device facilities of the SCLP Read SCP Info. Availability of SIPL facility is determined by byte 136 bit 1 of the SCLP Read SCP Info. Byte 136's facilities cannot be represented without the availability of the extended-length-SCCB, so add it as a check for consistency. Secure IPL is not available for guests under protected virtualization. This feature is available starting with the gen16 CPU model. Signed-off-by: Zhuoying Cai Reviewed-by: Collin Walling Reviewed-by: Thomas Huth Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-20-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- hw/s390x/sclp.c | 2 ++ include/hw/s390x/sclp.h | 6 ++++-- target/s390x/cpu_features.c | 4 ++++ target/s390x/cpu_features.h | 1 + target/s390x/cpu_features_def.h.inc | 3 +++ target/s390x/cpu_models.c | 2 ++ target/s390x/gen-features.c | 2 ++ target/s390x/kvm/kvm.c | 3 +++ 8 files changed, 21 insertions(+), 2 deletions(-) diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c index b452f2ce54..d8b655efcc 100644 --- a/hw/s390x/sclp.c +++ b/hw/s390x/sclp.c @@ -146,6 +146,8 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb) if (s390_has_feat(S390_FEAT_EXTENDED_LENGTH_SCCB)) { s390_get_feat_block(S390_FEAT_TYPE_SCLP_FAC134, &read_info->fac134); + s390_get_feat_block(S390_FEAT_TYPE_SCLP_FAC_IPL, + read_info->fac_ipl); s390_get_feat_block(S390_FEAT_TYPE_SCLP_FAC139, &read_info->fac139); } diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h index e1f9b0f6bc..dba9d8d463 100644 --- a/include/hw/s390x/sclp.h +++ b/include/hw/s390x/sclp.h @@ -136,9 +136,11 @@ typedef struct ReadInfo { uint32_t hmfai; uint8_t _reserved7[134 - 128]; /* 128-133 */ uint8_t fac134; - uint8_t _reserved8[139 - 135]; /* 135-138 */ + uint8_t _reserved8; + uint8_t fac_ipl[2]; /* 136-137 */ + uint8_t _reserved9; uint8_t fac139; - uint8_t _reserved9[144 - 140]; /* 140-143 */ + uint8_t _reserved10[144 - 140]; /* 140-143 */ struct CPUEntry entries[]; /* * When the Extended-Length SCCB (ELS) feature is enabled the diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c index c6cd411e04..27f38636a9 100644 --- a/target/s390x/cpu_features.c +++ b/target/s390x/cpu_features.c @@ -119,6 +119,7 @@ void s390_fill_feat_block(const S390FeatBitmap features= , S390FeatType type, * Some facilities are not available for CPUs in protected mode: * - All SIE facilities because SIE is not available * - DIAG318 + * - Secure IPL Facility * * As VMs can move in and out of protected mode the CPU model * doesn't protect us from that problem because it is only @@ -149,6 +150,9 @@ void s390_fill_feat_block(const S390FeatBitmap features= , S390FeatType type, clear_be_bit(s390_feat_def(S390_FEAT_DIAG_318)->bit, data); clear_be_bit(s390_feat_def(S390_FEAT_CERT_STORE)->bit, data); break; + case S390_FEAT_TYPE_SCLP_FAC_IPL: + clear_be_bit(s390_feat_def(S390_FEAT_SIPL)->bit, data); + break; case S390_FEAT_TYPE_SCLP_FAC139: clear_be_bit(s390_feat_def(S390_FEAT_SIE_ASTFLEIE2)->bit, data); break; diff --git a/target/s390x/cpu_features.h b/target/s390x/cpu_features.h index 52a82da751..421978faa4 100644 --- a/target/s390x/cpu_features.h +++ b/target/s390x/cpu_features.h @@ -24,6 +24,7 @@ typedef enum { S390_FEAT_TYPE_SCLP_CONF_CHAR, S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, S390_FEAT_TYPE_SCLP_FAC134, + S390_FEAT_TYPE_SCLP_FAC_IPL, S390_FEAT_TYPE_SCLP_FAC139, S390_FEAT_TYPE_SCLP_CPU, S390_FEAT_TYPE_MISC, diff --git a/target/s390x/cpu_features_def.h.inc b/target/s390x/cpu_feature= s_def.h.inc index ae96f2381f..0153a6aa67 100644 --- a/target/s390x/cpu_features_def.h.inc +++ b/target/s390x/cpu_features_def.h.inc @@ -140,6 +140,9 @@ DEF_FEAT(SIE_IBS, "ibs", SCLP_CONF_CHAR_EXT, 10, "SIE: = Interlock-and-broadcast-s DEF_FEAT(DIAG_318, "diag318", SCLP_FAC134, 0, "Control program name and ve= rsion codes") DEF_FEAT(CERT_STORE, "cstore", SCLP_FAC134, 5, "Certificate Store function= s") =20 +/* Features exposed via SCLP SCCB Facilities byte 136 - 137 (bit numbers r= elative to byte-136) */ +DEF_FEAT(SIPL, "sipl", SCLP_FAC_IPL, 1, "Secure-IPL facility") + /* Features exposed via SCLP SCCB Facilities byte 139 (bit numbers relativ= e to byte-139) */ DEF_FEAT(SIE_ASTFLEIE2, "astfleie2", SCLP_FAC139, 1, "SIE: ASTFLE interpre= tation execution facility 2") =20 diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c index 5e2c8b2b82..97e77f2bfa 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c @@ -263,6 +263,7 @@ bool s390_has_feat(S390Feat feat) case S390_FEAT_SIE_CMMA: case S390_FEAT_SIE_PFMFI: case S390_FEAT_SIE_IBS: + case S390_FEAT_SIPL: case S390_FEAT_CONFIGURATION_TOPOLOGY: case S390_FEAT_SIE_ASTFLEIE2: return false; @@ -508,6 +509,7 @@ static void check_consistency(const S390CPUModel *model) { S390_FEAT_AP_QUEUE_INTERRUPT_CONTROL, S390_FEAT_AP }, { S390_FEAT_DIAG_318, S390_FEAT_EXTENDED_LENGTH_SCCB }, { S390_FEAT_CERT_STORE, S390_FEAT_EXTENDED_LENGTH_SCCB }, + { S390_FEAT_SIPL, S390_FEAT_EXTENDED_LENGTH_SCCB }, { S390_FEAT_NNPA, S390_FEAT_VECTOR }, { S390_FEAT_RDP, S390_FEAT_LOCAL_TLB_CLEARING }, { S390_FEAT_UV_FEAT_AP, S390_FEAT_AP }, diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index e6a586bce7..6bf61447de 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -722,6 +722,7 @@ static uint16_t full_GEN16_GA1[] =3D { S390_FEAT_UV_FEAT_AP_INTR, S390_FEAT_SIE_ASTFLEIE2, S390_FEAT_CERT_STORE, + S390_FEAT_SIPL, }; =20 static uint16_t full_GEN17_GA1[] =3D { @@ -923,6 +924,7 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_PRNO_TRNG, S390_FEAT_EXTENDED_LENGTH_SCCB, S390_FEAT_CERT_STORE, + S390_FEAT_SIPL, }; =20 /****** END FEATURE DEFS ******/ diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c index 10cee19860..70c9933d7f 100644 --- a/target/s390x/kvm/kvm.c +++ b/target/s390x/kvm/kvm.c @@ -2502,6 +2502,9 @@ bool kvm_s390_get_host_cpu_model(S390CPUModel *model,= Error **errp) =20 set_bit(S390_FEAT_CERT_STORE, model->features); =20 + /* Some Secure IPL facilities are emulated by QEMU */ + set_bit(S390_FEAT_SIPL, model->features); + /* Test for Ultravisor features that influence secure guest behavior */ query_uv_feat_guest(model->features); =20 --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748840; cv=none; d=zohomail.com; s=zohoarc; b=HtqbNim9r/cJhhgqQRuF+nuQZW1ltr3ju1xmPeHeexMdyftRHjk4NZiPhuALpHqRe8G8VKzNFRgI6ZyGkGxbZq/81eUgwdgwX5WZwBr7zaSq2+HJcNGgtqd+/OEFFzXgOLFxm22QR6LaN/5AlM/RsAyk3OrfArhguUd7uyCTtbo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748840; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=2OJSVnp/iJ86vacKVypF5rac88HtDogF4FhUP3qMKo0=; b=kIzmrSQU9ARzqADSObCDMxMMDEjgT7ehOg87mz3HsHJVowPYtpwSNSFzfD5acI0WBzVQhI6jmvWo0zuOb+WPAOgirImni3O/Wke9//uWwr/BV4FdGmqs/I0K9Dpz1+nVzsgGgYdXBA5CZzFSYP5zHO5hYR4BnFi2SjLdVrG0Ai0= 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 1787748840777972.9151988291102; Wed, 26 Aug 2026 05:54:00 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7e-0007ty-2S; Wed, 26 Aug 2026 08:52:54 -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 1wzD7a-0007rm-Rm; Wed, 26 Aug 2026 08:52:51 -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 1wzD7Y-0002le-9T; Wed, 26 Aug 2026 08:52:50 -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 67QCVq9t3977412; Wed, 26 Aug 2026 12:52: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 4g73946pcr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:46 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfMWM018847; Wed, 26 Aug 2026 12:52:45 GMT Received: from smtprelay03.wdc07v.mail.ibm.com ([172.16.1.70]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7raght01-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:45 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay03.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCq4Lm66912558 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:04 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D994758059; Wed, 26 Aug 2026 12:52:43 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9B1725805B; Wed, 26 Aug 2026 12:52:42 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:42 +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=2OJSVn p/iJ86vacKVypF5rac88HtDogF4FhUP3qMKo0=; b=sjAXyVhXo4sXDe4zAFgDhJ OUmbEkhNQr0a37pYtRXX6I6UJaJECkmiXzk1nVVZty9+YxnE3L8EvxbhvmQ3WPCG YEaqoFVAVjTu+etPZEDqihA8eAlBsTFwkYCCdykBL0RhQz9o8opc4V3GJvLn6RVn 5FTS7wALN9jPdzu96zzyMr06LsQHgXH2H0mRfazCOHp8sJktcOl0t14N7JZUHjs+ yy/fcaIrfyk8pou+PTuOAs8swefK2mWliaT1dnqYEkN1gF3didlGJ16/G2K11mTU wvVfEmez6sBJKfS1itVZcW8O905KQ4byy9bXHGqc7RRVWmBjSCv6KHT6OuY/hXWw == From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Thomas Huth , Jared Rossi , Collin Walling , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Eric Farman Subject: [PULL 22/37] pc-bios/s390-ccw: Refactor zipl_run() Date: Wed, 26 Aug 2026 08:51:57 -0400 Message-ID: <20260826125213.1901252-23-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-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-GUID: 2vKF_gCAYddiOSyGteBbddfjdZtmHXAg X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX7aMwZilSY79v ldBxFeNuILXKoiwnYAn7rK6RieyjRot3IIxTYdG4eA+eg8IuN8uIBIYPBYDjsl5EM4InUnFsWtf VUi48N+uTsa0KNw7gEVaqagCpp4QKbQiBChNBUg6hL2HOdeXiIFayyoqzC6fczVsBSsiqWXv/uA K61R4Ti4j3Mui/QaL96DK3XhiQ2ypvcn4GOd5JR/LY49wVhyhlLksqbtYxe2uO1ZOefCkE7qRqs XAdizlgjO30XBCgYTPyOk5aU1tR/kCne0ga4+DZA7IAU80QrSx2JH659E7tXXTeGgJjt4GPgeur uu2bn29eaAjY/575Mqkib6JyP7TsE/Tp+lYdft2GumbichSOWKKBDIpJLqOWx0xslwP5JX+pTnv 5eYm1na3MZHjQobwvAMwPiEufvY6S6XMTjV9F6GV4CRyJN2l0mto+PITp9YHbJrz8WFw3BobDNP o51u9ga5vhkO5aHqrHA== X-Authority-Analysis: v=2.4 cv=Y/nIdBeN c=1 sm=1 tr=0 ts=6a8ee19e cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=EUspDBNiAAAA:8 a=9smrWREWR_s8Awy1JTMA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX6rq/xw70Lqjd du14i172A2noUfE4tZoXCmpv+Gqss285CHIAxtQ9YpULmtqAYC/JZER9QV1m9eXfdbYAg9DNrLN waHKHJsJc7FjRNR+AOYrJZDRsBg5YgQ= X-Proofpoint-ORIG-GUID: 2vKF_gCAYddiOSyGteBbddfjdZtmHXAg 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 impostorscore=0 priorityscore=1501 adultscore=0 bulkscore=0 suspectscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748841123158500 From: Zhuoying Cai Refactor to enhance readability before enabling secure IPL in later patches. Signed-off-by: Zhuoying Cai Reviewed-by: Thomas Huth Reviewed-by: Jared Rossi Reviewed-by: Collin Walling Reviewed-by: Philippe Mathieu-Daud=C3=A9 Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-21-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- pc-bios/s390-ccw/bootmap.c | 54 ++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 81512265ce..21c219ca94 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -676,12 +676,42 @@ static int zipl_load_segment(ComponentEntry *entry) return 0; } =20 +static int zipl_run_normal(ComponentEntry **entry_ptr, const uint8_t *tmp_= sec) +{ + ComponentEntry *entry =3D *entry_ptr; + + while (entry->component_type =3D=3D ZIPL_COMP_ENTRY_LOAD || + entry->component_type =3D=3D ZIPL_COMP_ENTRY_SIGNATURE) { + + /* Secure boot is off, so we skip signature entries */ + if (entry->component_type =3D=3D ZIPL_COMP_ENTRY_SIGNATURE) { + entry++; + continue; + } + + if (zipl_load_segment(entry)) { + return -1; + } + + entry++; + + if ((uint8_t *)&entry[1] > tmp_sec + MAX_SECTOR_SIZE) { + puts("Wrong entry value"); + return -EINVAL; + } + } + + *entry_ptr =3D entry; + return 0; +} + /* Run a zipl program */ static int zipl_run(ScsiBlockPtr *pte) { ComponentHeader *header; ComponentEntry *entry; uint8_t tmp_sec[MAX_SECTOR_SIZE]; + int rc; =20 if (virtio_read(pte->blockno, tmp_sec)) { puts("Cannot read header"); @@ -702,25 +732,10 @@ static int zipl_run(ScsiBlockPtr *pte) =20 /* Load image(s) into RAM */ entry =3D (ComponentEntry *)(&header[1]); - while (entry->component_type =3D=3D ZIPL_COMP_ENTRY_LOAD || - entry->component_type =3D=3D ZIPL_COMP_ENTRY_SIGNATURE) { - - /* We don't support secure boot yet, so we skip signature entries = */ - if (entry->component_type =3D=3D ZIPL_COMP_ENTRY_SIGNATURE) { - entry++; - continue; - } =20 - if (zipl_load_segment(entry)) { - return -1; - } - - entry++; - - if ((uint8_t *)(&entry[1]) > (tmp_sec + MAX_SECTOR_SIZE)) { - puts("Wrong entry value"); - return -EINVAL; - } + rc =3D zipl_run_normal(&entry, tmp_sec); + if (rc) { + return rc; } =20 if (entry->component_type !=3D ZIPL_COMP_ENTRY_EXEC) { @@ -728,10 +743,9 @@ static int zipl_run(ScsiBlockPtr *pte) return -EINVAL; } =20 - /* should not return */ write_reset_psw(entry->compdat.load_psw); jump_to_IPL_code(0); - return -1; + return -1; /* should not return */ } =20 static int ipl_scsi(void) --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787749010; cv=none; d=zohomail.com; s=zohoarc; b=CConyQCQ9GAI1GYQ3FhA/zUju8T0NeXW9YG78+qRcWY5yw5OrXCsvE6x4YYCCPDCB3VynOpeMVcXdskNpembRQ+JdUTMsgVG2l0XtqZG5sq5Ed1arxGfuuUlQWfKUfkWnB83fORB1OCCeqbmywQPXWa6gD1h+q4kRRwPW74EWyU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787749010; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=e1sXAYyTQLQ/leqkzK9GWXtFnfkXNsBbgEXq2UaguPk=; b=XHVSpuQfLLB1jhUwbEihsCyHXwP4gis+WtTsrMGGv1XwsLrW/MFULEsMjJAq4isvGaVaQUrnOPUBjIQP8pUmu4vZFnwDX2wP0BDeJoXXj7AVtcg42fQ3ARR8LfKC9aHuM5Orr+pGHPjCCY/cENjmXlU2zGKdZEjb+B2rzvfZAHY= 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 1787749010926559.1104784601287; Wed, 26 Aug 2026 05:56:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7f-0007vy-Kv; Wed, 26 Aug 2026 08:52:55 -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 1wzD7c-0007tZ-QC; Wed, 26 Aug 2026 08:52: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 1wzD7Z-0002m5-EY; Wed, 26 Aug 2026 08:52:52 -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 67QCVw9A4002747; Wed, 26 Aug 2026 12:52:47 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 4g73g4xpeq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:47 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfHm6006710; Wed, 26 Aug 2026 12:52:46 GMT Received: from smtprelay05.wdc07v.mail.ibm.com ([172.16.1.72]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7pfwa2tu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:46 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay05.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqjGq54722940 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:45 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 38EA25805E; Wed, 26 Aug 2026 12:52:45 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 170E358059; Wed, 26 Aug 2026 12:52:44 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52: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=e1sXAYyTQLQ/leqkz K9GWXtFnfkXNsBbgEXq2UaguPk=; b=HcJjYZqrY6GcP4HDodfDPhRShHYdED5qf ACmRBrqs7uGKS/M/oQOJAmOFu21nDodDf9Ma7TPnWWhysXljypMAMgEHjO/nTsCy 21fTbNgHwmjOI9OA+4i6TtbULkhHhwIAiWGaOSsRV2mrLL6uJBH0oes6wHHpsdAG vELc+N7tiSMQDM+S3hxzX0SxoPIiGgwgSgTn2Z6ih3K4Ozu+YfS9oZLTMEuyfr83 0z1FS28zV68uiI3n/FBG8k2/fNvG8oiRRgjNV9H9SZ87n4TROWWouJcoA+6AwlO1 jskY6Q1uIPyAmZfCGqPaqzrlQdqNr2JAkdMvqVtlY8nyYu84bVNUA== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Thomas Huth , Collin Walling , Jared Rossi , Eric Farman Subject: [PULL 23/37] pc-bios/s390-ccw: Rework zipl_load_segment function Date: Wed, 26 Aug 2026 08:51:58 -0400 Message-ID: <20260826125213.1901252-24-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: UJDugn4_1-4UfurLVai7EaYjNnGa5Z3O X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX649NERo6TMGZ EZl3Eq2xPJFx9LjA0d9xcLSINzKUFjozmMCqg/qDalbFHGo6LNG5GN3jT5jZVDR4L1GiIlsWMxf hMaohaAMXlb2iv4x+7sfkZSVHhvhIOk= X-Proofpoint-GUID: UJDugn4_1-4UfurLVai7EaYjNnGa5Z3O X-Authority-Analysis: v=2.4 cv=JZyMa0KV c=1 sm=1 tr=0 ts=6a8ee19f cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=uL_FI9FW9AP7juJAwn4A:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX2cdnERQK/0OL 1JZRHM5mW1uqZXGLdok9VZXuyG7tPh1/5/X0mlN9eiZai6wb25fsFjhci7uPqIcOhquunqnsx3w FlTOcBEsk6NDISIEYbVt7hVSGFgX1tuJ/uLkxCD/E9AOmDYx+/d+783+eFcYua6WdidPpSD7eGF IW/us0Y23V/4/jQAm46UvANgPzDYWBLEg54xHr1P5LmnF9ki4chQDF8fIC0bThe+d6arHjeUu9C y/+AocYC64YXOfR3r7wK3SFvnd8zEUgkWgMmxlryElAE/wuICPWxujMq5PXyGie2Zjmv8RHyhaY L+mGwe9JcdF2n0B9xe2OgvXUyVcK0N439pxFzT6tf0Q4tbFXrjKtgv82iiqoCX4CBlvJ70HvAuo x+BzByA51hNiuNikxeWc7cerHh3BVT9MhMoFowmRQYrdhRs6r09uj0GAM1Idthuy+K6s82Xy54M dpHIl1pZUswJSD7PSIA== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787749012084158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Change zipl_load_segment() to accept explicit blockno and address parameters instead of ComponentEntry pointer and return segment length. Modify this function to allow the caller to specify a memory address where segment data should be loaded into. seg_len variable is necessary to store the calculated segment length and is used during signature verification. Return the length on success, or a negative return code on failure. Remove static qualifier and add function declaration to bootmap.h to make it accessible to other modules. Signed-off-by: Zhuoying Cai Reviewed-by: Thomas Huth Reviewed-by: Collin Walling Reviewed-by: Jared Rossi Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-22-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- pc-bios/s390-ccw/bootmap.c | 14 ++++++-------- pc-bios/s390-ccw/bootmap.h | 13 +++++++++++++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 21c219ca94..38e98aab68 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -615,19 +615,15 @@ static int ipl_eckd(void) * IPL a SCSI disk */ =20 -static int zipl_load_segment(ComponentEntry *entry) +int zipl_load_segment(block_number_t blockno, uint64_t address) { const int max_entries =3D (MAX_SECTOR_SIZE / sizeof(ScsiBlockPtr)); ScsiBlockPtr *bprs =3D (void *)sec; const int bprs_size =3D sizeof(sec); - block_number_t blockno; - uint64_t address; int i; char err_msg[] =3D "zIPL failed to read BPRS at 0xZZZZZZZZZZZZZZZZ"; char *blk_no =3D &err_msg[30]; /* where to print blockno in (those ZZs= ) */ - - blockno =3D entry->data.blockno; - address =3D entry->compdat.load_addr; + int seg_len =3D 0; =20 debug_print_int("loading segment at block", blockno); debug_print_int("addr", address); @@ -670,10 +666,12 @@ static int zipl_load_segment(ComponentEntry *entry) puts("zIPL load segment failed"); return -EIO; } + + seg_len +=3D bprs->size * (bprs[i].blockct + 1); } } while (blockno); =20 - return 0; + return seg_len; } =20 static int zipl_run_normal(ComponentEntry **entry_ptr, const uint8_t *tmp_= sec) @@ -689,7 +687,7 @@ static int zipl_run_normal(ComponentEntry **entry_ptr, = const uint8_t *tmp_sec) continue; } =20 - if (zipl_load_segment(entry)) { + if (zipl_load_segment(entry->data.blockno, entry->compdat.load_add= r) < 0) { return -1; } =20 diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h index 95943441d3..40580600b5 100644 --- a/pc-bios/s390-ccw/bootmap.h +++ b/pc-bios/s390-ccw/bootmap.h @@ -113,6 +113,19 @@ typedef struct ScsiMbr { ScsiBlockPtr pt; /* block pointer to program table */ } __attribute__ ((packed)) ScsiMbr; =20 +/** + * zipl_load_segment + * @blockno: block number of the first BPRS describing the segment. + * @address: guest physical address at which to load the segment. + * + * Walks the BPRS chain starting at @blockno, loading each data block + * into guest memory at @address. + * + * Returns: length of the segment on success, + * negative value on error. + */ +int zipl_load_segment(block_number_t blockno, uint64_t address); + #define ZIPL_MAGIC "zIPL" #define ZIPL_MAGIC_EBCDIC "\xa9\xc9\xd7\xd3" #define IPL1_MAGIC "\xc9\xd7\xd3\xf1" /* =3D=3D "IPL1" in EBCDIC */ --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787749018; cv=none; d=zohomail.com; s=zohoarc; b=U+x4B40XMFj8i+LRg5NEm5sGecqqgG8JMYVsxKNH9twg01gWjcAyD/mQOSBG/Gzy6nd0z6oag2PKT+7MB+MUSt3UjhyO4cj3fZhRBWn9KLiiEuWI/JLchz7nLUKc8MGDqvrTo33gLQFti6MUmHHLbiqszyceorsrDbaqDW7VSBU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787749018; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=aBxMdLn/te7zVZwKA/DiJwCBedCtoL1kjbzaqHVsJvo=; b=Hp5PSQLr2NBQ6BQOFambKkuRXvO2YMzvTtBygq4y7Kjm2X6rDF8vnVC/jGQkibC+wiSYWQ078xftaDo+sed0Eqfgs0f/FePxZ1K12ikZF/dhw6N/JoH2MLmu5Ixuli9fR3WMrxhJgV5XP+oSAYG9+kj/q/5HZu1x2q76KzD+vFA= 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 1787749018061996.2411859033095; Wed, 26 Aug 2026 05:56:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD8H-0000AS-Nq; Wed, 26 Aug 2026 08:53:34 -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 1wzD83-0008RW-7p; Wed, 26 Aug 2026 08:53:24 -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 1wzD7u-0002mP-K4; Wed, 26 Aug 2026 08:53: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 67QCVwfe4002737; Wed, 26 Aug 2026 12:52:49 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 4g73g4xpet-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:48 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfGv9032639; Wed, 26 Aug 2026 12:52:47 GMT Received: from smtprelay06.wdc07v.mail.ibm.com ([172.16.1.73]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7qkh9vnn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:47 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay06.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqkG437749238 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:46 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6709358060; Wed, 26 Aug 2026 12:52:46 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 669CC58059; Wed, 26 Aug 2026 12:52:45 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52: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=aBxMdLn/te7zVZwKA /DiJwCBedCtoL1kjbzaqHVsJvo=; b=GLWwl+6LnCxPfKigx0T5afa6EEHdqbVaK 0FCsC7rFXoq7BnoAERFlFakul5vu90C7yvCqjB/lmtqZrhWUTTwOovCmcDEIJ6sw tNZj9kN5uqjUTlwoCfZO+ozzue7GA7AUdxvU75xq777COa4BR1/r8yfoxzTmLebp s0txoS38ZgZNf3wxxi6tk9tFiEib7Hr9yvH4TSerqdBXGfBK1O4v0UXK8QVWKFDi +8la6XIeNyk7SDL3O/Kjyu2FVt+wd8t37gvIfIDWbu5Oa1nDDx874beKMXDXFBmo CAPIEpYSOUhqbksPRFf7384TQr0iuBpl3OG65QybhVbt89nFVSz1A== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Collin Walling , Jared Rossi , Eric Farman Subject: [PULL 24/37] pc-bios/s390-ccw: Introduce ZiplBootMode enum for IPL mode selection Date: Wed, 26 Aug 2026 08:51:59 -0400 Message-ID: <20260826125213.1901252-25-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: DJn5qxcq99XHvmQJmjmZolC4zOIsx8xO X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX0KZ9hJKY34HJ CadykpbDfMLQns+jQL80QcyggwdnuRNes2hMBixCT5QALoVCYTDHpF/jm/DGPzkRzwKrZ5UbMvu snJXmTvyxGC7NsJaqn+sYB76F3hEapo= X-Proofpoint-GUID: DJn5qxcq99XHvmQJmjmZolC4zOIsx8xO X-Authority-Analysis: v=2.4 cv=JZyMa0KV c=1 sm=1 tr=0 ts=6a8ee1a0 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=d8dTZFwbv_yry3V4My0A:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX3jxVlB6udtJ9 XeWm2JddztMs5a59oX77ZnfifyEmp0szNAhtr2SheM2XGAZnT6giE4+4d2uEUXEfETs4vc0X5/a SEpsDtthIeh52U5gEXT4Rg43+K+WJu2gAujxHSog75bXBbV9A0mxTDoCLlkYSYVeISfiBgLWGOD f+h5aUtYISB/OOjuSsnsNrMKcRNxqEROv5ey6NIC3at4EcHS7bew4HEVRrOxveF71s/qR7hpd8B 4mEtkoLvuHrw0/8eQzbCssSEOd59wBUmA1c1gUi/fvanHveCxgLxxG7j1An2vK/LbQbGxB1xDQY ZkieFmi+NjuupDv5hDnECibzEHP8UzuFUNQEuvMH7sIGw6ihoDiKRkkeYSv2n8vjqhTbMvS7iWa kVPM8XRlF4GZnDncpzSdma+uPPsXhqOOmpBO/2JABkFtCj+/AxsIULC7xi9HBmZHQAnnjyvMT2A WSaF4MjyCMnr15ev3Kg== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787749020157158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Add ZiplBootMode enumeration to support multiple IPL boot configurations. Boot modes differentiate between normal boot and secure IPL operations, enabled based on boot certificates specified via the boot-certs option. Normal Mode: IPL when no certificates are provided. No signature verification is performed. This prepares for future secure IPL modes requiring signature verification. Signed-off-by: Zhuoying Cai Reviewed-by: Collin Walling Reviewed-by: Jared Rossi Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-23-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- docs/system/s390x/secure-ipl.rst | 21 +++++++++++++++++++++ pc-bios/s390-ccw/bootmap.c | 16 +++++++++++++++- pc-bios/s390-ccw/main.c | 6 ++++++ pc-bios/s390-ccw/s390-ccw.h | 6 ++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/docs/system/s390x/secure-ipl.rst b/docs/system/s390x/secure-ip= l.rst index 88df52ce2f..9d7d33f5ed 100644 --- a/docs/system/s390x/secure-ipl.rst +++ b/docs/system/s390x/secure-ipl.rst @@ -18,3 +18,24 @@ Note: certificate files must have a .pem extension. .. code-block:: shell =20 qemu-system-s390x -machine s390-ccw-virtio,boot-certs.0.path=3D/.../qe= mu/certs,boot-certs.1.path=3D/another/path/cert.pem ... + + +IPL Modes +--------- + +Multiple IPL modes are available to differentiate between the various IPL +configurations. These modes are mutually exclusive and enabled based on the +``boot-certs`` option on the QEMU command line. + +Normal Mode +^^^^^^^^^^^ + +The absence of certificates will attempt to IPL a guest without secure IPL +operations. No checks are performed, and no warnings/errors are reported. +This is the default mode. + +Configuration: + +.. code-block:: shell + + qemu-system-s390x -machine s390-ccw-virtio ... diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 38e98aab68..b6bd1a379d 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -332,6 +332,9 @@ static int run_eckd_boot_script(block_number_t bmt_bloc= k_nr, /* The S1B block number is NULL_BLOCK_NR if and only if it's an LD-IPL= */ bool ldipl =3D (s1b_block_nr =3D=3D NULL_BLOCK_NR); =20 + IPL_assert((boot_mode =3D=3D ZIPL_BOOT_MODE_NORMAL), + "Secure boot with the ECKD scheme is not supported!"); + if (menu_is_enabled_zipl() && !ldipl) { loadparm =3D eckd_get_boot_menu_index(s1b_block_nr); } @@ -731,7 +734,14 @@ static int zipl_run(ScsiBlockPtr *pte) /* Load image(s) into RAM */ entry =3D (ComponentEntry *)(&header[1]); =20 - rc =3D zipl_run_normal(&entry, tmp_sec); + switch (boot_mode) { + case ZIPL_BOOT_MODE_NORMAL: + rc =3D zipl_run_normal(&entry, tmp_sec); + break; + default: + panic("Unknown boot mode"); + } + if (rc) { return rc; } @@ -1102,12 +1112,16 @@ void zipl_load(void) VDev *vdev =3D virtio_get_device(); =20 if (vdev->is_cdrom) { + IPL_assert((boot_mode =3D=3D ZIPL_BOOT_MODE_NORMAL), + "Secure boot from ISO image is not supported!"); ipl_iso_el_torito(); puts("Failed to IPL this ISO image!"); return; } =20 if (virtio_get_device_type() =3D=3D VIRTIO_ID_NET) { + IPL_assert((boot_mode =3D=3D ZIPL_BOOT_MODE_NORMAL), + "Virtio net boot device does not support secure boot!"= ); netmain(); puts("Failed to IPL from this network!"); return; diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 44888e0c5c..40e568fc71 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -30,6 +30,7 @@ IplParameterBlock *iplb; bool have_iplb; static uint16_t cutype; LowCore *lowcore; /* Yes, this *is* a pointer to address 0 */ +ZiplBootMode boot_mode; =20 #define LOADPARM_PROMPT "PROMPT " #define LOADPARM_EMPTY " " @@ -306,6 +307,9 @@ static void ipl_ccw_device(void) switch (cutype) { case CU_TYPE_DASD_3990: case CU_TYPE_DASD_2107: + IPL_assert((boot_mode =3D=3D ZIPL_BOOT_MODE_NORMAL), + "Passthrough (vfio) CCW device does not support secure= boot!"); + dasd_ipl(blk_schid, cutype); break; case CU_TYPE_VIRTIO: @@ -393,6 +397,8 @@ void main(void) probe_boot_device(); } =20 + boot_mode =3D ZIPL_BOOT_MODE_NORMAL; + while (have_iplb) { boot_setup(); if (have_iplb && find_boot_device()) { diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index 25aac91d45..4004e9accc 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -69,6 +69,12 @@ int sclp_read(char *str, size_t count); /* bootmap.c */ void zipl_load(void); =20 +typedef enum ZiplBootMode { + ZIPL_BOOT_MODE_NORMAL =3D 0, +} ZiplBootMode; + +extern ZiplBootMode boot_mode; + /* jump2ipl.c */ void write_reset_psw(uint64_t psw); int jump_to_IPL_code(uint64_t address); --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748836; cv=none; d=zohomail.com; s=zohoarc; b=luLjF7vgAU1rIM11P26VgjUE3L8irajEzueo4t5DoJlr6IkEYC+MSAV+UKzBaOWEtAp384E3dHVBvMcBSCm1EPD0IcGqQ+imDkbN+GmjND061GPRhBwF5wuEGWjn6JxDqbMPu3hxINbm+5fnJfmDqclz9K5vMtlZd1xOlE0FsVY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748836; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=fYtkwMRqq2WQDvkEAvGveFTnDKgGVIr0G7mkrtAvIZg=; b=Zm2Bq04rNWV4bH3tDvKULSj6CapF6swHRUcxF6+yk2esCJTz/wR5U5ADyFZjvPnYEXeO3TNDYbF6hGlRk7O+8nk1kTc3ZTwqHvk6ovqi8oHyhLlgcO73sKdPp6Q2jOdZHLjaZQ/IYCdPNfj5QeEX5+h7nJ+FOFkMURpLny53IAc= 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 1787748836426741.883987033047; Wed, 26 Aug 2026 05:53:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7g-0007xJ-Vv; Wed, 26 Aug 2026 08:52: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 1wzD7f-0007ub-4U; Wed, 26 Aug 2026 08:52:55 -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 1wzD7b-0002mi-3v; Wed, 26 Aug 2026 08:52:54 -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 67QCW7PN2878114; Wed, 26 Aug 2026 12:52:49 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 4g726epkmm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:49 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfInf006718; Wed, 26 Aug 2026 12:52:48 GMT Received: from smtprelay07.wdc07v.mail.ibm.com ([172.16.1.74]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7pfwa2tv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:48 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay07.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqlMZ27722378 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:47 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8D19F5805C; Wed, 26 Aug 2026 12:52:47 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 93A3A58059; Wed, 26 Aug 2026 12:52:46 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52: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=fYtkwMRqq2WQDvkEA vGveFTnDKgGVIr0G7mkrtAvIZg=; b=s2BB5usZj/4d25CSpTWvrn5RiZZSg7LP7 Dxh61iKvdMqu/rlwK79Isn+UbHvqucnXUZIrYgvSSPO8IYeeovgF93rz0v2+H5x0 Gn7IpEN8xSLJs3gCL8AmdYfJFWuwDzAIFFsPPAqcvimwKzOE+Hw7ijD+ezIMyIOJ NSwGo13wWv19CB59HQ8XwrZJaFCUhbCmUMC1rgn7reLUEU2MyqFu/gBxg40FalEq zRLWlsYySU+1cr8vtuHQ7tkSiJco9ZEvnjoif+U+G+4XxBYq13/nLKE+zl+Czg9x 5NZLupdjjMxxo+pI+2T0nWi3NPkNW2otJKejmEJUebT/WnOX6HOQw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Eric Farman , Jared Rossi , Collin Walling Subject: [PULL 25/37] pc-bios/s390-ccw: Add signature verification for secure IPL in audit mode Date: Wed, 26 Aug 2026 08:52:00 -0400 Message-ID: <20260826125213.1901252-26-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-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=TfimcxQh c=1 sm=1 tr=0 ts=6a8ee1a1 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=dzv_R5LLPvLxPy7M2fYA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX3KC7amoE51U1 4Ie7RO8HTUWtJB/BFrjvwfer82ivopNm178WboW5hmlgFZ0FFpZ+2EF63+7cS+PnXslEEUKFqxI UMONTaeeHrRdDFZM9A6XZ2nnxaVYGwo= X-Proofpoint-GUID: 4-vY5QZevrWwRMFOIumFSMij6BbDmuTN X-Proofpoint-ORIG-GUID: 4-vY5QZevrWwRMFOIumFSMij6BbDmuTN X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXzHv5HKi2NyWk Xjkv9S6UX7Z6aLHSFy/4LMttsAy+zt1HJfYWdgcqnYuL9Usflmljs2aPgGXQkQMdcatXReiCvAe 3P0mf55r3XLLeoxSSw54BU6TaTV6IfO6giAB6aaDYTSS3BkXuTrN0Tk3oqkfRtj5FGP81tA67nd qLjLW5Qqf4/teB5deV+KoMt2Nc0JXyFIKaHLN7Libt5B6rBi4nRqW4haiO2awaiJbno+jDM2t3B ZLtV8QZ22FMVZndwOtdghHVVM0bq60uF/Hg9NlKLI6qI+3ZVcdQtBfdIKt9/REmf1Bk/cU+lXY4 AR/KO+T5takBLfH8j61duR0gHMMcN+tH7ypt4WZfD4IMi/qXHJPhJxhlnX2xZyQXZ8kciZJ6E3k DNlbUmKxyEH819a8PRAh1ZRSaDAo1kH0/ReqP60SdcpeN+zZjfeSvazqCt2RehEfSlXaoETJ+XP MqeI9I+6eEUzCmNA5cw== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 bulkscore=0 malwarescore=0 priorityscore=1501 lowpriorityscore=0 clxscore=1015 phishscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748837247158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Enable secure IPL in audit mode, which performs signature verification, but any error does not terminate the boot process. Only warnings will be logged to the console instead. Secure IPL in audit mode requires at least one certificate provided in the key store along with necessary facilities (Secure IPL Facility, Certificate Store Facility and secure IPL extension support). Note: Secure IPL in audit mode is implemented for the SCSI scheme of virtio-blk/virtio-scsi devices. Signed-off-by: Zhuoying Cai Reviewed-by: Eric Farman Reviewed-by: Jared Rossi Reviewed-by: Collin Walling Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-24-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- docs/system/s390x/secure-ipl.rst | 15 ++ hw/s390x/ipl.c | 9 + pc-bios/s390-ccw/Makefile | 2 +- pc-bios/s390-ccw/bootmap.c | 28 +++ pc-bios/s390-ccw/bootmap.h | 9 + pc-bios/s390-ccw/jump2ipl.c | 7 + pc-bios/s390-ccw/main.c | 19 +- pc-bios/s390-ccw/s390-ccw.h | 20 ++ pc-bios/s390-ccw/sclp.c | 27 +++ pc-bios/s390-ccw/sclp.h | 6 + pc-bios/s390-ccw/secure-ipl.c | 369 +++++++++++++++++++++++++++++++ pc-bios/s390-ccw/secure-ipl.h | 119 ++++++++++ 12 files changed, 628 insertions(+), 2 deletions(-) create mode 100644 pc-bios/s390-ccw/secure-ipl.c create mode 100644 pc-bios/s390-ccw/secure-ipl.h diff --git a/docs/system/s390x/secure-ipl.rst b/docs/system/s390x/secure-ip= l.rst index 9d7d33f5ed..cf6ccf5d57 100644 --- a/docs/system/s390x/secure-ipl.rst +++ b/docs/system/s390x/secure-ipl.rst @@ -39,3 +39,18 @@ Configuration: .. code-block:: shell =20 qemu-system-s390x -machine s390-ccw-virtio ... + +Audit Mode +^^^^^^^^^^ + +When the certificate store is populated with at least one certificate +and no additional secure IPL parameters are provided on the command +line, then secure IPL will proceed in "audit mode". All secure IPL +operations will be performed with signature verification errors reported +as non-disruptive warnings. + +Configuration: + +.. code-block:: shell + + qemu-system-s390x -machine s390-ccw-virtio,boot-certs.0.path=3D/.../qe= mu/certs,boot-certs.1.path=3D/another/path/cert.pem ... diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 85fe2d3cb4..d0dbf47d74 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -828,6 +828,15 @@ void s390_ipl_prepare_cpu(S390CPU *cpu) cpu->env.psw.addr =3D ipl->bios_start_addr; if (!ipl->iplb_valid) { ipl->iplb_valid =3D s390_init_all_iplbs(ipl); + + /* + * Secure IPL without specifying a boot device. + * IPLB is not generated if no boot device is defined. + */ + if (s390_has_certificate() && !ipl->iplb_valid) { + error_report("No boot device defined for Secure IPL"); + exit(1); + } } else { ipl->qipl.chain_len =3D 0; } diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index 3e5dfb64d5..2109d16781 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -35,7 +35,7 @@ QEMU_DGFLAGS =3D -MMD -MP -MT $@ -MF $(@D)/$(*F).d =20 OBJECTS =3D start.o main.o bootmap.o jump2ipl.o sclp.o menu.o netmain.o \ virtio.o virtio-net.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o \ - virtio-ccw.o clp.o pci.o virtio-pci.o + virtio-ccw.o clp.o pci.o virtio-pci.o secure-ipl.o =20 SLOF_DIR :=3D $(SRC_PATH)/../../roms/SLOF =20 diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index b6bd1a379d..16c20313c8 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -10,11 +10,13 @@ =20 #include #include +#include #include "s390-ccw.h" #include "s390-arch.h" #include "bootmap.h" #include "virtio.h" #include "bswap.h" +#include "secure-ipl.h" =20 #ifdef DEBUG /* #define DEBUG_FALLBACK */ @@ -712,6 +714,9 @@ static int zipl_run(ScsiBlockPtr *pte) ComponentHeader *header; ComponentEntry *entry; uint8_t tmp_sec[MAX_SECTOR_SIZE]; + IplDeviceComponentList comp_list =3D { 0 }; + IplSignatureCertificateList cert_list =3D { 0 }; + uint8_t *tmp_cert_buf =3D NULL; int rc; =20 if (virtio_read(pte->blockno, tmp_sec)) { @@ -738,6 +743,9 @@ static int zipl_run(ScsiBlockPtr *pte) case ZIPL_BOOT_MODE_NORMAL: rc =3D zipl_run_normal(&entry, tmp_sec); break; + case ZIPL_BOOT_MODE_SECURE_AUDIT: + rc =3D zipl_run_secure(&entry, tmp_sec, &comp_list, &cert_list, &t= mp_cert_buf); + break; default: panic("Unknown boot mode"); } @@ -748,10 +756,18 @@ static int zipl_run(ScsiBlockPtr *pte) =20 if (entry->component_type !=3D ZIPL_COMP_ENTRY_EXEC) { puts("No EXEC entry"); + free(tmp_cert_buf); return -EINVAL; } =20 write_reset_psw(entry->compdat.load_psw); + + if (boot_mode =3D=3D ZIPL_BOOT_MODE_SECURE_AUDIT) { + update_cert_list(&cert_list); + update_iirb(&comp_list, &cert_list); + free(tmp_cert_buf); + } + jump_to_IPL_code(0); return -1; /* should not return */ } @@ -1107,6 +1123,18 @@ static int zipl_load_vscsi(void) * IPL starts here */ =20 +ZiplBootMode get_boot_mode(uint8_t hdr_flags) +{ + bool sipl_set =3D hdr_flags & DIAG308_IPIB_FLAGS_SIPL; + bool iplir_set =3D hdr_flags & DIAG308_IPIB_FLAGS_IPLIR; + + if (!sipl_set && iplir_set) { + return ZIPL_BOOT_MODE_SECURE_AUDIT; + } + + return ZIPL_BOOT_MODE_NORMAL; +} + void zipl_load(void) { VDev *vdev =3D virtio_get_device(); diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h index 40580600b5..e1f4130752 100644 --- a/pc-bios/s390-ccw/bootmap.h +++ b/pc-bios/s390-ccw/bootmap.h @@ -88,9 +88,18 @@ typedef struct BootMapTable { BootMapPointer entry[]; } __attribute__ ((packed)) BootMapTable; =20 +#define DER_SIGNATURE_FORMAT 1 + +typedef struct SignatureInformation { + uint8_t format; + uint8_t reserved[3]; + uint32_t sig_len; +} SignatureInformation; + typedef union ComponentEntryData { uint64_t load_psw; uint64_t load_addr; + SignatureInformation sig_info; } ComponentEntryData; =20 typedef struct ComponentEntry { diff --git a/pc-bios/s390-ccw/jump2ipl.c b/pc-bios/s390-ccw/jump2ipl.c index fa2ca5cbe1..8e87c566f9 100644 --- a/pc-bios/s390-ccw/jump2ipl.c +++ b/pc-bios/s390-ccw/jump2ipl.c @@ -75,6 +75,13 @@ int jump_to_IPL_code(uint64_t address) "diag %%r1,%%r1,0x308\n\t" : : : "1", "memory"); puts("IPL code jump failed"); + + /* + * A failed jump only occurs in extreme conditions, so abort the IPL e= ntirely. + * This also prevents attempts to boot from the chain area if it has b= een + * overwritten with component data. + */ + qipl.chain_len =3D 0; return -1; } =20 diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 40e568fc71..520c448c2c 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -20,6 +20,7 @@ #include "dasd-ipl.h" #include "clp.h" #include "virtio-pci.h" +#include "secure-ipl.h" =20 static SubChannelId blk_schid =3D { .one =3D 1 }; static char loadparm_str[LOADPARM_LEN + 1]; @@ -386,6 +387,8 @@ static void probe_boot_device(void) =20 void main(void) { + int vcssb_len; + iplb =3D &ipl_blocks.iplb; =20 copy_qipl(); @@ -397,7 +400,21 @@ void main(void) probe_boot_device(); } =20 - boot_mode =3D ZIPL_BOOT_MODE_NORMAL; + boot_mode =3D get_boot_mode(iplb->hdr_flags); + switch (boot_mode) { + case ZIPL_BOOT_MODE_SECURE_AUDIT: + if (!secure_ipl_supported()) { + panic("Unable to boot in audit mode"); + } + + vcssb_len =3D zipl_secure_get_vcssb(); + if (vcssb_len =3D=3D 0) { + panic("Failed to query certificate storage information!"); + } + break; + default: + break; + } =20 while (have_iplb) { boot_setup(); diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index 4004e9accc..64584dc8a7 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -40,6 +40,22 @@ typedef unsigned long long u64; ((b) =3D=3D 0 ? (a) : (MIN(a, b)))) #endif =20 +/* + * Round number down to multiple. Requires that d be a power of 2. + * Works even if d is a smaller type than n. + */ +#ifndef ROUND_DOWN +#define ROUND_DOWN(n, d) ((n) & -(0 ? (n) : (d))) +#endif + +/* + * Round number up to multiple. Requires that d be a power of 2. + * Works even if d is a smaller type than n. + */ +#ifndef ROUND_UP +#define ROUND_UP(n, d) ROUND_DOWN((n) + (d) - 1, (d)) +#endif + #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) =20 #include "cio.h" @@ -64,6 +80,8 @@ void sclp_print(const char *string); void sclp_set_write_mask(uint32_t receive_mask, uint32_t send_mask); void sclp_setup(void); void sclp_get_loadparm_ascii(char *loadparm); +bool sclp_is_diag320_on(void); +bool sclp_is_fac_ipl_flag_on(uint16_t fac_ipl_flag); int sclp_read(char *str, size_t count); =20 /* bootmap.c */ @@ -71,9 +89,11 @@ void zipl_load(void); =20 typedef enum ZiplBootMode { ZIPL_BOOT_MODE_NORMAL =3D 0, + ZIPL_BOOT_MODE_SECURE_AUDIT =3D 1, } ZiplBootMode; =20 extern ZiplBootMode boot_mode; +ZiplBootMode get_boot_mode(uint8_t hdr_flags); =20 /* jump2ipl.c */ void write_reset_psw(uint64_t psw); diff --git a/pc-bios/s390-ccw/sclp.c b/pc-bios/s390-ccw/sclp.c index 4a07de018d..48bdfedf1f 100644 --- a/pc-bios/s390-ccw/sclp.c +++ b/pc-bios/s390-ccw/sclp.c @@ -113,6 +113,33 @@ void sclp_get_loadparm_ascii(char *loadparm) } } =20 +bool sclp_is_diag320_on(void) +{ + ReadInfo *sccb =3D (void *)_sccb; + + memset((char *)_sccb, 0, sizeof(ReadInfo)); + sccb->h.length =3D SCCB_SIZE; + if (!sclp_service_call(SCLP_CMDW_READ_SCP_INFO, sccb)) { + return sccb->fac134 & SCCB_FAC134_DIAG320_BIT; + } + + return 0; +} + +/* check if specified IPL facility flag is enabled */ +bool sclp_is_fac_ipl_flag_on(uint16_t fac_ipl_flag) +{ + ReadInfo *sccb =3D (void *)_sccb; + + memset((char *)_sccb, 0, sizeof(ReadInfo)); + sccb->h.length =3D SCCB_SIZE; + if (!sclp_service_call(SCLP_CMDW_READ_SCP_INFO, sccb)) { + return sccb->fac_ipl & fac_ipl_flag; + } + + return 0; +} + int sclp_read(char *str, size_t count) { ReadEventData *sccb =3D (void *)_sccb; diff --git a/pc-bios/s390-ccw/sclp.h b/pc-bios/s390-ccw/sclp.h index 64b53cad29..a8a41cd004 100644 --- a/pc-bios/s390-ccw/sclp.h +++ b/pc-bios/s390-ccw/sclp.h @@ -50,6 +50,8 @@ typedef struct SCCBHeader { } __attribute__((packed)) SCCBHeader; =20 #define SCCB_DATA_LEN (SCCB_SIZE - sizeof(SCCBHeader)) +#define SCCB_FAC134_DIAG320_BIT 0x4 +#define SCCB_FAC_IPL_SIPL_BIT 0x4000 =20 typedef struct ReadInfo { SCCBHeader h; @@ -57,6 +59,10 @@ typedef struct ReadInfo { uint8_t rnsize; uint8_t reserved[13]; uint8_t loadparm[LOADPARM_LEN]; + uint8_t reserved1[102]; + uint8_t fac134; + uint8_t reserved2; + uint16_t fac_ipl; } __attribute__((packed)) ReadInfo; =20 typedef struct SCCB { diff --git a/pc-bios/s390-ccw/secure-ipl.c b/pc-bios/s390-ccw/secure-ipl.c new file mode 100644 index 0000000000..a03105cf5a --- /dev/null +++ b/pc-bios/s390-ccw/secure-ipl.c @@ -0,0 +1,369 @@ +/* + * S/390 Secure IPL + * + * Functions to support IPL in secure boot mode (DIAG 320, DIAG 508, + * signature verification, and certificate handling). + * + * For secure IPL overview: docs/system/s390x/secure-ipl.rst + * For secure IPL technical: docs/specs/s390x-secure-ipl.rst + * + * Copyright 2025 IBM Corp. + * Author(s): Zhuoying Cai + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include +#include +#include "s390-ccw.h" +#include "sclp.h" +#include "secure-ipl.h" + +static VCStorageSizeBlock vcssb __attribute__((__aligned__(8))); + +#define for_each_rb_entry(entry, list) \ + for (entry =3D (void *)(list) + sizeof((list)->ipl_info_header); \ + (void *)(entry) + sizeof(*(entry)) <=3D \ + (void *)(list) + (list)->ipl_info_header.len; \ + entry++) + +int zipl_secure_get_vcssb(void) +{ + /* avoid retrieving vcssb multiple times */ + if (vcssb.length =3D=3D VCSSB_LEN_VALID) { + goto out; + } + + vcssb.length =3D VCSSB_LEN_VALID; + if (_diag320(&vcssb, DIAG_320_SUBC_QUERY_VCSI) !=3D DIAG_320_RC_OK) { + vcssb.length =3D 0; + } + +out: + return vcssb.length; +} + +static uint32_t request_certificate(uint8_t *cert_buf, uint8_t index) +{ + VCEntryHeader *vce_hdr; + struct vcb { + VCBlockHeader vcb_hdr; + struct vce { + VCEntryHeader vce_hdr; + uint8_t cert_buf[CERT_BUF_MAX_LEN]; + } vce; + } __attribute__((__aligned__(PAGE_SIZE))) vcb =3D { 0 }; + + /* + * Request single entry + * Fill input fields of single-entry VCB + * + * First and last index must be equal because only one + * VCE per VCB is currently supported + */ + vcb.vcb_hdr.in_len =3D ROUND_UP(vcssb.max_single_vcb_len, PAGE_SIZE); + vcb.vcb_hdr.first_vc_index =3D index; + vcb.vcb_hdr.last_vc_index =3D index; + + if (_diag320(&vcb, DIAG_320_SUBC_STORE_VC) !=3D DIAG_320_RC_OK) { + puts("Could not get certificate"); + return 0; + } + + if (vcb.vcb_hdr.out_len =3D=3D sizeof(VCBlockHeader)) { + puts("No certificate entry"); + return 0; + } + + if (vcb.vcb_hdr.remain_ct !=3D 0) { + panic("Not enough memory to store requested certificate"); + } + + vce_hdr =3D &vcb.vce.vce_hdr; + if (!(vce_hdr->flags & DIAG_320_VCE_FLAGS_VALID)) { + puts("Invalid certificate"); + return 0; + } + + memcpy(cert_buf, (uint8_t *)&vcb.vce + vce_hdr->cert_offset, vce_hdr->= cert_len); + + return vce_hdr->cert_len; +} + +static int cert_list_add(IplSignatureCertificateList *cert_list, + IplSignatureCertificateEntry cert_entry) +{ + int cert_entry_idx; + + cert_entry_idx =3D (cert_list->ipl_info_header.len - sizeof(IplInfoBlo= ckHeader)) / + sizeof(IplSignatureCertificateEntry); + + cert_list->cert_entries[cert_entry_idx] =3D cert_entry; + cert_list->ipl_info_header.len +=3D sizeof(IplSignatureCertificateEntr= y); + + return cert_entry_idx; +} + +static void comp_list_add(IplDeviceComponentList *comp_list, + IplDeviceComponentEntry comp_entry) +{ + int comp_entry_idx; + + comp_entry_idx =3D (comp_list->ipl_info_header.len - sizeof(IplInfoBlo= ckHeader)) / + sizeof(IplDeviceComponentEntry); + if (comp_entry_idx > MAX_COMP_ENTRIES - 1) { + printf("Warning: only %d component entries are supported\n", + MAX_COMP_ENTRIES); + panic("The device component list has reached its maximum capacity"= ); + } + + comp_list->device_entries[comp_entry_idx] =3D comp_entry; + comp_list->ipl_info_header.len +=3D sizeof(IplDeviceComponentEntry); +} + +void update_iirb(IplDeviceComponentList *comp_list, + IplSignatureCertificateList *cert_list) +{ + IplInfoReportBlock *iirb; + IplDeviceComponentList *iirb_comps; + IplSignatureCertificateList *iirb_certs; + uint32_t iirb_hdr_len; + uint32_t comps_len; + uint32_t certs_len; + + if (iplb->len % 8 !=3D 0) { + panic("IPL parameter block length field value is not multiple of 8= bytes"); + } + + iirb_hdr_len =3D sizeof(IplInfoReportBlockHeader); + comps_len =3D comp_list->ipl_info_header.len; + certs_len =3D cert_list->ipl_info_header.len; + if ((comps_len + certs_len + iirb_hdr_len) > sizeof(IplInfoReportBlock= )) { + panic("Not enough space to hold all components and certificates in= IIRB"); + } + + /* IIRB immediately follows IPLB */ + iirb =3D &ipl_blocks.iirb; + iirb->hdr.len =3D iirb_hdr_len; + + /* Copy IPL device component list after IIRB Header */ + iirb_comps =3D (IplDeviceComponentList *) iirb->info_blks; + memcpy(iirb_comps, comp_list, comps_len); + + /* Update IIRB length */ + iirb->hdr.len +=3D comps_len; + + /* Copy IPL sig cert list after IPL device component list */ + iirb_certs =3D (IplSignatureCertificateList *) (iirb->info_blks + + iirb_comps->ipl_info_hea= der.len); + memcpy(iirb_certs, cert_list, certs_len); + + /* Update IIRB length */ + iirb->hdr.len +=3D certs_len; +} + +bool secure_ipl_supported(void) +{ + if (!sclp_is_fac_ipl_flag_on(SCCB_FAC_IPL_SIPL_BIT)) { + puts("Secure IPL Facility is not supported by the hypervisor!"); + return false; + } + + if (!is_signature_verif_supported()) { + puts("Secure IPL extensions are not supported by the hypervisor!"); + return false; + } + + if (!is_cert_store_facility_supported()) { + puts("Certificate Store Facility is not supported by the hyperviso= r!"); + return false; + } + + return true; +} + +static void init_lists(IplDeviceComponentList *comp_list, + IplSignatureCertificateList *cert_list) +{ + comp_list->ipl_info_header.type =3D IPL_INFO_BLOCK_TYPE_COMPONENTS; + comp_list->ipl_info_header.len =3D sizeof(IplInfoBlockHeader); + + cert_list->ipl_info_header.type =3D IPL_INFO_BLOCK_TYPE_CERTIFICATES; + cert_list->ipl_info_header.len =3D sizeof(IplInfoBlockHeader); +} + +static int zipl_load_signature(ComponentEntry *entry, uint64_t sig) +{ + if (entry->compdat.sig_info.format !=3D DER_SIGNATURE_FORMAT) { + puts("Signature is not in DER format"); + return -1; + } + + if (zipl_load_segment(entry->data.blockno, sig) < 0) { + return -1; + } + + return entry->compdat.sig_info.sig_len; +} + +void update_cert_list(IplSignatureCertificateList *cert_list) +{ + IplSignatureCertificateEntry *cert_entry; + uint8_t *cert_buf; + + /* + * Recover the original base address of ipl_data for cert storage. + * + * The IplParameterBlocks stored in ipl_data will no longer be needed + * after this point. Reuse this region to store certificates from the + * BIOS heap into stable memory. + */ + cert_buf =3D (uint8_t *)qipl.ipl_data - qipl.index * sizeof(IplParamet= erBlock); + + for_each_rb_entry(cert_entry, cert_list) { + memcpy(cert_buf, (uint8_t *)cert_entry->addr, cert_entry->len); + cert_entry->addr =3D (uint64_t)cert_buf; + cert_buf +=3D cert_entry->len; + } +} + +int zipl_run_secure(ComponentEntry **entry_ptr, const uint8_t *tmp_sec, + IplDeviceComponentList *comp_list, + IplSignatureCertificateList *cert_list, + uint8_t **tmp_cert_buf) +{ + /* + * Keep track of which certificate store indices correspond to the + * certificate data entries within the IplSignatureCertificateList to + * prevent allocating space for the same certificate multiple times. + * + * The array index corresponds to the certificate's cert-store index. + * + * The array value corresponds to the certificate's entry within the + * IplSignatureCertificateList (with a value of -1 denoting no entry + * exists for the certificate). + */ + int cert_list_table[vcssb.total_vc_ct + 1]; + IplSignatureCertificateEntry sig_entry =3D { 0 }; + IplSignatureCertificateEntry cert_entry; + IplDeviceComponentEntry comp_entry; + ComponentEntry *entry =3D *entry_ptr; + int rc =3D -1; + int sig_len =3D 0; + int comp_len; + int cert_entry_idx; + uint64_t comp_addr; + uint8_t cert_table_idx; + uint8_t *tmp_buf; + bool verified; + bool signed_found =3D false; + + if ((MAX_SIGNED_COMP * CERT_BUF_MAX_LEN) > CERT_BUF_SIZE) { + panic("Not enough memory to store certificates"); + } + *tmp_cert_buf =3D malloc(CERT_BUF_SIZE); + tmp_buf =3D *tmp_cert_buf; + + init_lists(comp_list, cert_list); + sig_entry.addr =3D (uint64_t)malloc(MAX_SECTOR_SIZE); + memset(cert_list_table, -1, sizeof(cert_list_table)); + + while (entry->component_type !=3D ZIPL_COMP_ENTRY_EXEC) { + switch (entry->component_type) { + case ZIPL_COMP_ENTRY_SIGNATURE: + if (sig_entry.len) { + goto error; + } + + sig_len =3D zipl_load_signature(entry, sig_entry.addr); + if (sig_len < 0) { + goto error; + } + + sig_entry.len =3D sig_len; + break; + case ZIPL_COMP_ENTRY_LOAD: + comp_addr =3D entry->compdat.load_addr; + comp_len =3D zipl_load_segment(entry->data.blockno, comp_addr); + if (comp_len < 0) { + goto error; + } + + comp_entry =3D (IplDeviceComponentEntry){ 0 }; + comp_entry.addr =3D comp_addr; + comp_entry.len =3D (uint64_t)comp_len; + + /* no signature present (unsigned component) */ + if (!sig_entry.len) { + comp_list_add(comp_list, comp_entry); + break; + } + + /* + * Initialize with SC flag (signed component) + * CSV flag set upon successful verification + */ + comp_entry.flags =3D S390_IPL_DEV_COMP_FLAG_SC; + signed_found =3D true; + + cert_entry =3D (IplSignatureCertificateEntry) { 0 }; + verified =3D verify_signature(comp_entry, sig_entry, + &cert_entry.len, &cert_table_idx); + + if (verified) { + if (cert_list_table[cert_table_idx] =3D=3D -1) { + if (!request_certificate(tmp_buf, cert_table_idx)) { + puts("Could not get certificate"); + goto error; + } + + cert_entry.addr =3D (uint64_t)tmp_buf; + cert_entry_idx =3D cert_list_add(cert_list, cert_entry= ); + /* map cert-store index to cert-list entry index */ + cert_list_table[cert_table_idx] =3D cert_entry_idx; + /* increment for the next certificate */ + tmp_buf +=3D cert_entry.len; + } + + comp_entry.cert_index =3D cert_list_table[cert_table_idx]; + comp_entry.flags |=3D S390_IPL_DEV_COMP_FLAG_CSV; + puts("Verified component"); + } else { + zipl_secure_error("Could not verify component"); + } + + comp_list_add(comp_list, comp_entry); + + /* After a signature is used another new one can be accepted */ + sig_entry.len =3D 0; + break; + default: + puts("Unknown component entry type"); + goto error; + } + + entry++; + + if ((uint8_t *)(&entry[1]) > tmp_sec + MAX_SECTOR_SIZE) { + puts("Wrong entry value"); + rc =3D -EINVAL; + goto error; + } + } + + if (!signed_found) { + zipl_secure_error("Secure boot is on, but components are not signe= d"); + } + + *entry_ptr =3D entry; + free((void *)sig_entry.addr); + + return 0; +error: + free(*tmp_cert_buf); + *tmp_cert_buf =3D NULL; + free((void *)sig_entry.addr); + + return rc; +} diff --git a/pc-bios/s390-ccw/secure-ipl.h b/pc-bios/s390-ccw/secure-ipl.h new file mode 100644 index 0000000000..b5a871a799 --- /dev/null +++ b/pc-bios/s390-ccw/secure-ipl.h @@ -0,0 +1,119 @@ +/* + * S/390 Secure IPL + * + * Copyright 2025 IBM Corp. + * Author(s): Zhuoying Cai + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef _PC_BIOS_S390_CCW_SECURE_IPL_H +#define _PC_BIOS_S390_CCW_SECURE_IPL_H + +#include "bootmap.h" +#include +#include + +#define MAX_SIGNED_COMP 3 + +int zipl_secure_get_vcssb(void); +bool secure_ipl_supported(void); +void update_iirb(IplDeviceComponentList *comp_list, + IplSignatureCertificateList *cert_list); +void update_cert_list(IplSignatureCertificateList *cert_list); +int zipl_run_secure(ComponentEntry **entry_ptr, const uint8_t *tmp_sec, + IplDeviceComponentList *comp_list, + IplSignatureCertificateList *cert_list, + uint8_t **tmp_cert_buf); + +static inline void zipl_secure_error(const char *message) +{ + switch (boot_mode) { + case ZIPL_BOOT_MODE_SECURE_AUDIT: + printf("AUDIT MODE WARNING: %s\n", message); + break; + default: + /* + * Errors are intentionally ignored in non-secure boot modes. + * This function should only be reached in SECURE modes. + */ + break; + } +} + +static inline uint64_t _diag320(void *data, unsigned long subcode) +{ + register unsigned long addr asm("0") =3D (unsigned long)data; + register unsigned long rc asm("1") =3D 0; + + asm volatile ("diag %0,%2,0x320\n" + : "+d" (addr), "+d" (rc) + : "d" (subcode) + : "memory", "cc"); + return rc; +} + +static inline bool is_cert_store_facility_supported(void) +{ + uint32_t d320_ism; + + if (!sclp_is_diag320_on()) { + return false; + } + + if (_diag320(&d320_ism, DIAG_320_SUBC_QUERY_ISM) !=3D DIAG_320_RC_OK) { + return false; + } + + return d320_ism & (DIAG_320_ISM_QUERY_VCSI | DIAG_320_ISM_STORE_VC); +} + +static inline uint64_t _diag508(void *data, unsigned long subcode) +{ + register unsigned long addr asm("0") =3D (unsigned long)data; + register unsigned long rc asm("1") =3D 0; + + asm volatile ("diag %0,%2,0x508\n" + : "+d" (addr), "+d" (rc) + : "d" (subcode) + : "memory", "cc"); + return rc; +} + +static inline bool is_signature_verif_supported(void) +{ + uint64_t d508_subcodes; + + d508_subcodes =3D _diag508(NULL, DIAG_508_SUBC_QUERY_SUBC); + return d508_subcodes & DIAG_508_SUBC_SIG_VERIF; +} + +static inline bool verify_signature(IplDeviceComponentEntry comp_entry, + IplSignatureCertificateEntry sig_entry, + uint64_t *cert_len, uint8_t *cert_idx) +{ + Diag508SigVerifBlock svb; + + svb.length =3D sizeof(Diag508SigVerifBlock); + svb.version =3D 0; + svb.comp_len =3D comp_entry.len; + svb.comp_addr =3D comp_entry.addr; + svb.sig_len =3D sig_entry.len; + svb.sig_addr =3D sig_entry.addr; + + if (_diag508(&svb, DIAG_508_SUBC_SIG_VERIF) =3D=3D DIAG_508_RC_OK) { + *cert_len =3D svb.cert_len; + /* + * DIAG 508 utilizes an index origin of 0 when indexing the cert s= tore. + * The cert_idx will be used for DIAG 320 data structures, which e= xpects + * an index origin of 1. Account for the offset here so it's easie= r to + * manage later. + */ + *cert_idx =3D svb.cert_store_index + 1; + return true; + } + + return false; +} + +#endif /* _PC_BIOS_S390_CCW_SECURE_IPL_H */ --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748980; cv=none; d=zohomail.com; s=zohoarc; b=U4//iuomasGH7KjSW3rpJV/1kJJTiDzBftuN5cgmyKkYi+xN0dHWdhkxL6Hf0D2Ph2nkWBNm/FEFgoH7qV27C07mMRR05QX3cftps97Npxv83pLEVJviRaf8jemZLLnVQIvCl54Cf1vx9JUBnzkqfDMILM9sDzlpPBAkKZd3fgE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748980; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=TCzoDCBigZnHnzhP7O0NeyYg9pf+U7Zxai9zdUPXYgk=; b=gQC00TsUrRUmzhBmvFQXQUK56lDPWACyXB+YrI3p1nA43EsIfT+2QyJVwvsU7oYbJuj+jPTPdJJ6BMxl3KY8MAqLkfzJif3ogpRr04fAm1rZtc6oK22TWjchbo6+myUC8ghxYT6FFVWCNk5hjORNMjkOXU0riVYOcah25VOKjAM= 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 1787748980755376.0319314871514; Wed, 26 Aug 2026 05:56:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD8K-0000HG-Hk; Wed, 26 Aug 2026 08:53:36 -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 1wzD88-0008SX-Ge; Wed, 26 Aug 2026 08:53:24 -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 1wzD7x-0002nO-EJ; Wed, 26 Aug 2026 08:53:18 -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 67QCVx162127759; Wed, 26 Aug 2026 12:52:51 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 4g73eqxma0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:50 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfLbF003033; Wed, 26 Aug 2026 12:52:49 GMT Received: from smtprelay02.dal12v.mail.ibm.com ([172.16.1.4]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7p3qa5nk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:49 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay02.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqmwc65732900 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:49 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B54125805B; Wed, 26 Aug 2026 12:52:48 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B9D2B58059; Wed, 26 Aug 2026 12:52:47 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52: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=TCzoDCBigZnHnzhP7 O0NeyYg9pf+U7Zxai9zdUPXYgk=; b=Dkmtf3Qn9PaoC4tSUPAGXViX9zn2GBMMW Bpq88xoLvytSBCVcqbq3fCnBPhV64T24N7PDaoMqHV6auZVy6om8es7PM7T57xfY 3fI6dQQ5g2gPeGgg+tfYuFZcmprzaMHp1dCt5dOHN/m98xEk726SoHJUoTB6fTup 8DjYI5zJErz3mfpLTDqFQago5TEYCWYFCO6lVB1ECEL6uVbmK316SsM5+M+6LIJv 0ArTFTCr9fukMmEmTMike9+XCdnpA+rOQ/MtFGB5P0zKEQsWACiuUwsPJe0eQzs3 1J6EF2KmrN8+OvdiSadkV2MdpwH9L94ZqqT2wsWvjioKse2mcs+fQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Jared Rossi , Collin Walling , Eric Farman Subject: [PULL 26/37] pc-bios/s390-ccw: Add signed component address overlap checks Date: Wed, 26 Aug 2026 08:52:01 -0400 Message-ID: <20260826125213.1901252-27-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: MmMOKVJSQxFBGTU1LXjfIDUMSCA3c2w_ X-Proofpoint-ORIG-GUID: MmMOKVJSQxFBGTU1LXjfIDUMSCA3c2w_ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXzT2iODYsxRZ2 z//zrB0BRGsqUwfNwOp2IvCG+axSSDT3PzK7wDPNB1wlD38c0lNyy4Gfsvd7oIv27yrdUdctpuE 5aRn9T32iXwwMPZQin96IugyMnS6tn9EU1OsikbhmDDk6HZE2GPCQ1xVErspPFWJbr0J7IjMuB8 VRFDzx8FXWRLDfRPHXfriotrDcdbA5aVv7vvVPqrMRP1Xyp0m+3Vu15EPZmn1/EQpPkx7MewBXw j8tksYX3iwGrvkFhZTZvZZj4Pn4BitUU00Xy6UhaVFuw+Du0EWynY7dL8b9bd/RSxjL3wqrQQ8W Eb1UGfoJ7R7f0/lhNpwC7xwdpgm5yO0pld53xS2DtW2VUlq/e6OVq82aQ2uGQz7aamuYe3z8W0D Ta6bA4RmoF4t3T9YRlxK1vFPuucRShBsgBJJ7P17VNY+ZcHANDP6q6wHARWIAzgIOriHcMT5wgX aPnvL1CR4buoN/dQmBQ== X-Authority-Analysis: v=2.4 cv=QsRuG1yd c=1 sm=1 tr=0 ts=6a8ee1a2 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=NXXwFC7yLcffaugpo9UA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX58eolyh/9btE Xvd3/UHjLasG+JH4V7QETU2L1PmUn44rGsrdoWhze2ggTK4gkXGv+cTeVlPcEkLL/XjyYVcMBkm vdfSKCmKPMw8JU5q3QIYzf1dwPIej5s= 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 suspectscore=0 priorityscore=1501 impostorscore=0 spamscore=0 lowpriorityscore=0 clxscore=1015 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748981893158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Add address range tracking and overlap checks to ensure that no component overlaps with a signed component during secure IPL. Signed-off-by: Zhuoying Cai Reviewed-by: Jared Rossi Reviewed-by: Matthew Rosato Reviewed-by: Collin Walling Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-25-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- pc-bios/s390-ccw/secure-ipl.c | 19 +++++++++++++++++++ pc-bios/s390-ccw/secure-ipl.h | 10 ++++++++++ 2 files changed, 29 insertions(+) diff --git a/pc-bios/s390-ccw/secure-ipl.c b/pc-bios/s390-ccw/secure-ipl.c index a03105cf5a..fd3455cf67 100644 --- a/pc-bios/s390-ccw/secure-ipl.c +++ b/pc-bios/s390-ccw/secure-ipl.c @@ -193,6 +193,23 @@ static void init_lists(IplDeviceComponentList *comp_li= st, cert_list->ipl_info_header.len =3D sizeof(IplInfoBlockHeader); } =20 +static void check_comp_overlap(IplDeviceComponentList *comp_list, + IplDeviceComponentEntry comp_entry) +{ + IplDeviceComponentEntry *comp; + + /* + * Check component's address range does not overlap with any + * signed component's address range. + */ + for_each_rb_entry(comp, comp_list) { + if (comp->flags & S390_IPL_DEV_COMP_FLAG_SC && + intersects(comp->addr, comp->len, comp_entry.addr, comp_entry.= len)) { + zipl_secure_error("Component addresses overlap"); + } + } +} + static int zipl_load_signature(ComponentEntry *entry, uint64_t sig) { if (entry->compdat.sig_info.format !=3D DER_SIGNATURE_FORMAT) { @@ -294,6 +311,8 @@ int zipl_run_secure(ComponentEntry **entry_ptr, const u= int8_t *tmp_sec, comp_entry.addr =3D comp_addr; comp_entry.len =3D (uint64_t)comp_len; =20 + check_comp_overlap(comp_list, comp_entry); + /* no signature present (unsigned component) */ if (!sig_entry.len) { comp_list_add(comp_list, comp_entry); diff --git a/pc-bios/s390-ccw/secure-ipl.h b/pc-bios/s390-ccw/secure-ipl.h index b5a871a799..d495dd5d04 100644 --- a/pc-bios/s390-ccw/secure-ipl.h +++ b/pc-bios/s390-ccw/secure-ipl.h @@ -116,4 +116,14 @@ static inline bool verify_signature(IplDeviceComponent= Entry comp_entry, return false; } =20 +static inline bool intersects(uint64_t addr0, uint64_t size0, + uint64_t addr1, uint64_t size1) +{ + if (addr1 > addr0) { + return addr1 - addr0 < size0; + } + + return addr0 - addr1 < size1; +} + #endif /* _PC_BIOS_S390_CCW_SECURE_IPL_H */ --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748857; cv=none; d=zohomail.com; s=zohoarc; b=EV64+cfj9wRlHNgU88CnOLEuuPqHYUngm25lyjzJQzrNFDZ9Kw+UMLPEtqJ5RudxjgITi04dchlvN2SYaepX+k/ACyIyktseLH4yPmKNzrcmi+XKZD2xhmj/TjWxr8vOJCiE1NFNJfVhvR+VCYRrCV6R6NnxSyz+rbzCVv2Xyqg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748857; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=seEfB0e4OAYzI8TfBacX8QHo36myH1X0GDuBvkV8Jeo=; b=LEpkYqF8svfK7BCS+Zj9llW9cFnzNfJ3+tpBIQkPz77XZzjNW6Bp9NZ48gchrozpZJqcz3k6ieVSt9m8F1hTWOrxW3hcpKf/98QqgUbHnzMW7f1Pl3jbX+1dGxciaSTRKNUuJyWSwGilgYxuiCN5SC3qB13BDkC9XfrTeIqIDT4= 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 1787748857316716.1457020800784; Wed, 26 Aug 2026 05:54:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD8J-0000Ck-3T; Wed, 26 Aug 2026 08:53: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 1wzD88-0008SU-Fd; Wed, 26 Aug 2026 08:53:24 -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 1wzD7y-0002q1-Sy; Wed, 26 Aug 2026 08:53:19 -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 67QCVviu2127741; Wed, 26 Aug 2026 12:52: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 4g73eqxma3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:52 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfHXq002980; Wed, 26 Aug 2026 12:52:51 GMT Received: from smtprelay04.dal12v.mail.ibm.com ([172.16.1.6]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7p3qa5np-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:51 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay04.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqohP28115640 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:50 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1E95C5805B; Wed, 26 Aug 2026 12:52:50 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E3CE358059; Wed, 26 Aug 2026 12:52:48 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:48 +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=seEfB0 e4OAYzI8TfBacX8QHo36myH1X0GDuBvkV8Jeo=; b=MfJXkB0jZShgi608osszeK ri4QQevbLnaBmLJoaO58Kupq3gFEr+XP2ToFoC5BwoU4rchmr0iJ3JmJ7u7+Ucoc h60KDzp+numCmozscVCxKRdvkzsXABD1F8QwRfvLaKHpz8zXdTFSpI5sYORtZ4me ls2KGvTyrEkhcr/CXZTXTDD6SuIjDKVmVmkvNA4UJ/qq1bfBzRABiTYNM34oIQy1 54xpDNRNiRYd1ceEAE8cLS4CP2BM8eznqTCkbF0jkDCKXff7gVm+NyQ8XnJcH3uE jCJ/RN+6PdTwsWmXUO0qlTe0JsjSreAwZGaU+XD+CUb5rGMkDa72g4EQ0kGi72lA == From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Collin Walling , Eric Farman Subject: [PULL 27/37] s390x: Guest support for Secure-IPL Code Loading Attributes Facility (SCLAF) Date: Wed, 26 Aug 2026 08:52:02 -0400 Message-ID: <20260826125213.1901252-28-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-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-GUID: 7Yrn8plYqk9h63meLCoX5Adg1BWMfSbP X-Proofpoint-ORIG-GUID: 7Yrn8plYqk9h63meLCoX5Adg1BWMfSbP X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX6cdq8DDwHFSb dT+Qs/ShnS2viEjb6/oQOGb4iXrnPWtRFaqghbf++ArTfDeFhcD7cYBVBoEpmA7ZP2XsGAwmAoF /d4NIl8o3qLZh6/7lIUNp3UiwoZESpCHiHAWTH8s/P38AW60m73DnXOpRR6CopIt8o+UGHtW5zr XtMRAlwyipa+4kn2io7mOXKUSebl6oOJETwmLg3GYhsGwJPnt5ZUs/bHT6NMOwuXnwW8xdVc1IT nozn2GNrdFxRTOGpfGpMXgXKvaYMApInPTjT53U07qLJTPEfCmDPZBFX9RU8RJ5V6/mckIfromJ QihZK4kG1kj7r1c5AvTMhamhx0KYIRrEHwy/O3e3eipcQWFUiONH2qQLhBVa6GunKg3gJ9BWUmK 5hJLjQOFIvkz5uQ7MMf/QYCcywVn3aGdhwND7ZWgANd1gDNXiz165NrZZ2Nt6R+lzCYzrmVKk6o incHcHiiBWTx+f2CNNw== X-Authority-Analysis: v=2.4 cv=QsRuG1yd c=1 sm=1 tr=0 ts=6a8ee1a4 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=aZI9m_ZHqXwCzBCL7hMA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXyLktnaf6Xe55 WQWdi9nsiWCmkAbqu7ra1+eLanMZxyAvP2llLHURXdxE86tGHe7Aq1zXD+3s1Z8YsidGbQ66rA5 LvpTQ18TsP1kLgtx9qVFXdDO7Gwlxgc= 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 suspectscore=0 priorityscore=1501 impostorscore=0 spamscore=0 lowpriorityscore=0 clxscore=1015 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748859285158500 From: Zhuoying Cai The secure-IPL-code-loading-attributes facility (SCLAF) provides additional security during secure IPL. Availability of SCLAF is determined by byte 136 bit 3 of the SCLP Read SCP Info. This feature is available starting with the gen16 CPU model. Signed-off-by: Zhuoying Cai Reviewed-by: Collin Walling Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-26-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- docs/specs/s390x-secure-ipl.rst | 18 ++++++++++++++++++ target/s390x/cpu_features.c | 2 ++ target/s390x/cpu_features_def.h.inc | 1 + target/s390x/cpu_models.c | 3 +++ target/s390x/gen-features.c | 2 ++ target/s390x/kvm/kvm.c | 1 + 6 files changed, 27 insertions(+) diff --git a/docs/specs/s390x-secure-ipl.rst b/docs/specs/s390x-secure-ipl.= rst index 113acbeda9..7a603eb956 100644 --- a/docs/specs/s390x-secure-ipl.rst +++ b/docs/specs/s390x-secure-ipl.rst @@ -122,3 +122,21 @@ The guest kernel uses the contents in the IIRB for: * Boot logging: reports which components were loaded and verified. * kexec operations: builds the next kernel=E2=80=99s IPL report from the e= xisting one. * Keying: installs IPL certificates into the platform trusted keyring. + +Secure Code Loading Attributes Facility +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The Secure Code Loading Attributes Facility (SCLAF) enhances system securi= ty +during the IPL by enforcing additional verification rules. + +When SCLAF is available, its behavior depends on the IPL mode. It introduc= es +verification of both signed and unsigned components to help ensure that on= ly +authorized code is loaded during the IPL process. Any errors detected by S= CLAF +are reported in the IIRB. + +Unsigned components are restricted to load addresses at or above absolute +storage address ``0x2000``. + +Signed components must include a Secure Code Loading Attribute Block (SCLA= B), +which is appended at the very end of the component. The SCLAB defines secu= rity +attributes for handling the signed code. diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c index 27f38636a9..c634e74123 100644 --- a/target/s390x/cpu_features.c +++ b/target/s390x/cpu_features.c @@ -120,6 +120,7 @@ void s390_fill_feat_block(const S390FeatBitmap features= , S390FeatType type, * - All SIE facilities because SIE is not available * - DIAG318 * - Secure IPL Facility + * - Secure IPL Code Loading Attributes Facility * * As VMs can move in and out of protected mode the CPU model * doesn't protect us from that problem because it is only @@ -152,6 +153,7 @@ void s390_fill_feat_block(const S390FeatBitmap features= , S390FeatType type, break; case S390_FEAT_TYPE_SCLP_FAC_IPL: clear_be_bit(s390_feat_def(S390_FEAT_SIPL)->bit, data); + clear_be_bit(s390_feat_def(S390_FEAT_SCLAF)->bit, data); break; case S390_FEAT_TYPE_SCLP_FAC139: clear_be_bit(s390_feat_def(S390_FEAT_SIE_ASTFLEIE2)->bit, data); diff --git a/target/s390x/cpu_features_def.h.inc b/target/s390x/cpu_feature= s_def.h.inc index 0153a6aa67..a5aa19112a 100644 --- a/target/s390x/cpu_features_def.h.inc +++ b/target/s390x/cpu_features_def.h.inc @@ -142,6 +142,7 @@ DEF_FEAT(CERT_STORE, "cstore", SCLP_FAC134, 5, "Certifi= cate Store functions") =20 /* Features exposed via SCLP SCCB Facilities byte 136 - 137 (bit numbers r= elative to byte-136) */ DEF_FEAT(SIPL, "sipl", SCLP_FAC_IPL, 1, "Secure-IPL facility") +DEF_FEAT(SCLAF, "sclaf", SCLP_FAC_IPL, 3, "Secure-IPL-code-loading-attribu= tes facility") =20 /* Features exposed via SCLP SCCB Facilities byte 139 (bit numbers relativ= e to byte-139) */ DEF_FEAT(SIE_ASTFLEIE2, "astfleie2", SCLP_FAC139, 1, "SIE: ASTFLE interpre= tation execution facility 2") diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c index 97e77f2bfa..c41d629d68 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c @@ -264,6 +264,7 @@ bool s390_has_feat(S390Feat feat) case S390_FEAT_SIE_PFMFI: case S390_FEAT_SIE_IBS: case S390_FEAT_SIPL: + case S390_FEAT_SCLAF: case S390_FEAT_CONFIGURATION_TOPOLOGY: case S390_FEAT_SIE_ASTFLEIE2: return false; @@ -510,6 +511,8 @@ static void check_consistency(const S390CPUModel *model) { S390_FEAT_DIAG_318, S390_FEAT_EXTENDED_LENGTH_SCCB }, { S390_FEAT_CERT_STORE, S390_FEAT_EXTENDED_LENGTH_SCCB }, { S390_FEAT_SIPL, S390_FEAT_EXTENDED_LENGTH_SCCB }, + { S390_FEAT_SCLAF, S390_FEAT_EXTENDED_LENGTH_SCCB }, + { S390_FEAT_SCLAF, S390_FEAT_SIPL }, { S390_FEAT_NNPA, S390_FEAT_VECTOR }, { S390_FEAT_RDP, S390_FEAT_LOCAL_TLB_CLEARING }, { S390_FEAT_UV_FEAT_AP, S390_FEAT_AP }, diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c index 6bf61447de..a99a75d14e 100644 --- a/target/s390x/gen-features.c +++ b/target/s390x/gen-features.c @@ -723,6 +723,7 @@ static uint16_t full_GEN16_GA1[] =3D { S390_FEAT_SIE_ASTFLEIE2, S390_FEAT_CERT_STORE, S390_FEAT_SIPL, + S390_FEAT_SCLAF, }; =20 static uint16_t full_GEN17_GA1[] =3D { @@ -925,6 +926,7 @@ static uint16_t qemu_MAX[] =3D { S390_FEAT_EXTENDED_LENGTH_SCCB, S390_FEAT_CERT_STORE, S390_FEAT_SIPL, + S390_FEAT_SCLAF, }; =20 /****** END FEATURE DEFS ******/ diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c index 70c9933d7f..b34a912714 100644 --- a/target/s390x/kvm/kvm.c +++ b/target/s390x/kvm/kvm.c @@ -2504,6 +2504,7 @@ bool kvm_s390_get_host_cpu_model(S390CPUModel *model,= Error **errp) =20 /* Some Secure IPL facilities are emulated by QEMU */ set_bit(S390_FEAT_SIPL, model->features); + set_bit(S390_FEAT_SCLAF, model->features); =20 /* Test for Ultravisor features that influence secure guest behavior */ query_uv_feat_guest(model->features); --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748882; cv=none; d=zohomail.com; s=zohoarc; b=P9JmXOAR7nfKeUowM6294dQq4FeWLRwV7lixPP+IJI3A9y82c3jgkUvAqMPYO4MNCkzhYyoRfAbibng695Vb41YhIeM+X9uB59jFB8RVC5db+aJ3vaeeJcFJuqXTuatNSrlG6oQpH/2XEb7aAszP9QNXcLNH6vQ34Pi2gzCsPyc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748882; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=t/wEzNLQnynFbuIJENc5fbdPatu7PC0A76NBKujYSNo=; b=RmTx7PPBWE2Cdcn1zGNSjqb9SS85YMwPAnycw9IDwduzwrV9HZHSKWtYHudQEmKTaTCrkDc53XAVb6OcTMx9M0l94LVmMjaPKD4As8cv72a552KO8K+h7Vvu3dAnJm0OST3GB0WhlrtCrYkVsOL3Ns5d/oDG0tK5W5yD3+IHJ0o= 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 1787748881917574.4570125988004; Wed, 26 Aug 2026 05:54:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7k-00081S-O7; Wed, 26 Aug 2026 08:53:00 -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 1wzD7j-000812-3v; Wed, 26 Aug 2026 08:52:59 -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 1wzD7g-0002qz-20; Wed, 26 Aug 2026 08:52:58 -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 67QCWHKB2878255; Wed, 26 Aug 2026 12:52:54 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 4g726epkmw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52: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.7/8.18.1.7) with ESMTP id 67QCfGNc002972; Wed, 26 Aug 2026 12:52:52 GMT Received: from smtprelay05.dal12v.mail.ibm.com ([172.16.1.7]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7p3qa5nt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:52 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay05.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqpPW31982306 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:51 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 651B45805F; Wed, 26 Aug 2026 12:52:51 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4B6C858059; Wed, 26 Aug 2026 12:52:50 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52: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=t/wEzNLQnynFbuIJE Nc5fbdPatu7PC0A76NBKujYSNo=; b=RVh82adVPqNLPJXK87iG23kVwXmSgBZ1O 2zRw41oWLebkhR7ws9KVh7UHnGOHLrMYGh7Dpv3iaVEF+WZcJ38vkjtq77U0WUF7 YhNHPuUyZ39eZPfeBt5KszfBD4SLBbKWnh02A6n9zwp3FFxwPB6oju/QJzP+zvXX T52S0SETV7sp1WgHFyMyEYs0SzxrJfOwONku7Kdt3qJ7R4pFNTO3EKsOxRIF9qzh 8PMHA+mlFicyB3VGpL8noTJTejIqR1JeIz5ReN3+6HU1YSIIFAy0cpvVgUQWFnAT 8s4RQ6/FMRiUqOccQKDFFzUa8D/Mu3nXE442wTv3G5qRgOuX62Szw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Eric Farman , Collin Walling Subject: [PULL 28/37] pc-bios/s390-ccw: Add additional security checks for secure boot Date: Wed, 26 Aug 2026 08:52:03 -0400 Message-ID: <20260826125213.1901252-29-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-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=TfimcxQh c=1 sm=1 tr=0 ts=6a8ee1a5 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=s9pCXNYtFNHZQuK5kQYA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXzZq4aXdiAaQ2 JLgmm0gi+S7WsjdKvuQ0x9F9ZLldU5uOegfQ3x5ngu+zc/xSLexe9XsvpJRTaKU+lz8DMy5BRcS Qs2N/z3tu4Y6ZWMPAaH4Sj8lzPf7qQw= X-Proofpoint-GUID: h8b1OSG07uV99zKbckmXrMbInMB3DXls X-Proofpoint-ORIG-GUID: h8b1OSG07uV99zKbckmXrMbInMB3DXls X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX8cr95ioXclYF Zf9SXY800t2USibZrhSblYbchP/f7Gg3NcRwsasKAta4nnKKJ/Z4GYIIGmYVx+t3pPShBs0UPA+ cw8gwqPVEhQL43YYBqMXzKdsslGbEjexhHIS0wKRB5xteliawfAnM2+vwMLYNWpsT8aqFsok5D2 3nYLmJ+Ip7WNiw79TSDSZQHm0c5zR920FIThKB6Ce0BVPUX09BsxWQPkW69EAJSbjifkS66E2CM WNV3qPVeZ3ItPd5PL1/dNTMMBOVY8ubf2Jjcl3MbIFV7UTrzpG5i+wFTWfrkxzhewdHdJZUlMkn rZHu64PzPpGNDNTGwsv+wLwqHkjqTL34YH6jK4L3IPDfQ7PpzjQ6GzT3TNUD1FyxkwJAOsOpcGG CUQ5o84G+jispw346qYtJwfRmoKQ/6mT4Aiztm9buflT2tq+yZUPCUxRS5rZcdYff+aVInTPIlH q0ommS7/M3ty3ujxNyA== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 bulkscore=0 malwarescore=0 priorityscore=1501 lowpriorityscore=0 clxscore=1015 phishscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748883403158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Add additional checks to ensure that components do not overlap with signed components when loaded into memory. Add additional checks to ensure the load addresses of unsigned components are greater than or equal to 0x2000. When the secure IPL code loading attributes facility (SCLAF) is installed, all signed components must contain a secure code loading attributes block (SCLAB). The SCLAB provides further validation of information on where to load the signed binary code from the load device, and where to start the execution of the loaded OS code. When SCLAF is installed, its content must be evaluated during secure IPL. Add IPL Information Error Indicators (IIEI) and Component Error Indicators (CEI) for IPL Information Report Block (IIRB). When SCLAF is installed, additional secure boot checks are performed during zipl and store results of verification into IIRB. Signed-off-by: Zhuoying Cai Reviewed-by: Eric Farman Reviewed-by: Collin Walling Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-27-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- include/hw/s390x/ipl/qipl.h | 29 +++++- pc-bios/s390-ccw/sclp.h | 1 + pc-bios/s390-ccw/secure-ipl.c | 179 +++++++++++++++++++++++++++++++++- pc-bios/s390-ccw/secure-ipl.h | 51 ++++++++++ 4 files changed, 255 insertions(+), 5 deletions(-) diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index 5d560a433a..3fa9649112 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -172,10 +172,20 @@ struct IplInfoReportBlockHeader { }; typedef struct IplInfoReportBlockHeader IplInfoReportBlockHeader; =20 +/* IPL Info Error Indicators */ +#define S390_IIEI_NO_SIGNED_COMP 0x8000 /* bit 0 */ +#define S390_IIEI_NO_SCLAB 0x4000 /* bit 1 */ +#define S390_IIEI_NO_GLOBAL_SCLAB 0x2000 /* bit 2 */ +#define S390_IIEI_MORE_GLOBAL_SCLAB 0x1000 /* bit 3 */ +#define S390_IIEI_FOUND_UNSIGNED_COMP 0x800 /* bit 4 */ +#define S390_IIEI_MORE_SIGNED_COMP 0x400 /* bit 5 */ + struct IplInfoBlockHeader { uint32_t len; uint8_t type; - uint8_t reserved1[11]; + uint8_t reserved1[3]; + uint16_t iiei; + uint8_t reserved2[6]; }; typedef struct IplInfoBlockHeader IplInfoBlockHeader; =20 @@ -199,13 +209,28 @@ typedef struct IplSignatureCertificateList IplSignatu= reCertificateList; #define S390_IPL_DEV_COMP_FLAG_SC 0x80 #define S390_IPL_DEV_COMP_FLAG_CSV 0x40 =20 +/* IPL Device Component Error Indicators */ +#define S390_CEI_INVALID_SCLAB 0x80000000 /* bit 0 */ +#define S390_CEI_INVALID_SCLAB_LEN 0x40000000 /* bit 1 */ +#define S390_CEI_INVALID_SCLAB_FORMAT 0x20000000 /* bit 2 */ +#define S390_CEI_UNMATCHED_SCLAB_LOAD_ADDR 0x10000000 /* bit 3 */ +#define S390_CEI_UNMATCHED_SCLAB_LOAD_PSW 0x8000000 /* bit 4 */ +#define S390_CEI_INVALID_LOAD_PSW 0x4000000 /* bit 5 */ +#define S390_CEI_NUC_NOT_IN_GLOBAL_SCLAB 0x2000000 /* bit 6 */ +#define S390_CEI_SCLAB_OLA_NOT_ONE 0x1000000 /* bit 7 */ +#define S390_CEI_SC_NOT_IN_GLOBAL_SCLAB 0x800000 /* bit 8 */ +#define S390_CEI_SCLAB_LOAD_ADDR_NOT_ZERO 0x400000 /* bit 9 */ +#define S390_CEI_SCLAB_LOAD_PSW_NOT_ZERO 0x200000 /* bit 10 */ +#define S390_CEI_INVALID_UNSIGNED_ADDR 0x100000 /* bit 11 */ + struct IplDeviceComponentEntry { uint64_t addr; uint64_t len; uint8_t flags; uint8_t reserved1[5]; uint16_t cert_index; - uint8_t reserved2[8]; + uint32_t cei; + uint8_t reserved2[4]; }; typedef struct IplDeviceComponentEntry IplDeviceComponentEntry; =20 diff --git a/pc-bios/s390-ccw/sclp.h b/pc-bios/s390-ccw/sclp.h index a8a41cd004..cae65b29b5 100644 --- a/pc-bios/s390-ccw/sclp.h +++ b/pc-bios/s390-ccw/sclp.h @@ -52,6 +52,7 @@ typedef struct SCCBHeader { #define SCCB_DATA_LEN (SCCB_SIZE - sizeof(SCCBHeader)) #define SCCB_FAC134_DIAG320_BIT 0x4 #define SCCB_FAC_IPL_SIPL_BIT 0x4000 +#define SCCB_FAC_IPL_SCLAF_BIT 0x1000 =20 typedef struct ReadInfo { SCCBHeader h; diff --git a/pc-bios/s390-ccw/secure-ipl.c b/pc-bios/s390-ccw/secure-ipl.c index fd3455cf67..f86ed85176 100644 --- a/pc-bios/s390-ccw/secure-ipl.c +++ b/pc-bios/s390-ccw/secure-ipl.c @@ -180,6 +180,12 @@ bool secure_ipl_supported(void) return false; } =20 + if (!sclp_is_fac_ipl_flag_on(SCCB_FAC_IPL_SCLAF_BIT)) { + puts("Secure IPL Code Loading Attributes Facility is not supported= by" + " the hypervisor!"); + return false; + } + return true; } =20 @@ -210,6 +216,156 @@ static void check_comp_overlap(IplDeviceComponentList= *comp_list, } } =20 +static bool is_psw_valid(uint64_t psw, IplDeviceComponentEntry *comp) +{ + uint32_t addr =3D psw & 0x7fffffff; + + /* + * PSW points within a signed binary code component + * + * Check addr falls within [comp->addr, comp->addr + comp->len - 2], + * ensuring at least 2 bytes (minimum instruction length) remain. + */ + return intersects(addr, 1, comp->addr, comp->len - 1); +} + +void check_global_sclab(const SclaBlock *global_sclab, + IplDeviceComponentEntry *comp_entry, + IplDeviceComponentList *comp_list) +{ + bool psw_valid =3D false; + bool global_psw_valid =3D false; + int signed_count =3D 0; + int unsigned_count =3D 0; + IplDeviceComponentEntry *comp; + + if (!global_sclab) { + comp_list->ipl_info_header.iiei |=3D S390_IIEI_NO_GLOBAL_SCLAB; + zipl_secure_error("Global SCLAB does not exist"); + return; + } + + for_each_rb_entry(comp, comp_list) { + if (comp->flags & S390_IPL_DEV_COMP_FLAG_SC) { + psw_valid |=3D is_psw_valid(comp_entry->addr, comp); + global_psw_valid |=3D is_psw_valid(global_sclab->load_psw, com= p); + signed_count +=3D 1; + } else { + unsigned_count +=3D 1; + } + } + + /* validate load PSW with PSW specified in the final entry */ + zipl_secure_validate(psw_valid && global_psw_valid, &comp_entry->cei, + S390_CEI_INVALID_LOAD_PSW, "Invalid PSW"); + + /* compare load PSW with the PSW specified in component */ + zipl_secure_validate(global_sclab->load_psw =3D=3D comp_entry->addr, + &comp_entry->cei, S390_CEI_UNMATCHED_SCLAB_LOAD_P= SW, + "Load PSW does not match with PSW in component"); + + /* Unsigned components are not allowed if NUC flag is set in the globa= l SCLAB */ + if ((global_sclab->flags & S390_SCLAB_NUC) && unsigned_count > 0) { + comp_list->ipl_info_header.iiei |=3D S390_IIEI_FOUND_UNSIGNED_COMP; + zipl_secure_error("Unsigned components are not allowed"); + } + + /* + * Only one signed component is allowed if SC flag is set in the globa= l SCLAB + * More than one component in the component table is not allowed + */ + if ((global_sclab->flags & S390_SCLAB_SC) && + (signed_count !=3D 1 || unsigned_count !=3D 0)) { + comp_list->ipl_info_header.iiei |=3D S390_IIEI_MORE_SIGNED_COMP; + zipl_secure_error("Only one signed component is allowed"); + } +} + +static void check_sclab(SclaBlock **global_sclab, + IplDeviceComponentEntry *comp_entry, + IplInfoBlockHeader *comp_list_hdr) +{ + SclabOriginLocator *sclab_locator; + SclaBlock *sclab; + + /* must be large enough to locate the sclab locator, else implies inva= lid SCLAB */ + zipl_secure_validate(comp_entry->len >=3D 8, &comp_entry->cei, + S390_CEI_INVALID_SCLAB, + "Signed component too short to contain SCLAB loca= tor"); + + if (comp_entry->cei & S390_CEI_INVALID_SCLAB) { + return; + } + + /* sclab locator is located at the last 8 bytes of the signed comp */ + sclab_locator =3D (SclabOriginLocator *)(comp_entry->addr + + comp_entry->len - 8); + + /* return early if sclab does not exist */ + zipl_secure_validate(magic_match(sclab_locator->magic, ZIPL_MAGIC), + &comp_entry->cei, S390_CEI_INVALID_SCLAB, + "Magic does not match. SCLAB does not exist"); + + if (comp_entry->cei & S390_CEI_INVALID_SCLAB) { + return; + } + + zipl_secure_validate(sclab_locator->len >=3D S390_SCLAB_MIN_LEN, &comp= _entry->cei, + S390_CEI_INVALID_SCLAB_LEN | S390_CEI_INVALID_SCL= AB, + "Invalid SCLAB length"); + + /* return early if sclab is invalid */ + if (comp_entry->cei & S390_CEI_INVALID_SCLAB) { + return; + } + + sclab =3D (SclaBlock *)(comp_entry->addr + comp_entry->len - + sclab_locator->len); + + zipl_secure_validate(sclab->format =3D=3D 0, &comp_entry->cei, + S390_CEI_INVALID_SCLAB_FORMAT, + "Format-0 SCLAB is not being used"); + + if (!(sclab->flags & S390_SCLAB_OPSW)) { + /* OPSW =3D 0 - Load PSW field in SCLAB must contain zeros */ + zipl_secure_validate(sclab->load_psw =3D=3D 0, &comp_entry->cei, + S390_CEI_SCLAB_LOAD_PSW_NOT_ZERO, + "Load PSW is not zero when Override PSW bit i= s zero"); + } else { + /* OPSW =3D 1 indicating global SCLAB */ + if (*global_sclab) { + comp_list_hdr->iiei |=3D S390_IIEI_MORE_GLOBAL_SCLAB; + zipl_secure_error("More than one global SCLAB"); + } + *global_sclab =3D sclab; + + /* override load address flag must set to one */ + zipl_secure_validate(sclab->flags & S390_SCLAB_OLA, &comp_entry->c= ei, + S390_CEI_SCLAB_OLA_NOT_ONE, + "OLA flag is not set to one in the global SCL= AB"); + } + + if (!(sclab->flags & S390_SCLAB_OLA)) { + /* OLA =3D 0 - Load address field in SCLAB must contain zeros */ + zipl_secure_validate(sclab->load_addr =3D=3D 0, &comp_entry->cei, + S390_CEI_SCLAB_LOAD_ADDR_NOT_ZERO, + "Load Address is not zero when OLA flag is ze= ro"); + } else { + /* OLA =3D 1 - Load address field must match storage address of th= e component */ + zipl_secure_validate(sclab->load_addr =3D=3D comp_entry->addr, &co= mp_entry->cei, + S390_CEI_UNMATCHED_SCLAB_LOAD_ADDR, + "Load Address does not match with component l= oad address"); + } + + zipl_secure_validate(~sclab->flags & S390_SCLAB_NUC || sclab->flags & = S390_SCLAB_OPSW, + &comp_entry->cei, S390_CEI_NUC_NOT_IN_GLOBAL_SCLA= B, + "NUC bit is set, but not in the global SCLAB"); + + zipl_secure_validate(~sclab->flags & S390_SCLAB_SC || sclab->flags & S= 390_SCLAB_OPSW, + &comp_entry->cei, S390_CEI_SC_NOT_IN_GLOBAL_SCLAB, + "SC bit is set, but not in the global SCLAB"); +} + static int zipl_load_signature(ComponentEntry *entry, uint64_t sig) { if (entry->compdat.sig_info.format !=3D DER_SIGNATURE_FORMAT) { @@ -275,6 +431,8 @@ int zipl_run_secure(ComponentEntry **entry_ptr, const u= int8_t *tmp_sec, uint8_t *tmp_buf; bool verified; bool signed_found =3D false; + bool sclab_found =3D false; + SclaBlock *global_sclab =3D NULL; =20 if ((MAX_SIGNED_COMP * CERT_BUF_MAX_LEN) > CERT_BUF_SIZE) { panic("Not enough memory to store certificates"); @@ -315,6 +473,10 @@ int zipl_run_secure(ComponentEntry **entry_ptr, const = uint8_t *tmp_sec, =20 /* no signature present (unsigned component) */ if (!sig_entry.len) { + zipl_secure_validate(comp_entry.addr >=3D S390_UNSIGNED_MI= N_ADDR, + &comp_entry.cei, S390_CEI_INVALID_UNSIGNED_ADD= R, + "Load address for unsigned component is less t= han 0x2000"); + comp_list_add(comp_list, comp_entry); break; } @@ -326,6 +488,9 @@ int zipl_run_secure(ComponentEntry **entry_ptr, const u= int8_t *tmp_sec, comp_entry.flags =3D S390_IPL_DEV_COMP_FLAG_SC; signed_found =3D true; =20 + check_sclab(&global_sclab, &comp_entry, &comp_list->ipl_info_h= eader); + sclab_found |=3D !(comp_entry.cei & S390_CEI_INVALID_SCLAB); + cert_entry =3D (IplSignatureCertificateEntry) { 0 }; verified =3D verify_signature(comp_entry, sig_entry, &cert_entry.len, &cert_table_idx); @@ -371,9 +536,17 @@ int zipl_run_secure(ComponentEntry **entry_ptr, const = uint8_t *tmp_sec, } } =20 - if (!signed_found) { - zipl_secure_error("Secure boot is on, but components are not signe= d"); - } + zipl_secure_validate(signed_found, &comp_list->ipl_info_header.iiei, + S390_IIEI_NO_SIGNED_COMP, + "Secure boot is on, but components are not signed= "); + + zipl_secure_validate(sclab_found, &comp_list->ipl_info_header.iiei, + S390_IIEI_NO_SCLAB, "No recognizable SCLAB"); + + comp_entry =3D (IplDeviceComponentEntry){ 0 }; + comp_entry.addr =3D entry->compdat.load_psw; + check_global_sclab(global_sclab, &comp_entry, comp_list); + comp_list_add(comp_list, comp_entry); =20 *entry_ptr =3D entry; free((void *)sig_entry.addr); diff --git a/pc-bios/s390-ccw/secure-ipl.h b/pc-bios/s390-ccw/secure-ipl.h index d495dd5d04..ce354b4d6a 100644 --- a/pc-bios/s390-ccw/secure-ipl.h +++ b/pc-bios/s390-ccw/secure-ipl.h @@ -26,6 +26,33 @@ int zipl_run_secure(ComponentEntry **entry_ptr, const ui= nt8_t *tmp_sec, IplSignatureCertificateList *cert_list, uint8_t **tmp_cert_buf); =20 +#define S390_SCLAB_OPSW 0x8000 /* override PSW flag */ +#define S390_SCLAB_OLA 0x4000 /* override load address flag */ +#define S390_SCLAB_NUC 0x2000 /* no unsigned components flag */ +#define S390_SCLAB_SC 0x1000 /* single component flag */ + +#define S390_SCLAB_MIN_LEN 32 +#define S390_UNSIGNED_MIN_ADDR 0x2000 + +/* Secure Code Loading Attributes Block */ +struct SclaBlock { + uint8_t format; + uint8_t reserved1; + uint16_t flags; + uint8_t reserved2[4]; + uint64_t load_psw; + uint64_t load_addr; + uint64_t reserved3[]; +} __attribute__ ((packed)); +typedef struct SclaBlock SclaBlock; + +struct SclabOriginLocator { + uint8_t reserved[2]; + uint16_t len; + uint8_t magic[4]; +} __attribute__ ((packed)); +typedef struct SclabOriginLocator SclabOriginLocator; + static inline void zipl_secure_error(const char *message) { switch (boot_mode) { @@ -41,6 +68,30 @@ static inline void zipl_secure_error(const char *message) } } =20 +static inline void zipl_secure_validate_u16(bool condition, uint16_t *flag= s, + uint16_t flag, const char *mes= sage) +{ + if (!condition) { + *flags |=3D flag; + zipl_secure_error(message); + } +} + +static inline void zipl_secure_validate_u32(bool condition, uint32_t *flag= s, + uint32_t flag, const char *mes= sage) +{ + if (!condition) { + *flags |=3D flag; + zipl_secure_error(message); + } +} + +#define zipl_secure_validate(condition, flags, flag, message) \ + _Generic((flags), \ + uint16_t * : zipl_secure_validate_u16, \ + uint32_t * : zipl_secure_validate_u32 \ + )(condition, flags, flag, message) + static inline uint64_t _diag320(void *data, unsigned long subcode) { register unsigned long addr asm("0") =3D (unsigned long)data; --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748966; cv=none; d=zohomail.com; s=zohoarc; b=lmYqG07bk/PX6VwMPzzlV7n6pSZIH7x5s97LkwT8vetfYKciLRkp+6vLMtL0Bp7UvT+RtobyV5dyqDT7dG7kjhGuVtIRCoLC4xZ8QzrSt5I5yBKGX8irPfNe+I6Ypn6MXpsmOKLL1VoovEHdKqg3moIaqmXgosIU6vAQZaaeWaQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748966; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=9YI5Hrw3Z+WGIP+8DGcJ36TKKa6kwfNfjC04/9KDhwk=; b=lNsnglUj9NNw/JnyVgdVA1PgH5kh4aqHJ/29pEfskNXmiRdjE/i5qSPlz6NLraEEPjhToeqcoj9LzQwwN7G8wib8AHKOGorOqeA1KOm31PuXZUqwucRbnSZUjAB8qXnIY2fpsPayQkb+gUDY5QooIdbiQCe5B9nW8vU4GNGzBxw= 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 1787748966120866.2425725641632; Wed, 26 Aug 2026 05:56:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD8h-0000uv-O6; Wed, 26 Aug 2026 08:54: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 1wzD88-0008SQ-FS; Wed, 26 Aug 2026 08:53:24 -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 1wzD81-0002rV-9A; Wed, 26 Aug 2026 08:53:20 -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 67QCVqx43977409; Wed, 26 Aug 2026 12:52:55 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 4g73946pdh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:55 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfIni006718; Wed, 26 Aug 2026 12:52:54 GMT Received: from smtprelay06.dal12v.mail.ibm.com ([172.16.1.8]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7pfwa2u7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:54 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay06.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqqjM55836928 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:53 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AF4F75805C; Wed, 26 Aug 2026 12:52:52 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9416F58059; Wed, 26 Aug 2026 12:52:51 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52: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=9YI5Hrw3Z+WGIP+8D GcJ36TKKa6kwfNfjC04/9KDhwk=; b=G9KjUB+tkQHjOsp/HHpRECstypxOkEhNR ko5YxJRV4IQYRz8C341FTL8XbYtsDYirwrzh0jO7c4IBizTYof44ZzCmIjx2MvS5 83X9bUUfY244V6+5TJvYMCyXkGh+1ow3Ik+BpGWliNknfd69M2rcGGp21BWVctaD AwKqelXZoDc5hbBy3Frsitc2R53Zq8Ay14FzNhVrGNrB/mwhhcT4USAxzTzeWOK5 MFUcbxW6I+T2rwJ2fZ+5cZFFKRQESTqNRRpjXDxB4bJwtiigKw1bF9LaHE7yZWgb HDq4Zq6p/WaQHd9U8m1g+gRge8JY5WjOcnCAK3pm1Xo3mZxnUCSng== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Thomas Huth , Collin Walling , Eric Farman Subject: [PULL 29/37] Add secure-boot to s390-ccw-virtio machine type option Date: Wed, 26 Aug 2026 08:52:04 -0400 Message-ID: <20260826125213.1901252-30-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 3LrveXuvvCjV8vMIjmmfzTfDwSmKJvO0 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX7zOW5bYMd15s Iwegil08nlEavcp5TxeEvL2f/2NXNcMbmjzfdSQoUQGmQICl33iRFid+5HJ0G31f85HEL20Nyvh eTXVKPt1gYvdW2JKJ88NikVeN2wybLXcddsLAZBQIwrIJEiTrWX3fPCKQpO3+m6uAejxajLp0A0 tP21FJJeVMyCWiqPuvfhkP4KyF4KOpy2TFEHzXaGeCEOYvegPWqge4c3tDMOFuJAX00W+ULe7qG 2tJ7MJVMNwdVUk55m92iFvyCv14hMYo5igj9OhaP4sk5o1EkvXoqx7HPNbatpn/mhQX9s7aQEYf g/FcRiGtd0Q8OT/12ewGRj3fpT5RPxvrmOJsKQg9Q+nF4AoxiLeRDSePK8CZztqxWSX7202OPej TLphIP3qLRJEwWMe12GKF+dKARB4JhzErcdguJGgmlF6drZEu1qGA2Dx62frlOBB7s3D+oa8ie7 1B2XhHWZS7/4p7fNcjw== X-Authority-Analysis: v=2.4 cv=Y/nIdBeN c=1 sm=1 tr=0 ts=6a8ee1a7 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=ZvnaDWGK54Hqr3b-QrcA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXyy0+VrSIvmOk Kn43y/j+4YbctZJxHc8irNRS8ZnobVGo064gcgMTaLEkah0YhhMF1GsYYRVhsCvZlEej0YcqMAh DYkMpywsjnbbuwAEE+ZPH4Q6yboEg7c= X-Proofpoint-ORIG-GUID: 3LrveXuvvCjV8vMIjmmfzTfDwSmKJvO0 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 impostorscore=0 priorityscore=1501 adultscore=0 bulkscore=0 suspectscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748967984158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Add secure-boot as a parameter of s390-ccw-virtio machine type option. The `secure-boot=3Don|off` parameter is implemented to enable secure IPL. By default, secure-boot is set to false if not specified in the command line. Signed-off-by: Zhuoying Cai Reviewed-by: Thomas Huth Reviewed-by: Collin Walling Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-28-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- docs/system/s390x/secure-ipl.rst | 22 +++++++++++++++++----- hw/s390x/s390-virtio-ccw.c | 29 +++++++++++++++++++++++++++++ include/hw/s390x/s390-virtio-ccw.h | 2 ++ qemu-options.hx | 6 +++++- 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/docs/system/s390x/secure-ipl.rst b/docs/system/s390x/secure-ip= l.rst index cf6ccf5d57..9e3955f8fc 100644 --- a/docs/system/s390x/secure-ipl.rst +++ b/docs/system/s390x/secure-ipl.rst @@ -19,20 +19,32 @@ Note: certificate files must have a .pem extension. =20 qemu-system-s390x -machine s390-ccw-virtio,boot-certs.0.path=3D/.../qe= mu/certs,boot-certs.1.path=3D/another/path/cert.pem ... =20 +Enabling Secure IPL +^^^^^^^^^^^^^^^^^^^ + +Secure IPL is enabled by explicitly setting ``secure-boot=3Don``; if not +specified, secure boot is considered off. + +.. code-block:: shell + + qemu-system-s390x -machine s390-ccw-virtio,secure-boot=3Don|off + =20 IPL Modes --------- =20 Multiple IPL modes are available to differentiate between the various IPL -configurations. These modes are mutually exclusive and enabled based on the -``boot-certs`` option on the QEMU command line. +configurations. These modes are mutually exclusive and enabled based on sp= ecific +combinations of the ``secure-boot`` and ``boot-certs`` options on the QEMU +command line. =20 Normal Mode ^^^^^^^^^^^ =20 -The absence of certificates will attempt to IPL a guest without secure IPL -operations. No checks are performed, and no warnings/errors are reported. -This is the default mode. +The absence of both certificates and the ``secure-boot`` option will attem= pt to +IPL a guest without secure IPL operations. No checks are performed, and no +warnings/errors are reported. This is the default mode, and can be explic= itly +enabled with ``secure-boot=3Doff``. =20 Configuration: =20 diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index fe3a84f238..17266779a6 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -817,6 +817,27 @@ static void machine_set_boot_certs(Object *obj, Visito= r *v, const char *name, ms->boot_certs =3D cert_list; } =20 +static inline bool machine_get_secure_boot(Object *obj, Error **errp) +{ + S390CcwMachineState *ms =3D S390_CCW_MACHINE(obj); + + return ms->secure_boot; +} + +static inline void machine_set_secure_boot(Object *obj, bool value, + Error **errp) +{ + S390CcwMachineClass *s390mc =3D S390_CCW_MACHINE_GET_CLASS(obj); + S390CcwMachineState *ms =3D S390_CCW_MACHINE(obj); + + if (!s390mc->use_secure) { + error_setg(errp, "secure-boot is not supported by this machine ver= sion"); + return; + } + + ms->secure_boot =3D value; +} + /* * S390x-specific global compatibility properties. * @@ -843,6 +864,7 @@ static void ccw_machine_class_init(ObjectClass *oc, con= st void *data) s390mc->max_threads =3D 1; s390mc->use_cpi =3D true; s390mc->use_certs =3D true; + s390mc->use_secure =3D true; mc->reset =3D s390_machine_reset; mc->block_default_type =3D IF_VIRTIO; mc->no_cdrom =3D 1; @@ -891,6 +913,12 @@ static void ccw_machine_class_init(ObjectClass *oc, co= nst void *data) machine_get_boot_certs, machine_set_boot_cer= ts, NULL, NULL); object_class_property_set_description(oc, "boot-certs", "provide paths to a directory and/or a certificate file for se= cure boot"); + + object_class_property_add_bool(oc, "secure-boot", + machine_get_secure_boot, + machine_set_secure_boot); + object_class_property_set_description(oc, "secure-boot", + "enable/disable secure boot"); } =20 static inline void s390_machine_initfn(Object *obj) @@ -979,6 +1007,7 @@ static void ccw_machine_11_1_class_options(MachineClas= s *mc) S390CcwMachineClass *s390mc =3D S390_CCW_MACHINE_CLASS(mc); =20 s390mc->use_certs =3D false; + s390mc->use_secure =3D false; =20 ccw_machine_11_2_class_options(mc); compat_props_add(mc->compat_props, hw_compat_11_1, hw_compat_11_1_len); diff --git a/include/hw/s390x/s390-virtio-ccw.h b/include/hw/s390x/s390-vir= tio-ccw.h index d30f1fcc4c..dcac486bc4 100644 --- a/include/hw/s390x/s390-virtio-ccw.h +++ b/include/hw/s390x/s390-virtio-ccw.h @@ -29,6 +29,7 @@ struct S390CcwMachineState { bool aes_key_wrap; bool dea_key_wrap; bool pv; + bool secure_boot; uint8_t loadparm[8]; uint64_t memory_limit; uint64_t max_pagesize; @@ -58,6 +59,7 @@ struct S390CcwMachineClass { int max_threads; bool use_cpi; bool use_certs; + bool use_secure; }; =20 #endif diff --git a/qemu-options.hx b/qemu-options.hx index 107f74aeb5..562c4c2b03 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -47,7 +47,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ " cxl-fmw.0.targets.0=3Dfirsttarget,cxl-fmw.0.targets.1= =3Dsecondtarget,cxl-fmw.0.size=3Dsize[,cxl-fmw.0.interleave-granularity=3Dg= ranularity]\n" " sgx-epc.0.memdev=3Dmemid,sgx-epc.0.node=3Dnumaid\n" " smp-cache.0.cache=3Dcachename,smp-cache.0.topology=3D= topologylevel\n" - " boot-certs.0.path=3D/path/directory,boot-certs.1.path= =3D/path/file provides paths to a directory and/or a certificate file\n", + " boot-certs.0.path=3D/path/directory,boot-certs.1.path= =3D/path/file provides paths to a directory and/or a certificate file\n" + " secure-boot=3Don|off enable/disable secure boot (defa= ult=3Doff)\n", QEMU_ARCH_ALL) SRST ``-machine [type=3D]name[,prop=3Dvalue[,...]]`` @@ -218,6 +219,9 @@ SRST =20 ``boot-certs.0.path=3D/path/directory,boot-certs.1.path=3D/path/file`` Provide paths to a directory and/or a certificate file on the host= [s390x only]. + + ``secure-boot=3Don|off`` + Enables or disables secure boot on s390-ccw guest. The default is = off. ERST =20 DEF("M", HAS_ARG, QEMU_OPTION_M, --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748952; cv=none; d=zohomail.com; s=zohoarc; b=PRU0L44OJasGby2mCHQGabuYj7cjakoEwDf8HpJ554c4T6uRGIAKYNknY2kjmJZz5+ZW1Uw7m+zCNgW9Q9Z1vRP90EPGX27zIk6m0vCB7uNdMrIj21YIIkYRiwUpML4a1oO4JMyRlG82SWdT7uTjCcezNQk9qQzWztH3qxNl80c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748952; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=zkh+Z1fZjJrPWsSu4DS5vnmhr7ojtzYLLwlW1mYcLRw=; b=MHqSQMC0h/Fqs0BrPhFZlvH6SnhfCkwLhPCVg8W7ieNZtuzs/6En5do+M7Vgzud6BumYAnw9JI7TJc0GCopdAWIvchi/xHsdWkqeSslyYmD1nXcYv6628evAPBf/J4FHyREH++87i3T69QYbOn3NtDalUEbRJ3m+IMEmhyHoKtQ= 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 1787748952145139.12236313425979; Wed, 26 Aug 2026 05:55:52 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD90-0001SS-26; Wed, 26 Aug 2026 08:54: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 1wzD88-0008ST-Fs; Wed, 26 Aug 2026 08:53:24 -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 1wzD82-0002rs-Gi; Wed, 26 Aug 2026 08:53:20 -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 67QCVrtk3977437; Wed, 26 Aug 2026 12:52:56 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 4g73946pdk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:56 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfcjo002476; Wed, 26 Aug 2026 12:52:55 GMT Received: from smtprelay01.wdc07v.mail.ibm.com ([172.16.1.68]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7q3k1xy5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:55 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay01.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqsDW58786178 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:54 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E8FDD5805B; Wed, 26 Aug 2026 12:52:53 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DE02258059; Wed, 26 Aug 2026 12:52:52 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:52 +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=zkh+Z1fZjJrPWsSu4 DS5vnmhr7ojtzYLLwlW1mYcLRw=; b=M3QaSwAPnqAN1Y88UaFInp6pAGg8M1zOu SPZOoYYB3c3zXZ3rNyWt/rSwJeByA2kALAm7V4r5MYM/94Dyd1hnl/Q9SOcC2XXe wH0KsYouw/+NIFUoawHKzpQ5XE8fX3w67sqYSVizPne4QwLThVYZYwcVA8Cs27+Z KjGNPSHCEWhGPaHmrZtfUTysUj9R9uTfOoPnOxFKzvI3HlXJLe5GhmXgMNDlLcSB s/eNCOjBmM8Lpqtvgdrx/bGwiiX0BTeFkcOQXAodLCa/F9/65CEz6WOSm4OpC2mi pQ9aZ+XYYC9E7mLY+fKMoSv7b8KzeYbI4N+GPucGJ2mppinrUbPnA== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Thomas Huth , Collin Walling , Eric Farman Subject: [PULL 30/37] hw/s390x/ipl: Set IPIB flags for secure IPL Date: Wed, 26 Aug 2026 08:52:05 -0400 Message-ID: <20260826125213.1901252-31-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: xhG9hnAxWbPz7wfYlrMFJ5kgv31JWZaI X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX+1Ru0qdLapDl srVppmo28uY9BaO6GuYBC+3PCiUYPz85QJJsaTNUANK+nhg4dbH5FEqICn6A0qTemsu4VR4c76h 3f6J8o3BUness10wziyr89ia16q52dtteFl779NQ5Uh1xmrXFVMRdwb25KyIKVLCvmBwW/L/7LZ olrutTnO47l/IM29H1R7cA80QmZZLMWI0BvXKNBCmmZsMQyWPaSQ+lXwzEQliomwoMTL9f3iEYr PSLtt24ECUzDzdms6lshNEzHO4mxrQtMRyPlN+VnXbbU8L8X/jEzB96kyyxZH+VY3eMgsqPniVG ej0PYlYnXlPWnM882pjTqOJ7RpXSTnhnP9Fjsao+9lzruwqQ8NbCnpiJKW9VI+QJqXIqEdFO8nD UVkb5oXXVQ+lqe4TQ0cAsEfU3pG0EEEyZXNugHO/gc8HCBDzg1GS7nrEZtzkib1zzgg6QBNFStJ MVWeaWA1+9YmYbnwkDQ== X-Authority-Analysis: v=2.4 cv=Y/nIdBeN c=1 sm=1 tr=0 ts=6a8ee1a8 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=MUQpW0jNMHjpGy_Q9scA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX7GERS6VSHH5/ tUVGjaNmtb+XvCktSPbyzdehx8GWrpjfr7bD+qYkhzjBgADgrJI5ieu9q71ZZqnDHjUbpp/8eDc sCIEV1wwZXQVcM1eAD+oEKcAbMY1jhI= X-Proofpoint-ORIG-GUID: xhG9hnAxWbPz7wfYlrMFJ5kgv31JWZaI 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 impostorscore=0 priorityscore=1501 adultscore=0 bulkscore=0 suspectscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748953716158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai If `-M secure-boot=3Don` is specified on the command line option, indicating true secure IPL enabled, set Secure-IPL bit and IPL-Information-Report bit on in IPIB Flags field, and trigger true secure IPL in the S390 BIOS. Any error that occurs during true secure IPL will cause the IPL to terminate. Signed-off-by: Zhuoying Cai Reviewed-by: Thomas Huth Reviewed-by: Collin Walling Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-29-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- hw/s390x/ipl.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index d0dbf47d74..08294af4d0 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -468,15 +468,30 @@ static bool s390_has_certificate(void) return ipl->cert_store.count > 0; } =20 +static bool s390_secure_boot_enabled(void) +{ + return S390_CCW_MACHINE(qdev_get_machine())->secure_boot; +} + static void s390_set_secure_boot_flags(IplParameterBlock *iplb, - bool audit_mode) + bool secure_boot, bool audit_mode) { - if (!audit_mode) { + if (!secure_boot && !audit_mode) { return; } =20 /* - * For audit mode, enable the IPL Information + * If secure-boot is enabled, then toggle the secure IPL flags (SIPL) = to + * trigger secure boot in the s390 BIOS. + * + * Boot process will terminate if any error occurs during secure boot. + */ + if (secure_boot) { + iplb->hdr_flags |=3D DIAG308_IPIB_FLAGS_SIPL; + } + + /* + * For both secure boot and audit mode, enable the IPL Information * Report (IPLIR) flag so that the firmware generates an IPL * Information Report Block (IIRB). * @@ -545,7 +560,8 @@ 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_set_secure_boot_flags(iplb, s390_has_certificate()); + s390_set_secure_boot_flags(iplb, s390_secure_boot_enabled(), + s390_has_certificate()); =20 return true; } @@ -699,7 +715,9 @@ void s390_ipl_update_diag308(IplParameterBlock *iplb) * The kernel does not preserve secure boot flags across a reboot. * Re-apply them here based on the current machine configuration. */ - s390_set_secure_boot_flags(&ipl->iplb, s390_has_certificate()); + s390_set_secure_boot_flags(&ipl->iplb, + s390_secure_boot_enabled(), + s390_has_certificate()); } =20 update_machine_ipl_properties(iplb); --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748960; cv=none; d=zohomail.com; s=zohoarc; b=Atrh/uxl6Eo9LvL+5zCTEXBYwD6GcYkUZBok4ttMiU51OevNHwSToOL7WjunaANmF4x+xIfCvAbt3UbbSZJHQxNtaZo4NYVfud/lIuM2NekzJaQ8O5Z41f6FOBgUO10JcZX1UkZXc41+qnNH86vFKFpa4y5vhJRhulSaVrrM9HM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748960; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=gRwwb9Uo9FhtQS+4JjYZs+X0fYv3wIvAS3wKJpD9uv4=; b=W2U1c63EiyFwR8YQlVjQZLfzbMoMh5I9Dj+bmHmksM8eqL/IPrm4KXEipj5jiRYaebA7SjphpeTRx+Glbt6jopeWClc80Q2YdJ7yh98Ocr9AQUjjKgTYTV8ZN7cAv+mFDBiuDN8JP295wR/0zszPXmXuYlvvD6iu98Ofy9IA3y8= 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 178774896026367.61124791967006; Wed, 26 Aug 2026 05:56:00 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD8c-0000m5-3M; Wed, 26 Aug 2026 08:53:55 -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 1wzD8E-0000AA-OM; Wed, 26 Aug 2026 08:53:31 -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 1wzD83-0002sJ-Cx; Wed, 26 Aug 2026 08:53:30 -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 67QCW8Oj3978118; Wed, 26 Aug 2026 12:52:57 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 4g73946pdn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:57 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfPiP006769; Wed, 26 Aug 2026 12:52:56 GMT Received: from smtprelay02.wdc07v.mail.ibm.com ([172.16.1.69]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7pfwa2ub-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:56 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay02.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqthA31457914 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:55 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0A83F5805B; Wed, 26 Aug 2026 12:52:55 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 252AA58059; Wed, 26 Aug 2026 12:52:54 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:54 +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=gRwwb9Uo9FhtQS+4J jYZs+X0fYv3wIvAS3wKJpD9uv4=; b=ZYgXlTvQZjSTWEnlU0Q4xFjSGixqEkXqM 6ghE2FPE1j3ewwlQPTIgXWMUJjnowvUqqNeXH8ITaOpgrcKEJIzJZg7BYX+ZmP6Y 86fQaHyGLG0wJtH6tsyWygb8yP4hdbHYnJNBspYraIDFRtl7u98ioHbHgS9H/uhP 6XE7mH7jv/uZxi7lnwrDlWtrSTe/I8Ky/Db912XI7rhP9msN1AK1mLFNgd0n1Eel hlCZRVxYSdCRxDNR2jue+FqIauhZlqmohMkR6JzDBobXF+2wJCOkAKywTdq22k/9 fVAIe3BRTvrXgrAyeibpbujJuZ57OlDlYNjhfvYktYP+HKX/3KlJw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Collin Walling , Eric Farman Subject: [PULL 31/37] pc-bios/s390-ccw: Handle true secure IPL mode Date: Wed, 26 Aug 2026 08:52:06 -0400 Message-ID: <20260826125213.1901252-32-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 56GG81ghafrSPUlMnzIyua0v3dDSJ1cn X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX2B+Yp+yMnAXU peRn4F1ikS1rgyq3TZH3dKNOx0Z+S2X2gbqr4rMEyel/BiypLfRnbOqFjkQQqCfVTUdU5STNq4C NobduQEeNGe4joD1ckoJGhC4Qp+GqOjOjrKz62DdeZf8SHBYC+1STKCFpbq3+fGbje9/HT7xcye 7pua6kz4OD2Vf7YvT9b9Cxqlkv3UViidc8UR+biLu6C5p1DyJHrMrHVrnnFaJ3rBMQG4J2O2fPl Ps5KbAFK/3EXCqACA6xxvi923UzPMw7uppYokX7JJSB3DAH9O3tIE8VO0cmAxdGOMz+GXKfdvNI DyYeeTBPpUFf2c/9KMBN2iEpTNfx0pdCeAMTcESOD/jQN0ojMpqNDuuwJ/ihuxuYD5wRQPm+gxO kOq70FDditJiK2Agb9RIXby4tXYqyA9TLfGPNWpfPnjEjdyaJN82NCiz0Yna9j/80b5xC/rZJxc TjPDv1vCcJ46mK9RfvA== X-Authority-Analysis: v=2.4 cv=Y/nIdBeN c=1 sm=1 tr=0 ts=6a8ee1a9 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=f2vt_NpQTvy9KJbTYrsA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX7K2O/Hnrx5PV VBYbiOM/B3K6XZNJRJjfxbAUVZ/D1EzfoI+QpNNjddyF51xTiWr/woyLBEZqKOALqxEUkHRWIx0 RJnLrzNad+IFLXwCb3BRLk2X3SP3ePw= X-Proofpoint-ORIG-GUID: 56GG81ghafrSPUlMnzIyua0v3dDSJ1cn 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 impostorscore=0 priorityscore=1501 adultscore=0 bulkscore=0 suspectscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748961797158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai When secure boot is enabled (-secure-boot on) and certificate(s) are provided, the boot operates in True Secure IPL mode. Any verification error during True Secure IPL mode will cause the entire boot process to terminate. Secure IPL in audit mode requires at least one certificate provided in the key store along with necessary facilities. If secure boot is enabled but no certificate is provided, the boot process will also terminate, as this is not a valid secure boot configuration. Note: True Secure IPL mode is implemented for the SCSI scheme of virtio-blk/virtio-scsi devices. Signed-off-by: Zhuoying Cai Reviewed-by: Collin Walling Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-30-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- docs/system/s390x/secure-ipl.rst | 13 +++++++++++++ hw/s390x/ipl.c | 3 ++- pc-bios/s390-ccw/bootmap.c | 6 +++++- pc-bios/s390-ccw/main.c | 7 ++++++- pc-bios/s390-ccw/s390-ccw.h | 1 + pc-bios/s390-ccw/secure-ipl.h | 3 +++ 6 files changed, 30 insertions(+), 3 deletions(-) diff --git a/docs/system/s390x/secure-ipl.rst b/docs/system/s390x/secure-ip= l.rst index 9e3955f8fc..c8fb887ac0 100644 --- a/docs/system/s390x/secure-ipl.rst +++ b/docs/system/s390x/secure-ipl.rst @@ -66,3 +66,16 @@ Configuration: .. code-block:: shell =20 qemu-system-s390x -machine s390-ccw-virtio,boot-certs.0.path=3D/.../qe= mu/certs,boot-certs.1.path=3D/another/path/cert.pem ... + +Secure Mode +^^^^^^^^^^^ + +When the ``secure-boot=3Don`` option is set and certificates are provided, +a secure boot is performed with error reporting enabled. The boot process = aborts +if any error occurs. + +Configuration: + +.. code-block:: shell + + qemu-system-s390x -machine s390-ccw-virtio,secure-boot=3Don,boot-certs= .0.path=3D/.../qemu/certs,boot-certs.1.path=3D/another/path/cert.pem ... diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 08294af4d0..35bdfe03d8 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -851,7 +851,8 @@ void s390_ipl_prepare_cpu(S390CPU *cpu) * Secure IPL without specifying a boot device. * IPLB is not generated if no boot device is defined. */ - if (s390_has_certificate() && !ipl->iplb_valid) { + if ((s390_has_certificate() || s390_secure_boot_enabled()) && + !ipl->iplb_valid) { error_report("No boot device defined for Secure IPL"); exit(1); } diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 16c20313c8..9e0890f38d 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -743,6 +743,7 @@ static int zipl_run(ScsiBlockPtr *pte) case ZIPL_BOOT_MODE_NORMAL: rc =3D zipl_run_normal(&entry, tmp_sec); break; + case ZIPL_BOOT_MODE_SECURE: case ZIPL_BOOT_MODE_SECURE_AUDIT: rc =3D zipl_run_secure(&entry, tmp_sec, &comp_list, &cert_list, &t= mp_cert_buf); break; @@ -762,7 +763,8 @@ static int zipl_run(ScsiBlockPtr *pte) =20 write_reset_psw(entry->compdat.load_psw); =20 - if (boot_mode =3D=3D ZIPL_BOOT_MODE_SECURE_AUDIT) { + if (boot_mode =3D=3D ZIPL_BOOT_MODE_SECURE || + boot_mode =3D=3D ZIPL_BOOT_MODE_SECURE_AUDIT) { update_cert_list(&cert_list); update_iirb(&comp_list, &cert_list); free(tmp_cert_buf); @@ -1130,6 +1132,8 @@ ZiplBootMode get_boot_mode(uint8_t hdr_flags) =20 if (!sipl_set && iplir_set) { return ZIPL_BOOT_MODE_SECURE_AUDIT; + } else if (sipl_set && iplir_set) { + return ZIPL_BOOT_MODE_SECURE; } =20 return ZIPL_BOOT_MODE_NORMAL; diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 520c448c2c..c5c093534c 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -402,15 +402,20 @@ void main(void) =20 boot_mode =3D get_boot_mode(iplb->hdr_flags); switch (boot_mode) { + case ZIPL_BOOT_MODE_SECURE: case ZIPL_BOOT_MODE_SECURE_AUDIT: if (!secure_ipl_supported()) { - panic("Unable to boot in audit mode"); + panic("Unable to boot in secure/audit mode"); } =20 vcssb_len =3D zipl_secure_get_vcssb(); if (vcssb_len =3D=3D 0) { panic("Failed to query certificate storage information!"); } + + if (vcssb_len =3D=3D VCSSB_NO_VC) { + panic("Need at least one certificate for secure boot!"); + } break; default: break; diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index 64584dc8a7..b2afc155d2 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -90,6 +90,7 @@ void zipl_load(void); typedef enum ZiplBootMode { ZIPL_BOOT_MODE_NORMAL =3D 0, ZIPL_BOOT_MODE_SECURE_AUDIT =3D 1, + ZIPL_BOOT_MODE_SECURE =3D 2, } ZiplBootMode; =20 extern ZiplBootMode boot_mode; diff --git a/pc-bios/s390-ccw/secure-ipl.h b/pc-bios/s390-ccw/secure-ipl.h index ce354b4d6a..4908245b9b 100644 --- a/pc-bios/s390-ccw/secure-ipl.h +++ b/pc-bios/s390-ccw/secure-ipl.h @@ -59,6 +59,9 @@ static inline void zipl_secure_error(const char *message) case ZIPL_BOOT_MODE_SECURE_AUDIT: printf("AUDIT MODE WARNING: %s\n", message); break; + case ZIPL_BOOT_MODE_SECURE: + panic(message); + break; default: /* * Errors are intentionally ignored in non-secure boot modes. --=20 2.55.0 From nobody Sat Sep 26 21:35:37 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=1787748906; cv=none; d=zohomail.com; s=zohoarc; b=jLq4Oboeyz+4iw5gUkq6bpcJZbAMuMeCyI8IOQB9W9Np+X+1M0+QmsEotjpOIwl9+5igUZsrw5I3IaRc6AU7l7qsQ34zUCoZXW//RHgMytmOV6EBYWt56gYpSHHfAJdeLmyW4NxgFqKDERvhMgPb9rFKkJ7aUiT40vuCK1nWKXI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748906; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=pX5bETXRfCUNZCm+eyD1KKX5qc/NcZZ9TUtmXJgkT9Y=; b=J1Mncfep1SW0MqbgeqvtJ3F53h+4vJ7qKmTPFipO8ehoejmTBHaiGAgC/SspfWJPBRaK9c3BOT/tzSYS9m7XpHHp6smVpLumSKGd6m25cwF3Ud8DX9PJ3SlboSFFIFAeczoLB/E5vSr95zQYOM0U9cFep8ucfeDJcS/+LJVgboE= 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 1787748906807955.433586755235; Wed, 26 Aug 2026 05:55:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD8n-00015U-1a; Wed, 26 Aug 2026 08:54: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 1wzD8E-00009g-L5; Wed, 26 Aug 2026 08:53:31 -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 1wzD84-0002sh-BQ; Wed, 26 Aug 2026 08:53:30 -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 67QCVvPd3977510; Wed, 26 Aug 2026 12:52:58 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 4g73946pdt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:58 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfIv6002343; Wed, 26 Aug 2026 12:52:57 GMT Received: from smtprelay03.wdc07v.mail.ibm.com ([172.16.1.70]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4g7q3k1xyf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:57 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay03.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqG1B29885154 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:16 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1B2425805B; Wed, 26 Aug 2026 12:52:56 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3ABDC58059; Wed, 26 Aug 2026 12:52:55 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:55 +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=pX5bETXRfCUNZCm+e yD1KKX5qc/NcZZ9TUtmXJgkT9Y=; b=H2xKLp0PDC5iqiqUt10NMSxU7CMRhr1bc ZhlyBkOuVl+1xbLgwRAnM+klz1UhBoHl48bk2RGSnRE0834VhV3IMFn6wPRYmWRE woIDmr3CnN27MYMXUu5FnEs7c5D9Evoqiyg3dGAG9seYyAUlcK8swgdOvCgY0E9x SAdZ0gj4fuOJzYdjkNAOMGZxCSPmLzE8mjQwtcn8rqdHqnjQl9If726wNc+EJAWo X+6LZyCtZ/xYHvXkTl5i6xCOEiK8jV1iH8JEe83keRqSnd1/duWMsKyaYlFlvcP8 wJOpNN3ZNkmtLFZNoeg67lQiW5UeUKF5KiIL82W8tRZZVXHu5Uexw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Thomas Huth , Eric Farman Subject: [PULL 32/37] hw/s390x/ipl: Handle secure boot with multiple boot devices Date: Wed, 26 Aug 2026 08:52:07 -0400 Message-ID: <20260826125213.1901252-33-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: X43RV5hHcystoieP9gBD7JHWwAWB4EEo X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX8B/BR+PU6M/u ff3+JGEHKHYsD7eOOxgKewWQhcVv3OTCl+fkA6+hljkaV/sWeAnMHB1MLn1gN+iO0UlsQWHlA3B Y8dli+UyhEiTq8PIoBWZxVLK3/eoEQZm+RL6p6bsut4TegMf/TS4/8VbiQqHuDImuHkINU+roGg Yv4LHJUpoXahYnCa//YYAMd/AAb8YZGARnycuYcezre3VaCvitWKGsbX3Qvah7j+4n7BvMLf2uy MHiWuaKoks92cuI/Fhfqg+v731AKPP8YEUku/GDoGwLhyMux6XEZUKVPXUPPUVJWDptIJma1pr3 UvxuMKgAkbrN+X28YvV89S3haVtqYMjhbvDtRPMh4OQYJIq60f8uSjAws3QREZo1w7oF9rCTHRn aARnySpfllxrzuM/SfxbKMF7mgD6gTWKoPqu/JCvHF0qsRgkC6YpOPL9aDEynrLkx6xJYXBppSb RK//kW7gaU+2pATt8Og== X-Authority-Analysis: v=2.4 cv=Y/nIdBeN c=1 sm=1 tr=0 ts=6a8ee1aa cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=8E_wKCjR_O7UhaygiVUA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX9smrto519Qix Ur+l4lNkSmAE1Y1uXpBlBm43f4/7Q5LIDjbujpFROPm5J26gfQKALDICt4EUoIN+zyn2yH0EGh9 jUAeuu0o0TN378TwKSxW9DFUITSOVo4= X-Proofpoint-ORIG-GUID: X43RV5hHcystoieP9gBD7JHWwAWB4EEo 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 impostorscore=0 priorityscore=1501 adultscore=0 bulkscore=0 suspectscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748907475158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai The current approach to enable secure boot relies on providing secure-boot and boot-certs parameters of s390-ccw-virtio machine type option, which apply to all boot devices. With the possibility of multiple boot devices, secure boot expects all provided devices to be supported and eligible (e.g., virtio-blk/virtio-scsi using the SCSI scheme). If multiple boot devices are provided and include an unsupported (e.g., ECKD, VFIO) or a non-eligible (e.g., Net) device, the boot process will terminate with an error logged to the console. Signed-off-by: Zhuoying Cai Reviewed-by: Thomas Huth Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-31-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- hw/s390x/ipl.c | 40 ++++++++++++++++++++++++++++++++++++++-- pc-bios/s390-ccw/main.c | 3 --- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 35bdfe03d8..d59ed36c78 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -504,6 +504,37 @@ static void s390_set_secure_boot_flags(IplParameterBlo= ck *iplb, iplb->len =3D cpu_to_be32(S390_IPLB_MAX_LEN); } =20 +static bool s390_validate_secure_boot_device(int devtype, Error **errp) +{ + switch (devtype) { + case CCW_DEVTYPE_VFIO: + error_setg(errp, "Passthrough (vfio) CCW device does not support s= ecure boot!"); + return false; + case CCW_DEVTYPE_VIRTIO_NET: + error_setg(errp, "Virtio net boot device does not support secure b= oot!"); + return false; + default: + return true; + } +} + +static void s390_apply_secure_boot(IplParameterBlock *iplb, int devtype, + bool secure_boot, bool audit_mode) +{ + Error *local_error =3D NULL; + + if (!secure_boot && !audit_mode) { + return; + } + + if (!s390_validate_secure_boot_device(devtype, &local_error)) { + error_report_err(local_error); + exit(1); + } + + s390_set_secure_boot_flags(iplb, secure_boot, audit_mode); +} + static bool s390_build_iplb(DeviceState *dev_st, IplParameterBlock *iplb) { CcwDevice *ccw_dev =3D NULL; @@ -560,14 +591,19 @@ static bool s390_build_iplb(DeviceState *dev_st, IplP= arameterBlock *iplb) s390_ipl_convert_loadparm((char *)lp, iplb->loadparm); iplb->flags |=3D DIAG308_FLAGS_LP_VALID; =20 - s390_set_secure_boot_flags(iplb, s390_secure_boot_enabled(), - s390_has_certificate()); + s390_apply_secure_boot(iplb, devtype, s390_secure_boot_enabled(), + s390_has_certificate()); =20 return true; } =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; diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index c5c093534c..8fc1cbf653 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -308,9 +308,6 @@ static void ipl_ccw_device(void) switch (cutype) { case CU_TYPE_DASD_3990: case CU_TYPE_DASD_2107: - IPL_assert((boot_mode =3D=3D ZIPL_BOOT_MODE_NORMAL), - "Passthrough (vfio) CCW device does not support secure= boot!"); - dasd_ipl(blk_schid, cutype); break; case CU_TYPE_VIRTIO: --=20 2.55.0 From nobody Sat Sep 26 21:35:38 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=1787748976; cv=none; d=zohomail.com; s=zohoarc; b=A4uswYdsoBle9BuoyetoNgrYcWJeHFRLb0QhCO4ao5Ew+4tE0ojNsHNKUeE/oUsLDh3fsfhwhVF6JB+6iUNJtUP72kq4DtYXei5fyvz0mJSzFQbTckO7csNb7QVjZ8JK9+QrAb40dO6QpOtac7JcAylRtY0KieAoAb1p8l7b0aM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748976; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=x5cBv10XC4P42TJRyMkggvdKKheNVFGPmq45AZenU54=; b=dv1CgokZMydu9rXVX+o0thnq+0fYN48FHdxg60gM35gx/JX3kp86npqTTcB201DelWr+sk0khXXEQKvuknpFP4LCniU/cBCPl9WQcw7+1qMqKRAytKJyPEdfUOG5yFJCYjKyICiGEEpsh2AbGZn4G/eoU43pq6O9wzeJLO69bwU= 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 1787748976302439.8244924871369; Wed, 26 Aug 2026 05:56:16 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD9G-0002aa-9g; Wed, 26 Aug 2026 08:54:34 -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 1wzD8L-0000Jl-2w; Wed, 26 Aug 2026 08:53:37 -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 1wzD88-0002t1-4K; Wed, 26 Aug 2026 08:53:36 -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 67QCVrAv2127698; Wed, 26 Aug 2026 12:52:59 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 4g73eqxmam-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:59 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfLn7018839; Wed, 26 Aug 2026 12:52:58 GMT Received: from smtprelay04.wdc07v.mail.ibm.com ([172.16.1.71]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7raght18-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:58 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay04.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqvFZ37093896 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:57 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 11AB05805B; Wed, 26 Aug 2026 12:52:57 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4827358059; Wed, 26 Aug 2026 12:52:56 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:56 +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=x5cBv10XC4P42TJRy MkggvdKKheNVFGPmq45AZenU54=; b=sdAkRqlsEl39yiBW3R3idpVZvDRQAahwQ s31HJMgzR+2o205eL5Bdt/CAO0g12gV2qH+X+EEOUw/DieRX+zJzcwaoyBFgm1dy HN6UdseG6GPgFAAC3XRHepAd2V8uYLcJdNR39CETeviD2y5M2fy35zj78bpDzdcw 3EfNQKQ+FOn4JCIR1e9wt8ULh8YGeteWc8df9uqq6ma+atr9uS5OC4fOaGSLCcAS eJN2CblvtAfgtpCUdcfWGd3TpLC3HEZLhuFl6CsSDquBaSfVeb+a5whOxjRcR+43 qszufPX+kNAwRqzg+Y7vyItW8c0LiiAvZUPXpGRFxigDhkKZMdbmQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Eric Farman Subject: [PULL 33/37] tests/functional/s390x: Add secure IPL functional test Date: Wed, 26 Aug 2026 08:52:08 -0400 Message-ID: <20260826125213.1901252-34-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 1wZWt6FXlAWMwn_zvv6SmQY-X8NRUvlK X-Proofpoint-ORIG-GUID: 1wZWt6FXlAWMwn_zvv6SmQY-X8NRUvlK X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX2Qgcf/nVB7/J ug12acNqk6D5mkyTUAECYFIikqq10Uh+Ugw7J+BWhAs6KCUjuTVwOaKWbo6kpEb/hKi7qTpZEG1 cyJRgkk9h2Hxmlyy5bMpbUiHBBiF+5/+J64T1DnrPRXWn22czBh+C3Pncx1mLcjKCqjYbqwAZ6N rRHklaLUjceI4dk/Te2JpcRgAG0UPgjzomsSQ9iY6zuuVhswfQSlfmwnE2KkUcbK7B+Co0vt46R 3a6EkhmjVY5ihwHy4RVN/ReHM2wNfO+hQ5UJoDKX0BJrG3qrU3nN8OKKxeR5OBOBgfdmlkchKH8 +KGj1i6bb2S0yKYMxZzglw5nTTrg2fFzYwZGfd2QjpdSp+pnMvVAIzSGXNJi/IrkQ+UzmsQAgPX 87qtEJh4YZis1yNWqzOaAvYJwQ8Wy2cKeZK5xZ/I3rIbHgdDl12sxK+fqBGb9XHUyYYpRBLdyxd qRr0McHXITwCx20uaGg== X-Authority-Analysis: v=2.4 cv=QsRuG1yd c=1 sm=1 tr=0 ts=6a8ee1ab cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=vTr9H3xdAAAA:8 a=WP5zsaevAAAA:8 a=vvdW6g1Vg8v77fwKLDIA:9 a=t8Kx07QrZZTALmIZmm-o:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXxeot00zt6NlN pHiPEAO2oPCRhyPfqnhEKCCgJofteu+KKKGzbQSYnOUYQLCDr7lE9xGIcXAP4gnU0tQxHRyWvAy +zwRcpNFWLgIx5ebKeTNlnKus0FPfWY= 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 suspectscore=0 priorityscore=1501 impostorscore=0 spamscore=0 lowpriorityscore=0 clxscore=1015 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748977963158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Add functional test for secure IPL. Signed-off-by: Zhuoying Cai Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-32-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- tests/functional/s390x/meson.build | 2 + tests/functional/s390x/test_secure_ipl.py | 172 ++++++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100755 tests/functional/s390x/test_secure_ipl.py diff --git a/tests/functional/s390x/meson.build b/tests/functional/s390x/me= son.build index b065b666bc..16da5f0054 100644 --- a/tests/functional/s390x/meson.build +++ b/tests/functional/s390x/meson.build @@ -2,6 +2,7 @@ =20 test_s390x_timeouts =3D { 'ccw_virtio' : 420, + 'secure_ipl' : 360, } =20 tests_s390x_system_quick =3D [ @@ -14,6 +15,7 @@ tests_s390x_system_thorough =3D [ 'ccw_virtio', 'pxelinux', 'replay', + 'secure_ipl', 'topology', 'tuxrun', ] diff --git a/tests/functional/s390x/test_secure_ipl.py b/tests/functional/s= 390x/test_secure_ipl.py new file mode 100755 index 0000000000..06fc93e404 --- /dev/null +++ b/tests/functional/s390x/test_secure_ipl.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python3 +# +# SPDX-License-Identifier: GPL-2.0-or-later +""" +s390x Secure IPL functional test. + +Validates s390x secure boot by preparing a signed guest image, booting with +secure-boot enabled, and verifying cryptographic validation results. +""" + +from subprocess import check_call, DEVNULL + +from qemu_test import QemuSystemTest, Asset, get_qemu_img +from qemu_test import exec_command_and_wait_for_pattern, exec_command +from qemu_test import wait_for_console_pattern, skipBigDataTest + +class S390xSecureIpl(QemuSystemTest): + """Test s390x Secure IPL (secure boot) functionality.""" + ASSET_F40_QCOW2 =3D Asset( + ('https://archives.fedoraproject.org/pub/archive/' + 'fedora-secondary/releases/40/Server/s390x/images/' + 'Fedora-Server-KVM-40-1.14.s390x.qcow2'), + '091c232a7301be14e19c76ce9a0c1cbd2be2c4157884a731e1fc4f89e7455a5f') + + 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 + + def _create_certificate(self, vm): + """Generate x509 certificate""" + exec_command_and_wait_for_pattern(self, + 'openssl version', 'OpenSSL 3.2.= 1 30', + vm=3Dvm) + exec_command_and_wait_for_pattern(self, + 'openssl req -new -x509 -newkey rsa:2048 ' + '-keyout mykey.pem -outform PEM -out mycert.pe= m ' + '-days 36500 -subj "/CN=3DMy Name/" -nodes -ve= rbose', + 'Writing private key to \'mykey.pem\'', vm=3Dv= m) + + def _sign_binaries(self, vm): + """Sign stage3 binary and kernel""" + # Install kernel-devel (needed for sign-file) + 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) + exec_command_and_wait_for_pattern(self, + 'ls /usr/src/kernels/$(uname -r)/scrip= ts/', + 'sign-file', vm=3Dvm) + + # Sign stage3 binary and kernel + 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) + 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) + + def _run_zipl_secure(self, vm): + """Run zipl to prepare for secure boot""" + exec_command_and_wait_for_pattern(self, 'zipl --secure 1 -VV', 'Do= ne.', + vm=3Dvm) + + def _extract_certificate(self, vm): + """Extract certificate from VM to host filesystem""" + out =3D exec_command_and_wait_for_pattern(self, 'cat mycert.pem', + '-----END CERTIFICATE-----= ', + vm=3Dvm) + # strip first line to avoid console echo artifacts + cert =3D "\n".join(out.decode("utf-8").splitlines()[1:]) + self.log.info("%s", cert) + + self.cert_path =3D self.scratch_file("mycert.pem") + + with open(self.cert_path, 'w', encoding=3D"utf-8") as file_object: + file_object.write(cert) + + def setup_s390x_secure_ipl(self): + """ + Prepare a secure boot-enabled guest image. + + Boots a temporary VM to generate a certificate, sign boot componen= ts + (stage3 and kernel), run zipl, and extract the certificate to host. + """ + self.require_netdev('user') + + temp_vm =3D self.get_vm(name=3D'sipl_setup') + temp_vm.set_machine('s390-ccw-virtio') + + asset_path =3D self.ASSET_F40_QCOW2.fetch() + self.qcow2_path =3D self.scratch_file('f40.qcow2') + 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) + + 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}', + '-device', 'virtio-blk-ccw,drive=3Ddrive0,bootind= ex=3D1') + temp_vm.launch() + + # 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', + 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, + 'Password (confirm):', vm=3Dtemp= _vm) + exec_command_and_wait_for_pattern(self, self.root_password, + 'Please make a selection from the abov= e', + vm=3Dtemp_vm) + + # 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, + vm=3Dtemp_vm) + + self._create_certificate(temp_vm) + self._sign_binaries(temp_vm) + self._run_zipl_secure(temp_vm) + self._extract_certificate(temp_vm) + + # Shutdown temp vm + temp_vm.shutdown() + + @skipBigDataTest() + def test_s390x_secure_ipl(self): + """ + Verify secure boot validation during s390x guest boot. + + 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() + + # Expect two verified components + verified_output =3D "Verified component" + wait_for_console_pattern(self, verified_output) + wait_for_console_pattern(self, verified_output) + + # 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') + +if __name__ =3D=3D '__main__': + QemuSystemTest.main() --=20 2.55.0 From nobody Sat Sep 26 21:35:38 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=1787749008; cv=none; d=zohomail.com; s=zohoarc; b=e9bSusmm18Ndoo2uGiqLV0DLWsWNIT2fRs8mcryAabgjx25A0TY5RplnzU/XLEl54+wqUeP6xj6HhM5KFtNWAE2HeI1Z0TDswNh/2vEVx9/6Mkrh8DZXFntbflVbaA7VT+nOmUceDjZ+S5aWVamLw3U4MUUUa4qyHZ52FZiOJnk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787749008; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=B+zJ/y9zmnEaCZ4hrEDqAli++ruRnNrcMBTWtG0Nl3A=; b=GMyyG2g2WPMNJVJm7N6ygn22pl2Lsx11SuGRk5VSU340rkejp2y4srba8KYv3L3dXA28yob0iEXK0GHPw4TXHWaP2M917RsReUeDu4OyIxl2hsykyN90M6Noi3b1+3BLqUkyCBReFzCIxwaloJ3SkePsHbog3AwRuYRFs608k98= 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 1787749008557415.9457780676378; Wed, 26 Aug 2026 05:56:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD7t-0008BF-Kq; Wed, 26 Aug 2026 08:53: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 1wzD7p-000872-B7; Wed, 26 Aug 2026 08:53:05 -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 1wzD7m-0002tH-Np; Wed, 26 Aug 2026 08:53:04 -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 67QCW03T4057167; Wed, 26 Aug 2026 12:53:01 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 4g73dxec2e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:53:00 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfHx4018813; Wed, 26 Aug 2026 12:52:59 GMT Received: from smtprelay05.wdc07v.mail.ibm.com ([172.16.1.72]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7raght19-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:52:59 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay05.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqwK231523374 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:58 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 213055805D; Wed, 26 Aug 2026 12:52:58 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3ED2E58059; Wed, 26 Aug 2026 12:52:57 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:57 +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=B+zJ/y9zmnEaCZ4hr EDqAli++ruRnNrcMBTWtG0Nl3A=; b=NQRRaQaRDk0ZifE9tuVhxeATsBSE+XzyO cZl9nSq/bNW/p1oESImUJ1wTfJGHXWbh/y2q/uSMBRdUzNXQ5FTC27ujiydMGGW8 D1dNouTi0ZnYu4V5jeOcEczkfhMGsBefOa99ksvHLu4Sm+jgsb6J8BlE3kL1d2dh PPUjfLYtfePuoQt8kmqsLQTR8hWzsuX/fpN+bD/z2e0ai4JGfdybU9g+Cr5ZP02s OKcUz9niFDkefBiCSmQ1pVUC9/cIG02DzDSGXNJ6mH5KUCugrVfDbFUXKYUoTf+t EzwaJarNcHD6qWndaEJNT2YWXcueVB7aK2jx6srvM7ls4dwgfzevQ== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Collin Walling , Eric Farman Subject: [PULL 34/37] docs/specs: Add secure IPL documentation Date: Wed, 26 Aug 2026 08:52:09 -0400 Message-ID: <20260826125213.1901252-35-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX/ME3ehtAhlir 55vYqcQLIAYR+sxFwfapB/eH2ohXdk0Zh/BmnPk6w+g613JuIUXewopBHxgXUpkVHGi5wNHjqOW rBLk5TaSGBpBKDc7C92yLoZSEZ4EXhk= X-Authority-Analysis: v=2.4 cv=AYuB2XXG c=1 sm=1 tr=0 ts=6a8ee1ac cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=bKBM-sKadDDPLvLHMR0A:9 X-Proofpoint-ORIG-GUID: 1Oyy-2Q8-BJVcaRivkVaRT8-CHoQKkB9 X-Proofpoint-GUID: 1Oyy-2Q8-BJVcaRivkVaRT8-CHoQKkB9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX5Pqhe0cLbgT+ UGEO7cMi7CnbaixsSm2KzoRr8uAY8xKu8nnGIKxlLV27h9a5utvZ7yKI5QSz2jDGB0mRMNaUDWe tOtP10t+z1QZKom8gWpTUkzah1FA1bsDiBBMXih604gTAJueje7AmASxeH3v8WMjesZB8LmH7ZF avYiNXUoMAuzEuV2PdAz3tW3ZF/DFvGFsw3Eq3tUBKqcBwhMLcc87h6+8GgflY8M4MkKqHiBgtP 6m1nSOHWZcBs7q5NBc5bDdTIAWjA4CQQ7mgh6G6EnFfJjYvumfERIj0nzr/eCUIkceZc2aDqU7B nMiesHyYDcys91PzYNhC7I5dFTwI9qojCRFQa74c5JMY+9AcMkDmIe/62SqnidMcXWaxHv4pYOx 6Uq3GD+Q8xYkSmct8QWogJgW4zN7DUPnT8YbmL7kANGj9c1IG17pBBw6RSJgLci3yqfTm0PHHyJ 8DyiRJTmlT0txdcb6bw== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 clxscore=1015 adultscore=0 bulkscore=0 impostorscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787749010080158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Add documentation for secure IPL Signed-off-by: Collin Walling Signed-off-by: Zhuoying Cai Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-33-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- docs/specs/s390x-secure-ipl.rst | 55 +++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/docs/specs/s390x-secure-ipl.rst b/docs/specs/s390x-secure-ipl.= rst index 7a603eb956..82b21600af 100644 --- a/docs/specs/s390x-secure-ipl.rst +++ b/docs/specs/s390x-secure-ipl.rst @@ -1,5 +1,60 @@ .. SPDX-License-Identifier: GPL-2.0-or-later =20 +s390 Secure IPL +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Secure IPL (a.k.a. secure boot) enables s390-ccw virtual machines to +leverage qcrypto libraries and z/Architecture emulation to verify the +integrity of signed kernels. The qcrypto libraries are used to perform +certificate validation and signature-verification, whereas the +z/Architecture emulation is used to ensure secure IPL data has not +been tampered with, convey data between QEMU and guest code, and set up +the relevant secure IPL data structures with verification results. + +To find out more about using this feature, see +:doc:`documentation `. + +Note that "guest code" will refer to the s390-ccw BIOS unless stated +otherwise. + +Both QEMU and guest code work in cooperation to perform secure IPL. The Se= cure +Code Loading Attributes Facility (SCLAF) is used to check the Secure Code +Loading Attribute Block (SCLAB) and ensure that secure IPL data has not +been tampered with. DIAGNOSE 'X'320' is invoked by guest code to query +the certificate store info and retrieve specific certificates from QEMU. +DIAGNOSE 'X'508' is used by guest code to leverage qcrypto libraries to +perform signature-verification in QEMU. Lastly, guest code generates and +appends an IPL Information Report Block (IIRB) at the end of the IPL +Parameter Block (IPLB), which is used by the kernel to store signed and +verified entries. + +The logical steps are as follows: + +- guest code reads data payload from disk (e.g. stage3 boot loader, kernel) +- guest code checks the validity of the SCLAB +- guest code invokes DIAG 508 subcode 1 and provides the payload +- QEMU handles DIAG 508 request by reading the payload and retrieving the + certificate store +- QEMU DIAG 508 utilizes handler qcrypto libraries to perform + signature-verification on the payload, attempting with each cert in the = store + (until success or exhausted) +- QEMU DIAG 508 returns: + + - success: index of cert used to verify payload + - failure: error code + +- guest code is expected to respond to this operation by: + + - success: retrieves cert from store via DIAG 320 using returned index + - failure: reports with warning (audit mode), aborts with error (secure = mode) + +- guest code appends IIRB at the end of the IPLB +- guest code kicks off IPL + +More information regarding the respective DIAGNOSE commands and IPL data +structures are outlined within this document. + + s390 Certificate Store and Functions ------------------------------------ =20 --=20 2.55.0 From nobody Sat Sep 26 21:35:38 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=1787748887; cv=none; d=zohomail.com; s=zohoarc; b=AZLkfwISNv0tgzi64K8Dw6Jm/UF2Sjb5dGgvCyj+zgqKF6jH/gzsxfrN/k+AHpJupt1ybagsEZOA76ZtcRU/FWjmxygSetwCDcT1W9F1XXuLrMbouX7xsH+Cq9yJQqEWMzuvY00AGOiMFGk8XxRZYUvN0Sf3S/5ejlbfjYMBoh8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787748887; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=yO2/1k3kKqyLAyXvugXWwazfJFN6OMlk/qn6ujwe6IQ=; b=NfIfyQZeFIZEIj4fcjXGqJUthxw0CO+5W9Mmzoy4VOEBLw8+rbIMSSFU6D99hU+nWoNOCAtz/J37UVQebzbUSBsfxLbITp8blmpEbeMDCviFy78jFsR/E8d4sP89NYGugBdq1ce3IyOJONCHPviXVOk2GIg68Nc6zr6kttuOEEM= 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 1787748887902223.0031488915563; Wed, 26 Aug 2026 05:54:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD8s-0001FT-Ln; Wed, 26 Aug 2026 08:54: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 1wzD8H-0000CF-4U; Wed, 26 Aug 2026 08:53:33 -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 1wzD88-0002tP-4Y; Wed, 26 Aug 2026 08:53:32 -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 67QCWQHg3978471; Wed, 26 Aug 2026 12:53:02 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 4g73946pdy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:53:01 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfGNh002972; Wed, 26 Aug 2026 12:53:01 GMT Received: from smtprelay06.wdc07v.mail.ibm.com ([172.16.1.73]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7p3qa5pk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:53:00 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay06.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCqxJo41681272 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:52:59 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7A11D5805E; Wed, 26 Aug 2026 12:52:59 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4EB6D5805B; Wed, 26 Aug 2026 12:52:58 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:58 +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=yO2/1k 3kKqyLAyXvugXWwazfJFN6OMlk/qn6ujwe6IQ=; b=MbpvQE88AFvb+ae/pmIEgj Or0ReocYdwH3xTfQ8J4qtzGf2SOGOzqyyJc/Ai7CWaYofqX/NoaPLWbo7F9bVeiu QIhLUl3/IBtvA08J7q3Qx4F9ECZiNqNHeHdFq0lDevxezaZEK1+xMmINmT8rrhFw VwW7kWrHQmICv8K3RFGlYN44f+V1OLjHHQYVSot5k+BTKhp6i+ajIzZbhG5zxsLX AiYxQJonZCnwXPiBKmJvHWohnQ/rprtBemHt5ri0SBQe4OqOmlPLMQ+kYfHywtj9 +Y3OrRz8jvcIchuFlewxhnlNqeJzmiygXIAt499xnFyWJ3O00Uum0egC4TV+GM5g == From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Collin Walling , Joshua Daley , Eric Farman Subject: [PULL 35/37] docs/system/s390x: Add secure IPL documentation Date: Wed, 26 Aug 2026 08:52:10 -0400 Message-ID: <20260826125213.1901252-36-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-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-GUID: yoaaSdjnrbacVST54o3RPftpRP-wwXwB X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXyhVK9tuBGdJ7 HBQvJIQlU1kKOKG6QZwa9IaiOoZCXOaX7LC0K1J+ljCpj31M7hpBwwAn2AgsINrtt91TOd85TNA SPeyho8vcfMneNb092B0p5N9TjtwrSoakvg7PEHQwdYDXTuxTdB3u7t6ngidrRJqXuOn4S7jHVr eYsxU8gI2e+P+5JMMesdzXmQO8o3sxuY9eYsRbq4RliSksYAaWeM0pusxcgr0qpVUPZCbOepoHN 9KF/sbmiXudM0Gp8ACeUekTo6iNTGkmuJrrZC76bOZDRMftheiPf4w1pZPqjgZ8/WaprdpfOn1J OttD9OnizT9BnShlMuw05867qG5UJaQv5jQzhA01rYnIBcM06Vg/FJt3o8wBHOy3ZuNmLLuBFi9 +yZX8o7vO+BF6iubfxi83YOCeKeFnx0+37PoxYzqx9k2mGJ2z/RXIf2wZIhKGUjXErwc4iO8sqA 67yyy5q4OsqM1rzh4mw== X-Authority-Analysis: v=2.4 cv=Y/nIdBeN c=1 sm=1 tr=0 ts=6a8ee1ad cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=q5T4S90kAAAA:8 a=DPx5qUi3eHaybXJRD2EA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=LnBBZQxPVJ0Z7KJyRdxh:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXwkp7Ts1Kb/tp xiu6AAZ5/WI8o7B8DZDiBdYf/59wfXBIV1uhslMhl7nWCz0jppw5UzAK59JvlowvdfdwiZbJd18 062CTGPuLyp2Nh/M9I9wtClkVh6W+ZM= X-Proofpoint-ORIG-GUID: yoaaSdjnrbacVST54o3RPftpRP-wwXwB 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 impostorscore=0 priorityscore=1501 adultscore=0 bulkscore=0 suspectscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: -25 X-Spam_score: -2.6 X-Spam_bar: -- X-Spam_report: (-2.6 / 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, URIBL_CSS_A=0.1 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: 1787748889406158500 From: Zhuoying Cai Add documentation for secure IPL Signed-off-by: Collin Walling Signed-off-by: Zhuoying Cai Reviewed-by: Joshua Daley Reviewed-by: Matthew Rosato Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-34-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- docs/system/s390x/secure-ipl.rst | 103 +++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/docs/system/s390x/secure-ipl.rst b/docs/system/s390x/secure-ip= l.rst index c8fb887ac0..67de20f47a 100644 --- a/docs/system/s390x/secure-ipl.rst +++ b/docs/system/s390x/secure-ipl.rst @@ -1,5 +1,22 @@ .. SPDX-License-Identifier: GPL-2.0-or-later =20 +s390 Secure IPL +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Secure IPL, also known as secure boot, enables s390-ccw virtual machines to +verify the integrity of guest kernels. + +For technical details of this feature, see the +:doc:`specs document `. + +This document explains how to use secure IPL with s390x in QEMU. It covers +the command line options for providing certificates and enabling secure IP= L, +the different IPL modes (Normal, Audit, and Secure), and system requiremen= ts. + +A quickstart guide is provided to demonstrate how to generate certificates, +sign images, and start a guest in Secure Mode. + + Secure IPL Command Line Options ------------------------------- =20 @@ -79,3 +96,89 @@ Configuration: .. code-block:: shell =20 qemu-system-s390x -machine s390-ccw-virtio,secure-boot=3Don,boot-certs= .0.path=3D/.../qemu/certs,boot-certs.1.path=3D/another/path/cert.pem ... + + +Constraints +----------- + +The following constraints apply when attempting to boot an s390x guest in = secure +mode: + +- z16 or "qemu" CPU model +- certificates must be in X.509 PEM format +- only support for SCSI scheme of virtio-blk/virtio-scsi devices +- a boot device must be specified +- any unsupported devices (e.g., ECKD and VFIO) or non-eligible devices (e= .g., + network) will cause the entire boot process to terminate early, with an = error + logged to the console. + + +Secure IPL Quickstart +--------------------- + +Build QEMU with gnutls enabled +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: shell + + ./configure =E2=80=A6 --enable-gnutls + +Generate certificate (e.g. via certtool) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A private key is required before generating a certificate. This key must b= e kept +secure and confidential. + +Use an RSA private key for signing. + +.. code-block:: shell + + certtool --generate-privkey > key.pem + +A self-signed certificate requires the organization name. Use the ``cert.i= nfo`` +template to pre-fill values and avoid interactive prompts from certtool. + +.. code-block:: shell + + cat > cert.info < (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 1787748962916257.14996976449106; Wed, 26 Aug 2026 05:56:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD9C-0001vx-Tc; Wed, 26 Aug 2026 08:54:31 -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 1wzD8J-0000Hv-Vv; Wed, 26 Aug 2026 08:53:36 -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 1wzD88-0002th-NX; Wed, 26 Aug 2026 08:53:35 -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 67QCW2u53893831; Wed, 26 Aug 2026 12:53:03 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 4g716hxsbj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:53:03 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfSSd003092; Wed, 26 Aug 2026 12:53:02 GMT Received: from smtprelay07.wdc07v.mail.ibm.com ([172.16.1.74]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7p3qa5pp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:53:02 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay07.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCr0tV17760924 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:53:00 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9992C5805B; Wed, 26 Aug 2026 12:53:00 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AAFD558059; Wed, 26 Aug 2026 12:52:59 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:52:59 +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=IyLa/SA+RHp2L14np rNT1bv7osMr1IgTPthzs/jnPy8=; b=mKHosbo2FGQ3DcEVctjj7j6p4ZcVEjYpg JmQ5bGXzgQ4Qgupyc30lwa+Jl3zA10eyHR6YTa7I+aMGKr1aLocQYH+3hwb5H8qC tJ4alO1ymsHPWq/grJXL50CKZeaycuaydFHgmr8NnJqf+Pp6cz4dIkRJzdoRgORP ltGnAGlpp42j/KaPBUCEn+00E0NXvfYy9GKQYr9XJmMgs1noBH8lTd73kOyOtVLc A/tUxh6EglTwErYTOElsFwFzKbP8KBPQ9HfvIndWcaHgrcG6IXcPD/9sxrBwjvBj VMxPCH12wL6UoPL5p2JNG6N0866xQSVerf03iTkhAe7aKpYSINtTw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Zhuoying Cai , Jared Rossi , Eric Farman Subject: [PULL 36/37] MAINTAINERS: Add secure IPL files to S390-ccw boot group Date: Wed, 26 Aug 2026 08:52:11 -0400 Message-ID: <20260826125213.1901252-37-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-1-farman@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX2PzzCtAN27Lk 9/bMQjiPDbRLKF5UE5KAGuX7to9FpKpEDZdWICyXKYbh64UJgZnyP9wQTYC+RkN4OnAWEhxYaqw INToL+gbpsqxY4sCnZVKDO7C3DOFOMU= X-Proofpoint-GUID: rY-abXEHFZ9ipl8VFzERMizOeAJSgTyC X-Proofpoint-ORIG-GUID: rY-abXEHFZ9ipl8VFzERMizOeAJSgTyC X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfXxJZd2CXd07Lq TuEOWfKFIBoRaV5EW4aVkq+7je/1h/+nj8ltRzi4Ix1j+nf/bblHQCKbJtEVX8EPA9Tm59tWs2s ubg/sHmTK7NxtSY16R5P4yhZscR7xNDt2Q6bM5Bx+Bou2Xjslc0XOkdNbHYTS81/VOCSaqLMENO 8CPdgMV1lqORD1enHwxMmiODnWp7KkEjk1BDmhRxJcNyKiJD5uvZUesg9xdrELVgFJhJSAl6sd6 CknqJWO6nn3rj5hcG5SdQUjo7phbq/xHuT/v906cVYOL15sVWcZ3oF4T8607cPpsvaNjTQqTqKO 8IL6EjywQBYSH5ZTaygQW0Sd8kK8db0cRpZADGjuLT4i1HlhGwnuHC6tQ2vhnBQ5GUYh8He8J/Z JhF4/MXhZ1jbDZLDw+VTizySR2I3xLHU3W8BcH2X6NFnvaGgfPQwfmjSgtSdKoMjtvLx4AIKdq4 VS7nzBbf3rh0L3RYycg== X-Authority-Analysis: v=2.4 cv=H7brBeYi c=1 sm=1 tr=0 ts=6a8ee1af cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=69wJf7TsAAAA:8 a=3XkM9kc9ey0u6mwvYagA:9 a=Fg1AiH1G6rFz08G2ETeA:22 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 lowpriorityscore=0 impostorscore=0 spamscore=0 bulkscore=0 adultscore=0 priorityscore=1501 clxscore=1015 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787748963746158500 Content-Type: text/plain; charset="utf-8" From: Zhuoying Cai Add entries for the files introduced by the secure IPL series (cert-store, diag headers, documentation, and functional test) to the S390-ccw boot maintainer group. Signed-off-by: Zhuoying Cai Acked-by: Jared Rossi Acked-by: Matthew Rosato Acked-by: Eric Farman Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-35-zycai@li= nux.ibm.com Signed-off-by: Eric Farman --- MAINTAINERS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 2a0ee348c4..dc2f465628 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1970,10 +1970,15 @@ R: Christian Borntraeger R: Jason Herne S: Supported F: hw/s390x/ipl.* +F: hw/s390x/cert-store.[ch] +F: include/hw/s390x/ipl/ F: pc-bios/s390-ccw/ F: pc-bios/s390-ccw.img F: docs/devel/s390-dasd-ipl.rst +F: docs/specs/s390x-secure-ipl.rst +F: docs/system/s390x/secure-ipl.rst F: tests/functional/s390x/test_pxelinux.py +F: tests/functional/s390x/test_secure_ipl.py L: qemu-s390x@nongnu.org =20 S390 PCI --=20 2.55.0 From nobody Sat Sep 26 21:35:38 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=1787749014; cv=none; d=zohomail.com; s=zohoarc; b=RcvGIcNYBV+SFqUyxbK7plMCfnZDXcZspDEfNCXo79eZXhHbu8cUDX0eAghoPRCr61NvERA/moPr2IBuosOK9nzyz/cP4/I4pgO6Crai3YKXHzsuVGtuGtrwRbJtlp1G/Aeod0DYzUEYGRgsc/5Hu0iFZCOJKf9TwpcHzhHwnR0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787749014; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=RsDHaaOUD9CZfqArRt9ihexlRTzPNRFyvh6LmZYEOLI=; b=aYasQ3mZ3yMdp5XVayW1FTdJVtl/ksynBM4anMsAE9J7viPPYfetRIZWl9/T1FHohuQo520kXQpsCs4qvqdaXroLDsDGRaCHguFkGcyLDNLojGnIKxn7CALN6Knk4YTPxA46Wl+fKOPMpJUfTzvH84gaBfUPYWTJshkuMpAkiL4= 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 1787749014846196.76493350383794; Wed, 26 Aug 2026 05:56:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzD9D-000257-FZ; Wed, 26 Aug 2026 08:54:31 -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 1wzD8L-0000Jb-1m; Wed, 26 Aug 2026 08:53:37 -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 1wzD89-0002tv-IR; Wed, 26 Aug 2026 08:53:36 -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 67QCW0MF2877737; Wed, 26 Aug 2026 12:53:04 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 4g726epknr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:53:03 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67QCfOur003065; Wed, 26 Aug 2026 12:53:03 GMT Received: from smtprelay02.dal12v.mail.ibm.com ([172.16.1.4]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4g7p3qa5pr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 26 Aug 2026 12:53:03 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (smtpav02.wdc07v.mail.ibm.com [10.39.53.229]) by smtprelay02.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67QCr1GU15925930 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 Aug 2026 12:53:02 GMT Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B71BE58060; Wed, 26 Aug 2026 12:53:01 +0000 (GMT) Received: from smtpav02.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C874B5805C; Wed, 26 Aug 2026 12:53:00 +0000 (GMT) Received: from li-479af74c-31f9-11b2-a85c-e4ddee11713b.ibm.com.com (unknown [9.61.78.161]) by smtpav02.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 26 Aug 2026 12:53:00 +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=RsDHaaOUD9CZfqArR t9ihexlRTzPNRFyvh6LmZYEOLI=; b=ovaTi4/TIxDh1sTRTalK7+QDzuxNfmKoI VLv27O57NnAfkIaYIj2uDqj8HyL7tyo+MhcdASWWUSMcvbycnfcGy6NCx0Cd3W71 2Hen09ofgnXt7mVu9e7vAmNdZEZc2+8e/PFPp1B+CeXBelwJX4Dtx1dY2zpOnq5O D0dBG6laiUT0bP+ftkkJB0HToZ5qjeS1Efy+8ec0UlsrE9iprouC+fclMfY2ub8m QzrnrXSyOtcIPipaXbiWIa6WzA5VcXAshEmTE3C8aSwCO66Fpwt8uImNb6yHiF/n NtmrXV+wLHnhempllQzdOspat0URTRW45Y72Hy+TzkVLNSpE9DESw== From: Eric Farman To: qemu-devel@nongnu.org Cc: qemu-s390x@nongnu.org, Matthew Rosato , Cornelia Huck , Eric Farman Subject: [PULL 37/37] pc-bios/s390-ccw.img: update s390x bios Date: Wed, 26 Aug 2026 08:52:12 -0400 Message-ID: <20260826125213.1901252-38-farman@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826125213.1901252-1-farman@linux.ibm.com> References: <20260826125213.1901252-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=TfimcxQh c=1 sm=1 tr=0 ts=6a8ee1b0 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VnNF1IyMAAAA:8 a=VCnjdmfTgQdoE0W_WIoA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX0DZoLDuiFE8h UsuZBrzcN0GDD+k0RvDSgCbWXn2k3yPpqKqc5RbUiE22VxFAP3dF1vzAwoW7QegB5jHJpe9xLSH gIXQuydx01nXg23ZfLV8L2wE5gS2KBc= X-Proofpoint-GUID: GigB9EpmFrvnqHNebRk7_bKvqX8n85SP X-Proofpoint-ORIG-GUID: GigB9EpmFrvnqHNebRk7_bKvqX8n85SP X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI2MDEwNCBTYWx0ZWRfX2mufup59f96U IboE+1/rwY8S72PB9RHiKpFJ5IfTiqxE7W4/VVQqraEiBb/onG51qjGuz4s5A03QfkiOwuMAHGx fPLU9+8xUBjrbQXoB0caUmjtzowuwTY01vUg+N8403USW1BsbSKqbVR5HO8m/LQd89uHcFDH2oV B54yUkqOyviJLjQDIsMvPjkxMmrlvgFoDKT7kD+7hC+a2oOyGDcZIWiWLfnLp6tnMW9t71ejzte 0IXDq3exsRSnnzYNimOM75RvKmrYJ0Vtj65UmkSLl30hdVv/vjDyDnuFHiWVNLJ3QWKTvYuxXRO FHnwfzgNToCyrsSBjZwuOC7gL2frZR5vO6ddB4wwHBz9cmRNty/h+ILHZDsSiFzRapr7JMKM7gr 8loQZ/OJ+QFbL9Ti0I7qWAXUDT4NLDuDECEyuwhWMfgIqjD3Y6TcnS9jZwI1lBnuULfQ9BwhDYa nrkP9CKmdyVsuc+gClg== 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-08-26_03,2026-08-26_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 bulkscore=0 malwarescore=0 priorityscore=1501 lowpriorityscore=0 clxscore=1015 phishscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608260104 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: 1787749016099158500 Content-Type: text/plain; charset="utf-8" Rebuild the bios to include the secure IPL changes. Signed-off-by: Eric Farman --- pc-bios/s390-ccw.img | Bin 104216 -> 112408 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img index 291cd77eaff40679d0cc2d5697d0c7b73c493e94..de4f45180a46d19e2452743a1fb= c2cd8a11462ab 100644 GIT binary patch delta 32935 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 W-Ad1grCGYO`TP$yIj?E&SN{nit7ts{ delta 24716 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 --=20 2.55.0