From nobody Mon Feb 9 20:59:01 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=nutanix.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1651683111085962.6725901780441; Wed, 4 May 2022 09:51:51 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-670-bRjwoieUN3Ks7vqJHs1ZyA-1; Wed, 04 May 2022 12:51:46 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8560738149AA; Wed, 4 May 2022 16:51:43 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6CE6E40D2822; Wed, 4 May 2022 16:51:43 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id F1B62194707A; Wed, 4 May 2022 16:51:42 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 847F21947046 for ; Wed, 4 May 2022 16:51:42 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 55AFA9E82; Wed, 4 May 2022 16:51:42 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast09.extmail.prod.ext.rdu2.redhat.com [10.11.55.25]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4F4689E8F for ; Wed, 4 May 2022 16:51:39 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id F401F29AB419 for ; Wed, 4 May 2022 16:51:38 +0000 (UTC) Received: from mx0a-002c1b01.pphosted.com (mx0a-002c1b01.pphosted.com [148.163.151.68]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-341-3rvPlridN_mOOWgjERylLg-1; Wed, 04 May 2022 12:51:37 -0400 Received: from pps.filterd (m0127840.ppops.net [127.0.0.1]) by mx0a-002c1b01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 244CtfDR002768 for ; Wed, 4 May 2022 09:51:35 -0700 Received: from nam11-co1-obe.outbound.protection.outlook.com (mail-co1nam11lp2175.outbound.protection.outlook.com [104.47.56.175]) by mx0a-002c1b01.pphosted.com (PPS) with ESMTPS id 3fs1etrep8-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 04 May 2022 09:51:35 -0700 Received: from SJ0PR02MB8564.namprd02.prod.outlook.com (2603:10b6:a03:3f6::16) by BN6PR02MB2657.namprd02.prod.outlook.com (2603:10b6:404:fc::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5206.13; Wed, 4 May 2022 16:51:32 +0000 Received: from SJ0PR02MB8564.namprd02.prod.outlook.com ([fe80::8ac:200b:2dc3:5e99]) by SJ0PR02MB8564.namprd02.prod.outlook.com ([fe80::8ac:200b:2dc3:5e99%5]) with mapi id 15.20.5206.024; Wed, 4 May 2022 16:51:32 +0000 X-MC-Unique: bRjwoieUN3Ks7vqJHs1ZyA-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: 3rvPlridN_mOOWgjERylLg-1 From: Rohit Kumar To: libvir-list@redhat.com Subject: [PATCH v3 2/5] Add support to parse/format/validate virStorageSource type NVRAM Date: Wed, 4 May 2022 09:51:12 -0700 Message-Id: <20220504165115.1225892-3-rohit.kumar3@nutanix.com> In-Reply-To: <20220504165115.1225892-1-rohit.kumar3@nutanix.com> References: <20220504165115.1225892-1-rohit.kumar3@nutanix.com> X-ClientProxiedBy: BYAPR06CA0043.namprd06.prod.outlook.com (2603:10b6:a03:14b::20) To SJ0PR02MB8564.namprd02.prod.outlook.com (2603:10b6:a03:3f6::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 1f08d323-d1f2-4dc5-6a42-08da2dee578d X-MS-TrafficTypeDiagnostic: BN6PR02MB2657:EE_ X-Microsoft-Antispam-PRVS: x-proofpoint-crosstenant: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0 X-Microsoft-Antispam-Message-Info: WLfcOGjkUbiojce+0sPRrgZuSSb+UDjE03po6VqzgBEzWHDi53zaknen2swhXdWjs2Ow9GI0q366OWIiVjBE6yUInaAVAM9B7is5bUjTmSH58+Pg4FPB3PFQ+HpuXjkrEDCOjksHnal5xkg9DIr+3OYaumfmCNMZfWML/fee5+cd/3/B+I2DDTX5XXANRVNZ5BMmD41JTiEE9s4y4ESy4resdaeWTk2Ww9uQ76V/I57um7eXl4kzB2FeRUVdkdYTg352djvaom86N/1xfews/3KuOCRqNNtu5G5jktmWj2RBnAcJQUD/dMQ8Knf9iYbbOv1XxfDCBSrJmwqEfhGiJLQ/oCntZhbwy/5rG3jHQ9rkPKNd0fa5pWA7OS9UewZIMFDZJSRCp4Mqkv9bKy+J55c7n0Un7997iHxU8o/crsbozyZKH3y0OCc+W2ErumSvv85LYbowgNxCuAjMK+6RFF6eQGM5gML0Hgf0wv9NBLvg3j6H6QLCr0HA3vTTHzqSSZv3YxVw2ozYtdjKPXUtj4EyUEkcFf/CQ57msO8ysy3cAVndtQ9j8Nmpvwgmmc8InVvje7ry4eg6TLjGFdqGTFJ/sUoBTkqGXB4Zfd5eouQWbyw6+b0Txw5GZna9tQtM/c04tmXRbkyizK6wC8r9cZJBIWH71gD1dyHjdgn+SqcK/zGbBgUfwZ29KywxtMlVMUbqW3Ta6gGfmf/3qzA2BQ== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SJ0PR02MB8564.namprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230001)(366004)(1076003)(6916009)(38100700002)(26005)(38350700002)(6486002)(2906002)(6506007)(6666004)(316002)(36756003)(186003)(86362001)(107886003)(6512007)(2616005)(83380400001)(508600001)(52116002)(5660300002)(8676002)(8936002)(66946007)(30864003)(4326008)(66476007)(15650500001)(66556008); DIR:OUT; SFP:1102 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?d7CxoFXd+j2By//h15OPFDfI/qegmyjZHpVy21OliwYIcDPnsnb575GTT71w?= =?us-ascii?Q?3azPp98rJHUd+UWog901A38PxAR4cxK7acVqj4o5CufL9o5MIcOHnuQqRWD0?= =?us-ascii?Q?W0UH1miVUWlTaCfwSur685mS1TPlU9g6ojYKvLTTZhuBQ5OCZvT2CFkzWwK7?= =?us-ascii?Q?8DeH4Kp1r5jC0QN9ghC8ZxlerLbbvg8f2aofuvT1qaMHI7tU6whukvwDV50p?= =?us-ascii?Q?PJbaNkSC98TdPjZrBsVWuTb2V5puXZa6IuhP0Z/JTAv8KKM5nSfzvenEmxfl?= =?us-ascii?Q?ZL5BQNQ3SAGh5mrv1Q6yuK8jF4OGixYFu6FoM9pyMStY60dnMe1rESHo0i+W?= =?us-ascii?Q?JRc/L5VHCYw++mi2Vvr/Kj9WxF/70hBhHBNaAA85FaCm452hWYlwdMmEYi8y?= =?us-ascii?Q?NPN07VSFTUhRCxScTJAMR/IcvxNORStIBkncKtqHa4JmhO0/LT1Z/S/EDRF9?= =?us-ascii?Q?MJFTQ9AkQUBcNVjw0F0J19DdSH/tEl9yB34abvt/vsE/5zpFRBFWLXEQyraD?= =?us-ascii?Q?ZTRdljB7G+PJAzYRhn47mrvhjo/nxfcwJSU2Ec9lhtw5tcFDJtIxPyXs3tcn?= =?us-ascii?Q?Cvr8Mi7G7zitjpioG0X81DMLhFlgNzzTbsERRbGc0fVs6VUPhmI0KfWYzIxc?= =?us-ascii?Q?lhnk4PzqjYtJVq3ntobP4U0E9PPLb80UQutrgzOijNUZt++1cBYArk0qN8ES?= =?us-ascii?Q?nRYa3C/lHOdAQeeu+rwVBjFVE0iAUVcpwbvKnHv50VPf+lREz0sShn3sYTLH?= =?us-ascii?Q?3jSsODFUu67al6M0pY/+hmwAqm5RdpFQW2BjNLhRcEfdyhdLH4D4TcUM1bCx?= =?us-ascii?Q?kPsGlPGz8QBNhWWD2c80Js29YG5KLXgZ81c0qohWkeDg9Ui3ZCgy/zCLGfm8?= =?us-ascii?Q?GvQ0j9V01DMQ1YrqUnebVmF+AG+WvVsJnflgfnrPeprEYG/IqrGdkwxGLDh5?= =?us-ascii?Q?YAEF8yUxqqfvpSf/kNGny4ilDq7RmPnUAPp9zxaDIUqQQGvAr2eSgnDdxBaU?= =?us-ascii?Q?+9W/8EIHeNOtSn4yF8LDy8GkCi5jlLJ3NBlnbaIF4AshUf8mMUdVZw2PIQOr?= =?us-ascii?Q?AkEuMgaytbub73PmkNugwftxWJEHFwvf3D2pClm3SgLW5h0UcIOemwzzty12?= =?us-ascii?Q?80/Ajp/LbrTHCU0xJ8S2KiAkKEcJaqYkYZmYN4hAUZdO6vl9yG9hFheNUZKK?= =?us-ascii?Q?bDddruBzVgJrhkCJKGXwjVFCwlfLEY6xQVfsEyR5boNov4vEIuzWU1ymtkNd?= =?us-ascii?Q?d1EpBYNdMuPkvilXH7hfxG4wslBkLDCpBaWiTVW/zjxZlrc8RoX6itzB4dMX?= =?us-ascii?Q?pSKe8TfpcPXKMYd+u8+N0FdsbA4eoQYGHhl5ZhUORc1nAggAH3KdziUXz4qZ?= =?us-ascii?Q?vOpaioJXFXYecYkRqrU+aMvFhtlhR5QiYuSH1JBYD+n5DCO2572lj2R1RAL0?= =?us-ascii?Q?k5xqT1HU/8Hcl9gJILjkQdQ+7Z/F2hp2T7CAPA+ecX618Z/Sf7xgSNlnz8tO?= =?us-ascii?Q?eWoT93Du+uSJEb6kRu902dIrPQzTZewngRDqo5t6ZhTcs6Rvtd4GHCI5eDZq?= =?us-ascii?Q?TovqEfBbhNYRIgEvs20EMWdtyGA2EBFP3Hs3SSFlKc/+Z5J8FBIGEgyWC9Gd?= =?us-ascii?Q?U9LqqwAUNRqjZAIK1of1T5vpyaNBenqeigejsS4NSmB6ufKa88dvIVbh7zRU?= =?us-ascii?Q?B/CPzpgQudyK7kc7zls3KDeNZXkCWjGebWpgAd65APCLBRko2MFDN3HH6DQw?= =?us-ascii?Q?8RryOiRkZU+hY9enlD7f4ZRWxek/cIk=3D?= X-OriginatorOrg: nutanix.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1f08d323-d1f2-4dc5-6a42-08da2dee578d X-MS-Exchange-CrossTenant-AuthSource: SJ0PR02MB8564.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 May 2022 16:51:32.2416 (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: 429VCQTKEMhUWyuTRWaCqJf660jEYjgx4xD8DfycdpiKHWE/yiDNnXRBZB8Xg5Rn/icTm2SLBw/TdpiMD7JCOudg5g2wK4wAcwosgMuTzp0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR02MB2657 X-Proofpoint-ORIG-GUID: LXkcSlYZGHrJw0ymSSM_Ht6dzGXPKg-6 X-Proofpoint-GUID: LXkcSlYZGHrJw0ymSSM_Ht6dzGXPKg-6 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.858,Hydra:6.0.486,FMLib:17.11.64.514 definitions=2022-05-04_04,2022-05-04_02,2022-02-23_01 X-Proofpoint-Spam-Reason: safe X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: prachatos.mitra@nutanix.com, Rohit Kumar , flosch@nutanix.com, prerna.saxena@nutanix.com Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1651683112503100007 Content-Type: text/plain; charset="utf-8" This patch introduces the logic to format and parse remote NVRAM. This also adds 'type' attribute to nvram element and validates 'file' type NVRAM for unsupported configurations. Sample XML with new annotation: or Signed-off-by: Prerna Saxena Signed-off-by: Florian Schmidt Signed-off-by: Rohit Kumar --- src/conf/domain_conf.c | 110 +++++++++++++++++++++++++++++++++------ src/conf/domain_conf.h | 1 + src/qemu/qemu_domain.c | 9 ++++ src/qemu/qemu_firmware.c | 6 +++ src/qemu/qemu_validate.c | 61 ++++++++++++++++++++++ 5 files changed, 172 insertions(+), 15 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index bdd36e777c..0429ff659e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -17826,6 +17826,64 @@ virDomainLoaderDefParseXML(xmlNodePtr node, } =20 =20 +static int +virDomainNvramDefParseXML(virDomainLoaderDef *loader, + xmlXPathContextPtr ctxt, + virDomainXMLOption *opt, + unsigned int flags) +{ + g_autofree char *nvramType =3D NULL; + + nvramType =3D virXPathString("string(./os/nvram/@type)", ctxt); + + /* if nvramType=3D=3DNULL read old-style, else + * if there's a type, read new style */ + if (!nvramType) { + loader->newStyleNVRAM =3D false; + loader->nvram->type =3D VIR_STORAGE_TYPE_FILE; + loader->nvram->path =3D virXPathString("string(./os/nvram[1])", ct= xt); + return 0; + } else { + xmlNodePtr source; + g_autofree char *srcProtocol =3D NULL; + g_autofree char *srcFile =3D NULL; + + loader->newStyleNVRAM =3D true; + if ((loader->nvram->type =3D virStorageTypeFromString(nvramType)) = <=3D 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown disk type '%s'"), nvramType); + return -1; + } + + srcProtocol =3D virXPathString("string(./os/nvram/source/@protocol= )", ctxt); + if (srcProtocol && (loader->nvram->type !=3D VIR_STORAGE_TYPE_NETW= ORK)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Source 'protocol' field is not supported wit= h nvram type '%s'"), + nvramType); + return -1; + } + + srcFile =3D virXPathString("string(./os/nvram/source/@file)", ctxt= ); + if (!srcFile && (loader->nvram->type =3D=3D VIR_STORAGE_TYPE_FILE)= ) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Source 'file' attribute is missing with nvra= m type '%s'"), + nvramType); + return -1; + } + + source =3D virXPathNode("./os/nvram/source[1]", ctxt); + if (!source) { + virReportError(VIR_ERR_XML_ERROR, + _("Missing source element with nvram type '%s'"= ), + nvramType); + return -1; + } + return virDomainStorageSourceParse(source, ctxt, loader->nvram, fl= ags, opt); + } + return 0; +} + + static int virDomainSchedulerParseCommonAttrs(xmlNodePtr node, virProcessSchedPolicy *policy, @@ -18211,7 +18269,9 @@ virDomainDefParseBootFirmwareOptions(virDomainDef *= def, =20 static int virDomainDefParseBootLoaderOptions(virDomainDef *def, - xmlXPathContextPtr ctxt) + xmlXPathContextPtr ctxt, + virDomainXMLOption *xmlopt, + unsigned int flags) { xmlNodePtr loader_node =3D virXPathNode("./os/loader[1]", ctxt); const bool fwAutoSelect =3D def->os.firmware !=3D VIR_DOMAIN_OS_DEF_FI= RMWARE_NONE; @@ -18228,8 +18288,10 @@ virDomainDefParseBootLoaderOptions(virDomainDef *d= ef, =20 if (virXPathNode("./os/nvram[1]", ctxt)) { def->os.loader->nvram =3D virStorageSourceNew(); - def->os.loader->nvram->path =3D virXPathString("string(./os/nvram[= 1])", ctxt); - def->os.loader->nvram->type =3D VIR_STORAGE_TYPE_FILE; + + if (virDomainNvramDefParseXML(def->os.loader, + ctxt, xmlopt, flags) < 0) + return -1; } if (!fwAutoSelect) def->os.loader->nvramTemplate =3D virXPathString("string(./os/nvra= m[1]/@template)", ctxt); @@ -18284,7 +18346,9 @@ virDomainDefParseBootAcpiOptions(virDomainDef *def, =20 static int virDomainDefParseBootOptions(virDomainDef *def, - xmlXPathContextPtr ctxt) + xmlXPathContextPtr ctxt, + virDomainXMLOption *xmlopt, + unsigned int flags) { /* * Booting options for different OS types.... @@ -18302,7 +18366,7 @@ virDomainDefParseBootOptions(virDomainDef *def, if (virDomainDefParseBootFirmwareOptions(def, ctxt) < 0) return -1; =20 - if (virDomainDefParseBootLoaderOptions(def, ctxt) < 0) + if (virDomainDefParseBootLoaderOptions(def, ctxt, xmlopt, flags) <= 0) return -1; =20 if (virDomainDefParseBootAcpiOptions(def, ctxt) < 0) @@ -18318,7 +18382,7 @@ virDomainDefParseBootOptions(virDomainDef *def, case VIR_DOMAIN_OSTYPE_UML: virDomainDefParseBootKernelOptions(def, ctxt); =20 - if (virDomainDefParseBootLoaderOptions(def, ctxt) < 0) + if (virDomainDefParseBootLoaderOptions(def, ctxt, xmlopt, flags) <= 0) return -1; =20 break; @@ -19609,7 +19673,7 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt, if (virDomainDefClockParse(def, ctxt) < 0) return NULL; =20 - if (virDomainDefParseBootOptions(def, ctxt) < 0) + if (virDomainDefParseBootOptions(def, ctxt, xmlopt, flags) < 0) return NULL; =20 /* analysis of the disk devices */ @@ -26909,14 +26973,16 @@ virDomainHugepagesFormat(virBuffer *buf, virBufferAddLit(buf, "\n"); } =20 -static void +static int virDomainLoaderDefFormat(virBuffer *buf, - virDomainLoaderDef *loader) + virDomainLoaderDef *loader, + virDomainXMLOption *xmlopt, + unsigned int flags) { g_auto(virBuffer) loaderAttrBuf =3D VIR_BUFFER_INITIALIZER; g_auto(virBuffer) loaderChildBuf =3D VIR_BUFFER_INITIALIZER; g_auto(virBuffer) nvramAttrBuf =3D VIR_BUFFER_INITIALIZER; - g_auto(virBuffer) nvramChildBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) nvramChildBuf =3D VIR_BUFFER_INIT_CHILD(buf); =20 if (loader->readonly !=3D VIR_TRISTATE_BOOL_ABSENT) virBufferAsprintf(&loaderAttrBuf, " readonly=3D'%s'", @@ -26935,11 +27001,24 @@ virDomainLoaderDefFormat(virBuffer *buf, virXMLFormatElementInternal(buf, "loader", &loaderAttrBuf, &loaderChil= dBuf, false, false); =20 virBufferEscapeString(&nvramAttrBuf, " template=3D'%s'", loader->nvram= Template); - if (loader->nvram) { - if (loader->nvram->type =3D=3D VIR_STORAGE_TYPE_FILE) + if (loader->nvram || loader->nvramTemplate) { + bool childNewline; + if (!loader->newStyleNVRAM) { + virBufferSetIndent(&nvramChildBuf, 0); virBufferEscapeString(&nvramChildBuf, "%s", loader->nvram->pat= h); + childNewline =3D false; + } else { + virBufferAsprintf(&nvramAttrBuf, " type=3D'%s'", virStorageTyp= eToString(loader->nvram->type)); + if (virDomainDiskSourceFormat(&nvramChildBuf, loader->nvram, "= source", 0, + false, flags, false, false, xmlo= pt) < 0) { + return -1; + } + childNewline =3D true; + } + virXMLFormatElementInternal(buf, "nvram", &nvramAttrBuf, &nvramChi= ldBuf, false, childNewline); } - virXMLFormatElementInternal(buf, "nvram", &nvramAttrBuf, &nvramChildBu= f, false, false); + + return 0; } =20 static void @@ -28140,8 +28219,9 @@ virDomainDefFormatInternalSetRootName(virDomainDef = *def, if (def->os.initgroup) virBufferAsprintf(buf, "%s\n", def->os.init= group); =20 - if (def->os.loader) - virDomainLoaderDefFormat(buf, def->os.loader); + if (def->os.loader && + virDomainLoaderDefFormat(buf, def->os.loader, xmlopt, flags) < 0) + return -1; virBufferEscapeString(buf, "%s\n", def->os.kernel); virBufferEscapeString(buf, "%s\n", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 3a3164db9c..6523abaa0c 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2236,6 +2236,7 @@ struct _virDomainLoaderDef { virDomainLoader type; virTristateBool secure; virStorageSource *nvram; + bool newStyleNVRAM; char *nvramTemplate; /* user override of path to master nvram */ }; =20 diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9dccbbfb1a..afe94eb018 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -11283,6 +11283,15 @@ qemuDomainInitializePflashStorageSource(virDomainO= bj *vm) pflash1->format =3D VIR_STORAGE_FILE_RAW; pflash1->nodeformat =3D g_strdup("libvirt-pflash1-format"); pflash1->nodestorage =3D g_strdup("libvirt-pflash1-storage"); + + if (!pflash1->privateData && + !(pflash1->privateData =3D qemuDomainStorageSourcePrivateNew()= )) + return -1; + + if (qemuDomainSecretStorageSourcePrepare(priv, pflash1, + pflash1->nodestorage, + pflash1->nodeformat) < 0) + return -1; } =20 priv->pflash0 =3D g_steal_pointer(&pflash0); diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c index ab5151dc9f..55808efd70 100644 --- a/src/qemu/qemu_firmware.c +++ b/src/qemu/qemu_firmware.c @@ -1375,6 +1375,12 @@ qemuFirmwareFillDomain(virQEMUDriver *driver, virFileExists(def->os.loader->nvram->path)) return 0; =20 + + if (!reset_nvram && def->os.loader->nvram && + def->os.loader->nvram->type =3D=3D VIR_STORAGE_TYPE_NETWORK && + def->os.loader->nvram->path) + return 0; + /* ... then we want to consult JSON FW descriptors first, * but we don't want to fail if we haven't found a match. */ needResult =3D false; diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index b576efe375..28597ac702 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -603,6 +603,64 @@ qemuValidateDomainDefBoot(const virDomainDef *def) } =20 =20 +static int +qemuValidateDomainDefNvram(const virDomainDef *def, + virQEMUCaps *qemuCaps) +{ + int actualType; + if (!def->os.loader || !def->os.loader->nvram) + return 0; + + if (qemuDomainValidateStorageSource(def->os.loader->nvram, qemuCaps, f= alse) < 0) + return -1; + + actualType =3D virStorageSourceGetActualType(def->os.loader->nvram); + + switch (actualType) { + case VIR_STORAGE_TYPE_FILE: + break; + + case VIR_STORAGE_TYPE_NETWORK: + case VIR_STORAGE_TYPE_BLOCK: + case VIR_STORAGE_TYPE_DIR: + case VIR_STORAGE_TYPE_VOLUME: + case VIR_STORAGE_TYPE_NVME: + case VIR_STORAGE_TYPE_VHOST_USER: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unsupported nvram disk type %s"), + virStorageTypeToString(actualType)); + return -1; + + case VIR_STORAGE_TYPE_NONE: + case VIR_STORAGE_TYPE_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected nvram disk type %s"), + virStorageTypeToString(actualType)); + return -1; + } + + if (def->os.loader->nvram->encryption) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Encryption is not supported with NVRAM")); + return -1; + } + + if (def->os.loader->nvram->seclabels) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Security labels are not supported with NVRAM")); + return -1; + } + + if (def->os.loader->nvram->auth) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Auth is not supported with NVRAM")); + return -1; + } + + return 0; +} + + /** * qemuValidateDefGetVcpuHotplugGranularity: * @def: domain definition @@ -1177,6 +1235,9 @@ qemuValidateDomainDef(const virDomainDef *def, if (qemuValidateDomainDefBoot(def) < 0) return -1; =20 + if (qemuValidateDomainDefNvram(def, qemuCaps) < 0) + return -1; + if (qemuValidateDomainVCpuTopology(def, qemuCaps) < 0) return -1; =20 --=20 2.25.1