From nobody Wed Jun 24 21:45:00 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=fail (Bad Signature); dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1782293104849916.9589156510593; Wed, 24 Jun 2026 02:25:04 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id B13F741CEE; Wed, 24 Jun 2026 05:24:32 -0400 (EDT) Received: from [172.19.199.7] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 9B6FE41CC6; Wed, 24 Jun 2026 05:21:59 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 7AB5241C95; Wed, 24 Jun 2026 05:21:40 -0400 (EDT) Received: from mx0a-002c1b01.pphosted.com (mx0a-002c1b01.pphosted.com [148.163.151.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 4A5B241DAC for ; Wed, 24 Jun 2026 05:20:06 -0400 (EDT) Received: from pps.filterd (m0127838.ppops.net [127.0.0.1]) by mx0a-002c1b01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 65O5xk0O1354654 for ; Wed, 24 Jun 2026 02:20:00 -0700 Received: from bl0pr03cu003.outbound.protection.outlook.com (mail-eastusazon11022136.outbound.protection.outlook.com [52.101.53.136]) by mx0a-002c1b01.pphosted.com (PPS) with ESMTPS id 4f006t1hnc-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT) for ; Wed, 24 Jun 2026 02:19:59 -0700 (PDT) Received: from LV3PR02MB10211.namprd02.prod.outlook.com (2603:10b6:408:218::9) by CH3PR02MB10382.namprd02.prod.outlook.com (2603:10b6:610:203::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.159.13; Wed, 24 Jun 2026 09:19:56 +0000 Received: from LV3PR02MB10211.namprd02.prod.outlook.com ([fe80::a2ec:4c29:623:e12]) by LV3PR02MB10211.namprd02.prod.outlook.com ([fe80::a2ec:4c29:623:e12%3]) with mapi id 15.21.0159.013; Wed, 24 Jun 2026 09:19:56 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= proofpoint20171006; bh=Qy7NKoCZx4ocT/eszaDYhZcbTbc2jUc0cbSuVjzch FE=; b=wqP/2gpP1QtaZQO/Rcnu6K+5SLmgT029nxusLmgNr1gU1PoZFFu42ULtp seG1ifOf8HLdHZJbRN9vrMAJfY0G2u+FX9+IQA3dhWJiKq96smMf0FaTXp2YOk/9 FGWoDxeZv2b/WZb40tvoLLtEVLqlanf7dF2OCFbsyFi49myqEChrbXJF19Q2mqlk o9etxE+oKpNdCn7TnLlaAeLrrTxsvXu89rnSzg1rGAr2rl8T7Ko3ZxuW2ZRBwAiW pDZm/0/nqmq7cdojXfqGFKJEB+34LYQD4R+xVa1/wgBe0Z7WlDr1VDGRpFxM3RM2 vdD94SJHVtSFo2K3S3XtbOaDF1jiA== ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=V6quAYLRxGLMU5JDb3RBvXJAzdWQWx0TdboyA0SJH9dArX9SpKWnrjIfPh0l/5CTiJ70NbHmcvoi27290ujiagXkRI6wMoZlPMLTpTdRAReOi8/S+evPlZ0wZrcpdRalbbj8WplDDb3XJ9pl+6PVLxfAR0LmaKLCWFqiofjDiVJStVUwhfh5QPDHXIpBePxGRBCXNdb78jeq8HtDNE+IrGh9VbPM/yrqPfZs4zAtaobeGBbACUewImivHJw8KcEmP9olj/Ut+ry1wsAZOhRFt95/VA2SpqfMeU9yxG0kuHxvexTZR3WY1xJFK6r3R1gM5PPxSmTeZURR1I6ev0tSkA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Qy7NKoCZx4ocT/eszaDYhZcbTbc2jUc0cbSuVjzchFE=; b=kpwowJ39Q73yr9FlIYXpYEPV6EpkWgfghbhg/K0ikLoWu071IKSB+fJxQr3jagqCMTgKt+JGFj8kql7XwxEwGVgd7iwy6WV9l5mtTOsBlgbfl51AcKb+Cj4b0Y5ffaj9hpPOaKwSui3wZG/pml15LNh5MhPGPoXI9UsFfKrpS/IQa3QM90G8emtoSXa+tzzGcUV4RlkGFIkak7zo0Z1jAhOwzh2pqhuius3vo4Z6M0uVGmu9x9Jas73meuLiaBegp0dGrOJ3N7jZtNeeyJcHARmwt1R9Xywgi51DWmsRVUmJGnEaOqRf0aZk/1ZT/b6k2lVzstwr5vJJn57qhys/Ew== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nutanix.com; dmarc=pass action=none header.from=nutanix.com; dkim=pass header.d=nutanix.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Qy7NKoCZx4ocT/eszaDYhZcbTbc2jUc0cbSuVjzchFE=; b=CvwnfeWyyY/7F2xAyPn5tLZxhqZnoZ1fuXjhkemUAMNY6DZsFByAtcT/6xH2THPS8iPhvfXTkMIn6uxZ86yOkRkXQAIExEChjAq6VEY9n6cF9C06ksWSaVZZijo3GlDdqrMqJod7sDudkHuQpslryimC1IIphqoYNwj0JiZXngZp/6Pw75FDlJoR2QG/0+g0awD0pspTCEf2T+RxQh0LzhTs38YPaKlFDxMjdIVu2+skDjLqh9qpHGeSYYCIqs81RXsx16sjLhOKmjktXIjXS+Ik2VOyf9J2Eke42FRnNTZaNlwaoZGpgRqhpzGS2dOs96NkVL2+THzxiW86wJUBaQ== To: devel@lists.libvirt.org Subject: [RFC PATCH 1/3] Query supported ARM CPU property values from QEMU Date: Wed, 24 Jun 2026 09:17:05 +0000 Message-ID: <20260624091918.2073488-2-sandesh.patel@nutanix.com> X-Mailer: git-send-email 2.43.7 In-Reply-To: <20260624091918.2073488-1-sandesh.patel@nutanix.com> References: <20260624091918.2073488-1-sandesh.patel@nutanix.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CY5PR13CA0029.namprd13.prod.outlook.com (2603:10b6:930::6) To LV3PR02MB10211.namprd02.prod.outlook.com (2603:10b6:408:218::9) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV3PR02MB10211:EE_|CH3PR02MB10382:EE_ X-MS-Office365-Filtering-Correlation-Id: dd31e645-e8fd-4daf-28d3-08ded1d1c1c8 x-proofpoint-crosstenant: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|23010399003|1800799024|6133799003|18002099003|22082099003|56012099006|3023799007; X-Microsoft-Antispam-Message-Info: +DgYH5gYuESkmmhpbIGDbLYDIzWxHSnb1GLvx2z36c3FY/SyAKMzCgtRZ9Eu5KpIh0wmstvOmjGZ41Y9A8bS4pqOLwfHCCoLVwqJwGsuVKvqLcoxjfRzK+dhzb4p7/65PMWdESWK0/G3nyNAGXTTZ1fT7YJeIjMuSa+b4sVtMN12nQkzEoX01NXqvUyyGi5OypF1eT0NncyC57f3nuocRWwEoVmTQaaeVxGwOwrMweYEbe2/jAAr+a+fkjIIaNyQHezyf6vR/u0pCYoeOsjVTk1Lgb+eopRtQ00vd3KiKeDCk0nM2Mgg1O+cf93TZvfvjZAKgM7yDNGXvFIh8gjQs08E5A9cdnPPVsY/kB6g7YJmD1WfbfpajHEiLVgYVk0GBqn/u+RDxECCBjqQ5FSwACykmNZyWQwclwN32gGj+eMBmAhzEb1U3jxw+GdFe/vUAxVxK37EqNxgEhWv7fuN/+mA+kPgEUneFCm6lO/uB5jQm0xsYnyw9l1am+c54cJUcZZLv3ifMq/luP4IhiMI/WzQnG+KnAav0J5xnL4fdkPPZQZN8a7/gSd2HAfvwPzw+3tu4TyMNx5Sg3ajxd/aLcKMRz5HdSJE+sZpPrQvYbae1uRmAtD1FIf9CV6rwtrxsVkBrfeAxaYaeK943fIAX/LlY9rGZ9k9qDf0o7ffeRE= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV3PR02MB10211.namprd02.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(23010399003)(1800799024)(6133799003)(18002099003)(22082099003)(56012099006)(3023799007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?kGU7qLS2hQKWHJ3TveyoEq9x/6giWUCQFWJbhnM6sU/TZBJdJgPZUyxdcmTA?= =?us-ascii?Q?uFc7sUeKK9VLyU9C2zLXSjj7/65NR5OF5ORkI1A4QG1OuxOfIPl3vWCy0Ogw?= =?us-ascii?Q?DKar/iDd+khbDnXgVoLg6VJUMJpzB7tHiipQjAAwZFGtbt78fQX2HQ/8S5hN?= =?us-ascii?Q?70hvleRL89cORrisKD9N4PazQx6HXzNo3xHsWl487pX0yRa7eq7AvE2uGMah?= =?us-ascii?Q?i7U3uNDmsIOCt0/jK2jba5PUWj5U9kFXRbqA9rWQIRvRiuHdLRltTlqxvBtt?= =?us-ascii?Q?dppPS4cTuR4fw/uaDy+12U0tyVGEZlO+IXwPeIjDo9Gua/NUBm+lh9wlYcHX?= =?us-ascii?Q?vl+m5PxRyiEzyDiyd+SHWS6a5F0bj0bnOAB4LqCoBbfDOS2i1+LeoipG/eax?= =?us-ascii?Q?UI2GrMPrTDBsByFhYpcWpB8uHmFIQ3yzW6cH1Fd/OLV94S53Tl2i6WRm9XZw?= =?us-ascii?Q?WntB0w79SqHldzfdvkvZPCLbbofrHiBoXfZLgJU1rw9MZSfvU1exWZsJMasO?= =?us-ascii?Q?Gtzu4+Oc2AKl1o4nfSsi0tFuRO7Bt4x6N+m+ZizpXSqDlOoCQsh/9PYrATVV?= =?us-ascii?Q?8zswzj2p0YlEsx5OBp3uIHav4o+DT7MoWy53I4NqnNWaSTwmZmH71tb2a3Mz?= =?us-ascii?Q?YbO10ovQBGPC+VNtn2a+357COL71GfdkBpRVio9dy0CB9UCfIBsXnbbYc7ao?= =?us-ascii?Q?JQjAxrTM7WQbH4M6sbxyaD+6B+S0/T7VtZ7B1DT1TMtrmHZa9oqrIEtiPmT8?= =?us-ascii?Q?0pJ7wcP7T5b4qwlhnjuT0MQwbAfpnPs5zEobY6L8sWWk1zXhR4touZNz6NAb?= =?us-ascii?Q?Q2QZx6QpkOyut6RbqeVaBfwdHPzaN7WGOaPWm3O72EcPaNvEQkhVQu+jR04B?= =?us-ascii?Q?RyMTyUUo++uGXKEvKm74Lh/2AzHH6D1bgoLltkUFTeNTwn+tfKhOouoLo197?= =?us-ascii?Q?MkYJvFTZCh1ZoQkKBVVymbJFHhqTJYFzvEQYWf4UWIGRY2Aj6ZR3UB5g+HtZ?= =?us-ascii?Q?kVs/Ffc83RbktBx2qp3491wu0cUJc0cBv2t87pbO53YTQRX/w8zFSfAaczmj?= =?us-ascii?Q?0Be195EBucFCzUYEf7G39FKnbpf8CZqJ0SIT9CY6hJ16yrKDQR7Y13TauqTe?= =?us-ascii?Q?4POT0gIHpz/f6kBE+AkYORx1QjgAhBnUwpydGQ6KbMsgrbkFvKBx9kwx7dax?= =?us-ascii?Q?scO4s56RJ36EdgVv5j/kaGkQfcmJx8aJRY7xaMmBV830wePPLup49RZkSDRS?= =?us-ascii?Q?Mc4eCVma6DFyZdKsphyuR5EGRBKNpQk2mPR2FODhjp1cqjMCONGrPRRaFgWY?= =?us-ascii?Q?o8o1jrauWoWOVHbHnAyY+FlEFPN7SYam6GDbe/Urdqnna5Er6wsWkMY3U8AL?= =?us-ascii?Q?NxcENi1664PsE+bFemsZ2aOvy70HMmUuEFiOTrOjtfz8PBEdMy0g2bqilosE?= =?us-ascii?Q?feH8rBloQUGRbjTW5qqB4YijtcHMVBtL5fVl+qOsTZWuifrr0agWoFq0o0y0?= =?us-ascii?Q?rIzW6UYFgTMCnyZGk7kgcC79q6MVLBkJTbpaWymfKZBPvJEV/7TNa/bcqZjQ?= =?us-ascii?Q?drqt3lKqpiB8eZVnIAFDQ5tVesYHQErcriQ3I1QL108wW8khd2HwfjK4++be?= =?us-ascii?Q?oEFgz4WyLP9gFO2jZvvcURVXr3PUNJNoRdV4mxURsCaOP4a97zxB+ijWSlWG?= =?us-ascii?Q?7UFBnP0KnPxBGZjE2L9CEdeArJ5WZ6936HR7YzAnfTnzkXxYmfQJP4nV2hHp?= =?us-ascii?Q?WFuUaWPI5h7t8KQenVMpxxGqeL1HkX8=3D?= X-Exchange-RoutingPolicyChecked: S1piOK+nYZfnL6Xxl236OBPVmnPf2fyCbrHJrHIsZ7Py2Y3k+6JWeV4GHj2gCwQqN9bQ68xc0XqX2fYPd9GjqvIfFMUeodkc0rmnecafVnFqQgjl+AZBwQbUz4018iLrZoaA3OW7vH3FeGQ5M4C033vy4xg6VG4D9Ny9cMM8E5ne2TdyDAi8NBJins4EMfNxEP3NT3DdvJgR5rwvT67BnnZyCUddJ6aSl+IbXc1SmXOH2ZZRoRRm9UHUyqUZldqx0ohZ91IP6mYn+0UK+Dw0AZrpTYwP5P+fSJLrCs27IWYdLDzwNoqD7yzVeFs8BA9cANJy+6wIyEE0PVRL3VsSGg== X-OriginatorOrg: nutanix.com X-MS-Exchange-CrossTenant-Network-Message-Id: dd31e645-e8fd-4daf-28d3-08ded1d1c1c8 X-MS-Exchange-CrossTenant-AuthSource: LV3PR02MB10211.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Jun 2026 09:19:56.4319 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bb047546-786f-4de1-bd75-24e5b6f79043 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 7f8ymX+SRXu68TB8PeUZPT7ejWa2LhLmIYSH14iTLWvZ9zDjcKTkCXDjOY4VjtbuRxCFbEdB369toiuNqm86w10i9fkaXYsN6eJNcyVUDq8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR02MB10382 X-Proofpoint-GUID: PY90ILE-zgO2t1y3jJIN-0-g5gfsjnW_ X-Proofpoint-ORIG-GUID: PY90ILE-zgO2t1y3jJIN-0-g5gfsjnW_ X-Proofpoint-Spam-Info: AW1haW4tMjYwNjI0MDA3NiBTYWx0ZWRfX2VtoJtbke84x uHKaiX5X01IQah8w39wA8K3qt0a7GMKPV7sdP8qaoxHQE+kiagNPOQQJe4KH1nJLpFreh7vwqH1 2Sbp5V45Hz/sTAmWPfhMuT1XzQSI59A= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjI0MDA3NiBTYWx0ZWRfX0DrtEPmvbDEk CiVtmdp3WbNUVHreUqbrGjC7mBgPS07UT2hSKZFirYLL5+7C/UTpjljB3si+v4HuHz7QB/AJ5S4 WUdXmhyzsWrHLN9PxjEYwe7CizELzqkpQwd8lV88CrKzq6g/XfFzKuQc7CSt70qpDjMTU0NA6/J DFUT20HGLw3ipuHoz5YiN6qOnTdtC7NsJdZom9w4jWmpQagPNXHFH2Sg1hXfWHQF73f+RpJTigq 4SsiJy9iNk3l6SliUz/G3OQJ+k4DbSiD3hDJu5Wd0R1SOkLh5DcM/QjNy858+hV5tF4/LfahxeP obgm1pIyajFeEudVPxS7FU1OlK2nKNorUap+/1HPjFPSz/fF33J27ZY+ZQsGXtWJKJNKXX+E7v1 o46WU075kNscEuroyRBlq8GD/o/UefpxtnXPDMu2hgn35Vnrsy6yGXNpdXBmrkEoRkhU7K5/ruy UT6c6xH/tsb2HpsngVg== X-Authority-Analysis: v=2.4 cv=Xfi5Co55 c=1 sm=1 tr=0 ts=6a3ba140 cx=c_pps a=wT4O3adra3cfqKKwvhZ7sQ==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=FelO9ux0wxsA:10 a=0kUYKlekyDsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VofLwUrZ8Iiv6rRUPXIb:22 a=1L6crL_YRTbalZ11mEUO:22 a=VwQbUJbxAAAA:8 a=64Cc0HZtAAAA:8 a=ybTZXA7WAAAA:8 a=dNiPjOfFFMN0X28rXv4A:9 a=HcEtEu571YGEX4aK26Fo:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-24_02,2026-06-23_01,2025-10-01_01 X-Proofpoint-Spam-Reason: safe Message-ID-Hash: X5DZSY33UADHQEKANHJY5V23W3ZY6G6M X-Message-ID-Hash: X5DZSY33UADHQEKANHJY5V23W3ZY6G6M X-MailFrom: sandesh.patel@nutanix.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: shaju.abraham@nutanix.com, khushit.shah@nutanix.com, Sandesh Patel X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "sandesh.patel--- via Devel" Reply-To: sandesh.patel@nutanix.com X-ZohoMail-DKIM: fail (found 2 invalid signatures) X-ZM-MESSAGEID: 1782293107628158500 Content-Type: text/plain; charset="utf-8" From: Sandesh Patel Unlike x86 boolean CPU features, ARM CPU features are exposed by QEMU as multi-bit properties whose accepted values depend on the host; only a subset of the possible values are valid on any given host. A pending QEMU patch series [1] introduces a new QMP command, 'query-arm-cpu-props-info', which returns, for each ARM CPU property, its type and the set of values supported on the host. Add support to query feature supported values [1] https://lore.kernel.org/qemu-arm/20260605083358.1320563-1-khushit.shah@= nutanix.com/ Signed-off-by: Sandesh Patel --- src/qemu/qemu_capabilities.c | 13 +++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_monitor.c | 51 +++++++++++ src/qemu/qemu_monitor.h | 26 ++++++ src/qemu/qemu_monitor_json.c | 66 ++++++++++++++ src/qemu/qemu_monitor_json.h | 5 + .../caps_11.1.0_aarch64.replies | 69 ++++++++++++++ .../caps_11.1.0_aarch64.xml | 1 + tests/qemumonitorjsontest.c | 91 +++++++++++++++++++ 9 files changed, 323 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index a28f87ad2b..cb933aa630 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -767,6 +767,7 @@ VIR_ENUM_IMPL(virQEMUCaps, =20 /* 495 */ "blockdev-mirror.target-is-zero", /* QEMU_CAPS_BLOCKDEV_MIRR= OR_TARGET_IS_ZERO */ + "query-arm-cpu-props-info", /* QEMU_CAPS_QUERY_ARM_CPU_PROPS= _INFO */ ); =20 =20 @@ -812,6 +813,7 @@ struct _virQEMUCapsAccel { virQEMUCapsMachineType *machineTypes; virQEMUCapsHostCPUData hostCPU; qemuMonitorCPUDefs *cpuModels; + qemuMonitorCPUPropsInfoList *cpuProps; /* currently only populated on = ARM + KVM */ }; =20 =20 @@ -1298,6 +1300,7 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = =3D { { "blockdev-set-active", QEMU_CAPS_BLOCKDEV_SET_ACTIVE }, { "qom-list-get", QEMU_CAPS_QOM_LIST_GET }, { "query-accelerators", QEMU_CAPS_QUERY_ACCELERATORS }, + { "query-arm-cpu-props-info", QEMU_CAPS_QUERY_ARM_CPU_PROPS_INFO }, }; =20 struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] =3D { @@ -2092,6 +2095,7 @@ virQEMUCapsAccelCopy(virQEMUCapsAccel *dst, virQEMUCapsHostCPUDataCopy(&dst->hostCPU, &src->hostCPU); =20 dst->cpuModels =3D qemuMonitorCPUDefsCopy(src->cpuModels); + dst->cpuProps =3D qemuMonitorCPUPropsInfoListCopy(src->cpuProps); } =20 =20 @@ -2157,6 +2161,7 @@ virQEMUCapsAccelClear(virQEMUCapsAccel *caps) =20 virQEMUCapsHostCPUDataClear(&caps->hostCPU); qemuMonitorCPUDefsFree(caps->cpuModels); + qemuMonitorCPUPropsInfoListFree(caps->cpuProps); } =20 =20 @@ -3453,6 +3458,14 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCaps *qemuCaps, } =20 accel->hostCPU.info =3D g_steal_pointer(&modelInfo); + + /* Query the ARM CPU property info. Only applicable on ARM + KVM. */ + if (ARCH_IS_ARM(qemuCaps->arch) && + virQEMUCapsTypeIsAccelerated(virtType) && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_ARM_CPU_PROPS_INFO) && + qemuMonitorGetCPUPropsInfoList(mon, &accel->cpuProps) < 0) + return -1; + return 0; } =20 diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 3014f3dc5e..5bb6d5e1da 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -741,6 +741,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for = syntax-check */ =20 /* 495 */ QEMU_CAPS_BLOCKDEV_MIRROR_TARGET_IS_ZERO, /* 'blockdev-mirror' support= s 'target-is-zero' */ + QEMU_CAPS_QUERY_ARM_CPU_PROPS_INFO, /* 'query-arm-cpu-props-info' qmp = command is supported */ =20 QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index baa78dd6fe..38a46cffc4 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3339,6 +3339,57 @@ qemuMonitorGetCPUModelComparison(qemuMonitor *mon, } =20 =20 +int +qemuMonitorGetCPUPropsInfoList(qemuMonitor *mon, + qemuMonitorCPUPropsInfoList **props_info) +{ + QEMU_CHECK_MONITOR(mon); + return qemuMonitorJSONGetCPUPropsInfoList(mon, props_info); +} + + +void +qemuMonitorCPUPropsInfoListFree(qemuMonitorCPUPropsInfoList *list) +{ + size_t i; + + if (!list) + return; + + for (i =3D 0; i < list->nprops; i++) { + g_free(list->props[i].name); + g_free(list->props[i].composite); + g_strfreev(list->props[i].supportedValues); + } + g_free(list->props); + g_free(list); +} + + +qemuMonitorCPUPropsInfoList * +qemuMonitorCPUPropsInfoListCopy(const qemuMonitorCPUPropsInfoList *orig) +{ + qemuMonitorCPUPropsInfoList *copy; + size_t i; + + if (!orig) + return NULL; + + copy =3D g_new0(qemuMonitorCPUPropsInfoList, 1); + copy->nprops =3D orig->nprops; + copy->props =3D g_new0(qemuMonitorCPUPropsInfo, orig->nprops); + + for (i =3D 0; i < orig->nprops; i++) { + copy->props[i].name =3D g_strdup(orig->props[i].name); + copy->props[i].type =3D orig->props[i].type; + copy->props[i].supportedValues =3D g_strdupv(orig->props[i].suppor= tedValues); + copy->props[i].composite =3D g_strdup(orig->props[i].composite); + } + + return copy; +} + + void qemuMonitorCPUModelInfoFree(qemuMonitorCPUModelInfo *model_info) { diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index c2afb580e4..1653d63722 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1455,6 +1455,20 @@ struct _qemuMonitorCPUModelInfo { bool migratability; }; =20 +typedef struct _qemuMonitorCPUPropsInfo qemuMonitorCPUPropsInfo; +struct _qemuMonitorCPUPropsInfo { + char *name; + qemuMonitorCPUPropertyType type; + GStrv supportedValues; + char *composite; +}; + +typedef struct _qemuMonitorCPUPropsInfoList qemuMonitorCPUPropsInfoList; +struct _qemuMonitorCPUPropsInfoList { + size_t nprops; + qemuMonitorCPUPropsInfo *props; +}; + typedef enum { QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC, QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC_FULL, @@ -1490,6 +1504,18 @@ qemuMonitorGetCPUModelComparison(qemuMonitor *mon, qemuMonitorCPUModelInfo * qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig); =20 +int +qemuMonitorGetCPUPropsInfoList(qemuMonitor *mon, + qemuMonitorCPUPropsInfoList **props_list); + +void +qemuMonitorCPUPropsInfoListFree(qemuMonitorCPUPropsInfoList *list); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuMonitorCPUPropsInfoList, qemuMonitorCPUP= ropsInfoListFree); + +qemuMonitorCPUPropsInfoList * +qemuMonitorCPUPropsInfoListCopy(const qemuMonitorCPUPropsInfoList *orig); + GHashTable * qemuMonitorGetCommandLineOptions(qemuMonitor *mon); =20 diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 28f7d93834..d44a6ab270 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5727,6 +5727,72 @@ qemuMonitorJSONGetCPUModelComparison(qemuMonitor *mo= n, } =20 =20 +int +qemuMonitorJSONGetCPUPropsInfoList(qemuMonitor *mon, + qemuMonitorCPUPropsInfoList **props_lis= t) +{ + g_autoptr(virJSONValue) cmd =3D NULL; + g_autoptr(virJSONValue) reply =3D NULL; + g_autoptr(qemuMonitorCPUPropsInfoList) props_info =3D NULL; + virJSONValue *data; + size_t nprops; + size_t i; + + if (!(cmd =3D qemuMonitorJSONMakeCommand("query-arm-cpu-props-info", N= ULL))) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + return -1; + + if (!(data =3D qemuMonitorJSONGetReply(cmd, reply, VIR_JSON_TYPE_ARRAY= ))) + return -1; + + nprops =3D virJSONValueArraySize(data); + + props_info =3D g_new0(qemuMonitorCPUPropsInfoList, 1); + props_info->nprops =3D nprops; + props_info->props =3D g_new0(qemuMonitorCPUPropsInfo, nprops); + + for (i =3D 0; i < nprops; i++) { + virJSONValue *item =3D virJSONValueArrayGet(data, i); + virJSONValue *sv_array; + const char *name; + const char *type_str; + int type; + + if (!(name =3D virJSONValueObjectGetString(item, "name"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-arm-cpu-props-info reply is missing 'n= ame'")); + return -1; + } + + if (!(type_str =3D virJSONValueObjectGetString(item, "type"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("query-arm-cpu-props-info reply for '%1$s' is= missing 'type'"), + name); + return -1; + } + + if ((type =3D qemuMonitorCPUPropertyTypeFromString(type_str)) < 0)= { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("query-arm-cpu-props-info reply for '%1$s' ha= s unknown type '%2$s'"), + name, type_str); + return -1; + } + + props_info->props[i].name =3D g_strdup(name); + props_info->props[i].type =3D type; + props_info->props[i].composite =3D g_strdup(virJSONValueObjectGetS= tring(item, "composite")); + + if ((sv_array =3D virJSONValueObjectGetArray(item, "supported-valu= es"))) + props_info->props[i].supportedValues =3D virJSONValueArrayToSt= ringList(sv_array); + } + + *props_list =3D g_steal_pointer(&props_info); + return 0; +} + + static int qemuMonitorJSONGetCommandLineOptionsWorker(size_t pos G_GNUC_UNUSED, virJSONValue *item, diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index f4c093d717..11b07a6770 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -446,6 +446,11 @@ qemuMonitorJSONGetCPUModelComparison(qemuMonitor *mon, char **result) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); =20 +int +qemuMonitorJSONGetCPUPropsInfoList(qemuMonitor *mon, + qemuMonitorCPUPropsInfoList **props_lis= t) + ATTRIBUTE_NONNULL(2); + GHashTable * qemuMonitorJSONGetCommandLineOptions(qemuMonitor *mon); =20 diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.replies b/tests= /qemucapabilitiesdata/caps_11.1.0_aarch64.replies index 41cd5496c6..40fd157680 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.replies +++ b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.replies @@ -24932,6 +24932,40 @@ "in-use", "auto" ] + }, + { + "name": "query-arm-cpu-props-info", + "ret-type": "[999]", + "meta-type": "command", + "arg-type": "0" + }, + { + "name": "[999]", + "element-type": "999", + "meta-type": "array" + }, + { + "name": "999", + "members": [ + { + "name": "name", + "type": "str" + }, + { + "name": "type", + "type": "str" + }, + { + "name": "supported-values", + "type": "[str]" + }, + { + "name": "composite", + "default": null, + "type": "str" + } + ], + "meta-type": "object" } ], "id": "libvirt-4" @@ -37945,6 +37979,41 @@ } } =20 +{ + "execute": "query-arm-cpu-props-info", + "id": "libvirt-46" +} + +{ + "return": [ + { + "name": "hw_prop_WRPs", + "supported-values": [ + "0-3" + ], + "type": "number" + }, + { + "name": "hw_prop_API", + "composite": "pauth", + "supported-values": [ + "off" + ], + "type": "string" + }, + { + "name": "feat_RAS", + "supported-values": [ + "0.0", + "1.0", + "1.1_base" + ], + "type": "string" + } + ], + "id": "libvirt-46" +} + { "execute": "qmp_capabilities", "id": "libvirt-1" diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml b/tests/qem= ucapabilitiesdata/caps_11.1.0_aarch64.xml index f7dd14a1ad..f2340830fd 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml @@ -188,6 +188,7 @@ + 11000050 61700287 v11.0.0-1600-g5611a9268d diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index f59b97c1c3..0808c23c18 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -2682,6 +2682,86 @@ testQemuMonitorJSONqemuMonitorJSONGetCPUModelBaselin= e(const void *opaque) } =20 =20 +static int +testQemuMonitorJSONqemuMonitorJSONGetCPUPropsInfoList(const void *opaque) +{ + const testGenericData *data =3D opaque; + g_autoptr(qemuMonitorTest) test =3D NULL; + g_autoptr(qemuMonitorCPUPropsInfoList) props_list =3D NULL; + + if (!(test =3D qemuMonitorTestNewSchema(data->xmlopt, data->schema))) + return -1; + + if (qemuMonitorTestAddItem(test, "query-arm-cpu-props-info", + "{ " + " \"return\": [ " + " { " + " \"name\": \"hw_prop_API\", " + " \"supported-values\": [\"off\"= ], " + " \"type\": \"string\", " + " \"composite\": \"pauth\" " + " }, " + " { " + " \"name\": \"feat_RAS\", " + " \"supported-values\": [\"0.0\"= , \"1.0\", \"1.1_base\"], " + " \"type\": \"string\" " + " } " + " ] " + "}") < 0) + return -1; + + if (qemuMonitorJSONGetCPUPropsInfoList(qemuMonitorTestGetMonitor(test)= , &props_list) < 0) + return -1; + + if (props_list->nprops !=3D 2) { + virReportError(VIR_ERR_INTERNAL_ERROR, + "Expected 2 properties, got %zu", props_list->nprop= s); + return -1; + } + + if (STRNEQ(props_list->props[0].name, "hw_prop_API") || + props_list->props[0].type !=3D QEMU_MONITOR_CPU_PROPERTY_STRING || + STRNEQ(props_list->props[1].name, "feat_RAS") || + props_list->props[1].type !=3D QEMU_MONITOR_CPU_PROPERTY_STRING) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "Unexpected property name or type"); + return -1; + } + + if (!props_list->props[0].supportedValues || + STRNEQ_NULLABLE(props_list->props[0].supportedValues[0], "off") || + props_list->props[0].supportedValues[1] !=3D NULL) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "Unexpected supportedValues for hw_prop_API"); + return -1; + } + + if (!props_list->props[1].supportedValues || + STRNEQ_NULLABLE(props_list->props[1].supportedValues[0], "0.0") || + STRNEQ_NULLABLE(props_list->props[1].supportedValues[1], "1.0") || + STRNEQ_NULLABLE(props_list->props[1].supportedValues[2], "1.1_base= ") || + props_list->props[1].supportedValues[3] !=3D NULL) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "Unexpected supportedValues for feat_RAS"); + return -1; + } + + if (STRNEQ_NULLABLE(props_list->props[0].composite, "pauth")) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "Expected composite 'pauth' for hw_prop_API"); + return -1; + } + + if (props_list->props[1].composite !=3D NULL) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "Expected NULL composite for feat_RAS"); + return -1; + } + + return 0; +} + + static int testQemuMonitorJSONGetSEVInfo(const void *opaque) { @@ -2933,6 +3013,7 @@ mymain(void) testQemuMonitorJSONSimpleFuncData simpleFunc; g_autoptr(GHashTable) qapischema_x86_64 =3D NULL; g_autoptr(GHashTable) qapischema_s390x =3D NULL; + g_autoptr(GHashTable) qapischema_aarch64 =3D NULL; struct testQAPISchemaData qapiData; =20 if (qemuTestDriverInit(&driver) < 0) @@ -3195,6 +3276,16 @@ mymain(void) DO_TEST(qemuMonitorJSONGetCPUModelComparison); DO_TEST(qemuMonitorJSONGetCPUModelBaseline); =20 + if (!(qapischema_aarch64 =3D testQEMUSchemaLoadLatest("aarch64"))) { + VIR_TEST_VERBOSE("failed to load qapi schema for aarch64"); + ret =3D -1; + goto cleanup; + } + + qapiData.schema =3D qapischema_aarch64; + + DO_TEST(qemuMonitorJSONGetCPUPropsInfoList); + cleanup: qemuTestDriverFree(&driver); return (ret =3D=3D 0) ? EXIT_SUCCESS : EXIT_FAILURE; --=20 2.43.7 From nobody Wed Jun 24 21:45:00 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=fail (Bad Signature); dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1782294078153364.34058977876043; Wed, 24 Jun 2026 02:41:18 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id C92FB41DC0; Wed, 24 Jun 2026 05:40:44 -0400 (EDT) Received: from [172.19.199.7] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 5AA5D41D9F; Wed, 24 Jun 2026 05:39:24 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 2F70241BFB; Wed, 24 Jun 2026 05:39:06 -0400 (EDT) Received: from mx0b-002c1b01.pphosted.com (mx0b-002c1b01.pphosted.com [148.163.155.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 783BD41BDE for ; Wed, 24 Jun 2026 05:38:59 -0400 (EDT) Received: from pps.filterd (m0127842.ppops.net [127.0.0.1]) by mx0b-002c1b01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 65O5uYdx2202865 for ; Wed, 24 Jun 2026 02:20:03 -0700 Received: from bl2pr02cu003.outbound.protection.outlook.com (mail-eastusazon11021125.outbound.protection.outlook.com [52.101.52.125]) by mx0b-002c1b01.pphosted.com (PPS) with ESMTPS id 4f00gx1gb1-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT) for ; Wed, 24 Jun 2026 02:20:02 -0700 (PDT) Received: from LV3PR02MB10211.namprd02.prod.outlook.com (2603:10b6:408:218::9) by CH3PR02MB10382.namprd02.prod.outlook.com (2603:10b6:610:203::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.159.13; Wed, 24 Jun 2026 09:20:01 +0000 Received: from LV3PR02MB10211.namprd02.prod.outlook.com ([fe80::a2ec:4c29:623:e12]) by LV3PR02MB10211.namprd02.prod.outlook.com ([fe80::a2ec:4c29:623:e12%3]) with mapi id 15.21.0159.013; Wed, 24 Jun 2026 09:20:01 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 X-Greylist: delayed 1135 seconds by postgrey-1.37 at lists.libvirt.org; Wed, 24 Jun 2026 05:38:59 EDT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= proofpoint20171006; bh=LrY1E9C6vi/VIPUfNajyYGwk8WpS0sr2zLWZemWS0 IY=; b=0Yq3FR5fNOQeIg0Zt7H1z4tWRKbxqqiN+DvoLUR9jUK3Mdm/qVmLBZv99 WgU8mcmCx/W9FEXH944sZeZvCn5qIAM4qJwKqDJqMIYjsXF4RXnKBGEZRKKSdHZK JB0rNADzBz9339ryENyaWgz4TlpeHdLtZuM3yt4kEqR7rma7hUvFxX2gl/+EVwhf F7JI3+HGz4gp3boIhdzl4kkUBpGAUFZo3VLQnvwTCoZmtPKLVDVZkOMO3lxIDYip Dz5snHA9NzmvlSfq3U/sEuP4Lf3+l0Duar4OOmkffXKgBFwRT0xocQH9LsOXnmwY hvoGIfuFmYBWEXRTmWetdCodyTyGg== ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=lruaUXr/F+B3IQ7S/hs9J7ye4tPQpMxwRdbRj5Gjl3/a5NokAA2SpEh74UuQJcGdZBEShoE54VeAA9SV9SJ2uFvDUZSac3RXc7lyDeUSD2dcZsCnJCcyQuFxJv8D12ZM7boAiZ/CEZB0Lomx18FIsmmQNk7qCgh9z/UE0WGPCUnGAZ83/yKoq1k6e/QlHRdJQhNKZaUH9cKivPJ2KbHNu2dc9TrujEsJdfcT0rV3ZqKitr+bMiSHG41R83LKk67G811sqG8ChyHQhUUkr1TTrsl+mqQudmGi7ZT3/1ajGdUozbYYF1j2ZnO8+kzhfAUbw9oCrVtyINDeObbqvf2fuw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=LrY1E9C6vi/VIPUfNajyYGwk8WpS0sr2zLWZemWS0IY=; b=eD85qMSEVqORQyCBal6Kwgm81V/JKHEWwiHpkXm3JQF6pGaC7sJKtQ55MO0VyHXAmbaikrE2cLjblJAQcSG48R1fIfxOlvuBbpsFiHaJtxQU1T5ZRFw4ZjsSk29eIwaNA2oqUxyuMo1WrFWoWo+fNytOq3hdOw8ePmXz+uKuKaOOZqNgB472hW85Vr1OCvA5ViftBL1y2rQNhkflnL2NTUK6gCQQUODQFfsGgf20v4ypyR5nsWwwLNQR5JGfZtuhz2fOdr6cdYllDeKW2LN+0ejNoAjCafHT9etdUdYolw45EoEyx3Fpj441NAtJJvpoSkkClLlLknudEdqPFQA/nw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nutanix.com; dmarc=pass action=none header.from=nutanix.com; dkim=pass header.d=nutanix.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=LrY1E9C6vi/VIPUfNajyYGwk8WpS0sr2zLWZemWS0IY=; b=TIGi7PrnSFxNv9zWykC3ozcoIkaMloFT+bt30iivPwsKIff+wo6xlHBbNeb0sbb7xe30+mDkBKm595FCj+HoSzlWoEMvrpSqoC6ZpC6+0H4EsAO43SkttrDeIy190yVPsWESmYAEtCk2aPHWs/cVvwP6GphhZh3GiQfdNarQ66pcKepkJuC6lYNC0wc8KMUWlm460SIoQEB83AQOJYx/Rg20Ftm5bGvgPKmvjLpH5kb7Zz7UvdqNy5KZHNL+CrGKW4KkYAkUM/+VX/BbrCdG2Ho4ggfCTck/DP18mYmg1ETnFbeI3STzxC4FCVGqWPZb4jySmBUN54Kgai/csaJIBA== To: devel@lists.libvirt.org Subject: [RFC PATCH 2/3] Cache ARM CPU property information Date: Wed, 24 Jun 2026 09:17:06 +0000 Message-ID: <20260624091918.2073488-3-sandesh.patel@nutanix.com> X-Mailer: git-send-email 2.43.7 In-Reply-To: <20260624091918.2073488-1-sandesh.patel@nutanix.com> References: <20260624091918.2073488-1-sandesh.patel@nutanix.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CY5PR19CA0112.namprd19.prod.outlook.com (2603:10b6:930:64::12) To LV3PR02MB10211.namprd02.prod.outlook.com (2603:10b6:408:218::9) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV3PR02MB10211:EE_|CH3PR02MB10382:EE_ X-MS-Office365-Filtering-Correlation-Id: 7128157c-fe36-4852-c248-08ded1d1c4ba x-proofpoint-crosstenant: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|23010399003|1800799024|6133799003|18002099003|22082099003|56012099006; X-Microsoft-Antispam-Message-Info: OCD1iBCqGoS/I1zl6tKKGCVfiUOpwdtEgqFfhl4dgIscIFKT4MnOCPC9tauxlt4R18UGiN4Ijg+iK7WuyujMsho1XExPGllaMTZpsFn8Z0l78we4ldxnJk7tlgspO+gyAzgpzYTTt60SMWcSrBSK2dpF/9bx4gq8TU5FS6y/UB7t/QTJ58s2LclL0IW9xD4Oq8BhO8cg+ePonlBp0ZtYjzZEoz9UTYn9C4DhKHfZ1vC+JbVYSOSuwONWzvyw07rhmup/MTU2+Wv5oqGCgoJxS7wm22RqneCEpDv3PrAghupQNrRMuAYUCHFyRqA8OaCoUWjxHIpwYexpDrSTIf68Y7V3vL4+xMyAIvzg4LXVWvfBwCx/AGYyJ+8tyJKkfQ4qDNwWX0rzWtiEITGA22+ABnMnQ+EPyj5EvZnKCO88m9YsxXKN+QppAf38V6FPSt7xzjebaTW17wT3Ok365eHhIXoL38RnyVT4qfpuwSekvogJKR2WK1c5o/bjkVofXVQJF4YJPhOPN5CQi+8019ZWpvPpYRWFq0KACrS8OmSmBl/raznZM/8tP2XvgBx1hSEElo+bHMNvGsiQF90vUGFf2JOfVfE5f+LonzxRROGpGc5TCMZ28EgMD4BIo0pQxIYEaTmKZ1udoIaPESr03WzcdI9JULI3xIUmR6Iv8BEi3sU= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV3PR02MB10211.namprd02.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(23010399003)(1800799024)(6133799003)(18002099003)(22082099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?E9JmsoJnNKC2/UPLvGcmTNM5sHCQteXhyraIgIu493wY0M51xl34uJiRAolB?= =?us-ascii?Q?qIVySysmd2OdoE3gBK8Gby8+pBg0lwDKe1oX2nclSylcTapJq8s+N/3wIoqk?= =?us-ascii?Q?RvBE+prSbQWF20W0miAZlx5vyuRRfcRi10f394T0NWBcuFpDRjYeoPj9yoct?= =?us-ascii?Q?VdL/1qWQFpBmXT1OnHzpjjiyT6wyo7nsXT9GtdFvh1MU2u8avHlbKwLp+N+Y?= =?us-ascii?Q?L9wOD1CqjBeeIp9QyM0jWvaW9H/G+Y/rCZnujsliWDyzpAmUMtwq0iFmXzth?= =?us-ascii?Q?MTa9fwsg9QjFxZLiqg6Q+MkgMQ17jeSTiBwSc8Q2Zbn4+w+Cm8+iP0r1ESQa?= =?us-ascii?Q?DqZBkx0sfq26m+E+lmvGbuZQS0JE10kiu0CC5VA7AgHryxHNHyWsawIQOwgK?= =?us-ascii?Q?iVAFvcxSSBK07rpBYEDHGcerO7uu9HeiKJf516pyVLIE73qQImsL6CV8Ab7C?= =?us-ascii?Q?jQbCooej40oUFUIi0ZI06lG5rwkvIekJ5H2Vd8Hu2arIUAuC4Txh8QdFJ5gR?= =?us-ascii?Q?0yitTEJT5F1a1CpdNpjmiWTA+cuW6gHrBt2QeBRhER2Ekis3AUB7Z/dS6oC9?= =?us-ascii?Q?u9bd9bdq/Dy/UTBuuG8NIwIon2+XShNs6zhlnuprnTs86DcdhM/ysE0ag2XP?= =?us-ascii?Q?I+wv89FvKW4aTKyZ5iNpaeBhcoQQkIv+Pz401Lac0twe9vrEqDOEmvCHmq3T?= =?us-ascii?Q?U7r510qYs5ElvbSfrB9tClLQm7480l9rVjoyEE9bNdwPtWfIMEVLB7Q+u/5a?= =?us-ascii?Q?2jRQPxfFoirnxMeZMRXP9N29X178Wc8egw4+KbgO1NwGMQSwpE6XiruHgFB0?= =?us-ascii?Q?aaq62EEMYq1oCCxXPgZ7dFyQ8mgUoswo8cN25RbC8F546UjO2JcLfzPHFDbo?= =?us-ascii?Q?5W8U4laOj/nOnXfaisvIRnlPAPGE/jyKonIXrSNtFQ2XbnXQ3E1OYoXyIodn?= =?us-ascii?Q?dnD0uteGBkGFthYwqv3QHMeh9MTYe+FsIHTto3v3R4n7vuD3SRR4k+L8pP4P?= =?us-ascii?Q?x5kVXyAbC4Wh0q5SqqkSFpxu0HbCtvNA++QA1OfWGJnhA2p8vCFbFeH3e6K+?= =?us-ascii?Q?BZmtu1hqortcfVP+pOkmHpB0FTfBB5GBPV3JdiSqv6Q9MLw/Xm3i/WJ8tfeo?= =?us-ascii?Q?GE4jtfoRrDbTVyZaAor2UaUTCvULU6MbOkZnkpvs8oHp2zOpJ028QkhysVlz?= =?us-ascii?Q?Bn4UIuOyScZORQXHiARVG/pgfyRgeY+pDGgFjg2OwxQO/LNFQv7PSm0uSimp?= =?us-ascii?Q?peSG58YAlMQ5ejddBa2gSuULN8ugMWEXcUOKJka9FaCWp1ceqToafU7glMsy?= =?us-ascii?Q?SJA37MPc+xTjBn0ZSD83eiGVr77e27pSVzX5xyFr44oXxD2AgeK/koU1D+wW?= =?us-ascii?Q?cvaNk+yWQvNmjyeWqCCzO0QuYnmtFydeCXJV3LAm8yBkHjDmnjzbLOWRBYwd?= =?us-ascii?Q?y/4H4wKxumJ58w30seI4jnhcBaTqcBFl/+5FJIymeEJ0F5M0R9CC3PJjZQEW?= =?us-ascii?Q?QHkcm15tYJCsIgKmprQi0nELTPf1VWrJkN35RFIDd+Uh0re9FahBprO5jINt?= =?us-ascii?Q?8Bwmxi3JefEBZDFXmfmxe3nP0SrcxEoNRY3c3EfXZpucqRrYdyfjTfvyI5F1?= =?us-ascii?Q?XLcDaDbr9bMHvKETBogLuVp0Zii8n+xv0jOzvwwnvCQTrWJbRwkSptR34ohX?= =?us-ascii?Q?jXZ7jN3x6QsMf4vg9goSyl0K3CTw94SEPjzP0Vg7ahwRCEW8rNvhoPrpau2L?= =?us-ascii?Q?sb9RtOJgbLRhKg1Pbt6y9IcxPh4P/4s=3D?= X-Exchange-RoutingPolicyChecked: sxa5aQCF26xJw3GW7DqtV5IV9U+Kza8CG/+hHEuiqzEBeZKJV2/zxGt41rNIBuSBhnLesZLSB6pBy1RGG5OJGWzyLHktW815tpaggWFwszabQH8/jjckrXoSFvpcj6C6Y8tnLBJFMlDf91dCX9bMSWXr3kH9jFhOGt/+C7b9eNoUBqo/DMvtqyQ2YaVJ6laLvbi18q4EBAQmELlD6ssOjVpgyvHFquzui9st60YMUwSXSxcdM94vbVjpAYdUY4/9fmOTutOemlToosqr1bi9hbxy8DtTQE/Bq4hBARR7B4i3Dg18wI9tCzNu8rG3D7CGu9QdU46q6OXotGzlZvUEqg== X-OriginatorOrg: nutanix.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7128157c-fe36-4852-c248-08ded1d1c4ba X-MS-Exchange-CrossTenant-AuthSource: LV3PR02MB10211.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Jun 2026 09:20:01.3786 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bb047546-786f-4de1-bd75-24e5b6f79043 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Pq4BmqQ60HBd917p2PXNYVxSY8laH9zqnFwij+c8BJO8/yFXItVcl5uJQRDpoxiLygFKPwsowk/6QS4tDjyTPO9VTpdhx+aJVV+C4TC2aLw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR02MB10382 X-Proofpoint-Spam-Info: AW1haW4tMjYwNjI0MDA3NiBTYWx0ZWRfX+kzjBI2dkXUS Re7Q+zegKAwJX6eui32KToTYgDeT+LBHCHQy59cg3VES8FhroVjf+pt4juHmMs5LGe7BUqbQXtf XnenoKOlQzDHQzdTSTxpNKBTeeAxzdc= X-Proofpoint-ORIG-GUID: Vbcy9jGD2DNKY9orTcq5wGfTyum0CoHW X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjI0MDA3NiBTYWx0ZWRfX/W1+EOcdtI+O gJGCZKSGObOsTUsAY7U4ockpEsbc+QUbNuF5kipIJjtR+e/qV50Cj2P1KuK9O6kZKxkOQkyyTVJ XpcE7CWPUmFwM4JnGcowVBo81ZJo6462+LbKwUqOvQ1xDxTRW33MGy4WvuS+bUF4Ph0Hk61ieCT A7hcvtBJGoOInCmZ8AK8ZwyPCMfZCTj+pYk+dqpk5DWj8TB4BrYsW5sHadskc2dk2Un2HiV4ypD TzSB3xt9yGfb9+cfCCPKsAknwlfm6q2nhnSH5dlnJu3jx/FZrd/KKfpKEazemE7gW1/pffznp63 bg3I12yj9V2M2DbNQamBCQ/wm1fdDNOdPGp++8JTIZUNdlqXp2GxWgUBpaIdCPoW3HEEggwrTua 3wWor8y4yT7/5CBeCh0LAGrQNQl9mQ== X-Authority-Analysis: v=2.4 cv=EMQ2FVZC c=1 sm=1 tr=0 ts=6a3ba142 cx=c_pps a=/Qmun3bZW4YbXd3UFKUczw==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=FelO9ux0wxsA:10 a=0kUYKlekyDsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VofLwUrZ8Iiv6rRUPXIb:22 a=VUi8bpU7OL1Oj2-RSIOF:22 a=64Cc0HZtAAAA:8 a=nABFzKVlJAu1W68KlsMA:9 X-Proofpoint-GUID: Vbcy9jGD2DNKY9orTcq5wGfTyum0CoHW X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-24_02,2026-06-23_01,2025-10-01_01 X-Proofpoint-Spam-Reason: safe Message-ID-Hash: OMAICFDQZBHIYNGTMI3UH7CXGKZFVNQG X-Message-ID-Hash: OMAICFDQZBHIYNGTMI3UH7CXGKZFVNQG X-MailFrom: sandesh.patel@nutanix.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: shaju.abraham@nutanix.com, khushit.shah@nutanix.com, Sandesh Patel X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "sandesh.patel--- via Devel" Reply-To: sandesh.patel@nutanix.com X-ZohoMail-DKIM: fail (found 2 invalid signatures) X-ZM-MESSAGEID: 1782294081447158500 Content-Type: text/plain; charset="utf-8" From: Sandesh Patel Persist the list of ARM CPU properties and their host-supported values that was probed from QEMU into the on-disk QEMU capabilities cache, so that subsequent libvirtd starts do not have to re-issue the QMP query. Signed-off-by: Sandesh Patel --- src/qemu/qemu_capabilities.c | 120 +++++++++++++++++- .../caps_11.1.0_aarch64.xml | 13 ++ 2 files changed, 132 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index cb933aa630..6c78e2a2da 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -4531,6 +4531,82 @@ virQEMUCapsLoadMachines(virQEMUCapsAccel *caps, } =20 =20 +static int +virQEMUCapsLoadCPUProps(virQEMUCaps *qemuCaps, + xmlXPathContextPtr ctxt) +{ + g_autoptr(qemuMonitorCPUPropsInfoList) cpuProps =3D NULL; + g_autofree char *xpath =3D NULL; + g_autofree xmlNodePtr *nodes =3D NULL; + int nprops; + size_t i; + + VIR_XPATH_NODE_AUTORESTORE(ctxt); + + xpath =3D g_strdup("/qemuCaps/cpuPropertyInfo/property"); + if ((nprops =3D virXPathNodeSet(xpath, ctxt, &nodes)) < 0) + return -1; + + if (nprops =3D=3D 0) + return 0; + + cpuProps =3D g_new0(qemuMonitorCPUPropsInfoList, 1); + cpuProps->nprops =3D nprops; + cpuProps->props =3D g_new0(qemuMonitorCPUPropsInfo, nprops); + + for (i =3D 0; i < (size_t) nprops; i++) { + qemuMonitorCPUPropsInfo *prop =3D cpuProps->props + i; + g_autofree char *type_str =3D NULL; + g_autofree xmlNodePtr *svsNodes =3D NULL; + int nsvs; + size_t j; + + prop->name =3D virXMLPropString(nodes[i], "name"); + if (!prop->name) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("missing property name in QEMU capabilities c= ache")); + return -1; + } + + if (!(type_str =3D virXMLPropString(nodes[i], "type"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("missing property type in QEMU capabilities c= ache for property '%1$s'"), + prop->name); + return -1; + } + if ((prop->type =3D qemuMonitorCPUPropertyTypeFromString(type_str)= ) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unknown property type '%1$s' in QEMU capabil= ities cache for property '%2$s'"), + type_str, prop->name); + return -1; + } + + prop->composite =3D virXMLPropString(nodes[i], "composite"); + + ctxt->node =3D nodes[i]; + if ((nsvs =3D virXPathNodeSet("./supportedValue", ctxt, &svsNodes)= ) < 0) + return -1; + + if (nsvs =3D=3D 0) + continue; + + prop->supportedValues =3D g_new0(char *, nsvs + 1); + for (j =3D 0; j < (size_t) nsvs; j++) { + prop->supportedValues[j] =3D virXMLPropString(svsNodes[j], "va= lue"); + if (!prop->supportedValues[j]) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("missing 'value' attribute in QEMU capabi= lities cache for property '%1$s'"), + prop->name); + return -1; + } + } + } + + qemuCaps->kvm.cpuProps =3D g_steal_pointer(&cpuProps); + return 0; +} + + static int virQEMUCapsLoadAccel(virQEMUCaps *qemuCaps, xmlXPathContextPtr ctxt, @@ -5089,6 +5165,9 @@ virQEMUCapsLoadCache(virArch hostArch, virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_HY= PERV); virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_QEMU); =20 + if (virQEMUCapsLoadCPUProps(qemuCaps, ctxt) < 0) + return -1; + if (virXPathBoolean("boolean(./kvmSupportsNesting)", ctxt) > 0) qemuCaps->kvmSupportsNesting =3D true; =20 @@ -5182,6 +5261,45 @@ virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsAccel *= caps, } =20 =20 +static void +virQEMUCapsFormatCPUProps(virQEMUCapsAccel *caps, virBuffer *buf) +{ + qemuMonitorCPUPropsInfoList *cpuProps =3D caps->cpuProps; + size_t i; + + if (!cpuProps) + return; + + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + + for (i =3D 0; i < cpuProps->nprops; i++) { + qemuMonitorCPUPropsInfo *prop =3D cpuProps->props + i; + + virBufferEscapeString(buf, "name); + virBufferAsprintf(buf, " type=3D'%s'", + qemuMonitorCPUPropertyTypeToString(prop->type)); + virBufferEscapeString(buf, " composite=3D'%s'", prop->composite); + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); + if (prop->supportedValues) { + size_t j; + + for (j =3D 0; prop->supportedValues[j]; j++) { + virBufferEscapeString(buf, "= \n", + prop->supportedValues[j]); + } + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + } + + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); +} + + static void virQEMUCapsFormatCPUModels(virArch arch, virQEMUCapsAccel *caps, @@ -5275,7 +5393,7 @@ virQEMUCapsFormatAccel(virQEMUCaps *qemuCaps, virQEMUCapsFormatHostCPUModelInfo(caps, buf, typeStr); virQEMUCapsFormatCPUModels(qemuCaps->arch, caps, buf, typeStr); virQEMUCapsFormatMachines(caps, buf, typeStr); - + virQEMUCapsFormatCPUProps(caps, buf); } =20 =20 diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml b/tests/qem= ucapabilitiesdata/caps_11.1.0_aarch64.xml index f2340830fd..ef7b5a6ae9 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml @@ -362,6 +362,19 @@ + + + + + + + + + + + + + --=20 2.43.7 From nobody Wed Jun 24 21:45:00 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=fail (Bad Signature); dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1782294580688378.68190025846627; Wed, 24 Jun 2026 02:49:40 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 2782841C0D; Wed, 24 Jun 2026 05:49:19 -0400 (EDT) Received: from [172.19.199.7] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 9F81A41DA6; Wed, 24 Jun 2026 05:47:06 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 9175641BBD; Wed, 24 Jun 2026 05:46:47 -0400 (EDT) Received: from mx0b-002c1b01.pphosted.com (mx0b-002c1b01.pphosted.com [148.163.155.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 7E4CD41BE2 for ; Wed, 24 Jun 2026 05:46:40 -0400 (EDT) Received: from pps.filterd (m0127844.ppops.net [127.0.0.1]) by mx0b-002c1b01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 65O5uxPJ1193106 for ; Wed, 24 Jun 2026 02:20:09 -0700 Received: from ch4pr04cu002.outbound.protection.outlook.com (mail-northcentralusazon11023118.outbound.protection.outlook.com [40.107.201.118]) by mx0b-002c1b01.pphosted.com (PPS) with ESMTPS id 4eyxm91uw6-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT) for ; Wed, 24 Jun 2026 02:20:08 -0700 (PDT) Received: from LV3PR02MB10211.namprd02.prod.outlook.com (2603:10b6:408:218::9) by CH3PR02MB10382.namprd02.prod.outlook.com (2603:10b6:610:203::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.159.13; Wed, 24 Jun 2026 09:20:06 +0000 Received: from LV3PR02MB10211.namprd02.prod.outlook.com ([fe80::a2ec:4c29:623:e12]) by LV3PR02MB10211.namprd02.prod.outlook.com ([fe80::a2ec:4c29:623:e12%3]) with mapi id 15.21.0159.013; Wed, 24 Jun 2026 09:20:06 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= proofpoint20171006; bh=PxgOvie/JDVM5RzABNiQSKORlzGqelLEZ2Gvy5qn4 ts=; b=UIwtlvsdmSlW9sX9vJoWIhPLXFOk5VSSzh+AJore7pRkCTudw5wZcKcKy JSNEBjy3t527/GmwRXf3I4vD1oShUEVRg01y8kHvYixzar/av3K5RA1EzY9FysyI 0mtofs8EOPcxyQLX5Yjlh/VnzUwYZxywWK/APFLQWsIXrlUUmTkv+716SgHW9SIz PPICl8l5S7XnKL8VOKx8x+EGj+CX99ns+NIpPc0b2Kz0XdGxIkyF51jdGQmvuZxk 5D5rta//LibQJb+sCPosjK+ho4HEcf6D4H8z3/PfrTHADAi9BLCGIpHi+aDjwtkf C1yzXctk5SvUEywYc88zharM+7Blw== ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=yeweZJsxZOVWQfKSYDxlI5TLyrDRU6tRoCqHRbYnwOJqLTUiYjQc3PxcVUmeVg7uayZoCmkSQIITLFjhOMBvL4Ksx2kaHkGI0KLUyZ1L3HNp21ksJxRgAgizLu9iPTsTDlaAlcRH7vte2HUcavwaVEu8bzGQ2vbcpGqybSn9efkoMwgqHQm4CzjkCBh37Gh12uD84bJ+9tyB221yooqpgS3thUZbKczFMdQasZ/5hVSU50wxp/Fbg1R8z7QfTRVLiL1xwZy5mEq3sbR1KSMyXOxA9EfwvONSSt1onK1z1EKDFxdXD+ikdyPydDJ8XNTYZrK4kJF7OYL89D5HvWZkmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=PxgOvie/JDVM5RzABNiQSKORlzGqelLEZ2Gvy5qn4ts=; b=EVo59QtEkQv9FYSkXlXy2hjtiJ048QB1Qh+rkyol0o1fbYOpnyh3o6cWFoPNxbtvNIXt7QyOFLmqa4V/zPi2Di0vxL1hNiUYKx8c/Hw7dFYTlh1dGK83yDerEsB7HtNbnNxr7DKpAUfcd98EmnDLtlMZ+GIuTGqFVSDMDjjTnxVzUTQ4sek0AuSrZ9AiBhjOZX74Fz8qJzG7hJ5grEvWzg8IVK4m4T2xwFvOCD9tov5AySb6jMRteoGjlJf6u9dsohO9ct91RhB9msvc8POVAZVMtOghHzLa2GNnVRoq8xm/GTRCIHtXZjPQd1h6LGAfxcQQrormgRqEBMSQnzAVNA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nutanix.com; dmarc=pass action=none header.from=nutanix.com; dkim=pass header.d=nutanix.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=PxgOvie/JDVM5RzABNiQSKORlzGqelLEZ2Gvy5qn4ts=; b=iduRfvkJNFBsOh+DK4vyIyrO1LWkDvChjGrzEMKFlN6s673/DzIfA7UJMEvmPL/I2k844cApm1IO6yVhNH0/lMPxMGsF874citLUynjExRKghcp4Ldz+KVjRwtV1S91gkAa7mDWkQcXHRmpwVVujK38BPmR1wldUeCUfVqdTmedEZR6mg7Rd0BlYWxugCeQcTheHqot14smhmaY7lF3KPhvKWRGa1+xYFWc/oCRJsoTIVJ2SV2iXpUJ7o6s8GYED9OikPqsk9krUWjfSRgcoD2Wpv+loS5NFnryZTDzH2yDdMnf8rodrzPBoaNTGejKnKoHKciadJ9ZDSDKn0KaW+g== To: devel@lists.libvirt.org Subject: [RFC PATCH 3/3] Support 'value' attribute on CPU features Date: Wed, 24 Jun 2026 09:17:07 +0000 Message-ID: <20260624091918.2073488-4-sandesh.patel@nutanix.com> X-Mailer: git-send-email 2.43.7 In-Reply-To: <20260624091918.2073488-1-sandesh.patel@nutanix.com> References: <20260624091918.2073488-1-sandesh.patel@nutanix.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CY5PR15CA0045.namprd15.prod.outlook.com (2603:10b6:930:1b::23) To LV3PR02MB10211.namprd02.prod.outlook.com (2603:10b6:408:218::9) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV3PR02MB10211:EE_|CH3PR02MB10382:EE_ X-MS-Office365-Filtering-Correlation-Id: 06c074bf-dca7-4bc9-0f22-08ded1d1c7ec x-proofpoint-crosstenant: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|23010399003|1800799024|6133799003|18002099003|22082099003|56012099006|3023799007; X-Microsoft-Antispam-Message-Info: E0BnkSocFYvjFZYCu94mhvODoVp0Sq26N79JDZJagQCiRIPjRVgLTK/5PhbwUgqRb1lXHaKHB9ndJhn4LvHGg5Y/Ryes3ZzNBsrjks3IFYI8yvmDEgoLZ+w/UhATRA3yIRS9ZUgtxLpWTNuKC/un7wl6JAWQm8FYBixpIJ0h3QEP/9KKHv5Dxt40Q1NtLi8ElH80yCSP4Dq8ZI2yUQx7/NVllMz5skGscUaFCzvG2C/63LSZudA1FRbk0FBkpsNsKSpCoeNPx6umIaY8WgOquVXlT5AmJiruEeEUb7Xj1qrIroanZb/mAkWu7O6WasXn5r86pdP68ckr3qFPf0mGxN4B364Kw7wi8Xs382UP01fUvXPevq72PeAcvmLhiAxzjIal+e4wCJcg/QpCDKN/q4TDQ0TNpvVihaaa83zgOy3yrlG3At1VQ2/A9EsRZNH+3aKpo+DT+Hab0nCalb+Ysu1krR6lTESo7ZgUMBBSrHCyz4yDYuDH9ejX6Ttl9r/r3AxxSskdPnZLPLBDpCWfXDAHsq2QPKOe1lnPfQOsbOULnCQer1Iy1RBx1EKmUWkd2Xp3pywWhN3Ec8bZMvYipOhDugi0WJfIwsriDrjUyh2TRYYWO8NFGg9UxNS4iqBrMNkcCmUnO/Tg+G7CBvIcDyvL+byDVb0UR4bN4Q0TLZs= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV3PR02MB10211.namprd02.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(23010399003)(1800799024)(6133799003)(18002099003)(22082099003)(56012099006)(3023799007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?FnPTYDEB2kcwj41ipWa0+6Z+oyIxcQ01KxQMc6lQoUBOqNz58ciivq6rhBG5?= =?us-ascii?Q?rEORe7aPSYN7PBLrjCiVYAfmskwt+8qZ/hBXvzoaK4DW+9wK2WIC92ZzTsx6?= =?us-ascii?Q?SsfCv3pOm+mzFOHjjrDe3xnc5gIwHHrXVcl2G3pU2TulFqetq73z4oK88sv7?= =?us-ascii?Q?sFvEpKqFl1YrbeVP0gpCTD5qSmNZf/pcQaI+a32a70SQrtkHd84w6Rbm6TeZ?= =?us-ascii?Q?XcjLVkeJFhV7Ghs7KbUG1JlSe1LfAp1EgZSHdREUrVyPbelG/8ZwRY3pK2KM?= =?us-ascii?Q?1ZYjiPcrIZKEuQMPW+Y6t6uEo1B277hWCnOXjHu2aNjVoPtfuUp9ieH+UoCT?= =?us-ascii?Q?jPmniBZDgOVdgyihpELZfba72KHYgTGaq++0E8ix93X6UHO2LwHGKNRY6NNp?= =?us-ascii?Q?9PSkbp6IxvDXP/RFFmpZ5MJIG2mzlpyk7rMXCE5GdGjakQ5VWQ/2YQ8PZjcn?= =?us-ascii?Q?PJ0DsuXYDDkE62UQPD/sSrb1v8wJ69tQ6oUcHZEMtIUL7lSw7NgGmmvVAcZ8?= =?us-ascii?Q?CvAqLNl9A5HX9My0KP2V9JliAgbJjG8xqHkUgaS74bAeRSS7un+i7rBA94Fz?= =?us-ascii?Q?/IVVBM8iMZ9hUFqm+VJIw0ANbmZpHaalH7Hgfc3i0u7b/LmcUg9b23Xc8m8h?= =?us-ascii?Q?XvlqhBz/o7s6yx24pARShdIQofZzDaqxLlh/+NAxboNxOoyYXqqrVxDKX7QT?= =?us-ascii?Q?qkKcYbWFCe8d53hhMgqRhxIhnJb02QuJ64aXQJmmij3R+/QrSBLnbXxI/GtM?= =?us-ascii?Q?TK5hOXqzHH/ARAh1X4N7FuJTKXymfBAsTulhEylBgV7H0Eq5j17WSC+1zQoo?= =?us-ascii?Q?uStUYOXEiG3CVjJeMFMoAOyvL8TGpIeTvbkHxbtKl2dSI8eHqBEVsLg+5ewU?= =?us-ascii?Q?Zcle8wolod8jlgVLhqOpaxXJ8SXVBNYw9PTtEL90vhA9OZXYoblrhxtdjQaP?= =?us-ascii?Q?5UTXwWS/8A1pYlD2NjSd1cDqTlWTvPXM7YX0DnUIAhwUVgX57sT+/qEdWjK/?= =?us-ascii?Q?BI3Us5ZSzforQiUsUvx+7EuDkxuto5vJJlykHlgcL+25o+gWF4IOo6E3Gy/3?= =?us-ascii?Q?8ENR15XlKRN62S0BHiFMWzDGgBWZ/EsXZxiIKkRqC7O3WwQ10NYWMFzinKV/?= =?us-ascii?Q?xyknJwz8sHSJ2wLL6tQHhado2FGDxp1dq8lBRo45t2q2XHg8BHqLVWZm+hGA?= =?us-ascii?Q?573YtVNSk9sWVfZiGnXbDicV7xtoSNMN3OqmbPKneIhdOPOVdAhoxEvnYqsf?= =?us-ascii?Q?gEDf0zDdWfP9Yv0HeT4uTmTiH5zJDzbfdy3hLnsqyRIdCNPkXSACPHsMfc2Q?= =?us-ascii?Q?hoRvbMYGp/Gr0VNv9WpzB1kJGUkcT5WZp3S39jKgvf7YDBOs5mcDJ9JXMm98?= =?us-ascii?Q?vN52J+Ia8HW5Ui1NpASL96AFtnekpMptRvsQ2JnO7SJFxnJAfXitz/TFpF/g?= =?us-ascii?Q?mzfxfO7AzFMhHPA9b2FTNQbmgV3Thin3/vvChmOwmHtWKdzldxjhHetY91v5?= =?us-ascii?Q?Quxf34n0wNngEwqZbFR4lNV2XVUMJZDFnbvehOP2dXlRIWV0s34vU4tj57qU?= =?us-ascii?Q?4X5wAN0IOCz6vNMh0B+n0nknFF9aw4tki3BHO8NU7OUpEMFnTOects0Cnv5v?= =?us-ascii?Q?gXC/ffGXWXvxq4Ryg+/oZJUhc42vsoYGIR113LxqP7OLe/N/we1ib8V/xCHj?= =?us-ascii?Q?3zZKbHT7noprxK8dQhNUWPxgoiR28fGrvc9QnGe5WJAeHGLBWNYKZ4Mm9lfv?= =?us-ascii?Q?3dEuySmij+9xAruQQAOFF59WMqMAqGQ=3D?= X-Exchange-RoutingPolicyChecked: JZ8rSudciZP0nhcc6Eu6z3gXocjl/NmTJzKeDFbItegcmoxMvwb9x/qD9ZoTRQGl6F7TMr3v98xyN4xdL1CIYqNWYX0+ccBYt+41vABJQYXesBb/y7+M45ebMxDa1PcCvqBJVkeru6tqsvp72OcV4YTCdzDcE9lGK8SmbYDsmWSoAe89xf7t30tsP+rUCxFmQZMaMPk08CdJALD91bt9AZywnM+7chKn3jVY47dQkcAi2siiP63ZBzWIV3Pm2UTx4/9hQvGPRjxvVzucGZvaVTQwZf1rmjIi9auS9THssAQzAFOFnVFl60ByYtK9lp/VTOMs8JeThJjuCgbv/GjMYA== X-OriginatorOrg: nutanix.com X-MS-Exchange-CrossTenant-Network-Message-Id: 06c074bf-dca7-4bc9-0f22-08ded1d1c7ec X-MS-Exchange-CrossTenant-AuthSource: LV3PR02MB10211.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Jun 2026 09:20:06.6791 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bb047546-786f-4de1-bd75-24e5b6f79043 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 7xirkdP3mSG0zYh2ocemDZyi9ugfTp2NL1vaYmtapSzAjCuV9yXw45oKIhpKYDHuX1ZbjB3f9aAAKVgCHG76vN3ehi9QIPnMjgboiM8YmLY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR02MB10382 X-Proofpoint-GUID: xOC_hfL7OhKhzJuSXvVykhnjvWRVVIHJ X-Proofpoint-Spam-Info: AW1haW4tMjYwNjI0MDA3NiBTYWx0ZWRfX449iJQotYAJj tSW6VXrbEAzpqxs62j852Z5eEDxWyzO4wtQLE8cuBzxNJpKBlsR+sZplW3VlA1RmYOPWLYmBOav lA1xgRFxczmtCay2FFJ1O/mmwXoH20U= X-Authority-Analysis: v=2.4 cv=H6/rBeYi c=1 sm=1 tr=0 ts=6a3ba148 cx=c_pps a=MtJuZ5RhhfRGh3snRrmfAQ==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=FelO9ux0wxsA:10 a=0kUYKlekyDsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VofLwUrZ8Iiv6rRUPXIb:22 a=0LlEyIVc8U2lsR7dKhuH:22 a=64Cc0HZtAAAA:8 a=8me4YNSjwr39se2n9aoA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjI0MDA3NiBTYWx0ZWRfX8pSVIh3hM9/l eM9MMeKe81IR9KB3akX66sxuJ7asK9SHc7s5He7O+FbY3K7M7ifMOCl7Y+qC1b916xk1t03i4RP he4ZURZz3zbTPd55bEwGlKqzeDLWc1JHctlPac5rFkMeoT7ZVh7eF5UkF9gEjgQr0d/NYfASarM 5cqLyQGMKcX2FEqpT43mV6oRRtFnL89cuEDxjmKkkAu76H+1W99BvEQX+sn2XfWLraenCNhUm/1 jb9+5oxQyjt7edUpxswKyyce40oQrkoj0Mvie6jr2Yq1c9RRK4fjtvvHw661omMFhpzDZHCb/6Z Ky2eJdRqakPn3vsPtmwG7PQjrOxUKzJDbJp/dnn7r89kuYFU74skegk7GkETI0GaB/9PCeQVooa A3v4e/JFA9ln9DFAQ7dQTSHiwoPszg== X-Proofpoint-ORIG-GUID: xOC_hfL7OhKhzJuSXvVykhnjvWRVVIHJ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-24_02,2026-06-23_01,2025-10-01_01 X-Proofpoint-Spam-Reason: safe Message-ID-Hash: K3PC6Q4CNX7RZHJ5Y2LUGWSS6SPFT3G5 X-Message-ID-Hash: K3PC6Q4CNX7RZHJ5Y2LUGWSS6SPFT3G5 X-MailFrom: sandesh.patel@nutanix.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: shaju.abraham@nutanix.com, khushit.shah@nutanix.com, Sandesh Patel X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "sandesh.patel--- via Devel" Reply-To: sandesh.patel@nutanix.com X-ZohoMail-DKIM: fail (found 2 invalid signatures) X-ZM-MESSAGEID: 1782294582399158500 Content-Type: text/plain; charset="utf-8" From: Sandesh Patel ARM CPU features exposed by QEMU are not pure booleans: each property may take one of several QEMU-defined values (e.g. "1.0", "1.1_base", "off"). To let users request a specific value, extend the guest CPU XML element with an optional 'value' attribute: Signed-off-by: Sandesh Patel --- src/conf/cpu_conf.c | 21 ++- src/conf/cpu_conf.h | 1 + src/conf/schemas/cputypes.rng | 5 + src/cpu_map/arm_features.xml | 170 ++++++++++++++++++ src/qemu/qemu_command.c | 13 ++ ...arch64-cpu-passthrough.aarch64-latest.args | 2 +- ...aarch64-cpu-passthrough.aarch64-latest.xml | 6 +- .../aarch64-cpu-passthrough.xml | 6 +- tests/testutilshostcpus.h | 74 ++++---- 9 files changed, 254 insertions(+), 44 deletions(-) diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index f5a2004ee6..4326c06b48 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -101,8 +101,10 @@ virCPUDefFreeFeatures(virCPUDef *def) { size_t i; =20 - for (i =3D 0; i < def->nfeatures; i++) + for (i =3D 0; i < def->nfeatures; i++) { VIR_FREE(def->features[i].name); + VIR_FREE(def->features[i].value); + } VIR_FREE(def->features); =20 def->nfeatures =3D def->nfeatures_max =3D 0; @@ -184,6 +186,7 @@ virCPUDefCopyModelFilter(virCPUDef *dst, } =20 dst->features[n].name =3D g_strdup(src->features[i].name); + dst->features[n].value =3D g_strdup(src->features[i].value); } } =20 @@ -652,6 +655,7 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt, =20 def->features[i].name =3D g_steal_pointer(&name); def->features[i].policy =3D policy; + def->features[i].value =3D virXMLPropString(nodes[i], "value"); } =20 if ((ncacheNodes =3D virXPathNodeSet("./cache", ctxt, &cacheNodes)) > = 0) { @@ -894,12 +898,16 @@ virCPUDefFormatBuf(virBuffer *buf, feature->policy); return -1; } - virBufferAsprintf(buf, "\n= ", + virBufferAsprintf(buf, "name); } else { - virBufferAsprintf(buf, "\n", - feature->name); + virBufferAsprintf(buf, "name); } + + if (feature->value) + virBufferEscapeString(buf, " value=3D'%s'", feature->value); + + virBufferAddLit(buf, "/>\n"); } =20 return 0; @@ -1194,6 +1202,11 @@ virCPUDefIsEqual(virCPUDef *src, virCPUFeaturePolicyTypeToString(src->features[i].poli= cy)); return false; } + if (STRNEQ_NULLABLE(src->features[i].value, dst->features[i].value= )) { + MISMATCH(_("Target CPU feature value %1$s does not match sourc= e %2$s"), + NULLSTR(dst->features[i].value), NULLSTR(src->feature= s[i].value)); + return false; + } } =20 if ((src->cache && !dst->cache) || diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h index 0cac1a1489..c0bab0765f 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -96,6 +96,7 @@ typedef struct _virCPUFeatureDef virCPUFeatureDef; struct _virCPUFeatureDef { char *name; int policy; /* enum virCPUFeaturePolicy */ + char *value; /* optional property value; currently only used by= ARM CPU features */ }; =20 =20 diff --git a/src/conf/schemas/cputypes.rng b/src/conf/schemas/cputypes.rng index 8edf1d14e3..e50fb2c385 100644 --- a/src/conf/schemas/cputypes.rng +++ b/src/conf/schemas/cputypes.rng @@ -78,6 +78,11 @@ + + + + + diff --git a/src/cpu_map/arm_features.xml b/src/cpu_map/arm_features.xml index fc80a3b5bd..8df9ee321f 100644 --- a/src/cpu_map/arm_features.xml +++ b/src/cpu_map/arm_features.xml @@ -22,4 +22,174 @@ =20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e726dc661c..792f9d5748 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6516,6 +6516,19 @@ qemuBuildCpuModelArgStr(virQEMUDriver *driver, const char *featname =3D virQEMUCapsCPUFeatureToQEMU(def->os.arch, cpu->features[i].nam= e); =20 + /* If an explicit value is provided, policy must be "require". */ + if (cpu->features[i].value) { + if (cpu->features[i].policy !=3D VIR_CPU_FEATURE_FORCE + && cpu->features[i].policy !=3D VIR_CPU_FEATURE_REQUIRE) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Feature %1$s with explicit values must h= ave policy 'force' or 'require'"), + cpu->features[i].name); + return -1; + } + virBufferAsprintf(buf, ",%s=3D%s", featname, cpu->features[i].= value); + continue; + } + switch ((virCPUFeaturePolicy) cpu->features[i].policy) { case VIR_CPU_FEATURE_FORCE: case VIR_CPU_FEATURE_REQUIRE: diff --git a/tests/qemuxmlconfdata/aarch64-cpu-passthrough.aarch64-latest.a= rgs b/tests/qemuxmlconfdata/aarch64-cpu-passthrough.aarch64-latest.args index 65dba77871..10adb0bcef 100644 --- a/tests/qemuxmlconfdata/aarch64-cpu-passthrough.aarch64-latest.args +++ b/tests/qemuxmlconfdata/aarch64-cpu-passthrough.aarch64-latest.args @@ -12,7 +12,7 @@ XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-aarch64= test/.config \ -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/va= r/lib/libvirt/qemu/domain--1-aarch64test/master-key.aes"}' \ -machine virt,usb=3Doff,gic-version=3D2,dump-guest-core=3Doff,memory-backe= nd=3Dmach-virt.ram,acpi=3Doff \ -accel kvm \ --cpu host \ +-cpu host,feat_RAS=3D1.0,hw_prop_API=3Doff,hw_prop_WRPs=3D2 \ -m size=3D1048576k \ -object '{"qom-type":"memory-backend-ram","id":"mach-virt.ram","size":1073= 741824}' \ -overcommit mem-lock=3Doff \ diff --git a/tests/qemuxmlconfdata/aarch64-cpu-passthrough.aarch64-latest.x= ml b/tests/qemuxmlconfdata/aarch64-cpu-passthrough.aarch64-latest.xml index cf59cf9fef..8ef4e07b03 100644 --- a/tests/qemuxmlconfdata/aarch64-cpu-passthrough.aarch64-latest.xml +++ b/tests/qemuxmlconfdata/aarch64-cpu-passthrough.aarch64-latest.xml @@ -13,7 +13,11 @@ - + + + + + destroy restart diff --git a/tests/qemuxmlconfdata/aarch64-cpu-passthrough.xml b/tests/qemu= xmlconfdata/aarch64-cpu-passthrough.xml index 0dda095049..b3f77b273e 100644 --- a/tests/qemuxmlconfdata/aarch64-cpu-passthrough.xml +++ b/tests/qemuxmlconfdata/aarch64-cpu-passthrough.xml @@ -11,7 +11,11 @@ - + + + + + destroy restart diff --git a/tests/testutilshostcpus.h b/tests/testutilshostcpus.h index 36118d6acb..c808fc8ce0 100644 --- a/tests/testutilshostcpus.h +++ b/tests/testutilshostcpus.h @@ -21,19 +21,19 @@ #include "util/virarch.h" =20 static virCPUFeatureDef cpuDefaultFeatures[] =3D { - { (char *) "ds", -1 }, - { (char *) "acpi", -1 }, - { (char *) "ss", -1 }, - { (char *) "ht", -1 }, - { (char *) "tm", -1 }, - { (char *) "pbe", -1 }, - { (char *) "ds_cpl", -1 }, - { (char *) "vmx", -1 }, - { (char *) "est", -1 }, - { (char *) "tm2", -1 }, - { (char *) "cx16", -1 }, - { (char *) "xtpr", -1 }, - { (char *) "lahf_lm", -1 }, + { (char *) "ds", -1, NULL}, + { (char *) "acpi", -1, NULL}, + { (char *) "ss", -1, NULL}, + { (char *) "ht", -1, NULL}, + { (char *) "tm", -1, NULL}, + { (char *) "pbe", -1, NULL}, + { (char *) "ds_cpl", -1, NULL}, + { (char *) "vmx", -1, NULL}, + { (char *) "est", -1, NULL}, + { (char *) "tm2", -1, NULL}, + { (char *) "cx16", -1, NULL}, + { (char *) "xtpr", -1, NULL}, + { (char *) "lahf_lm", -1, NULL}, }; static virCPUDef cpuDefaultData =3D { .type =3D VIR_CPU_TYPE_HOST, @@ -49,30 +49,30 @@ static virCPUDef cpuDefaultData =3D { }; =20 static virCPUFeatureDef cpuHaswellFeatures[] =3D { - { (char *) "vme", -1 }, - { (char *) "ds", -1 }, - { (char *) "acpi", -1 }, - { (char *) "ss", -1 }, - { (char *) "ht", -1 }, - { (char *) "tm", -1 }, - { (char *) "pbe", -1 }, - { (char *) "dtes64", -1 }, - { (char *) "monitor", -1 }, - { (char *) "ds_cpl", -1 }, - { (char *) "vmx", -1 }, - { (char *) "smx", -1 }, - { (char *) "est", -1 }, - { (char *) "tm2", -1 }, - { (char *) "xtpr", -1 }, - { (char *) "pdcm", -1 }, - { (char *) "osxsave", -1 }, - { (char *) "f16c", -1 }, - { (char *) "rdrand", -1 }, - { (char *) "cmt", -1 }, - { (char *) "pdpe1gb", -1 }, - { (char *) "abm", -1 }, - { (char *) "invtsc", -1 }, - { (char *) "lahf_lm", -1 }, + { (char *) "vme", -1, NULL}, + { (char *) "ds", -1, NULL}, + { (char *) "acpi", -1, NULL}, + { (char *) "ss", -1, NULL}, + { (char *) "ht", -1, NULL}, + { (char *) "tm", -1, NULL}, + { (char *) "pbe", -1, NULL}, + { (char *) "dtes64", -1, NULL}, + { (char *) "monitor", -1, NULL}, + { (char *) "ds_cpl", -1, NULL}, + { (char *) "vmx", -1, NULL}, + { (char *) "smx", -1, NULL}, + { (char *) "est", -1, NULL}, + { (char *) "tm2", -1, NULL}, + { (char *) "xtpr", -1, NULL}, + { (char *) "pdcm", -1, NULL}, + { (char *) "osxsave", -1, NULL}, + { (char *) "f16c", -1, NULL}, + { (char *) "rdrand", -1, NULL}, + { (char *) "cmt", -1, NULL}, + { (char *) "pdpe1gb", -1, NULL}, + { (char *) "abm", -1, NULL}, + { (char *) "invtsc", -1, NULL}, + { (char *) "lahf_lm", -1, NULL}, }; static virCPUDef cpuHaswellData =3D { .type =3D VIR_CPU_TYPE_HOST, --=20 2.43.7