On 02/12/2017 04:12 PM, Roman Bogorodskiy wrote: > From: Fabian Freyer <fabian.freyer@xxxxxxxxxxxxxxxxxxx> > > 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); > ACK, but we really need a better way to detect capabilites. For instance now, bhyve binary is executed 4 times just to find out whether it supports 4 capabilities. That's just madness. Maybe we can get in touch with bhyve developers and ask them? Maybe it could have a monitor just like qemu has, or something. Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list