From: Fabian Freyer <fabian.freyer(a)physik.tu-berlin.de>
Implement the BHACE_CAP_LPC_BOOTROM capability by checking the stderr
output of 'bhyve -l bootrom'. If the bootrom option is unsupported, this
will contain the following output:
bhyve: invalid lpc device configuration 'bootrom'
On newer bhyve versions that do support specifying a bootrom image, the
standard help will be printed.
---
src/bhyve/bhyve_capabilities.c | 25 +++++++++++++++++++++++++
src/bhyve/bhyve_capabilities.h | 1 +
2 files changed, 26 insertions(+)
diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c
index 1dc0593af..13b4835a8 100644
--- a/src/bhyve/bhyve_capabilities.c
+++ b/src/bhyve/bhyve_capabilities.c
@@ -239,6 +239,28 @@ bhyveProbeCapsNetE1000(unsigned int *caps, char *binary)
return ret;
}
+static int
+bhyveProbeCapsLPC_Bootrom(unsigned int *caps, char *binary)
+{
+ char *error;
+ virCommandPtr cmd = NULL;
+ int ret = -1, exit;
+
+ cmd = virCommandNew(binary);
+ virCommandAddArgList(cmd, "-l", "bootrom", NULL);
+ virCommandSetErrorBuffer(cmd, &error);
+ if (virCommandRun(cmd, &exit) < 0)
+ goto cleanup;
+
+ if (strstr(error, "bhyve: invalid lpc device configuration
'bootrom'") == NULL)
+ *caps |= BHYVE_CAP_LPC_BOOTROM;
+
+ cleanup:
+ VIR_FREE(error);
+ virCommandFree(cmd);
+ return ret;
+}
+
int
virBhyveProbeCaps(unsigned int *caps)
{
@@ -260,6 +282,9 @@ virBhyveProbeCaps(unsigned int *caps)
if ((ret = bhyveProbeCapsNetE1000(caps, binary)))
goto out;
+ if ((ret = bhyveProbeCapsLPC_Bootrom(caps, binary)))
+ goto out;
+
out:
VIR_FREE(binary);
return ret;
diff --git a/src/bhyve/bhyve_capabilities.h b/src/bhyve/bhyve_capabilities.h
index 690feadb8..746c77181 100644
--- a/src/bhyve/bhyve_capabilities.h
+++ b/src/bhyve/bhyve_capabilities.h
@@ -40,6 +40,7 @@ typedef enum {
BHYVE_CAP_RTC_UTC = 1 << 0,
BHYVE_CAP_AHCI32SLOT = 1 << 1,
BHYVE_CAP_NET_E1000 = 1 << 2,
+ BHYVE_CAP_LPC_BOOTROM = 1 << 3,
} virBhyveCapsFlags;
int virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps);
--
2.11.0