From nobody Fri Dec 12 14:05:26 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 (Bad Signature); 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 1764098862400946.8446116564198; Tue, 25 Nov 2025 11:27:42 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id A14FE43E9E; Tue, 25 Nov 2025 14:27:11 -0500 (EST) Received: from [172.19.199.68] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 8378944CA1; Tue, 25 Nov 2025 14:17:47 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 4775044BA1; Tue, 25 Nov 2025 14:17:31 -0500 (EST) Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010032.outbound.protection.outlook.com [52.101.85.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 4D70F44998 for ; Tue, 25 Nov 2025 14:17:20 -0500 (EST) Received: from PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) by MW6PR12MB9000.namprd12.prod.outlook.com (2603:10b6:303:24b::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.17; Tue, 25 Nov 2025 19:17:11 +0000 Received: from PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb]) by PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb%6]) with mapi id 15.20.9343.016; Tue, 25 Nov 2025 19:17:11 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=J3agV6ZyMCEGCUsaPGIgDyR4/twMjwsnYgdNp2ogUsYpoqEaEt5Eun6h2A5KkBAgGj4Z+o9YsDknePVU1+MZLelks98CXk/ubJCT16pLZ9pZqkdD4RzVbBrUjAuzVim35cVNzAMxIefaDKOBluUg20Jz+XL86nR2CL50b8bA9fK6VnyiPH4FxXv1OIiZKedvc+uyVxHCqn5hLxjMVvB0xPQ3OjDRs8qXWR7/u27N0xLLIOSr5pEl+baJWRSgJTuqKMQ3zE/aEYyh/Cz+Px3a9sw1HeVWpL/eUY/sf+vKazw/7xPsHoA2xMDMCdF2q+mv/ShZab6hwtgWwjpckbIIJg== 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=PYUBk3QxMYdQdoN9XR04z3cAHnc+ajFqeUvqVWTYl90=; b=lRsNuPW4ZF/VBDxo1qaN7DkEQl+BcgIGLEh3WUqzCJiteRBjD5yVC/BhfCxkQtgoGALtPgWjgyPg6l3g5+hlOxf0tnMP9aigpqfNNvsTEh2L3d55ojYlyptBG3osMXaCwxdlsGSWOndO34ta/21S5ggNjQJG1BDyJP0FSFkz4mJVvqme2DSY7/onJrfhr/chVwigXjNlx6a3fbW3SIeihIKCJ7VQhCaHmVAL/Y4UVhCRbO8q6IBLT+/2tNA4ySZAJYh6LbCyB9ezuEox3QZtD6gceovmVUgHuWSMcc5v99weAbEpVAA7JkPZ0EBLXc3ol32wvY7ZymMO6avP14zm2A== 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=PYUBk3QxMYdQdoN9XR04z3cAHnc+ajFqeUvqVWTYl90=; b=Lp4gNLAigg+gtFVSW0Yr+wiHvmmitDEUQzyPrPOaUp8CWMlidjhMibZ1l4KDVj8LNYZ4DC8usS1e4q8kMai1oX2tfsF6e9JTah1kpys+P47LXOZvEtb/XS1OSvL3Apgup7TgEbzMThAGALZ5byQphNKQKkem4Dkfwa6A9DYGACbop1g3TavIrPF1uLs5ZdvA8JjNZrmnXmSkPCZypeHjGvn77kE8QLYXL51N0jGDP/6M9GMQlOBc98ufZD7CN5JL08pkkqslCD181kBIKOYmqlXBk91bZqa2mWlO1JEgZL5JjjNDlZQqz+j1RjTQaE/HzkaRQ5y+dM/ZMSFijNfcFA== 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 v3 4/4] tests: Add qemuxmlconftest for ACPI EGM memory device Date: Tue, 25 Nov 2025 11:17:04 -0800 Message-ID: <20251125191704.644477-5-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251125191704.644477-1-nathanc@nvidia.com> References: <20251125191704.644477-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0371.namprd03.prod.outlook.com (2603:10b6:a03:3a1::16) To PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH7PR12MB6834:EE_|MW6PR12MB9000:EE_ X-MS-Office365-Filtering-Correlation-Id: d3d02c21-bf0e-4d88-c2c5-08de2c573b96 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?QAj6MJxkhvENgpJVJy4GOVc4V0/PRTX9tgTeP/Gjj1XEvtBus/2MaTdDkP+Q?= =?us-ascii?Q?usxfUVd+nk8N0P8IhIwSAz4/AUgR5gKudxu9IZ0Bg7Bce46gtJmiVHsrcbgp?= =?us-ascii?Q?xNjkg5itDR1x0tjnSTg950kjU2WAtKEqRZGoPSIUqryyhZkiP7o9QfEOicCq?= =?us-ascii?Q?p+wNA7V3f/BvglhY9ulcXtpYa3OWr5l7dRMca1FlXBs0eDK7tEyxf6J+kW9h?= =?us-ascii?Q?q6vaee7KbLBs/4v4D7u/mrccH9Vix0T5ItDpeBuWA+wAFEnObBVq0IYHKNTf?= =?us-ascii?Q?iLwyusgCMHPmcrruoQzb0kr1m9blFXUdDM12RjzBqn3IhUnc4CSvwOIIGyb6?= =?us-ascii?Q?51//bgfFiKq4JOK4PN1hNUyyFTC/Fe7Lx4UAU2A4SItAABEoDQrZu4XyuLMX?= =?us-ascii?Q?O128fNjkqLy4zQ5qGmh3TzAw6iwrWL1U5Ty4tq4OfDSHwvuNAkN91pX3Foq/?= =?us-ascii?Q?XMAznL0Vmcjir1BLVG82JPfg5S9IkeAnmDxPG3LPLUBcjD6+B49BxldQrEUZ?= =?us-ascii?Q?i8PS+RTdg2AIxWwbA0dje5ChpRZ51K8BCZfDhhQ4wQfXQXZktcAwhRv5TZ+j?= =?us-ascii?Q?SViE3+H/X00vjEDDZ5rf3UGfErle6CNAV5hSnmF7zCGjF4EAYm+NSPYwY2MZ?= =?us-ascii?Q?xIT/J3cehq/nwD6Idd6ZnLiBzPC4TBJqe8E2mBASO2a7eQkgGXIjqlwRNPR3?= =?us-ascii?Q?LbRh/sB6Q7yvr4ZQHM7p3fmllJTeAcIceGZV0AVN4Cz5fcPIi4KMh/17ETtx?= =?us-ascii?Q?DD8LByZbc2ZZ+OwzozJtFotFSMSsLZvAFKyAIrieoU6C0W98WuqQw1jdAGPC?= =?us-ascii?Q?3/+Gk36TbA6qk2B04LZsfwL8hCqWw4sW1dFzMRROCkBr+MmfnLsZ+D3rj3pn?= =?us-ascii?Q?e0yEZpCZYCKMfuBMGm8Ddp/riRcW9+vxerGxSo2dOLjiTpt7EzkKbb25hqCK?= =?us-ascii?Q?nNfnja1hcA/nQGyKTYtzrkfTCGkNdq8NeQqQ2+/1m+55CG98/nra1OJqM6VD?= =?us-ascii?Q?6Rsadu/4SzxRToBpmFDASuFwlznwnyrHZ5JNz/AnqXQGDZIPaAGINUtCrv2L?= =?us-ascii?Q?mMD6XsczlEiXb4NULx7MbxXD6s/UlXS2HO/2RUpvzgld6yj0uVMSxvP6/u/m?= =?us-ascii?Q?SJhrWBEDmVAgE1vrH7AWAMLbR74oQdgzcAv/tpA5eRH48gAUhdzO83qOXal/?= =?us-ascii?Q?H3hMdPmdKolGNQDRoeysNwRmjnBsRnUlQ4FhqJzafzSVLpfnWvk9BuzIgnZo?= =?us-ascii?Q?C5SmH5QasbnOCJOt+m8/lkHO14Gxw8AtmOdM3iBgPrY8mH54+DIqDrayuzP0?= =?us-ascii?Q?S9rzlT4VsZXVFcepD9l1k62vr9FYR0fIhIB8RRAHQu111MGgSTFSxl/t606o?= =?us-ascii?Q?Qw/NwbRpIqluYTSyKKKqR+Wpi5HWCNEPA2OM+5nDEjl/3bjK8PDEefvFAG5f?= =?us-ascii?Q?3zjZsZmlopi2IwwoZHkxiLlipQeXoaNG?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH7PR12MB6834.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?P/mk+xkKw7W7Z+EWBhbyAThFlv98SECRA8CqXLtYF8FfaAW5dJSrbZhwBFHl?= =?us-ascii?Q?J5UCpiomKb3UNyJFtPM/aPizOl/ALOYdMmysVz1Bk9cGEJD1xcJhbfxC98yL?= =?us-ascii?Q?8NJlBmWFZ7g6nHd9QQz34k6RpKs964Z2MJp7Nfs+RuF2qL7pTzzIImuRBdMo?= =?us-ascii?Q?LrTv0J456+YpdmeFijeuzviQ0Ks43F+h6VNcQSYSnUWxV+UGWRPLlz7Rci/A?= =?us-ascii?Q?qVy02AS4xR/m0sKgRy/aZTVijupP4rUzi30nuqcHbLHGEp2zBfPs885i2wLk?= =?us-ascii?Q?q6i4yjOzeTuNMJuENazifpG6KD/T/Bc97ef3zQXYNVUdRH1e8/GBJ7V3Sf0U?= =?us-ascii?Q?JSI0IuJpBDctbvwFO9/lSLB/ycO29mnS4PTIaSGAMsiRfkAQCSj/ul6up9Lt?= =?us-ascii?Q?MFqZxsfovpPGq2hiH8vXQy/n3x3kIzhognsTSvdiETsI6dhJW79nFviOshpE?= =?us-ascii?Q?+VLuM4V2CCXdFlgFiqmgoDHodciV7wSfhnCa5lFhfhkYrRDH1UcyCPwo46P+?= =?us-ascii?Q?nqsv9JQn4urLBwfnqY8BnGAuHaaMpLB5tKz3//C82useTcblGmPKIN7IQJ2Y?= =?us-ascii?Q?80SF30SJT6kSzz1AdQ3BbWeH6Xkwe0WOUjKrToEKlJUL0H7U473ZJfwvx6QY?= =?us-ascii?Q?uqy9+lCH8i4Ni/77/6ZPZBI15LmOhXQzhbpQjvYGP1hvQNM7Ad7K5vYXrMDZ?= =?us-ascii?Q?VbGZ8Isvh7AFX9VqXXTA48GBH7bDS7O7kMFc6YgdxEgmDMsmz76Cy/r9naM7?= =?us-ascii?Q?TV8YoAtZrc/ierRaN0/iK96uQzCzeLVyTUb7IAw8Otwt+APaB5Gqfdumnkpk?= =?us-ascii?Q?pqTjlKru1ZtwyIvHuyHiDxvugLzlA+BsjMnpJy0rSQiRMHd4XnzgudhpY6f6?= =?us-ascii?Q?XfJ7HFpinVp49OEjfTTnjykZfQthPbIa5/uvHDA1Jc82UzdpVvCnVW8sm0Ws?= =?us-ascii?Q?FrimNYvjOiytBI/+DHkQQWWjRiN/f/CsNMj55KzFhlIjjQ94wE3U8d+aqBdk?= =?us-ascii?Q?GO+hmCh2+Xk3CeSSn8traKd8CstMd17awGGkTwWjBd94EbvR28ggDP0sUkGm?= =?us-ascii?Q?J0fWcYLQ1XkdvU/B7IdemQWfTW04aGRg8S8YwPFJTeelokpYJhqfRqt3ewZt?= =?us-ascii?Q?CwB9mJtkhoEJMHYJmOp5lOlCRm9MQGkeups8vMtgVvnnlbadyIx6PepUZuJA?= =?us-ascii?Q?iDE4MczwF2N+XwvI8OdOjfE0ZSqPd6ALiOMjLRv57pNacXBZ7OVAmRuHOIwB?= =?us-ascii?Q?en5C81s1pxEcZ7u9aLN9zsR/44BpCONLwsU+cPsDXCgzRKzFbnlbLo3cbYf+?= =?us-ascii?Q?jBHUUL4GGxX2Bwy0pr7HJUHg0fVD4e1JZPgQNOO58/GBN4Js5yVJ9Msx5CFX?= =?us-ascii?Q?q72DcgivHOpQUsEHihH5a9czHAelnLInu1AC5rrCdZM1iTynsU7TBpFCL50m?= =?us-ascii?Q?23K472Gp8InE/+UBK48ZAiCNvr3uXbiB7aET219DOhKDnQofFWGScj0ALBkG?= =?us-ascii?Q?cA43K2odcGex7mwgbIlVBluJ2H/Jc1PxfiU6YP+DyMn3Yoz+Q2yCiQn+TmB2?= =?us-ascii?Q?cldyMyKJ39XD/jqX2bF04VQ08OHC7f6UNmq26QG/?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d3d02c21-bf0e-4d88-c2c5-08de2c573b96 X-MS-Exchange-CrossTenant-AuthSource: PH7PR12MB6834.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Nov 2025 19:17:10.9140 (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: XGzYiy56k2eZcd5QSxiPpR+7Uni5H3UAQUxK2Z6O84sDD+TSv0NCpEmVaPvr+362SkWbXBw6kjuLPANF6aXZ/w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW6PR12MB9000 Message-ID-Hash: 43APGWYSAN45OSXVIV4MVQIQLTMIQX2H X-Message-ID-Hash: 43APGWYSAN45OSXVIV4MVQIQLTMIQX2H X-MailFrom: nathanc@nvidia.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: skolothumtho@nvidia.com, nicolinc@nvidia.com, nathanc@nvidia.com, mochs@nvidia.com 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: Nathan Chen via Devel Reply-To: Nathan Chen X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1764098865409019200 Content-Type: text/plain; charset="utf-8" From: Ian May Add test coverage for the ACPI EGM memory device feature: - Add test case to qemuxmlconftest.c for aarch64 architecture - Add acpi-egm-memory capability to QEMU 10.0.0 aarch64 capabilities - Create test input XML with EGM device configuration - Generate expected output XML and QEMU command line args - Update validation to skip filesystem checks during tests The test validates XML parsing, formatting, device validation, and QEMU command line generation for the EGM device. Signed-off-by: Ian May Signed-off-by: Nathan Chen --- src/conf/domain_conf.c | 5 +- src/conf/domain_postparse.c | 5 +- src/qemu/qemu_domain.c | 2 + src/util/virfile.h | 2 +- tests/meson.build | 1 + tests/qemuegmmock.c | 67 ++++++++++ .../acpi-egm-memory.aarch64-latest.args | 47 +++++++ .../acpi-egm-memory.aarch64-latest.xml | 124 ++++++++++++++++++ tests/qemuxmlconfdata/acpi-egm-memory.xml | 124 ++++++++++++++++++ tests/qemuxmlconftest.c | 8 +- 10 files changed, 381 insertions(+), 4 deletions(-) create mode 100644 tests/qemuegmmock.c create mode 100644 tests/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.ar= gs create mode 100644 tests/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.xml create mode 100644 tests/qemuxmlconfdata/acpi-egm-memory.xml diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2cda32fa6e..3fba40476f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8813,8 +8813,11 @@ virDomainDefGetMemoryInitial(const virDomainDef *def) size_t i; unsigned long long ret =3D def->mem.total_memory; =20 - for (i =3D 0; i < def->nmems; i++) + for (i =3D 0; i < def->nmems; i++) { + if (def->mems[i]->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_EGM) + continue; ret -=3D def->mems[i]->size; + } =20 return ret; } diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c index 0181d21f0e..bb4a61b7d8 100644 --- a/src/conf/domain_postparse.c +++ b/src/conf/domain_postparse.c @@ -44,8 +44,11 @@ virDomainDefPostParseMemory(virDomainDef *def, numaMemory =3D virDomainNumaGetMemorySize(def->numa); =20 /* calculate the sizes of hotplug memory */ - for (i =3D 0; i < def->nmems; i++) + for (i =3D 0; i < def->nmems; i++) { + if (def->mems[i]->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_EGM) + continue; hotplugMemory +=3D def->mems[i]->size; + } =20 if (numaMemory) { /* update the sizes in XML if nothing was set in the XML or ABI up= date diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 14f2b3ec5d..1b0b375a49 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8038,6 +8038,8 @@ qemuDomainDefValidateMemoryHotplug(const virDomainDef= *def, } =20 for (i =3D 0; i < def->nmems; i++) { + if (def->mems[i]->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_EGM) + continue; hotplugMemory +=3D def->mems[i]->size; =20 switch (def->mems[i]->model) { diff --git a/src/util/virfile.h b/src/util/virfile.h index ce2ffb8ed4..5203ef4425 100644 --- a/src/util/virfile.h +++ b/src/util/virfile.h @@ -167,7 +167,7 @@ int virFileReadHeaderQuiet(const char *path, int maxlen= , char **buf) int virFileReadLimFD(int fd, int maxlen, char **buf) G_GNUC_WARN_UNUSED_RESULT ATTRIBUTE_NONNULL(3); int virFileReadAll(const char *path, int maxlen, char **buf) - G_GNUC_WARN_UNUSED_RESULT ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3); + G_GNUC_WARN_UNUSED_RESULT ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) AT= TRIBUTE_MOCKABLE; int virFileReadAllQuiet(const char *path, int maxlen, char **buf) G_GNUC_WARN_UNUSED_RESULT ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3); int virFileReadBufQuiet(const char *file, char *buf, int len) diff --git a/tests/meson.build b/tests/meson.build index bb6ee6b4ee..28ee8591a3 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -174,6 +174,7 @@ if conf.has('WITH_QEMU') { 'name': 'qemucaps2xmlmock' }, { 'name': 'qemucapsprobemock', 'link_with': [ test_qemu_driver_lib ] }, { 'name': 'qemucpumock' }, + { 'name': 'qemuegmmock' }, { 'name': 'qemuhotplugmock', 'link_with': [ test_qemu_driver_lib, test= _utils_qemu_lib, test_utils_lib ] }, { 'name': 'qemuxml2argvmock' }, { 'name': 'virhostidmock' }, diff --git a/tests/qemuegmmock.c b/tests/qemuegmmock.c new file mode 100644 index 0000000000..c915212f45 --- /dev/null +++ b/tests/qemuegmmock.c @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2024 Red Hat, Inc. + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include +#include + +#include "internal.h" +#include "virfile.h" +#include "virmock.h" + +static bool (*real_virFileExists)(const char *path); +static int (*real_access)(const char *path, int mode); +static int (*real_virFileReadAll)(const char *path, int maxlen, char **buf= ); + +static void +init_syms(void) +{ + if (real_virFileExists && real_access && real_virFileReadAll) + return; + + VIR_MOCK_REAL_INIT(virFileExists); + VIR_MOCK_REAL_INIT(access); + VIR_MOCK_REAL_INIT(virFileReadAll); +} + +bool +virFileExists(const char *path) +{ + init_syms(); + + /* Mock EGM device paths for testing */ + if (g_str_has_prefix(path, "/dev/egm") || + g_str_has_prefix(path, "/sys/class/egm/")) + return true; + + return real_virFileExists(path); +} + +int +access(const char *path, int mode) +{ + init_syms(); + + /* Mock EGM device paths for testing */ + if (g_str_has_prefix(path, "/dev/egm") || + g_str_has_prefix(path, "/sys/class/egm/")) + return 0; /* success */ + + return real_access(path, mode); +} + +int +virFileReadAll(const char *path, int maxlen, char **buf) +{ + init_syms(); + + /* Mock EGM GPU device file for testing */ + if (g_str_has_prefix(path, "/sys/class/egm/") && + g_str_has_suffix(path, "/gpu_devices")) { + *buf =3D g_strdup("0000:01:00.0\n"); + return strlen(*buf); + } + + return real_virFileReadAll(path, maxlen, buf); +} diff --git a/tests/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.args b/te= sts/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.args new file mode 100644 index 0000000000..41d1fcc026 --- /dev/null +++ b/tests/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.args @@ -0,0 +1,47 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/var/lib/libvirt/qemu/domain--1-egm \ +USER=3Dtest \ +LOGNAME=3Dtest \ +XDG_DATA_HOME=3D/var/lib/libvirt/qemu/domain--1-egm/.local/share \ +XDG_CACHE_HOME=3D/var/lib/libvirt/qemu/domain--1-egm/.cache \ +XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-egm/.config \ +/usr/bin/qemu-system-aarch64 \ +-name guest=3Degm,debug-threads=3Don \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/va= r/lib/libvirt/qemu/domain--1-egm/master-key.aes"}' \ +-machine virt,usb=3Doff,gic-version=3D3,dump-guest-core=3Doff,acpi=3Doff \ +-accel kvm \ +-cpu host \ +-m size=3D524288k,maxmem=3D524288k \ +-overcommit mem-lock=3Doff \ +-smp 4,sockets=3D2,dies=3D1,clusters=3D1,cores=3D2,threads=3D1 \ +-object '{"qom-type":"memory-backend-file","id":"memegm0","mem-path":"/dev= /egm4","share":true,"size":268435456}' \ +-object acpi-egm-memory,id=3Degm0,pci-dev=3Dua-hostdev0,node=3D0 \ +-object acpi-egm-memory,id=3Degm1,pci-dev=3Dua-hostdev1,node=3D0 \ +-object '{"qom-type":"memory-backend-file","id":"memegm1","mem-path":"/dev= /egm5","share":true,"size":268435456}' \ +-object acpi-egm-memory,id=3Degm2,pci-dev=3Dua-hostdev2,node=3D1 \ +-object acpi-egm-memory,id=3Degm3,pci-dev=3Dua-hostdev3,node=3D1 \ +-numa node,nodeid=3D0,cpus=3D0-1,memdev=3Dmemegm0 \ +-numa node,nodeid=3D1,cpus=3D2-3,memdev=3Dmemegm1 \ +-uuid 00010203-0405-4607-8809-0a0b0c0d0e0f \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=3Dcharmonitor,fd=3D1729,server=3Don,wait=3Doff \ +-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \ +-rtc base=3Dutc \ +-no-shutdown \ +-boot strict=3Don \ +-device '{"driver":"pcie-root-port","port":8,"chassis":1,"id":"pci.1","bus= ":"pcie.0","multifunction":true,"addr":"0x1"}' \ +-device '{"driver":"pcie-root-port","port":9,"chassis":2,"id":"pci.2","bus= ":"pcie.0","addr":"0x1.0x1"}' \ +-device '{"driver":"pcie-root-port","port":10,"chassis":3,"id":"pci.3","bu= s":"pcie.0","addr":"0x2"}' \ +-device '{"driver":"pcie-root-port","port":11,"chassis":4,"id":"pci.4","bu= s":"pcie.0","addr":"0x3"}' \ +-device '{"driver":"pcie-root-port","port":12,"chassis":5,"id":"pci.5","bu= s":"pcie.0","addr":"0x4"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"vfio-pci","host":"0000:01:00.0","id":"ua-hostdev0","bu= s":"pci.1","addr":"0x0"}' \ +-device '{"driver":"vfio-pci","host":"0000:02:00.0","id":"ua-hostdev1","bu= s":"pci.3","addr":"0x0"}' \ +-device '{"driver":"vfio-pci","host":"0000:03:00.0","id":"ua-hostdev2","bu= s":"pci.4","addr":"0x0"}' \ +-device '{"driver":"vfio-pci","host":"0000:04:00.0","id":"ua-hostdev3","bu= s":"pci.5","addr":"0x0"}' \ +-sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,resource= control=3Ddeny \ +-msg timestamp=3Don diff --git a/tests/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.xml b/tes= ts/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.xml new file mode 100644 index 0000000000..bd73d613e5 --- /dev/null +++ b/tests/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.xml @@ -0,0 +1,124 @@ + + egm + 00010203-0405-4607-8809-0a0b0c0d0e0f + 524288 + 524288 + 524288 + 4 + + hvm + + + + + + + + + + + + + + destroy + restart + destroy + + /usr/bin/qemu-system-aarch64 + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ +