From nobody Mon May 25 11:58:29 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; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1776758911; cv=none; d=zohomail.com; s=zohoarc; b=Fsgu2KZvtwPjwN9OBcjOeTKbH2boMVCKFKuZOOSxzofqZUNIGDkUdNSYft0SUQO+s17nQl9IyWOlBtuIBwAH0R7lc9WJZyk3nOThN/f00+Mz61ztyWcNsh4FtpNmnxGbC2iOJfFagKBY9JpBA5oES/99FPUzejRK5ym1hagOW7U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1776758911; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:Subject:Subject:To:To:Message-Id; bh=6caXccJYqZky0hVoNCKuKsSMwNagxYuI135zSH6ZcdQ=; b=j+MJG+bTuznDHzo9U1nPluRugAKKLF6Ei5vIQaIK7KI+p+roIyS7VMZvYVd+PWT+jt4GlK+HYw7yrScJFvhh/u9Xj3Hf+/bckkMjpHKsKVQ30HDe5IP5gZLxl+c7cHRF01x7G26zhWPKI9aQhTFe6s1cI8HqZfJ3anWayC4Mgx0= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1776758911621867.1638194390831; Tue, 21 Apr 2026 01:08:31 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id DAB8541853; Tue, 21 Apr 2026 04:08:30 -0400 (EDT) Received: from [172.19.199.6] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 88C54418E9; Tue, 21 Apr 2026 03:58:49 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id F1DB3417F9; Tue, 21 Apr 2026 01:30:42 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 268C83F282 for ; Tue, 21 Apr 2026 01:30:39 -0400 (EDT) Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-142-aokF6N3eMge1_bkMTsV-Vg-1; Tue, 21 Apr 2026 01:30:37 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2EB9F1800473 for ; Tue, 21 Apr 2026 05:30:36 +0000 (UTC) Received: from surygupt-thinkpadx1carbongen12.bengluru.csb (unknown [10.74.80.237]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id D7639195608E; Tue, 21 Apr 2026 05:30:33 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1776749438; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=6caXccJYqZky0hVoNCKuKsSMwNagxYuI135zSH6ZcdQ=; b=UajaQ8dc4JMPmNg/k1xxRjoaXqTG/ySMWh6hRRAPQWmzzFjKY7fp6o3PIwpMY3N+5TJnM7 EPd5rr0Qlnw4aDJYozbQJQqjoXGMMytXQSp/tFMhFYJTR2SMZcDWPlqlRiTZ/eKIGfRocH wWSvA7f6+sz1DHUXjSZxaomgKRblUAg= X-MC-Unique: aokF6N3eMge1_bkMTsV-Vg-1 X-Mimecast-MFC-AGG-ID: aokF6N3eMge1_bkMTsV-Vg_1776749436 To: devel@lists.libvirt.org Subject: [PATCH] vmx: Add support for NVRAM configuration Date: Tue, 21 Apr 2026 11:00:21 +0530 Message-ID: <20260421053022.520404-1-surygupt@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: Z1SRYerFyWl_xIMBKsZJjBBCuTS_1I0Qo6E0sd3Nzx4_1776749436 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-MailFrom: surygupt@redhat.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation Message-ID-Hash: LQYJIOODVHHBMRFB2DPQ26OELQRL7BOF X-Message-ID-Hash: LQYJIOODVHHBMRFB2DPQ26OELQRL7BOF X-Mailman-Approved-At: Tue, 21 Apr 2026 07:58:20 +0000 CC: Surya Gupta 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: Surya Gupta via Devel Reply-To: Surya Gupta X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1776758913894154100 Content-Type: text/plain; charset="utf-8"; x-default="true" Some VMware guests specify NVRAM storage using the 'nvram' parameter. If found, parse it and store it in the domain's os.loader.nvram field, which gets formatted as: hvm [datastore] directory/dokuwiki.nvram The NVRAM path uses the same transformation functions as disk paths (ctx->parseFileName and ctx->formatFileName) to ensure consistent handling of datastore-qualified paths. The NVRAM is stored as a virStorageSource with type VIR_STORAGE_TYPE_FILE to ensure compatibility with libvirt's existing firmware handling infrastructure. Fixes: https://redhat.atlassian.net/browse/RHELMISC-29421 Signed-off-by: Surya Gupta --- src/vmx/vmx.c | 32 ++++++++++++++++++++++++ tests/vmx2xmldata/case-insensitive-1.xml | 1 + tests/vmx2xmldata/case-insensitive-2.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-1.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-10.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-11.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-12.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-13.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-14.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-15.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-16.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-17.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-2.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-3.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-4.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-5.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-6.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-7.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-8.xml | 1 + tests/vmx2xmldata/esx-in-the-wild-9.xml | 1 + tests/vmx2xmldata/gsx-in-the-wild-1.xml | 1 + tests/vmx2xmldata/gsx-in-the-wild-2.xml | 1 + tests/vmx2xmldata/gsx-in-the-wild-3.xml | 1 + tests/vmx2xmldata/gsx-in-the-wild-4.xml | 1 + 24 files changed, 55 insertions(+) diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 57dfd57cfc..c42b030dd6 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -1415,6 +1415,7 @@ virVMXParseConfig(virVMXContext *ctx, long long coresPerSocket =3D 0; virCPUDef *cpu =3D NULL; char *firmware =3D NULL; + char *nvram =3D NULL; size_t saved_ndisks =3D 0; =20 if (ctx->parseFileName =3D=3D NULL) { @@ -2022,6 +2023,26 @@ virVMXParseConfig(virVMXContext *ctx, VIR_TRISTATE_BOOL_YES; } =20 + /* vmx:nvram */ + if (virVMXGetConfigString(conf, "nvram", &nvram, true) < 0) { + goto cleanup; + } + + if (nvram !=3D NULL) { + g_autoptr(virStorageSource) n =3D virStorageSourceNew(); + char *tmp =3D NULL; + + if (!def->os.loader) { + def->os.loader =3D virDomainLoaderDefNew(); + } + + n->type =3D VIR_STORAGE_TYPE_FILE; + if (ctx->parseFileName(nvram, ctx->opaque, &tmp, false) < 0) + goto cleanup; + n->path =3D tmp; + def->os.loader->nvram =3D g_steal_pointer(&n); + } + if (virDomainDefPostParse(def, VIR_DOMAIN_DEF_PARSE_ABI_UPDATE, xmlopt, NULL) < 0) goto cleanup; @@ -2035,6 +2056,7 @@ virVMXParseConfig(virVMXContext *ctx, VIR_FREE(guestOS); virCPUDefFree(cpu); VIR_FREE(firmware); + VIR_FREE(nvram); =20 if (!success) return NULL; @@ -3738,6 +3760,16 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLO= ption *xmlopt, virDomainDef if (def->os.firmware =3D=3D VIR_DOMAIN_OS_DEF_FIRMWARE_EFI) virBufferAddLit(&buffer, "firmware =3D \"efi\"\n"); =20 + /* vmx:nvram */ + if (def->os.loader && def->os.loader->nvram && def->os.loader->nvram->= path) { + g_autofree char *nvramPath =3D NULL; + + nvramPath =3D ctx->formatFileName(def->os.loader->nvram->path, ctx= ->opaque); + if (nvramPath !=3D NULL) { + virBufferAsprintf(&buffer, "nvram =3D \"%s\"\n", nvramPath); + } + } + if (virtualHW_version >=3D 7) { if (hasSCSI) { virBufferAddLit(&buffer, "pciBridge0.present =3D \"true\"\n"); diff --git a/tests/vmx2xmldata/case-insensitive-1.xml b/tests/vmx2xmldata/c= ase-insensitive-1.xml index 7cb6413941..e854cc37cb 100644 --- a/tests/vmx2xmldata/case-insensitive-1.xml +++ b/tests/vmx2xmldata/case-insensitive-1.xml @@ -9,6 +9,7 @@ hvm + [datastore] directory/FEDORA11.NVRAM destroy diff --git a/tests/vmx2xmldata/case-insensitive-2.xml b/tests/vmx2xmldata/c= ase-insensitive-2.xml index 188c3f3cd5..f5c4446ab5 100644 --- a/tests/vmx2xmldata/case-insensitive-2.xml +++ b/tests/vmx2xmldata/case-insensitive-2.xml @@ -9,6 +9,7 @@ hvm + [datastore] directory/fedora11.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-1.xml b/tests/vmx2xmldata/es= x-in-the-wild-1.xml index c15275ccb9..9ae28c8497 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-1.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-1.xml @@ -9,6 +9,7 @@ hvm + [datastore] directory/Fedora11.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-10.xml b/tests/vmx2xmldata/e= sx-in-the-wild-10.xml index 78129682bd..1b1fdf0662 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-10.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-10.xml @@ -10,6 +10,7 @@ hvm + [datastore] directory/windows2019biosvmware.nvram diff --git a/tests/vmx2xmldata/esx-in-the-wild-11.xml b/tests/vmx2xmldata/e= sx-in-the-wild-11.xml index 8807a057d7..a0c1e05e90 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-11.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-11.xml @@ -9,6 +9,7 @@ hvm + [datastore] directory/esx6.7-rhel7.7-x86_64.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-12.xml b/tests/vmx2xmldata/e= sx-in-the-wild-12.xml index c5aad90677..ac83982b9b 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-12.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-12.xml @@ -13,6 +13,7 @@ + [datastore] directory/Auto-esx8.0-rhell9.3-efi-with-empty-cdrom= .nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-13.xml b/tests/vmx2xmldata/e= sx-in-the-wild-13.xml index e6ef947d50..cef9fd4e48 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-13.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-13.xml @@ -23,6 +23,7 @@ package:20.6.2 hvm + [datastore] directory/Test-Mig-VM-1 (01ce57d0-4e20-41a5-8b6c-bc= bf49a032ec).nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-14.xml b/tests/vmx2xmldata/e= sx-in-the-wild-14.xml index dd5c2434ee..f10707d1d4 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-14.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-14.xml @@ -7,6 +7,7 @@ 12 hvm + [datastore] directory/wild14.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-15.xml b/tests/vmx2xmldata/e= sx-in-the-wild-15.xml index 77b094e9d5..78d15e1538 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-15.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-15.xml @@ -9,6 +9,7 @@ hvm + [datastore] directory/dokuwiki.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-16.xml b/tests/vmx2xmldata/e= sx-in-the-wild-16.xml index 147bc0825a..51746dd77e 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-16.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-16.xml @@ -13,6 +13,7 @@ + [datastore] directory/Auto-esx8.0-rhel9.4-efi-nvme-disk.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-17.xml b/tests/vmx2xmldata/e= sx-in-the-wild-17.xml index ae66de7431..725f21bdf6 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-17.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-17.xml @@ -10,6 +10,7 @@ hvm + [datastore] directory/esx8.0-win11-with-second-disk-in-subfolde= r.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-2.xml b/tests/vmx2xmldata/es= x-in-the-wild-2.xml index 59071b5d3a..59c7087300 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-2.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-2.xml @@ -6,6 +6,7 @@ 4 hvm + [datastore] directory/Debian1.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-3.xml b/tests/vmx2xmldata/es= x-in-the-wild-3.xml index cbe8eceb37..29c63d8d6b 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-3.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-3.xml @@ -6,6 +6,7 @@ 2 hvm + [datastore] directory/Debian2.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-4.xml b/tests/vmx2xmldata/es= x-in-the-wild-4.xml index a8a2ac6f97..82eccca1c4 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-4.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-4.xml @@ -9,6 +9,7 @@ hvm + [datastore] directory/virtMonServ1.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-5.xml b/tests/vmx2xmldata/es= x-in-the-wild-5.xml index 9eb975afe9..c88e60bdc0 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-5.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-5.xml @@ -13,6 +13,7 @@ hvm + [datastore] directory/vmtest.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-6.xml b/tests/vmx2xmldata/es= x-in-the-wild-6.xml index 51c74dd8a1..805f033561 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-6.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-6.xml @@ -6,6 +6,7 @@ 1 hvm + [datastore] directory/el6-test.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-7.xml b/tests/vmx2xmldata/es= x-in-the-wild-7.xml index c117bd62e5..b641574776 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-7.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-7.xml @@ -6,6 +6,7 @@ 1 hvm + [datastore] directory/esx-rhel6-mini.nvram destroy diff --git a/tests/vmx2xmldata/esx-in-the-wild-8.xml b/tests/vmx2xmldata/es= x-in-the-wild-8.xml index 47d22ced2a..f13e6f7448 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-8.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-8.xml @@ -9,6 +9,7 @@ hvm + [datastore] directory/RHEL7_6.nvram diff --git a/tests/vmx2xmldata/esx-in-the-wild-9.xml b/tests/vmx2xmldata/es= x-in-the-wild-9.xml index ee6be2527f..6b4d878ab1 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-9.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-9.xml @@ -10,6 +10,7 @@ hvm + [datastore] directory/v2v-windows-kkulkarn.nvram diff --git a/tests/vmx2xmldata/gsx-in-the-wild-1.xml b/tests/vmx2xmldata/gs= x-in-the-wild-1.xml index 62ec191c82..f189ff79e4 100644 --- a/tests/vmx2xmldata/gsx-in-the-wild-1.xml +++ b/tests/vmx2xmldata/gsx-in-the-wild-1.xml @@ -6,6 +6,7 @@ 1 hvm + [datastore] directory/Debian-System1.nvram destroy diff --git a/tests/vmx2xmldata/gsx-in-the-wild-2.xml b/tests/vmx2xmldata/gs= x-in-the-wild-2.xml index 906e4657ca..d1c1bf39df 100644 --- a/tests/vmx2xmldata/gsx-in-the-wild-2.xml +++ b/tests/vmx2xmldata/gsx-in-the-wild-2.xml @@ -6,6 +6,7 @@ 1 hvm + [datastore] directory/Server2.nvram destroy diff --git a/tests/vmx2xmldata/gsx-in-the-wild-3.xml b/tests/vmx2xmldata/gs= x-in-the-wild-3.xml index 61812851e1..acc9d6ba5d 100644 --- a/tests/vmx2xmldata/gsx-in-the-wild-3.xml +++ b/tests/vmx2xmldata/gsx-in-the-wild-3.xml @@ -6,6 +6,7 @@ 1 hvm + [datastore] directory/Debian-System3.nvram destroy diff --git a/tests/vmx2xmldata/gsx-in-the-wild-4.xml b/tests/vmx2xmldata/gs= x-in-the-wild-4.xml index a65a7d137f..8c73224846 100644 --- a/tests/vmx2xmldata/gsx-in-the-wild-4.xml +++ b/tests/vmx2xmldata/gsx-in-the-wild-4.xml @@ -6,6 +6,7 @@ 1 hvm + [datastore] directory/Debian-System4.nvram destroy --=20 2.53.0