From b6ae129534a2c74af5de70cf314ae9e948de8a8b Mon Sep 17 00:00:00 2001 From: Fabian Freyer Date: Tue, 24 May 2016 15:30:56 +0200 Subject: [PATCH] bhyve: virBhyveProbeCaps: BHYVE_CAP_LPC_BOOTROM 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 | 26 ++++++++++++++++++++++++++ src/bhyve/bhyve_capabilities.h | 1 + 2 files changed, 27 insertions(+) diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c index 52d6ca7829..24494121bb 100644 --- a/src/bhyve/bhyve_capabilities.c +++ b/src/bhyve/bhyve_capabilities.c @@ -239,6 +239,29 @@ 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; + + ret = 0; + cleanup: + VIR_FREE(error); + virCommandFree(cmd); + return ret; +} + int virBhyveProbeCaps(unsigned int *caps) { @@ -260,6 +283,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 690feadb84..746c77181b 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.39.5