1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2024-12-22 17:34:18 +03:00

qemu: Allow UEFI paths to be specified at compile time

Up until now there are just two ways how to specify UEFI paths to
libvirt. The first one is editing qemu.conf, the other is editing
qemu_conf.c and recompile which is not that fancy. So, new
configure option is introduced: --with-loader-nvram which takes a
list of pairs of UEFI firmware and NVRAM store. This way, the
compiled in defaults can be passed during compile time without
need to change the code itself.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Michal Privoznik 2015-01-21 19:38:57 +01:00
parent 9783c20cfb
commit bc03a23149
3 changed files with 74 additions and 7 deletions

View File

@ -2796,6 +2796,23 @@ AC_ARG_WITH([default-editor],
[DEFAULT_EDITOR=vi])
AC_DEFINE_UNQUOTED([DEFAULT_EDITOR], ["$DEFAULT_EDITOR"], [Default editor to use])
AC_ARG_WITH([loader-nvram],
[AS_HELP_STRING([--with-loader-nvram],
[Pass list of pairs of <loader>:<nvram> paths. Both
pairs and list items are separated by a colon.
@<:default=paths to OVMF and its clones@:>@])],
[if test "$withval" = "no"; then
withval=""
else
l=`echo $withval | tr ':' '\n' | wc -l`
if test "`expr $l % 2`" -ne 0; then
AC_MSG_ERROR([Malformed --with-loader-nvram argument])
fi
fi
AC_DEFINE_UNQUOTED([DEFAULT_LOADER_NVRAM],
["$withval"],
[List of laoder:nvram pairs])])
# Some GNULIB base64 symbols clash with a kerberos library
AC_DEFINE_UNQUOTED([isbase64],[libvirt_gl_isbase64],[Hack to avoid symbol clash])
AC_DEFINE_UNQUOTED([base64_encode],[libvirt_gl_base64_encode],[Hack to avoid symbol clash])

View File

@ -107,6 +107,48 @@ void qemuDomainCmdlineDefFree(qemuDomainCmdlineDefPtr def)
VIR_FREE(def);
}
static int ATTRIBUTE_UNUSED
virQEMUDriverConfigLoaderNVRAMParse(virQEMUDriverConfigPtr cfg,
const char *list)
{
int ret = -1;
char **token;
size_t i, j;
if (!(token = virStringSplit(list, ":", 0)))
goto cleanup;
for (i = 0; token[i]; i += 2) {
if (!token[i] || !token[i + 1] ||
STREQ(token[i], "") || STREQ(token[i + 1], "")) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Invalid --with-loader-nvram list: %s"),
list);
goto cleanup;
}
}
if (i) {
if (VIR_ALLOC_N(cfg->loader, i / 2) < 0 ||
VIR_ALLOC_N(cfg->nvram, i / 2) < 0)
goto cleanup;
cfg->nloader = i / 2;
for (j = 0; j < i / 2; j++) {
if (VIR_STRDUP(cfg->loader[j], token[2 * j]) < 0 ||
VIR_STRDUP(cfg->nvram[j], token[2 * j + 1]) < 0)
goto cleanup;
}
}
ret = 0;
cleanup:
virStringFreeList(token);
return ret;
}
#define VIR_QEMU_LOADER_FILE_PATH "/usr/share/OVMF/OVMF_CODE.fd"
#define VIR_QEMU_NVRAM_FILE_PATH "/usr/share/OVMF/OVMF_VARS.fd"
@ -258,6 +300,12 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged)
cfg->logTimestamp = true;
#ifdef DEFAULT_LOADER_NVRAM
if (virQEMUDriverConfigLoaderNVRAMParse(cfg, DEFAULT_LOADER_NVRAM) < 0)
goto error;
#else
if (VIR_ALLOC_N(cfg->loader, 1) < 0 ||
VIR_ALLOC_N(cfg->nvram, 1) < 0)
goto error;
@ -266,6 +314,7 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged)
if (VIR_STRDUP(cfg->loader[0], VIR_QEMU_LOADER_FILE_PATH) < 0 ||
VIR_STRDUP(cfg->nvram[0], VIR_QEMU_NVRAM_FILE_PATH) < 0)
goto error;
#endif
return cfg;

View File

@ -105,6 +105,7 @@ fillQemuCaps(virDomainCapsPtr domCaps,
struct fillQemuCapsData *data = (struct fillQemuCapsData *) opaque;
virQEMUCapsPtr qemuCaps = data->qemuCaps;
virQEMUDriverConfigPtr cfg = data->cfg;
virDomainCapsLoaderPtr loader = &domCaps->os.loader;
if (virQEMUCapsFillDomainCaps(domCaps, qemuCaps,
cfg->loader, cfg->nloader) < 0)
@ -122,14 +123,14 @@ fillQemuCaps(virDomainCapsPtr domCaps,
/* Moreover, as of f05b6a918e28 we are expecting to see
* OVMF_CODE.fd file which may not exists everywhere. */
if (!domCaps->os.loader.values.nvalues) {
virDomainCapsLoaderPtr loader = &domCaps->os.loader;
while (loader->values.nvalues)
VIR_FREE(loader->values.values[--loader->values.nvalues]);
if (fillStringValues(&loader->values,
"/usr/share/OVMF/OVMF_CODE.fd",
NULL) < 0)
return -1;
if (fillStringValues(&loader->values,
"/usr/share/OVMF/OVMF_CODE.fd",
NULL) < 0)
return -1;
}
return 0;
}
#endif /* WITH_QEMU */