Xen only supports one firmware, making autoselection easy to implement.
In fact, <os firmware='efi'> is probably preferable in the Xen driver,
where libxl supports a firmware setting with accepted values such as
bios, ovmf, uefi (currently same semantics as ovmf), seabios, etc.
Signed-off-by: Jim Fehlig <jfehlig(a)suse.com>
---
src/libxl/libxl_conf.c | 17 +++++++++++++++--
src/libxl/libxl_domain.c | 22 ++++++++++++++++------
2 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index fc4268db01..aef93fae53 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -627,15 +627,28 @@ libxlMakeDomBuildInfo(virDomainDef *def,
/*
* Currently libxl only allows specifying the type of BIOS.
- * If the type is PFLASH, we assume OVMF and set libxl_bios_type
+ * If automatic firmware selection is enabled or the loader
+ * type is PFLASH, we assume OVMF and set libxl_bios_type
* to LIBXL_BIOS_TYPE_OVMF. The path to the OVMF firmware is
* configured when building Xen using '--with-system-ovmf='. If
* not specified, LIBXL_FIRMWARE_DIR/ovmf.bin is used. In the
* future, Xen will support a user-specified firmware path. See
*
https://lists.xenproject.org/archives/html/xen-devel/2016-03/msg01628.html
*/
- if (virDomainDefHasOldStyleUEFI(def))
+ if (def->os.firmware == VIR_DOMAIN_OS_DEF_FIRMWARE_EFI) {
+ if (def->os.loader == NULL)
+ def->os.loader = g_new0(virDomainLoaderDef, 1);
+ if (def->os.loader->path == NULL)
+ def->os.loader->path = g_strdup(cfg->firmwares[0]->name);
+ if (def->os.loader->type == VIR_DOMAIN_LOADER_TYPE_NONE)
+ def->os.loader->type = VIR_DOMAIN_LOADER_TYPE_PFLASH;
+ if (def->os.loader->readonly == VIR_TRISTATE_BOOL_ABSENT)
+ def->os.loader->readonly = VIR_TRISTATE_BOOL_YES;
b_info->u.hvm.bios = LIBXL_BIOS_TYPE_OVMF;
+ def->os.firmware = VIR_DOMAIN_OS_DEF_FIRMWARE_NONE;
+ } else if (virDomainDefHasOldStyleUEFI(def)) {
+ b_info->u.hvm.bios = LIBXL_BIOS_TYPE_OVMF;
+ }
if (def->emulator) {
if (!virFileExists(def->emulator)) {
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index 14d000511a..59d26d5e2b 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -440,6 +440,7 @@ libxlDomainDefValidate(const virDomainDef *def,
{
libxlDriverPrivate *driver = opaque;
g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
+ bool reqSecureBoot = false;
if (!virCapabilitiesDomainSupported(cfg->caps, def->os.type,
def->os.arch,
@@ -447,13 +448,20 @@ libxlDomainDefValidate(const virDomainDef *def,
return -1;
/* Xen+ovmf does not support secure boot */
+ if (def->os.firmware == VIR_DOMAIN_OS_DEF_FIRMWARE_EFI) {
+ if (def->os.firmwareFeatures &&
+ def->os.firmwareFeatures[VIR_DOMAIN_OS_DEF_FIRMWARE_FEATURE_SECURE_BOOT])
+ reqSecureBoot = true;
+ }
if (virDomainDefHasOldStyleUEFI(def)) {
if (def->os.loader &&
- def->os.loader->secure == VIR_TRISTATE_BOOL_YES) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("Secure boot is not supported on Xen"));
- return -1;
- }
+ def->os.loader->secure == VIR_TRISTATE_BOOL_YES)
+ reqSecureBoot = true;
+ }
+ if (reqSecureBoot) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Secure boot is not supported on Xen"));
+ return -1;
}
return 0;
@@ -465,7 +473,9 @@ virDomainDefParserConfig libxlDomainDefParserConfig = {
.devicesPostParseCallback = libxlDomainDeviceDefPostParse,
.domainPostParseCallback = libxlDomainDefPostParse,
.domainValidateCallback = libxlDomainDefValidate,
- .features = VIR_DOMAIN_DEF_FEATURE_NET_MODEL_STRING,
+
+ .features = VIR_DOMAIN_DEF_FEATURE_FW_AUTOSELECT |
+ VIR_DOMAIN_DEF_FEATURE_NET_MODEL_STRING,
};
--
2.31.1