From nobody Tue Sep 9 19:11:27 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; 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 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=fail (BodyHash is different from the expected one); dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1753255509855165.88019481566425; Wed, 23 Jul 2025 00:25:09 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id D7015BFA; Wed, 23 Jul 2025 03:25:08 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id AB9881458; Wed, 23 Jul 2025 03:22:40 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 1428D11BA; Tue, 22 Jul 2025 16:26:22 -0400 (EDT) Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2049.outbound.protection.outlook.com [40.107.243.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 8E91311C2 for ; Tue, 22 Jul 2025 16:26:20 -0400 (EDT) Received: from CH0PR12MB5092.namprd12.prod.outlook.com (2603:10b6:610:bf::16) by SA3PR12MB8802.namprd12.prod.outlook.com (2603:10b6:806:314::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8943.30; Tue, 22 Jul 2025 20:26:15 +0000 Received: from CH0PR12MB5092.namprd12.prod.outlook.com ([fe80::969b:49e4:6d48:b058]) by CH0PR12MB5092.namprd12.prod.outlook.com ([fe80::969b:49e4:6d48:b058%5]) with mapi id 15.20.8943.029; Tue, 22 Jul 2025 20:26:15 +0000 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, FORGED_SPF_HELO,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_PASS autolearn=no autolearn_force=no version=3.4.4 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RTaES1L9wj0+m18TVRec/2q/zlAWw/hU9uxOLEHWmzKGbt+N1PUHTKsfcqUAo6r2zoJXgT4dNOhD0VL66yeul6EqfE6daOOkk+wNjJGSX/SElrHkyqYOUzvrrLmQS74G9kcQbPlvbiejxef/usGpkr/9EvNwu47BcTKXdku1zUz29G3BTw904SnhEdHuUEoAxF4cqh6C8GImgBmkSjBSWwDQ8NiNNpdE3edSx3ThHIMha936aVvsp9ToMRai8jkq41ySJp9mxV2SlEGyCy0Oj9fStHyA9bM3XrwHZHawxemzzGiwzAI2y+8Q97jOmPe2wba+l0IQVh1W5IeOLFE73Q== 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=I6FcRvToxp8jEvlTsQhyguIRGhdNBwUQkVbkjYSLnFo=; b=PwIyUtgE8EKU9FXoA8bwxJOrDC1NSWs3llX7l0aW9UOobOhFxAAZFx1Px6bNreatZ/jpeJj7YdpLIEH3U+KnTTQsgoyezKbHCbfqpyyEXJx5iV0agqZweQnxCouhIPbBtjdMn5owtLPFI1ei55O7wsEVKZ4Q6y0RqRgtVi0D35wH2e8qC2gqgwlZ3u+Muk9Ie0W0jvol42zVrwyW2J0/GiR7uvJZVtJLi1En84TQ9h68f+uajrj4JOi+2UN8DGziQNcVcVi0ho6VhmqSuH9ri+pT9CgWNiVr8ydx5l+hark3WrVFZZ5xq8MTAfaiva9F89MrUufDCvCpsx7mvdDKtw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=I6FcRvToxp8jEvlTsQhyguIRGhdNBwUQkVbkjYSLnFo=; b=UWNvB7K7rc6GfNcBSLIh+4HDYBPo6GiM5NAeE806v5OIi+XcTPVMUsSWOyzFJ0GPICR/ixk3JT0egcAPyQoxaW+e4fUaq4YtlJW5dff1jXyI4REpjyGjSVKll1ml3GWkvKdSF8C2jrP54RmKHQPEZ58Y8mXyXU7JRPj8yUtFGf25/QabRRgBT2m/2DZ7HORmcxxC2iQC8i8z6a9U6+QxBGtMLnUUKOXUUTUmE9xnnHBoRKmy+9N87b30CYo7BNGfgqG69Sep6n36i6+zqKb4TBAkXx9F1e3UHm/7jh+oryUmxb6M5mIL9J+BpeWQvS6UoAgmtDjG6c8JH/O7VqNUdg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; To: devel@lists.libvirt.org Subject: [RFC PATCH 2/8] conf: Add definitions and XML parsing for ACPI EGM memory device Date: Tue, 22 Jul 2025 15:26:02 -0500 Message-ID: <20250722202609.1823658-3-ianm@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250722202609.1823658-1-ianm@nvidia.com> References: <20250722202609.1823658-1-ianm@nvidia.com> X-ClientProxiedBy: SA0PR11CA0135.namprd11.prod.outlook.com (2603:10b6:806:131::20) To CH0PR12MB5092.namprd12.prod.outlook.com (2603:10b6:610:bf::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH0PR12MB5092:EE_|SA3PR12MB8802:EE_ X-MS-Office365-Filtering-Correlation-Id: 5366e3f9-6173-4a0a-87c8-08ddc95e021e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?V70IIUi0TqEWcNGaN1bvh820K2JRiqWa40cAZerKsOqs5CyUZ3WiBWfYuCxS?= =?us-ascii?Q?PE/yYv7jQ/KmAREVZJx/oLWh3oyCe6nX6K77T+z598D337R/o46EotfbElox?= =?us-ascii?Q?/ly2eOz8p+3uW3tJaQcAwXEkEP0wA7/uL8GHcLaMlNA5vaSko9pXR0SPbwhu?= =?us-ascii?Q?985T1kMBtDL+GrxkV5uf4teMqmvQT54KCyTIO6+zrMQCDwOAboJlrtC8iDmN?= =?us-ascii?Q?JNy1UbLc9VpUkbugKFAknut6mAPKoWAwi76qcUYzzzV1xyK4PSM289IqMdPM?= =?us-ascii?Q?Ser1xJpNYKpW0BFmTaMaDsTEA+6GyFIkdncz//b1c3IAW9nm5mXD+PTWkK+c?= =?us-ascii?Q?R4d7stbuuhH6RHRlN26b9O/ZodKNjQQZlWWBQ4GO2wdEkFyieeN7nBj5QAOm?= =?us-ascii?Q?Jr8s1ZPHhcETkKQoXv1Nu/OZzN+EibC9nqYBJBZVKm5EiCBlCMSM8wV69bs5?= =?us-ascii?Q?4GF2Xor7k2la+JFJ/BHg92nvb/J6u3ijk8cGgtMUArZmKv8CTJ6PGoyjAV8C?= =?us-ascii?Q?JUHzELVW0XXbUBviFKB9+wtGCTYH5zZxz0WjrT0tn6EkBJwSQY5sAZTUvdF2?= =?us-ascii?Q?621joGjQaFhNBPsAAu10p51vTy9ub8WfiEcMBS6pTyJVqEuE2HhMJo/7V+wu?= =?us-ascii?Q?PSK1O758JbUoMqV4nEAzPa7JVyb9hdDmH2Do5H8H0CarrodaU+OswSynITzO?= =?us-ascii?Q?kxUE95K6EfVMZYJ7kSvkvZHcOUv2Nx4ibQzwKaLbqHxY1fYI26TD0PamOwLk?= =?us-ascii?Q?yIn7+H/japTl6XiRMFc9DTadevtaMDnD3nxnbedOSApt4SQt+Mxp/aklFlyM?= =?us-ascii?Q?nqmUnVeI7HWwks7WIoKdxiovQtyrv18nIr0onDSBebPspBT8pipwa83A+FAn?= =?us-ascii?Q?Mf1EkxhxkI3GQcoVvpWnhXUOQHXkzhxC15DQWkzM7LPS0DywU1rJ4JLKU5Kj?= =?us-ascii?Q?sv28N4FxIF7mf0vjn08Az+LsRQUjzlxRtoaw8F4LSvZ1vUOSr1CuRww31VBk?= =?us-ascii?Q?RqsOvOYHkUVSB4ovjTKR8U87Hj+LnPVM8W9xJTzPA/RupRj0gzWRk1cTqW6k?= =?us-ascii?Q?9ac8j3+LssQvLtfVXgpjNKLfEilKtb+BhGLFzWVt8G1EwoVYH+TtLDfnRJQk?= =?us-ascii?Q?agCQjqXssqr1g+fzpIIEt1tbgf2zs7B9v8uPKGMCAF2kozC1BvVFnDPbpdvk?= =?us-ascii?Q?6ytfL3Ep7qpzk27fpSTLcXPKueaauZVVZxVmSg3PJratE17bB19t/XgWphKd?= =?us-ascii?Q?I6H9DwzDR2Pd3pjItmBMY6ih2W3NB42J3046GP3dXIJMFKDLiP8wfbcM1yjR?= =?us-ascii?Q?qk1Kbzbf4U1OYS/3z1LTHeWcjd3686mjNXBMMzenQFSCJHximuEHDA56ABtf?= =?us-ascii?Q?gUCkryZ4BQJkY7/sZvKfqggueDYF0jhKz1Lgcbn0mgUHGjfXe0IW/yHnTZOC?= =?us-ascii?Q?fjzzxqg57jg=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH0PR12MB5092.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?3lGDoN5qyqGiZvDRcqsa54cBfjfsK0pFQ01Q3ZJRKFYBCzJqKdAjDR0sWV6u?= =?us-ascii?Q?7hRsdZQI6u5Yc0HI++qyKu6v/R3Auzl5FjwCslWmQfUr+TXMOoDM2aVhZ/PB?= =?us-ascii?Q?LroXBfIoP+QKyahjKBwguEYE8QArtpGETVO+SI+ny1tHXzXFkTbNIXiX6jx9?= =?us-ascii?Q?mTD2ncJ1hIUUVT7ovvSSMgzSAj/UfgilCog0T+FQnFms10jyCqnGlYG+KAhj?= =?us-ascii?Q?lctUDrTHtEaUBF/0fDnvo+7N0jZCnzHRRzs690cL2lSyB9OeIo5hUMKHOQiv?= =?us-ascii?Q?mX/1+Q/IBE5FGfg3wcEZABS4Qfr17Wm9njSnC5Qx/gMwUydglsXx6o4kL5AC?= =?us-ascii?Q?wTIjTVxtntvrtsaQfzCx9lwDHKw8H5Vzh6MpB1eamazW5vLcXqWm4wpwpAdD?= =?us-ascii?Q?6CezdzDXydZ4rQA61797rfUgQs5fC3myu7/uvFfDrJRflCjbjdkK80HBY6kb?= =?us-ascii?Q?IL340FJHrF6L+MIDL+TsmRFcNYR0ILsrL6tTdQGUPNIuQfUj9+ZL6hyH4wOS?= =?us-ascii?Q?qhhWesvd/m/5cv2J9i5dKtK76quCYKnzMzsU1f0OmF7c2dH34eHLHXWH/GRn?= =?us-ascii?Q?mVLGUxOW4/5kU9srFZHn5zkZ6MLH6GF5zfE91Fn1PGRRBwwEmsZFcvKEVnw5?= =?us-ascii?Q?p49M+Fmu+dbQ2RO6g/FFHb4N78wtBbJtngaFbuQm0KCYGvhRva3MOJlY/whs?= =?us-ascii?Q?ndbAs0QtIZSlVAGk9pk65MLncQglTze6kVs0ugkHtVjie4Hu/fvIlP8FmFVy?= =?us-ascii?Q?kILa8VSvWLyFqmfbsPmzNrwKaG/Cho+oUB9TwN2mzz6v9oMYeHtcS2fKyG3s?= =?us-ascii?Q?URBwzAmvQ3Thhca0H+9sK2UrxVnim8vYypqGmgyE7gIIpJ29oKtM3bHJyGZQ?= =?us-ascii?Q?AhyKU6z0ANlGe9E7CzJ/3DB1z4XJN+opo5QSanc/1inEq3RDv3Pzsjrgz5Tn?= =?us-ascii?Q?D0KsfXqUWRsTNbFsaWbEzje0qEEKCPcW4vMGzk0zDBw8QTH+y/InvQCqKjw+?= =?us-ascii?Q?Ms+TwJsxwd+LRl8sYsw6k3VnzRu8Ezk4yLmFUz6wTcsElRlimS8xGtR0ljLC?= =?us-ascii?Q?VG6SAnO5P8cp8myWlpDZi42ZcQYb5skcifg40rccNfSuXYB8MRodvpxTRLfi?= =?us-ascii?Q?sXwXXKxR7SBItBNz+6F7EX1naYwC9vYs8u184Ive3YW3fSYHCD5qtJbF2xKG?= =?us-ascii?Q?B7fsRSUh7uwxAuSNpemdID8AVZuNvqCfH1h/0KN+lppx8n8bgU2RqeqnB6tA?= =?us-ascii?Q?2Rh0+ODvB5ksWWRNTP6OEj4YBs2p5X2MyQw8XJHVYa0US7t3ZLDyv750/Wat?= =?us-ascii?Q?BBEftY1fbCDDKwOkLVqPZGyQNAwGMPR/gZF6K95C3ctwQsM8WuRcQG7BOfY9?= =?us-ascii?Q?XX6/DCYbBlkogB0y+TnbGclqHzqrqOjyAv1yIFjUZ3NJvcv5hh8GGlO93R1Q?= =?us-ascii?Q?l4iQhkppES7h2ESx11wQW4qo4w6jiixXOs2/BQhK+fWbit1enXP639qLLZ2c?= =?us-ascii?Q?O6vFfQR5XoAiSjT+ZlrbxR9wv+gRP+V+MNQ1touhSWJdt96qkEU1uiUyq9aJ?= =?us-ascii?Q?oQFM47CG0M2hS/mYjlFEIbpKq/blTN+MzZsHrdIu?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5366e3f9-6173-4a0a-87c8-08ddc95e021e X-MS-Exchange-CrossTenant-AuthSource: CH0PR12MB5092.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2025 20:26:15.7881 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: YhkPv+5GzhPzKUYQTxaTAHYVtfU/1SICxkLHkLxE77AcAxGQJvS4fXKyELTVJ3Hn X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA3PR12MB8802 Content-Transfer-Encoding: quoted-printable X-MailFrom: ianm@nvidia.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0 Message-ID-Hash: UCUN5XGDGHXKMSPA2ZNF7VDVDRZJPQJW X-Message-ID-Hash: UCUN5XGDGHXKMSPA2ZNF7VDVDRZJPQJW X-Mailman-Approved-At: Wed, 23 Jul 2025 07:22:29 -0400 CC: ianm@nvidia.com X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Ian May via Devel Reply-To: Ian May X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1753255510787116600 Content-Type: text/plain; charset="utf-8" Implement the core data structures and XML parsing for ACPI EGM memory device support. This includes: - New device type VIR_DOMAIN_DEVICE_EGM - Data structure virDomainAcpiEgmDef for device configuration - XML parsing and formatting functions - Integration with existing device handling infrastructure Signed-off-by: Ian May --- src/ch/ch_domain.c | 1 + src/conf/domain_conf.c | 102 +++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 11 ++++ src/conf/domain_postparse.c | 8 +++ src/conf/domain_validate.c | 1 + src/conf/virconftypes.h | 2 + src/libxl/libxl_driver.c | 6 ++ src/lxc/lxc_driver.c | 6 ++ src/qemu/qemu_domain.c | 2 + src/qemu/qemu_domain_address.c | 2 + src/qemu/qemu_driver.c | 3 + src/qemu/qemu_hotplug.c | 5 ++ src/qemu/qemu_postparse.c | 1 + src/test/test_driver.c | 4 ++ 14 files changed, 154 insertions(+) diff --git a/src/ch/ch_domain.c b/src/ch/ch_domain.c index 7231fdc49f..3c0ad0c513 100644 --- a/src/ch/ch_domain.c +++ b/src/ch/ch_domain.c @@ -185,6 +185,7 @@ chValidateDomainDeviceDef(const virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Cloud-Hypervisor doesn't support '%1$s' device"), virDomainDeviceTypeToString(dev->type)); diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ba0d4a7b12..5f1854d89a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -342,6 +342,7 @@ VIR_ENUM_IMPL(virDomainDevice, "audio", "crypto", "pstore", + "egm", ); =20 VIR_ENUM_IMPL(virDomainDiskDevice, @@ -3623,6 +3624,17 @@ void virDomainPstoreDefFree(virDomainPstoreDef *def) g_free(def); } =20 +void virDomainAcpiEgmDefFree(virDomainAcpiEgmDef *def) +{ + if (!def) + return; + + g_free(def->alias); + g_free(def->pciDev); + virDomainDeviceInfoClear(&def->info); + g_free(def); +} + void virDomainDeviceDefFree(virDomainDeviceDef *def) { if (!def) @@ -3710,6 +3722,9 @@ void virDomainDeviceDefFree(virDomainDeviceDef *def) case VIR_DOMAIN_DEVICE_PSTORE: virDomainPstoreDefFree(def->data.pstore); break; + case VIR_DOMAIN_DEVICE_EGM: + virDomainAcpiEgmDefFree(def->data.egm); + break; case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_NONE: break; @@ -4688,6 +4703,8 @@ virDomainDeviceGetInfo(const virDomainDeviceDef *devi= ce) return &device->data.crypto->info; case VIR_DOMAIN_DEVICE_PSTORE: return &device->data.pstore->info; + case VIR_DOMAIN_DEVICE_EGM: + return &device->data.egm->info; =20 /* The following devices do not contain virDomainDeviceInfo */ case VIR_DOMAIN_DEVICE_LEASE: @@ -4796,6 +4813,9 @@ virDomainDeviceSetData(virDomainDeviceDef *device, case VIR_DOMAIN_DEVICE_PSTORE: device->data.pstore =3D devicedata; break; + case VIR_DOMAIN_DEVICE_EGM: + device->data.egm =3D devicedata; + break; case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: break; @@ -5021,6 +5041,13 @@ virDomainDeviceInfoIterateFlags(virDomainDef *def, return rc; } =20 + device.type =3D VIR_DOMAIN_DEVICE_EGM; + if (def->egm) { + device.data.egm =3D def->egm; + if ((rc =3D cb(def, &device, &def->egm->info, opaque)) !=3D 0) + return rc; + } + /* If the flag below is set, make sure @cb can handle @info being NULL= */ if (iteratorFlags & DOMAIN_DEVICE_ITERATE_MISSING_INFO) { device.type =3D VIR_DOMAIN_DEVICE_GRAPHICS; @@ -5081,6 +5108,7 @@ virDomainDeviceInfoIterateFlags(virDomainDef *def, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: break; } #endif @@ -14506,6 +14534,40 @@ virDomainPstoreDefParseXML(virDomainXMLOption *xml= opt, } =20 =20 +static virDomainAcpiEgmDef * +virDomainAcpiEgmDefParseXML(virDomainXMLOption *xmlopt, + xmlNodePtr node, + xmlXPathContextPtr ctxt, + unsigned int flags) +{ + g_autoptr(virDomainAcpiEgmDef) def =3D NULL; + VIR_XPATH_NODE_AUTORESTORE(ctxt) + int rc; + xmlNodePtr alias =3D NULL; + + def =3D g_new0(virDomainAcpiEgmDef, 1); + + ctxt->node =3D node; + + alias =3D virXPathNode("./alias", ctxt); + if (!alias) + return NULL; + def->alias =3D virXMLPropString(alias, "name"); + def->pciDev =3D virXPathString("string(./pciDev)", ctxt); + rc =3D virXPathInt("string(./numaNode)", ctxt, &def->numaNode); + if (rc < 0 || def->numaNode < 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("invalid NUMA node in target")); + return NULL; + } + + if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, &def->info, flags)= < 0) + return NULL; + + return g_steal_pointer(&def); +} + + static int virDomainDeviceDefParseType(const char *typestr, virDomainDeviceType *type) @@ -14691,6 +14753,12 @@ virDomainDeviceDefParse(const char *xmlStr, return NULL; } break; + case VIR_DOMAIN_DEVICE_EGM: + if (!(dev->data.egm =3D virDomainAcpiEgmDefParseXML(xmlopt, node, + ctxt, flags)))= { + return NULL; + } + break; case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: break; @@ -20104,6 +20172,22 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt, } VIR_FREE(nodes); =20 + if ((n =3D virXPathNodeSet("./devices/acpiEgmMemory", ctxt, &nodes)) <= 0) + return NULL; + + if (n > 1) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("only a single egm device is supported")); + return NULL; + } + + if (n > 0) { + if (!(def->egm =3D virDomainAcpiEgmDefParseXML(xmlopt, nodes[0], + ctxt, flags))) + return NULL; + } + VIR_FREE(nodes); + /* analysis of the user namespace mapping */ if ((n =3D virXPathNodeSet("./idmap/uid", ctxt, &nodes)) < 0) return NULL; @@ -22576,6 +22660,7 @@ virDomainDefCheckABIStabilityFlags(virDomainDef *sr= c, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: break; } #endif @@ -28844,6 +28929,19 @@ virDomainPstoreDefFormat(virBuffer *buf, return 0; } =20 +static int +virDomainAcpiEgmDefFormat(virBuffer *buf, + virDomainAcpiEgmDef *egm) +{ + g_auto(virBuffer) childBuf =3D VIR_BUFFER_INIT_CHILD(buf); + + virBufferAsprintf(&childBuf, "\n", egm->alias); + virBufferAsprintf(&childBuf, "%s\n", egm->pciDev); + virBufferAsprintf(&childBuf, "%d\n", egm->numaNod= e); + + virXMLFormatElement(buf, "acpiEgmMemory", NULL, &childBuf); + return 0; +} =20 int virDomainDefFormatInternal(virDomainDef *def, @@ -29328,6 +29426,9 @@ virDomainDefFormatInternalSetRootName(virDomainDef = *def, if (def->pstore) virDomainPstoreDefFormat(buf, def->pstore, flags); =20 + if (def->egm) + virDomainAcpiEgmDefFormat(buf, def->egm); + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); =20 @@ -29488,6 +29589,7 @@ virDomainDeviceIsUSB(virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: break; } =20 diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 6008ec66d3..5132c6587b 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -88,6 +88,7 @@ typedef enum { VIR_DOMAIN_DEVICE_AUDIO, VIR_DOMAIN_DEVICE_CRYPTO, VIR_DOMAIN_DEVICE_PSTORE, + VIR_DOMAIN_DEVICE_EGM, =20 VIR_DOMAIN_DEVICE_LAST } virDomainDeviceType; @@ -122,6 +123,7 @@ struct _virDomainDeviceDef { virDomainAudioDef *audio; virDomainCryptoDef *crypto; virDomainPstoreDef *pstore; + virDomainAcpiEgmDef *egm; } data; }; =20 @@ -3100,6 +3102,12 @@ struct _virDomainPstoreDef { virDomainDeviceInfo info; }; =20 +struct _virDomainAcpiEgmDef { + char *alias; + char *pciDev; + int numaNode; + virDomainDeviceInfo info; +}; =20 #define SCSI_SUPER_WIDE_BUS_MAX_CONT_UNIT 64 #define SCSI_WIDE_BUS_MAX_CONT_UNIT 16 @@ -3282,6 +3290,7 @@ struct _virDomainDef { virDomainIOMMUDef *iommu; virDomainVsockDef *vsock; virDomainPstoreDef *pstore; + virDomainAcpiEgmDef *egm; =20 void *namespaceData; virXMLNamespace ns; @@ -3728,6 +3737,8 @@ void virDomainCryptoDefFree(virDomainCryptoDef *def); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainCryptoDef, virDomainCryptoDefFree); void virDomainPstoreDefFree(virDomainPstoreDef *def); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainPstoreDef, virDomainPstoreDefFree); +void virDomainAcpiEgmDefFree(virDomainAcpiEgmDef *def); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainAcpiEgmDef, virDomainAcpiEgmDefFree= ); void virDomainNetTeamingInfoFree(virDomainNetTeamingInfo *teaming); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainNetTeamingInfo, virDomainNetTeaming= InfoFree); void virDomainNetPortForwardFree(virDomainNetPortForward *pf); diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c index a07ec8d94e..4933259129 100644 --- a/src/conf/domain_postparse.c +++ b/src/conf/domain_postparse.c @@ -85,6 +85,13 @@ virDomainDefPostParseMemory(virDomainDef *def, return -1; } =20 + /* if we have a Grace EGM device, setup memory backing */ + if (def->egm) { + def->mem.source =3D VIR_DOMAIN_MEMORY_SOURCE_FILE; + def->mem.access =3D VIR_DOMAIN_MEMORY_ACCESS_SHARED; + def->mem.allocation =3D VIR_DOMAIN_MEMORY_ALLOCATION_IMMEDIATE; + } + return 0; } =20 @@ -760,6 +767,7 @@ virDomainDeviceDefPostParseCommon(virDomainDeviceDef *d= ev, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: ret =3D 0; break; =20 diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 8f7259a0e1..88e61fb878 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -3317,6 +3317,7 @@ virDomainDeviceDefValidateInternal(const virDomainDev= iceDef *dev, case VIR_DOMAIN_DEVICE_PSTORE: return virDomainPstoreDefValidate(dev->data.pstore); =20 + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_WATCHDOG: case VIR_DOMAIN_DEVICE_HUB: diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h index 8c6fcdbeaa..97ddc3de2a 100644 --- a/src/conf/virconftypes.h +++ b/src/conf/virconftypes.h @@ -268,6 +268,8 @@ typedef struct _virDomainCryptoDef virDomainCryptoDef; =20 typedef struct _virDomainPstoreDef virDomainPstoreDef; =20 +typedef struct _virDomainAcpiEgmDef virDomainAcpiEgmDef; + typedef struct _virDomainWatchdogDef virDomainWatchdogDef; =20 typedef struct _virDomainXMLOption virDomainXMLOption; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 308c0372aa..5e56327439 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -3492,6 +3492,7 @@ libxlDomainAttachDeviceLive(libxlDriverPrivate *drive= r, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be attached"), virDomainDeviceTypeToString(dev->type)); @@ -3596,6 +3597,7 @@ libxlDomainAttachDeviceConfig(virDomainDef *vmdef, vi= rDomainDeviceDef *dev) case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent attach of device is not supported= ")); return -1; @@ -3965,6 +3967,7 @@ libxlDomainDetachDeviceLive(libxlDriverPrivate *drive= r, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be detached"), virDomainDeviceTypeToString(dev->type)); @@ -4056,6 +4059,7 @@ libxlDomainDetachDeviceConfig(virDomainDef *vmdef, vi= rDomainDeviceDef *dev) case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent detach of device is not supported= ")); return -1; @@ -4119,6 +4123,7 @@ libxlDomainUpdateDeviceLive(virDomainObj *vm, virDoma= inDeviceDef *dev) case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be updated"), virDomainDeviceTypeToString(dev->type)); @@ -4182,6 +4187,7 @@ libxlDomainUpdateDeviceConfig(virDomainDef *vmdef, vi= rDomainDeviceDef *dev) case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent update of device is not supported= ")); return -1; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 80cf07d2e5..46f65ef630 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -3020,6 +3020,7 @@ lxcDomainAttachDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent attach of device is not supported")); break; @@ -3086,6 +3087,7 @@ lxcDomainUpdateDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent update of device is not supported")); break; @@ -3168,6 +3170,7 @@ lxcDomainDetachDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent detach of device is not supported")); break; @@ -3270,6 +3273,7 @@ lxcDomainAttachDeviceMknodHelper(pid_t pid G_GNUC_UNU= SED, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected device type %1$d"), data->def->type); @@ -3946,6 +3950,7 @@ lxcDomainAttachDeviceLive(virLXCDriver *driver, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be attached"), virDomainDeviceTypeToString(dev->type)); @@ -4364,6 +4369,7 @@ lxcDomainDetachDeviceLive(virLXCDriver *driver, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be detached"), virDomainDeviceTypeToString(dev->type)); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 54eda9e12f..4414fd7289 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8830,6 +8830,7 @@ qemuDomainPrepareChardevSourceOne(virDomainDeviceDef = *dev, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: break; } =20 @@ -10720,6 +10721,7 @@ qemuDomainDeviceBackendChardevForeachOne(virDomainD= eviceDef *dev, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: /* no chardev backend */ break; } diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 96a9ca9b14..f204f595d4 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -471,6 +471,7 @@ qemuDomainDeviceSupportZPCI(virDomainDeviceDef *device) case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: break; =20 case VIR_DOMAIN_DEVICE_NONE: @@ -1013,6 +1014,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDev= iceDef *dev, break; =20 case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: return pciFlags; =20 /* These devices don't ever connect with PCI */ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index a0f770b053..a0375a28e0 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6906,6 +6906,7 @@ qemuDomainAttachDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent attach of device '%1$s' is not suppo= rted"), @@ -7125,6 +7126,7 @@ qemuDomainDetachDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent detach of device '%1$s' is not suppor= ted"), @@ -7251,6 +7253,7 @@ qemuDomainUpdateDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent update of device '%1$s' is not suppor= ted"), diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index e9568af125..e0573d2eaf 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -3563,6 +3563,7 @@ qemuDomainAttachDeviceLive(virDomainObj *vm, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live attach of device '%1$s' is not supported"), @@ -5533,6 +5534,7 @@ qemuDomainRemoveAuditDevice(virDomainObj *vm, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LAST: /* libvirt doesn't yet support detaching these devices */ break; @@ -5638,6 +5640,7 @@ qemuDomainRemoveDevice(virQEMUDriver *driver, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("don't know how to remove a %1$s device"), @@ -6540,6 +6543,7 @@ qemuDomainDetachDeviceLive(virDomainObj *vm, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live detach of device '%1$s' is not supported"), @@ -7531,6 +7535,7 @@ qemuDomainUpdateDeviceLive(virDomainObj *vm, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("live update of device '%1$s' is not supported"), diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c index 9c2427970d..ae60ca02e8 100644 --- a/src/qemu/qemu_postparse.c +++ b/src/qemu/qemu_postparse.c @@ -959,6 +959,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_RNG: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_EGM: ret =3D 0; break; =20 diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 25335d9002..2e1048686c 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -10460,6 +10460,7 @@ testDomainAttachDeviceLive(virDomainObj *vm, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live attach of device '%1$s' is not supported"), @@ -10603,6 +10604,7 @@ testDomainUpdateDevice(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent update of device '%1$s' is not suppor= ted"), @@ -10975,6 +10977,7 @@ testDomainRemoveDevice(testDriver *driver, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live detach of device '%1$s' is not supported"), @@ -11046,6 +11049,7 @@ testDomainDetachDeviceLive(testDriver *driver, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_EGM: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live detach of device '%1$s' is not supported"), --=20 2.43.0