On 02/12/2017 04:12 PM, Roman Bogorodskiy wrote:
From: Fabian Freyer <fabian.freyer(a)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(a)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