From nobody Fri Dec 19 20:18:14 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; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1746810828610434.26389905792837; Fri, 9 May 2025 10:13:48 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id DE40417D9; Fri, 9 May 2025 13:13:47 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id D592117D3; Fri, 9 May 2025 13:13:06 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 642831739; Fri, 9 May 2025 13:13:02 -0400 (EDT) Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) (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 E88561473 for ; Fri, 9 May 2025 13:12:59 -0400 (EDT) Received: by mail-ed1-f51.google.com with SMTP id 4fb4d7f45d1cf-5faaddb09feso4396384a12.2 for ; Fri, 09 May 2025 10:12:59 -0700 (PDT) Received: from tulp.my.domain (80-115-115-199.cable.dynamic.v4.ziggo.nl. [80.115.115.199]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5fcb3773b04sm581106a12.10.2025.05.09.10.12.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 May 2025 10:12:57 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746810778; x=1747415578; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=i47mSFLxNJe4VTDp7imQJsZiWKkqjCNWrh9y5o018IA=; b=OqVXjdp+Bpi9fwCgln0d2xX5t09/1O+ItCFPIHy9Ek/HroLU0G2kY59EMw6rsQEjDP AsNI8nXyx2RgwLJqbpSlQQn/1qp6f36Wo5Ec+FsaIk/sKdGZ0imUAYAlxg6hSn/KZZ2U A6A2usxb2/JNvFwQtzE/6mL23c9uFw6NrzTUjBNakxFB57CIP5vNO6KFmcQtKCDYNPQ2 R3czPhrYtrusPDbiSibkkfPQJ93G1dRUgxq/8Iron6UCJu/8/RFNAjR9cxK9Z96wJ3SO MbdkJO9bQCozn7pHtIy2k9ZuZso51h4oJUQeKv3fHLQfeug8foo0NFK4eZ+OBqofeBrm yN3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746810778; x=1747415578; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=i47mSFLxNJe4VTDp7imQJsZiWKkqjCNWrh9y5o018IA=; b=kCORoOsQU3GSidj9Fu5r0dRvqKDuhpxZdd7QRF3/UGfvVWipfNKFesVkvDd7GUxI3C 1rk0NwoCuM/piqidZs4F1X4VJryEuXYDxoSSSDJZpT8sBu/sHH6GZ0JDMSNCIXpmy7Z7 xl58J7K/X3KcuNiD2pV/t2aiXj7tVkQfrWZYSC+alDgwPH9RvzURswkwviK3GAYVFl+O QO5mNmm/bpnTosmW2n5NlnTLgWq1IO96wba2SPfA47Ve3HRC1IV0emGV7iKE+JgsEiBg 4ox70y4A6jLAg7yEyHEllHOyKApJJ+Uppa3u7SIsYrtpwY7msAvfztnRkYamHOyF5pyJ M+Xw== X-Gm-Message-State: AOJu0YywC3qPKx2x57uMy9Pnps3wrA5Hsqaa2LMkJt/ehs9ERdY5vxxd NjCHib0JYIucyQVHRt6c66BAvH8/h8ikDTP86mjDWRBWcMJ021RtFmJV96ha5bvrMA== X-Gm-Gg: ASbGnctGpfzvI1HaRCMJMPqFJTG2F32UoO29iFV8TtF6sIh548dMgsh3iZBHgZ1IkiC 11cbsk0c7lgwRMxU0yVpQKBQyzR21TPT0kXm2KjnAJhPDDSA9mRHSKfPaz11OuzuffIFWb3sC6j 5j2tZRi+fxXx43pprTi4tnoypavZY5qk7bFRwDO4egSfZVzdJ1hT4iGyBg7uRdaV+L3nIE0wveg B7oZo+1qYU9CmxvusQecn2MZqXCGK3wEcJTdB1Vs59KBmw8BJPYSHRi+2Gi0GzkyT11cRzN/1jI lZHSdHUFdu2umg94pYbJnTF92BjwnSPPEv9soSwZaim2DR+WSP+xvOS+z08FOC4hh0YtHmx3XXq NqRy9qyx0EEUKSw== X-Google-Smtp-Source: AGHT+IEOyztePKziScIReOzQlY9Rb+DU7sxTx7aIjX6lQV5GCgKOZrTZRzPFLfdutfz77d8T7xvOjg== X-Received: by 2002:a05:6402:1e96:b0:5fc:8d86:8ea3 with SMTP id 4fb4d7f45d1cf-5fca081af06mr3733309a12.30.1746810778137; Fri, 09 May 2025 10:12:58 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH 1/5] bhyve: conf: introduce nvramDir Date: Fri, 9 May 2025 19:11:47 +0200 Message-ID: <20250509171151.31305-2-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250509171151.31305-1-bogorodskiy@gmail.com> References: <20250509171151.31305-1-bogorodskiy@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 2HUOJSTQDQTYQIUTB3P7R4MOM35MEGF2 X-Message-ID-Hash: 2HUOJSTQDQTYQIUTB3P7R4MOM35MEGF2 X-MailFrom: bogorodskiy@gmail.com 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; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Roman Bogorodskiy 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: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1746810832153019000 Content-Type: text/plain; charset="utf-8" As a preparation for NVRAM support, introduce nvramDir configuration item. Signed-off-by: Roman Bogorodskiy Reviewed-by: Michal Privoznik --- src/bhyve/bhyve_conf.c | 4 ++++ src/bhyve/bhyve_utils.h | 2 ++ src/bhyve/meson.build | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/src/bhyve/bhyve_conf.c b/src/bhyve/bhyve_conf.c index 28981c90b7..f18b24f91d 100644 --- a/src/bhyve/bhyve_conf.c +++ b/src/bhyve/bhyve_conf.c @@ -57,6 +57,8 @@ virBhyveDriverConfigNew(void) return NULL; =20 cfg->firmwareDir =3D g_strdup(DATADIR "/uefi-firmware"); + cfg->libDir =3D g_strdup_printf("%s/lib/libvirt/bhyve", LOCALSTATEDIR); + cfg->nvramDir =3D g_strdup_printf("%s/nvram", cfg->libDir); =20 return cfg; } @@ -95,6 +97,8 @@ virBhyveDriverConfigDispose(void *obj) struct _virBhyveDriverConfig *cfg =3D obj; =20 g_free(cfg->firmwareDir); + g_free(cfg->libDir); + g_free(cfg->nvramDir); } =20 void diff --git a/src/bhyve/bhyve_utils.h b/src/bhyve/bhyve_utils.h index 6c6fd12dbe..9c9ea0a01a 100644 --- a/src/bhyve/bhyve_utils.h +++ b/src/bhyve/bhyve_utils.h @@ -39,6 +39,8 @@ struct _virBhyveDriverConfig { virObject parent; =20 char *firmwareDir; + char *libDir; + char *nvramDir; }; =20 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virBhyveDriverConfig, virObjectUnref); diff --git a/src/bhyve/meson.build b/src/bhyve/meson.build index b3551477b7..11920d9c3e 100644 --- a/src/bhyve/meson.build +++ b/src/bhyve/meson.build @@ -64,4 +64,9 @@ if conf.has('WITH_BHYVE') virt_daemon_confs +=3D { 'name': 'virtbhyved', } + + virt_install_dirs +=3D [ + localstatedir / 'lib' / 'libvirt' / 'bhyve', + localstatedir / 'lib' / 'libvirt' / 'bhyve' / 'nvram', + ] endif --=20 2.49.0 From nobody Fri Dec 19 20:18:14 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; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1746810858083376.0686956220799; Fri, 9 May 2025 10:14:18 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 6612A171C; Fri, 9 May 2025 13:14:17 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id A82E61763; Fri, 9 May 2025 13:13:15 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 178C5179E; Fri, 9 May 2025 13:13:11 -0400 (EDT) Received: from mail-ed1-f48.google.com (mail-ed1-f48.google.com [209.85.208.48]) (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 860DD179E for ; Fri, 9 May 2025 13:13:01 -0400 (EDT) Received: by mail-ed1-f48.google.com with SMTP id 4fb4d7f45d1cf-5f5bef591d6so4774151a12.1 for ; Fri, 09 May 2025 10:13:01 -0700 (PDT) Received: from tulp.my.domain (80-115-115-199.cable.dynamic.v4.ziggo.nl. [80.115.115.199]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5fcb3773b04sm581106a12.10.2025.05.09.10.12.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 May 2025 10:12:58 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746810780; x=1747415580; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MJlF7D0xpfPjbCPKdrWI6JVGYxuoLTDn/2fP7GBU1es=; b=F/TIN+wPm72egJjP+L006I3eGDGpWYk3GyESSW+p6vHtJDI/oO2ux3xM1uwbaCUWww mAuM9VJGtWtkRHwoLpp6C5JBotuQWh7ELCJxKf/9GQ4DGaJ5Ik5VHPcqLr9RKri1vQ5Q t+aKuOaX1+JbEDG55/Cg+DDsYST3/gzXSjCo9IS47dXhahZw0QJvBi9+miesmBUQXb4H IOOJOk/NP3BZhbxURkv8aa4b6jWXxP6JCqIuYTaLOcfmiOVDaTVLaOBbEiSteK2KJX6G eTW4gvo3V+OzavO7HuyxBFyO9I9Qh3z9FlIzxR1iUwmDCdV2Mli/Yy4uHsjirzZA7Iag J6KA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746810780; x=1747415580; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MJlF7D0xpfPjbCPKdrWI6JVGYxuoLTDn/2fP7GBU1es=; b=lkQqDNPdRtSFHlUhL0K3GgzSBV6sxP9AU4dl63FKnzpqWTQ/Q/xG5MmVh8Oi1EJv8S CAOeSFKMiv+fTXdR4ukL0/zR0vFDi9Deb4lRKhCBbdEuLCIxRK+bgd0x06o4tnMzepNv bzks03N47rs68zPRVopI6kPoMPZZvNYy9T9XYyIPKVHpPOExr5Bv4pWgd3pP4nF3slGx wGzrGVzPFAdeyaSkTEjbaUYDTJo5Z7NXOHkwDl+z5hwdqRE2FYIG/Kc98EyKo6MT/+lW rMa6W+Pta73PZDd61b6sxsvNrzTyCAFPefU3d88VcjF6fh4eAMP5uYP3YCMz9tOxpMO4 8Mfw== X-Gm-Message-State: AOJu0YxWdtniVtqpmPC40k/Nb+VfWLzc4JfnF9d6QHIFyDOnfobPpj+9 iqjBlbLk/hDZjURAsPL6CQ0xbOKs/xiEJugj8tNFkWSRierPkxjIZKwkdXkgA1jcCA== X-Gm-Gg: ASbGncvqu88HXoX0eNij3b5UMxuZFO1f8MJTa815sbFmmZUu9JKkuAlBIvLcTtkvgIM 4y2bKG3fumtbuW0j1/tBAf/3Oa68/4rzF1xfgBBG+RfUp5Qu6gEiCCFkibrZ7vh32ErE0r86NGd +tp64jtDD9XIp1ffCyh/zDC5yXsdkofGciLyyEDm2vX2tDSuoMc/as7Xs8RSjeVJt5+E27/T/sE QTP7yqgKk9zg7AVVOrXShL5PUbaM/6iQ0/e+IObmxVWmH4gN3OmvqkDJqv6yzj6pEq0b1SZr97V QzOpuxVm1YrlW5cANhooXxZtVFhQjDCQHoh1EHhFTwqIASaZAzsS4jtFcjLOOldzmq6fkMfcaGC 4Zbrgufqa9t43OA== X-Google-Smtp-Source: AGHT+IEScecgO/eEtwmbTIv1x+zPfEh2Tt7GB32rZFyBDI5mDDf4tmRJWm6gq6p9fPZGHfe42a3BnQ== X-Received: by 2002:a05:6402:5241:b0:5fb:3ca1:fb3c with SMTP id 4fb4d7f45d1cf-5fca07ed5e9mr3968826a12.27.1746810779425; Fri, 09 May 2025 10:12:59 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH 2/5] bhyve: generate NVRAM bhyve arguments Date: Fri, 9 May 2025 19:11:48 +0200 Message-ID: <20250509171151.31305-3-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250509171151.31305-1-bogorodskiy@gmail.com> References: <20250509171151.31305-1-bogorodskiy@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: L3JHA2IXZZ4JBTS5ENTDMJAJX42XV5PE X-Message-ID-Hash: L3JHA2IXZZ4JBTS5ENTDMJAJX42XV5PE X-MailFrom: bogorodskiy@gmail.com 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; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Roman Bogorodskiy 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: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1746810860176019000 Content-Type: text/plain; charset="utf-8" Currently, bhyve bootrom specification looks like this: bhyve ... -l bootrom,/path/to/firmware.fd In addition to that, it supports specifying the VARS files using: -l bootrom,/path/to/firmware.fd,/path/to/my_domain_VARS.fd Update virBhyveProcessBuildBhyveCmd() to include the VARS file if NVRAM is specified in the domain XML. Additionally, support copying this file from the specified template. To do that, introduce the bhyveProcessPrepareHost() and related helpers. They are currently not doing anything but NVRAM preparations, but should be useful for other host-side related tasks in the future. Signed-off-by: Roman Bogorodskiy Reviewed-by: Michal Privoznik --- src/bhyve/bhyve_command.c | 8 ++- src/bhyve/bhyve_process.c | 132 ++++++++++++++++++++++++++++++++++++++ src/bhyve/bhyve_process.h | 8 +++ 3 files changed, 146 insertions(+), 2 deletions(-) diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index 44c66ea147..cd1ccf61f3 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -808,8 +808,12 @@ virBhyveProcessBuildBhyveCmd(struct _bhyveConn *driver= , virDomainDef *def, if (def->os.bootloader =3D=3D NULL && def->os.loader) { if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_LPC_BOOTROM)) { - virCommandAddArg(cmd, "-l"); - virCommandAddArgFormat(cmd, "bootrom,%s", def->os.loader->path= ); + g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; + virBufferAsprintf(&buf, "bootrom,%s", def->os.loader->path); + if (def->os.loader->nvram && def->os.loader->nvram->path) + virBufferAsprintf(&buf, ",%s", def->os.loader->nvram->path= ); + + virCommandAddArgList(cmd, "-l", virBufferContentAndReset(&buf)= , NULL); } else { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Installed bhyve binary does not support UEFI= loader")); diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c index a17994e2a0..5e77a9c4d6 100644 --- a/src/bhyve/bhyve_process.c +++ b/src/bhyve/bhyve_process.c @@ -1,6 +1,7 @@ /* * bhyve_process.c: bhyve process management * + * Copyright (C) 2006-2016 Red Hat, Inc. * Copyright (C) 2014 Roman Bogorodskiy * Copyright (C) 2025 The FreeBSD Foundation * @@ -275,6 +276,134 @@ bhyveProcessPrepareDomain(bhyveConn *driver, return 0; } =20 + +struct bhyvePrepareNVRAMHelperData { + int srcFD; + const char *srcPath; +}; + + +static int +bhyvePrepareNVRAMHelper(int dstFD, + const char *dstPath, + const void *opaque) +{ + const struct bhyvePrepareNVRAMHelperData *data =3D opaque; + ssize_t r; + + do { + char buf[1024]; + + if ((r =3D saferead(data->srcFD, buf, sizeof(buf))) < 0) { + virReportSystemError(errno, + _("Unable to read from file '%1$s'"), + data->srcPath); + return -2; + } + + if (safewrite(dstFD, buf, r) < 0) { + virReportSystemError(errno, + _("Unable to write to file '%1$s'"), + dstPath); + return -1; + } + } while (r); + + return 0; +} + + +static int +bhyvePrepareNVRAMFile(bhyveConn *driver G_GNUC_UNUSED, + virDomainLoaderDef *loader) +{ + VIR_AUTOCLOSE srcFD =3D -1; + struct bhyvePrepareNVRAMHelperData data; + + if (virFileExists(loader->nvram->path)) + return 0; + + if (!loader->nvramTemplate) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("unable to find any master var store for loader: = %1$s"), + loader->path); + return -1; + } + + /* If 'nvramTemplateFormat' is empty it means that it's a user-provided + * template which we couldn't verify. Assume the user knows what they'= re doing */ + if (loader->nvramTemplateFormat !=3D VIR_STORAGE_FILE_NONE && + loader->nvram->format !=3D loader->nvramTemplateFormat) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("conversion of the nvram template to another targ= et format is not supported")); + return -1; + } + + if ((srcFD =3D virFileOpenAs(loader->nvramTemplate, O_RDONLY, + 0, -1, -1, 0)) < 0) { + virReportSystemError(-srcFD, + _("Failed to open file '%1$s'"), + loader->nvramTemplate); + return -1; + } + + data.srcFD =3D srcFD; + data.srcPath =3D loader->nvramTemplate; + + if (virFileRewrite(loader->nvram->path, + S_IRUSR | S_IWUSR, + 0, 0, + bhyvePrepareNVRAMHelper, + &data) < 0) { + return -1; + } + + return 0; +} + + +int +bhyvePrepareNVRAM(bhyveConn *driver, + virDomainDef *def) +{ + virDomainLoaderDef *loader =3D def->os.loader; + + if (!loader || !loader->nvram) + return 0; + + VIR_DEBUG("nvram=3D'%s'", NULLSTR(loader->nvram->path)); + + switch (virStorageSourceGetActualType(loader->nvram)) { + case VIR_STORAGE_TYPE_FILE: + return bhyvePrepareNVRAMFile(driver, loader); + case VIR_STORAGE_TYPE_BLOCK: + case VIR_STORAGE_TYPE_DIR: + case VIR_STORAGE_TYPE_NETWORK: + case VIR_STORAGE_TYPE_VOLUME: + case VIR_STORAGE_TYPE_NVME: + case VIR_STORAGE_TYPE_VHOST_USER: + case VIR_STORAGE_TYPE_VHOST_VDPA: + case VIR_STORAGE_TYPE_LAST: + case VIR_STORAGE_TYPE_NONE: + break; + } + + return 0; +} + +int +bhyveProcessPrepareHost(bhyveConn *driver, + virDomainDef *def, + unsigned int flags) +{ + virCheckFlags(0, -1); + + if (bhyvePrepareNVRAM(driver, def) < 0) + return -1; + + return 0; +} + int virBhyveProcessStart(bhyveConn *driver, virConnectPtr conn, @@ -292,6 +421,9 @@ virBhyveProcessStart(bhyveConn *driver, if (bhyveProcessPrepareDomain(driver, vm, flags) < 0) return -1; =20 + if (bhyveProcessPrepareHost(driver, vm->def, flags) < 0) + return -1; + return virBhyveProcessStartImpl(driver, vm, reason); } =20 diff --git a/src/bhyve/bhyve_process.h b/src/bhyve/bhyve_process.h index e69db41fc2..5e0acc810c 100644 --- a/src/bhyve/bhyve_process.h +++ b/src/bhyve/bhyve_process.h @@ -23,10 +23,18 @@ =20 #include "bhyve_utils.h" =20 +int +bhyvePrepareNVRAM(bhyveConn *driver, + virDomainDef *def); + int bhyveProcessPrepareDomain(bhyveConn *driver, virDomainObj *vm, unsigned int flags); +int +bhyveProcessPrepareHost(bhyveConn *driver, + virDomainDef *def, + unsigned int flags); =20 int virBhyveProcessStart(bhyveConn *driver, virConnectPtr conn, --=20 2.49.0 From nobody Fri Dec 19 20:18:14 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; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 174681090408077.5094298266497; Fri, 9 May 2025 10:15:04 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 7CB5817D6; Fri, 9 May 2025 13:15:03 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 73E321790; Fri, 9 May 2025 13:13:18 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id AC878178D; Fri, 9 May 2025 13:13:13 -0400 (EDT) Received: from mail-ed1-f52.google.com (mail-ed1-f52.google.com [209.85.208.52]) (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 2480517BC for ; Fri, 9 May 2025 13:13:02 -0400 (EDT) Received: by mail-ed1-f52.google.com with SMTP id 4fb4d7f45d1cf-5fbe7a65609so3905660a12.0 for ; Fri, 09 May 2025 10:13:02 -0700 (PDT) Received: from tulp.my.domain (80-115-115-199.cable.dynamic.v4.ziggo.nl. [80.115.115.199]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5fcb3773b04sm581106a12.10.2025.05.09.10.12.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 May 2025 10:12:59 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746810780; x=1747415580; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LEXfghiyWg7FKsKa4I/AvZnqgUSVDeYCmrUVziMmnjU=; b=DXTuYV32ALNEzrF6pCYaYqcykx8yyOREt5kTdYo5OXlTSJUv+OBoOOpVDuixYkTok/ 5zk6Eluui99nSxPitPJmCRfZbCLIuR2Zi7XUtGajLurYZI+F6FM6ccmzBxJvOQMTg74F GnesGRBHwvaAa+hE2wNflXty4Of/xdArTLh5WZFMTa92UBZhbBHVTQ743HAakrOBsbIp fjlwB1qcC6xf+Z7sgoWk33XC8+egOJb3K0bhj2Q3GOzj/tPom7RhquEQs04e0nas1ZAi uj8zxa5CL0IlUy4p9PmC9KNlxRsjn3gn0gUYUUPeH3QDau+u0tZiugsVrBM6jZqDqlLM dO/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746810780; x=1747415580; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LEXfghiyWg7FKsKa4I/AvZnqgUSVDeYCmrUVziMmnjU=; b=koxOhcqx0U6hVpTo0TaqQgA/MHTOuLZYDL0eZAuEdM3XJzqUaOK5JoaJDtf+Me3U4V NWrjh15lFlkyLcOS4VB3ysyC4woMMr7sPq0EqKwtCe0A5+5FfZK631E4C6xaRoZuICS4 1dgUqutJHL+PSjuDBOoldQai0UxWrICX4ZKU15xdsk5LTtNFF5oKKa0w5MGJooG70yTd IIzDumhKNw+EaaCRQUTLU0NdrntdKaUhYYoWSwuDxiwXWY8BAoh8wp92uEQwNVrGFobO Md42C3Qi4GtKK1ujk0Fc+ltsp0jdO6c77nhYLDdzBexBx83x5m6eMMsMqW3kMhhk4jGD 4CRg== X-Gm-Message-State: AOJu0YxdZNVQhLrhTJvadymy+lGbPttkMlAKRV7SyzoqfzeMZnvzpP8a YxoEVpoZGNs05AzEuAnI9RESxMErHumLWIJnH6+8H46E78rkMu0fluRaqPuoUCzjsQ== X-Gm-Gg: ASbGncv5qhaytKbPLvZ2EP/w4DSPG5lq08Vh188QffK6JS6KuqDK3XvcrUe/S4aPAFM uiTRQs1kZzuUhKm9ozWoTxKGNnn+uv5+XqmnRQhxKUQrBa0klAck05M4vOOJj2yE16HXBr+KPIm qSBEiVabEcV4+8UhTbcLJuUt47pBF3P66Z29ms/rljNmkbdnI/6eDfamMR8QFuhPw8DAHC784Qa 3zJ071R0jiPEjAIVvE/5+na7BxKNoJD0TX8Eq2Vu8PmkkDkMpY6X2M8ZrDk3pqMnk2c9pn55w9V 1Dh/TwGZIGcJhl3mOuYjGAwCnUdtsZkA0SFT9S1lSJErjHUziiroajOkl1T4fW5OWmHNljaXRaH N7FY7icbAZ6EQ2w== X-Google-Smtp-Source: AGHT+IHJt01lMZuz5iyVhzv1BWTDlqSaA63VDGOWqZgg3FSV+FjSO+MvsvxsB8KQbNQuZcpImjNNww== X-Received: by 2002:a05:6402:354e:b0:5f7:eaf0:8849 with SMTP id 4fb4d7f45d1cf-5fca0770858mr3543801a12.16.1746810780396; Fri, 09 May 2025 10:13:00 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH 3/5] bhyve: firmware: try to guess NVRAM settings Date: Fri, 9 May 2025 19:11:49 +0200 Message-ID: <20250509171151.31305-4-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250509171151.31305-1-bogorodskiy@gmail.com> References: <20250509171151.31305-1-bogorodskiy@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: VNHXWCIUFYAUW6GF2HIZZITIIN3Q5VTZ X-Message-ID-Hash: VNHXWCIUFYAUW6GF2HIZZITIIN3Q5VTZ X-MailFrom: bogorodskiy@gmail.com 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; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Roman Bogorodskiy 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: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1746810906501019000 Content-Type: text/plain; charset="utf-8" Extend bhyveFirmwareFillDomain() so that when we find the default edk2 firmware, also look for its matching template file, and use it as a nvramTemplate if found. Extend bhyvexml2argvtest to verify various NVRAM configurations. Signed-off-by: Roman Bogorodskiy Reviewed-by: Michal Privoznik --- src/bhyve/bhyve_firmware.c | 119 +++++++++++++++--- ...gv-uefi-nvram-template-and-source-set.args | 12 ++ ...-uefi-nvram-template-and-source-set.ldargs | 1 + ...rgv-uefi-nvram-template-and-source-set.xml | 24 ++++ ...bhyvexml2argv-uefi-nvram-template-set.args | 12 ++ ...yvexml2argv-uefi-nvram-template-set.ldargs | 1 + .../bhyvexml2argv-uefi-nvram-template-set.xml | 24 ++++ .../bhyvexml2argv-uefi-nvram.args | 12 ++ .../bhyvexml2argv-uefi-nvram.ldargs | 1 + .../bhyvexml2argv-uefi-nvram.xml | 24 ++++ tests/bhyvexml2argvtest.c | 5 + 11 files changed, 221 insertions(+), 14 deletions(-) create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-templa= te-and-source-set.args create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-templa= te-and-source-set.ldargs create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-templa= te-and-source-set.xml create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-templa= te-set.args create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-templa= te-set.ldargs create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-templa= te-set.xml create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram.args create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram.ldargs create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram.xml diff --git a/src/bhyve/bhyve_firmware.c b/src/bhyve/bhyve_firmware.c index 8aaf05dc62..35a1097e5d 100644 --- a/src/bhyve/bhyve_firmware.c +++ b/src/bhyve/bhyve_firmware.c @@ -1,7 +1,9 @@ /* * bhyve_firmware.c: bhyve firmware management * + * Copyright (C) 2019 Red Hat, Inc. * Copyright (C) 2021 Roman Bogorodskiy + * Copyright (C) 2025 The FreeBSD Foundation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -25,6 +27,7 @@ #include "viralloc.h" #include "virlog.h" #include "virfile.h" +#include "virstring.h" #include "bhyve_conf.h" #include "bhyve_firmware.h" =20 @@ -34,6 +37,76 @@ VIR_LOG_INIT("bhyve.bhyve_firmware"); =20 =20 #define BHYVE_DEFAULT_FIRMWARE "BHYVE_UEFI.fd" +#define BHYVE_DEFAULT_NVRAM_TEMPLATE "BHYVE_UEFI_VARS.fd" + +static void +bhyveFirmwareEnsureNVRAM(virDomainDef *def, + bhyveConn *driver) +{ + g_autoptr(virBhyveDriverConfig) cfg =3D virBhyveDriverGetConfig(driver= ); + virDomainLoaderDef *loader =3D def->os.loader; + const char *ext =3D NULL; + + if (!loader) + return; + + if (loader->type !=3D VIR_DOMAIN_LOADER_TYPE_PFLASH) + return; + + if (loader->readonly !=3D VIR_TRISTATE_BOOL_YES) + return; + + if (loader->stateless =3D=3D VIR_TRISTATE_BOOL_YES) + return; + + /* If the NVRAM format hasn't been set yet, inherit the same as + * the loader */ + if (loader->nvram && !loader->nvram->format) + loader->nvram->format =3D loader->format; + + if (loader->nvram) { + /* Nothing to do if a proper NVRAM backend is already configured */ + if (!virStorageSourceIsEmpty(loader->nvram)) + return; + + /* otherwise we want to reset and re-populate the definition */ + virObjectUnref(loader->nvram); + } else { + /* Also do nothing if NVRAM is not requested */ + return; + } + + loader->nvram =3D virStorageSourceNew(); + loader->nvram->type =3D VIR_STORAGE_TYPE_FILE; + + /* The nvram template format should be always present but as a failsaf= e, + * duplicate the loader format if it is not available. */ + if (loader->nvramTemplateFormat > VIR_STORAGE_FILE_NONE) + loader->nvram->format =3D loader->nvramTemplateFormat; + else + loader->nvram->format =3D loader->format; + + /* The extension used by raw edk2 builds has historically + * been .fd, but more recent aarch64 builds have started + * using the .raw extension instead. + * + * If we're defining a new domain, we should try to match the + * extension for the file backing its NVRAM store with the + * one used by the template to keep things nice and + * consistent. + * + * If we're loading an existing domain, however, we need to + * stick with the .fd extension to ensure compatibility */ + if (loader->nvramTemplate && + virStringHasSuffix(loader->nvramTemplate, ".raw")) + ext =3D ".raw"; + else + ext =3D ".fd"; + + loader->nvram->path =3D g_strdup_printf("%s/%s_VARS%s", + cfg->nvramDir, def->name, + NULLSTR_EMPTY(ext)); +} =20 int bhyveFirmwareFillDomain(bhyveConn *driver, @@ -42,25 +115,31 @@ bhyveFirmwareFillDomain(bhyveConn *driver, { g_autoptr(DIR) dir =3D NULL; g_autoptr(virBhyveDriverConfig) cfg =3D virBhyveDriverGetConfig(driver= ); + virDomainLoaderDef *loader =3D def->os.loader; const char *firmware_dir =3D cfg->firmwareDir; struct dirent *entry; g_autofree char *matching_firmware =3D NULL; + g_autofree char *matching_nvram_template =3D NULL; g_autofree char *first_found =3D NULL; =20 virCheckFlags(0, -1); =20 if (def->os.firmware =3D=3D VIR_DOMAIN_OS_DEF_FIRMWARE_NONE) - return 0; + goto out; =20 if (virDirOpenIfExists(&dir, firmware_dir) > 0) { while ((virDirRead(dir, &entry, firmware_dir)) > 0) { if (g_str_has_prefix(entry->d_name, ".")) continue; =20 - if (STREQ(entry->d_name, BHYVE_DEFAULT_FIRMWARE)) { + if (!matching_firmware && + STREQ(entry->d_name, BHYVE_DEFAULT_FIRMWARE)) matching_firmware =3D g_strdup(entry->d_name); - break; - } + + if (!matching_nvram_template && + STREQ(entry->d_name, BHYVE_DEFAULT_NVRAM_TEMPLATE)) + matching_nvram_template =3D g_strdup(entry->d_name); + if (!first_found) first_found =3D g_strdup(entry->d_name); } @@ -77,25 +156,37 @@ bhyveFirmwareFillDomain(bhyveConn *driver, } } =20 - if (!def->os.loader) - def->os.loader =3D virDomainLoaderDefNew(); + if (!loader) { + loader =3D virDomainLoaderDefNew(); + def->os.loader =3D loader; + } =20 - if (!def->os.loader->format) - def->os.loader->format =3D VIR_STORAGE_FILE_RAW; + if (!loader->format) + loader->format =3D VIR_STORAGE_FILE_RAW; =20 - if (def->os.loader->format !=3D VIR_STORAGE_FILE_RAW) { + if (loader->format !=3D VIR_STORAGE_FILE_RAW) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported loader format '%1$s'"), - virStorageFileFormatTypeToString(def->os.loader->fo= rmat)); + virStorageFileFormatTypeToString(loader->format)); return -1; } =20 - def->os.loader->type =3D VIR_DOMAIN_LOADER_TYPE_PFLASH; - def->os.loader->readonly =3D VIR_TRISTATE_BOOL_YES; + if (!loader->nvramTemplate + && matching_firmware && matching_nvram_template) { + loader->nvramTemplate =3D g_build_filename(firmware_dir, + matching_firmware, + NULL); + } + + loader->type =3D VIR_DOMAIN_LOADER_TYPE_PFLASH; + loader->readonly =3D VIR_TRISTATE_BOOL_YES; + + VIR_FREE(loader->path); =20 - VIR_FREE(def->os.loader->path); + loader->path =3D g_build_filename(firmware_dir, matching_firmware, NUL= L); =20 - def->os.loader->path =3D g_build_filename(firmware_dir, matching_firmw= are, NULL); + out: + bhyveFirmwareEnsureNVRAM(def, driver); =20 return 0; } diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-and-= source-set.args b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template= -and-source-set.args new file mode 100644 index 0000000000..05a9e8df2c --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-and-source-= set.args @@ -0,0 +1,12 @@ +bhyve \ +-c 1 \ +-m 214 \ +-u \ +-H \ +-P \ +-s 0:0,hostbridge \ +-l bootrom,/path/to/test.fd,/path/to/nvram/guest_VARS.fd \ +-s 1:0,lpc \ +-s 2:0,ahci,hd:/tmp/freebsd.img \ +-s 3:0,virtio-net,faketapdev,mac=3D52:54:00:00:00:00 \ +bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-and-= source-set.ldargs b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-templa= te-and-source-set.ldargs new file mode 100644 index 0000000000..421376db9e --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-and-source-= set.ldargs @@ -0,0 +1 @@ +dummy diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-and-= source-set.xml b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-= and-source-set.xml new file mode 100644 index 0000000000..cdcbfd081c --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-and-source-= set.xml @@ -0,0 +1,24 @@ + + bhyve + df3be7e7-a104-11e3-aeb0-50e5492bd3dc + 219136 + 1 + + hvm + /path/to/test.fd + /path/to/nvram/guest_VARS.fd= + + + + + + +
+ + + + +
+ + + diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-set.= args b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-set.args new file mode 100644 index 0000000000..0d367e99f1 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-set.args @@ -0,0 +1,12 @@ +bhyve \ +-c 1 \ +-m 214 \ +-u \ +-H \ +-P \ +-s 0:0,hostbridge \ +-l bootrom,/path/to/test.fd,fakenvramdir/bhyve_VARS.fd \ +-s 1:0,lpc \ +-s 2:0,ahci,hd:/tmp/freebsd.img \ +-s 3:0,virtio-net,faketapdev,mac=3D52:54:00:00:00:00 \ +bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-set.= ldargs b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-set.ldar= gs new file mode 100644 index 0000000000..421376db9e --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-set.ldargs @@ -0,0 +1 @@ +dummy diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-set.= xml b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-set.xml new file mode 100644 index 0000000000..c05dd4ff95 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram-template-set.xml @@ -0,0 +1,24 @@ + + bhyve + df3be7e7-a104-11e3-aeb0-50e5492bd3dc + 219136 + 1 + + hvm + /path/to/test.fd + + + + + + + +
+ + + + +
+ + + diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram.args b/tests/= bhyvexml2argvdata/bhyvexml2argv-uefi-nvram.args new file mode 100644 index 0000000000..0d367e99f1 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram.args @@ -0,0 +1,12 @@ +bhyve \ +-c 1 \ +-m 214 \ +-u \ +-H \ +-P \ +-s 0:0,hostbridge \ +-l bootrom,/path/to/test.fd,fakenvramdir/bhyve_VARS.fd \ +-s 1:0,lpc \ +-s 2:0,ahci,hd:/tmp/freebsd.img \ +-s 3:0,virtio-net,faketapdev,mac=3D52:54:00:00:00:00 \ +bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram.ldargs b/test= s/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram.ldargs new file mode 100644 index 0000000000..421376db9e --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram.ldargs @@ -0,0 +1 @@ +dummy diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram.xml b/tests/b= hyvexml2argvdata/bhyvexml2argv-uefi-nvram.xml new file mode 100644 index 0000000000..bec38ad65d --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-uefi-nvram.xml @@ -0,0 +1,24 @@ + + bhyve + df3be7e7-a104-11e3-aeb0-50e5492bd3dc + 219136 + 1 + + hvm + /path/to/test.fd + + + + + + + +
+ + + + +
+ + + diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index 3831f0c65d..58b404ca7d 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -148,6 +148,7 @@ mymain(void) { int ret =3D 0; g_autofree char *fakefirmwaredir =3D g_strdup("fakefirmwaredir"); + g_autofree char *fakenvramdir =3D g_strdup("fakenvramdir"); g_autofree char *fakefirmwareemptydir =3D g_strdup("fakefirmwareemptyd= ir"); =20 if ((driver.caps =3D virBhyveCapsBuild()) =3D=3D NULL) @@ -163,6 +164,7 @@ mymain(void) return EXIT_FAILURE; =20 driver.config->firmwareDir =3D fakefirmwaredir; + driver.config->nvramDir =3D fakenvramdir; =20 # define DO_TEST_FULL(name, flags) \ do { \ @@ -218,6 +220,9 @@ mymain(void) DO_TEST("localtime"); DO_TEST("net-e1000"); DO_TEST("uefi"); + DO_TEST("uefi-nvram"); + DO_TEST("uefi-nvram-template-set"); + DO_TEST("uefi-nvram-template-and-source-set"); DO_TEST("vnc"); DO_TEST("vnc-vgaconf-on"); DO_TEST("vnc-vgaconf-off"); --=20 2.49.0 From nobody Fri Dec 19 20:18:14 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; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1746810930507915.5159464231008; Fri, 9 May 2025 10:15:30 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id E050117FD; Fri, 9 May 2025 13:15:29 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id A53B11792; Fri, 9 May 2025 13:13:21 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id EDD00173F; Fri, 9 May 2025 13:13:13 -0400 (EDT) Received: from mail-ed1-f52.google.com (mail-ed1-f52.google.com [209.85.208.52]) (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 455B11746 for ; Fri, 9 May 2025 13:13:03 -0400 (EDT) Received: by mail-ed1-f52.google.com with SMTP id 4fb4d7f45d1cf-5f624291db6so3764657a12.3 for ; Fri, 09 May 2025 10:13:03 -0700 (PDT) Received: from tulp.my.domain (80-115-115-199.cable.dynamic.v4.ziggo.nl. [80.115.115.199]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5fcb3773b04sm581106a12.10.2025.05.09.10.13.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 May 2025 10:13:00 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746810782; x=1747415582; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Npzg5X8MondGFv6AgDqcTvlQDb7xL1dcWCViCJtB9jk=; b=THuIEd9F1vOksR7Itsy6IYACKpl5ccfPm3CI1DJ7LLLh1v/HZmxbnx/kTcVLU/l2s+ maNdwKhwp2LZXmG10C5OMf3l7jgujsp4Zg28/iW/SL/nkFw1jrnzijZPxxDITQtZiodJ 10e3kAzX/E0S5FjWw0UbcthJt4iXUnf7fGneMqsanL/mEXxCBpTvA/+9ERf1q77Uncjr JZ0FhJu9M02SWRzFX6204zdVlLVZBPtHWTU5OeuZZjkOq8vDs0zvOV3n11Xg+hAzDCCt hr86ukYhMkys4ZjI2D5h5brKILNp6lSXXtG0ypdFodx8Lir2zk8Rd95nQW1Iyrr2anm4 a7aA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746810782; x=1747415582; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Npzg5X8MondGFv6AgDqcTvlQDb7xL1dcWCViCJtB9jk=; b=JVSaiPpP+q7M3jW/UTFXTn45wu5WTgtm2sXHjA/OOIWpjNI/GAknartKGn8oOzQ5sN DnLXqCZMxK9SBYvLVsf0/OOclCWQKP3k4fPSvCLIhmDPZRTHp34oEoIfRFLMf6yYykjC adXU7JywPu0TUbgJV/3+cF1w+97O9DAP7j5kNs1mrAKZ/VeG4t8iMEXaNp6//kMLEpM+ NFA78uK7XeU0F6qD97+RiCuoG8CE94W6s8FP/vpZKOtSuEqfBkGZHT1ALsu7mIrQA27b xzOCg8TNiljG2M9bAnFdVqVfaDuCFc4ZeVHjpJLqnVu/in1QAtrCFpPlSKFMHrkDqV+M PTNQ== X-Gm-Message-State: AOJu0YwYtQ1GQdJPvLsKUyqvMBnvLNNutBsbrtrlO8RIcWMq6zfccdOg 2WO1VyHhTFC6Og/7LFOEvs1FO0reP/u4PWUvgh+77uKXEcp9LlYe4Z5h84B4oJX3Sg== X-Gm-Gg: ASbGncsanhVoLhFgsYUi3vGC2EUqV00w8zpIKndVayf1ksxG1zwXqNNb60MqtA8uOPg NBUlUZPzKtzVwAn6lKALjR3xwf9CsCNXT5pLHRCmslvVGZOeEC111KYF89oZ9BbOXqoR0hhuJAs uI7RlyulErXFT814UQeAWsf0DxNzq2qLWLolz3g+NJPxQXcTr+tr20j03B4BMNqlu8olTUGmz6M dBR92cLamiWhg7x2DyCXhHbf1P1/vqxI+NHGc/HWB+/8qtW7Q7Cvme1xkpP08bZNdB/EGSHGlFP OWyq5hBL7dcU9hZsMdTFiF8bmPZS6hkBISHLrQl8ygLeoDerDb7OaKqBAjykeirOKX51H0ODsNe lnVvVXcu6HVwvyCZ+lBIpmLO9 X-Google-Smtp-Source: AGHT+IGpUQm6lEyEYr156fkVzKYLv+vFRQ863wn9L+hljc+b9SXoMpor0IBpqen9KmeGrHzX/NhWkw== X-Received: by 2002:a05:6402:2813:b0:5fb:1fbd:e3ad with SMTP id 4fb4d7f45d1cf-5fca0759c82mr3647972a12.13.1746810781575; Fri, 09 May 2025 10:13:01 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH 4/5] bhyve: introduce bhyveDomainDefValidate() Date: Fri, 9 May 2025 19:11:50 +0200 Message-ID: <20250509171151.31305-5-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250509171151.31305-1-bogorodskiy@gmail.com> References: <20250509171151.31305-1-bogorodskiy@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: ZWAIXEMFIEEMU6IIYNPMBP4ZMNS6KPXO X-Message-ID-Hash: ZWAIXEMFIEEMU6IIYNPMBP4ZMNS6KPXO X-MailFrom: bogorodskiy@gmail.com 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; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Roman Bogorodskiy 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: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1746810932368019000 Content-Type: text/plain; charset="utf-8" Add the bhyveDomainDefValidate() validation which currently checks whether the requested NVRAM is supported. Signed-off-by: Roman Bogorodskiy Reviewed-by: Michal Privoznik --- src/bhyve/bhyve_domain.c | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c index ca5176885a..3e18a462e4 100644 --- a/src/bhyve/bhyve_domain.c +++ b/src/bhyve/bhyve_domain.c @@ -267,11 +267,54 @@ bhyveDomainDeviceDefValidate(const virDomainDeviceDef= *dev, return 0; } =20 + +static int +bhyveDomainDefValidate(const virDomainDef *def, + void *opaque G_GNUC_UNUSED, + void *parseOpaque G_GNUC_UNUSED) +{ + virStorageSource *src =3D NULL; + + if (!def->os.loader) + return 0; + + if (!(src =3D def->os.loader->nvram)) + return 0; + + if (src->type !=3D VIR_STORAGE_TYPE_FILE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", + _("only 'file' type is supported with NVRAM")); + return -1; + } + + if (src->sliceStorage) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("slices are not supported with NVRAM")); + return -1; + } + + if (src->pr) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("persistent reservations are not supported with = NVRAM")); + return -1; + } + + if (src->backingStore) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("backingStore is not supported with NVRAM")); + return -1; + } + + return 0; +} + virDomainDefParserConfig virBhyveDriverDomainDefParserConfig =3D { .devicesPostParseCallback =3D bhyveDomainDeviceDefPostParse, .domainPostParseCallback =3D bhyveDomainDefPostParse, .assignAddressesCallback =3D bhyveDomainDefAssignAddresses, .deviceValidateCallback =3D bhyveDomainDeviceDefValidate, + .domainValidateCallback =3D bhyveDomainDefValidate, =20 .features =3D VIR_DOMAIN_DEF_FEATURE_FW_AUTOSELECT, }; --=20 2.49.0 From nobody Fri Dec 19 20:18:14 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; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1746810949054733.2014696664636; Fri, 9 May 2025 10:15:49 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 6A77F1735; Fri, 9 May 2025 13:15:48 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id C3B811805; Fri, 9 May 2025 13:13:23 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 68964178D; Fri, 9 May 2025 13:13:15 -0400 (EDT) Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) (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 D1258175E for ; Fri, 9 May 2025 13:13:04 -0400 (EDT) Received: by mail-ed1-f51.google.com with SMTP id 4fb4d7f45d1cf-5f7ec0e4978so4268972a12.1 for ; Fri, 09 May 2025 10:13:04 -0700 (PDT) Received: from tulp.my.domain (80-115-115-199.cable.dynamic.v4.ziggo.nl. [80.115.115.199]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5fcb3773b04sm581106a12.10.2025.05.09.10.13.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 May 2025 10:13:01 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746810783; x=1747415583; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ceITU7dPeFpCiahH6tNcp5qrqKOt7BV51G7EadIWkJs=; b=GyldilOX7FpKEf8TjiXA1M5skiznZtU+kHKnJXsERG/BEWp2RWnQc2US96GVJhBAky EOWOJL9JgdHQErhgoVbwA7KyXLHzkxaif0DVfp8yXBQk/n7pe95GUQKQzu/1fBpDcLUd WMqxXpWt0/2jKWjEf+VHaz6yKKUCXgaUijXM/C+YrKD/7Kir6fD2P88iBgVnadw2XaQg ASGVayww2CU7AEf5NdmKgEJ+jXFSBQmT5UUeUq26NhvbhUmQkgDgE2qa2lLnYCQbaxju ho+GVkZ2KX0ohNqXzXjhC6tg3feKhRj2rarjMbokHopaqU/rNU1h713DgcW8bNZHd8Jp 88CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746810783; x=1747415583; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ceITU7dPeFpCiahH6tNcp5qrqKOt7BV51G7EadIWkJs=; b=ObeXMXk1F8teMGUqzZXRim69gd2d4Fj991p68CMpabHeBdV/R6eoohtVV8YSoiysfB LJ8IRFLUj9UOV264nLFXhFnHMQO951NRl88QSbvJhco+nz4o4Ox4DDoKHjWa0Y+WW0Qw N8Ukac2C6ScSWux0txOF45nwToHeoFJb00cUinTzB0xF+fG0qN8D6BgFAJectdSJyMvp MJaXE1sYtQ2BozdQIsjEG4oPH9AhmhcmzCU5gjfyqd1SCq7nJKFxKsEJmwuk8KIRzP2D bbtr+Ggz262M+giSIyVoLiqmdOdaX7Gagw6u4i0e/3pS0SLSymq2XJonfipp5AMv6t4q xteA== X-Gm-Message-State: AOJu0Yxa603i2XXIMmrBqR4JeEyXcFrRMLXNKa3ihUCjZ4hxBmRPaO4b JSQL7qgKAX42Fc4SOoV4XQ623HobBcY6jlsFDY6KBbVmw6YHye/NbKMh8+cD1yoZTw== X-Gm-Gg: ASbGncsrkxImW3AABi44Q2s7LbgmkNNh4mbS83Xm4wKbKFQvHBMl0oFWnl2n1RD82xE rTWsyibg0nKYQFpLaHIJTxHp17x08jTt7rfMVN9NBWH+4ZCVpRkudhvNQl4/ESrh7H/+76e6e+A ryJBKXCD2umu9s+EFTfxM/PG9t3QrFxvILjnpcFVhM/BD+YRL+6xuDiw6YN+P1L04AK1pZkYPA6 Gck1MGITTfvlVXtR+y9njj/D3aF+srYH9drYqk0zromwhsQyUYRXJ7EhnP/hKgmmNRo03smC/+/ MD9rCqlycrbtg/yi0i+1ZQ6YrDaBh3oxPTPsfie4g2OtUo69Q/ruJdWqSDBNxvJogf3YS8DSWIc i9E66oDjhB0v9xA== X-Google-Smtp-Source: AGHT+IGdrGVWnT+dvALBN+5Ng+IJTO+7Z0sM/k6clb1UC1OteghQCEfJ0f2yG5Gzs/IYhswiT0S7Hw== X-Received: by 2002:a05:6402:90a:b0:5fb:d4a5:a3c2 with SMTP id 4fb4d7f45d1cf-5fca0759839mr3461741a12.10.1746810782823; Fri, 09 May 2025 10:13:02 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH 5/5] bhyve: support removing NVRAM on domain undefine Date: Fri, 9 May 2025 19:11:51 +0200 Message-ID: <20250509171151.31305-6-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250509171151.31305-1-bogorodskiy@gmail.com> References: <20250509171151.31305-1-bogorodskiy@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: JASWWDCANDXIXVMYGTSJF5GTTETWP6VJ X-Message-ID-Hash: JASWWDCANDXIXVMYGTSJF5GTTETWP6VJ X-MailFrom: bogorodskiy@gmail.com 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; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Roman Bogorodskiy 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: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1746810950455019000 Content-Type: text/plain; charset="utf-8" Signed-off-by: Roman Bogorodskiy Reviewed-by: Michal Privoznik --- src/bhyve/bhyve_driver.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 684346952d..db7d440a97 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -533,9 +533,19 @@ bhyveDomainUndefineFlags(virDomainPtr domain, unsigned= int flags) struct _bhyveConn *privconn =3D domain->conn->privateData; virObjectEvent *event =3D NULL; virDomainObj *vm; + g_autofree char *nvram_path =3D NULL; int ret =3D -1; =20 - virCheckFlags(0, -1); + virCheckFlags(VIR_DOMAIN_UNDEFINE_NVRAM | + VIR_DOMAIN_UNDEFINE_KEEP_NVRAM, -1); + + if ((flags & VIR_DOMAIN_UNDEFINE_NVRAM) && + (flags & VIR_DOMAIN_UNDEFINE_KEEP_NVRAM)) { + virReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("cannot both keep and delete nvram")); + return -1; + } + if (!(vm =3D bhyveDomObjFromDomain(domain))) goto cleanup; =20 @@ -548,6 +558,26 @@ bhyveDomainUndefineFlags(virDomainPtr domain, unsigned= int flags) goto cleanup; } =20 + if (vm->def->os.loader && vm->def->os.loader->nvram && + virStorageSourceIsLocalStorage(vm->def->os.loader->nvram)) { + nvram_path =3D g_strdup(vm->def->os.loader->nvram->path); + } + + if (nvram_path && virFileExists(nvram_path)) { + if ((flags & VIR_DOMAIN_UNDEFINE_NVRAM)) { + if (unlink(nvram_path) < 0) { + virReportSystemError(errno, + _("failed to remove nvram: %1$s"), + nvram_path); + goto cleanup; + } + } else if (!(flags & VIR_DOMAIN_UNDEFINE_KEEP_NVRAM)) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("cannot undefine domain with nvram")); + goto cleanup; + } + } + if (virDomainDeleteConfig(BHYVE_CONFIG_DIR, BHYVE_AUTOSTART_DIR, vm) < 0) --=20 2.49.0