[libvirt] [PATCH 2/6] bhyve: add support for booting from UEFI
Michal Privoznik
mprivozn at redhat.com
Wed Mar 8 17:20:03 UTC 2017
On 02/12/2017 04:12 PM, Roman Bogorodskiy wrote:
> From: Fabian Freyer <fabian.freyer at physik.tu-berlin.de>
>
> Allow to boot using UEFI rather than using an external boot loader
> such as bhyveload or grub-bhyve.
>
> Also, make LPC PCI-ISA bridge handling more flexible as now it's
> needed not only for serial ports, but for bootrom as well.
>
> Signed-off-by: Roman Bogorodskiy <bogorodskiy at gmail.com>
> ---
> src/bhyve/bhyve_command.c | 30 +++++++++++++++++++++++++-
> src/bhyve/bhyve_driver.c | 27 +++++++++++++++++++----
> src/bhyve/bhyve_process.c | 55 +++++++++++++++++++++++++----------------------
> 3 files changed, 81 insertions(+), 31 deletions(-)
>
> diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c
> index e7131625c..450800920 100644
> --- a/src/bhyve/bhyve_command.c
> +++ b/src/bhyve/bhyve_command.c
> @@ -163,7 +163,6 @@ bhyveBuildConsoleArgStr(const virDomainDef *def, virCommandPtr cmd)
> return -1;
> }
>
> - virCommandAddArgList(cmd, "-s", "1,lpc", NULL);
> virCommandAddArg(cmd, "-l");
> virCommandAddArgFormat(cmd, "com%d,%s",
> chr->target.port + 1, chr->source->data.file.path);
> @@ -283,6 +282,14 @@ bhyveBuildVirtIODiskArgStr(const virDomainDef *def ATTRIBUTE_UNUSED,
> return 0;
> }
>
> +static int
> +bhyveBuildLPCArgStr(const virDomainDef *def ATTRIBUTE_UNUSED,
> + virCommandPtr cmd)
> +{
> + virCommandAddArgList(cmd, "-s", "1,lpc", NULL);
> + return 0;
> +}
> +
> virCommandPtr
> virBhyveProcessBuildBhyveCmd(virConnectPtr conn,
> virDomainDefPtr def, bool dryRun)
> @@ -296,6 +303,7 @@ virBhyveProcessBuildBhyveCmd(virConnectPtr conn,
> * vm0
> */
> size_t i;
> + bool add_lpc = false;
>
> virCommandPtr cmd = virCommandNew(BHYVE);
>
> @@ -350,6 +358,21 @@ virBhyveProcessBuildBhyveCmd(virConnectPtr conn,
> virCommandAddArg(cmd, "-P"); /* vmexit from guest on pause */
>
> virCommandAddArgList(cmd, "-s", "0:0,hostbridge", NULL);
> +
> + if (def->os.bootloader == NULL &&
> + def->os.loader) {
> + if ((bhyveDriverGetCaps(conn) & BHYVE_CAP_LPC_BOOTROM)) {
> + virCommandAddArg(cmd, "-l");
> + virCommandAddArgFormat(cmd, "bootrom,%s", def->os.loader->path);
> + add_lpc = true;
> + } else {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("Installed bhyve binary does not support "
> + "UEFI loader"));
> + goto error;
> + }
> + }
> +
> /* Devices */
> for (i = 0; i < def->ncontrollers; i++) {
> virDomainControllerDefPtr controller = def->controllers[i];
> @@ -389,8 +412,13 @@ virBhyveProcessBuildBhyveCmd(virConnectPtr conn,
> goto error;
> }
> }
> +
> + if (add_lpc || def->nserials)
> + bhyveBuildLPCArgStr(def, cmd);
> +
> if (bhyveBuildConsoleArgStr(def, cmd) < 0)
> goto error;
> +
> virCommandAddArg(cmd, def->name);
>
> return cmd;
> diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
> index f4ccef32b..0f9961ae0 100644
> --- a/src/bhyve/bhyve_driver.c
> +++ b/src/bhyve/bhyve_driver.c
> @@ -734,15 +734,34 @@ bhyveConnectDomainXMLToNative(virConnectPtr conn,
> if (bhyveDomainAssignAddresses(def, NULL) < 0)
> goto cleanup;
>
> - if (!(loadcmd = virBhyveProcessBuildLoadCmd(conn, def, "<device.map>",
> + if (def->os.bootloader == NULL &&
> + def->os.loader) {
> +
> + if ((def->os.loader->readonly != VIR_TRISTATE_BOOL_YES)
> + || (def->os.loader->type != VIR_DOMAIN_LOADER_TYPE_PFLASH)) {
Please move the or operator at the end of the previous line.
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("Only read-only pflash is supported."));
> + goto cleanup;
> + }
ACK
Michal
More information about the libvir-list
mailing list