From 58b49d0c19f9e9c2b544260bfea344f11bd57ddc Mon Sep 17 00:00:00 2001 From: Fabian Freyer Date: Fri, 8 Jul 2016 17:51:12 +0000 Subject: [PATCH] bhyve: enumerate UEFI firmwares Extend domain capabilities XML with the information about available UEFI firmware files. It searches in the location that the sysutils/bhyve-firmware FreeBSD port installs files to. Signed-off-by: Roman Bogorodskiy --- src/bhyve/bhyve_capabilities.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c index 24494121bb..6f686a9af0 100644 --- a/src/bhyve/bhyve_capabilities.c +++ b/src/bhyve/bhyve_capabilities.c @@ -22,6 +22,9 @@ */ #include #include +#include +#include +#include #include "viralloc.h" #include "virfile.h" @@ -114,11 +117,35 @@ virBhyveDomainCapsBuild(const char *emulatorbin, virDomainVirtType virttype) { virDomainCapsPtr caps = NULL; + DIR *dir; + struct dirent *entry; + const char *firmware_dir = "/usr/local/share/uefi-firmware"; + size_t firmwares_alloc = 0; if (!(caps = virDomainCapsNew(emulatorbin, machine, arch, virttype))) goto cleanup; caps->os.supported = true; + caps->os.loader.supported = true; + VIR_DOMAIN_CAPS_ENUM_SET(caps->os.loader.type, + VIR_DOMAIN_LOADER_TYPE_PFLASH); + VIR_DOMAIN_CAPS_ENUM_SET(caps->os.loader.readonly, + VIR_TRISTATE_BOOL_YES); + + if (virDirOpenIfExists(&dir, firmware_dir) > 0) { + while ((virDirRead(dir, &entry, firmware_dir)) > 0) { + if (VIR_RESIZE_N(caps->os.loader.values.values, + firmwares_alloc, caps->os.loader.values.nvalues, 2) < 0) + goto cleanup; + + if (virAsprintf( + &caps->os.loader.values.values[caps->os.loader.values.nvalues], + "%s/%s", firmware_dir, entry->d_name) < 0) + goto cleanup; + + caps->os.loader.values.nvalues++; + } + } caps->disk.supported = true; VIR_DOMAIN_CAPS_ENUM_SET(caps->disk.diskDevice, VIR_DOMAIN_DISK_DEVICE_DISK, @@ -129,6 +156,7 @@ virBhyveDomainCapsBuild(const char *emulatorbin, VIR_DOMAIN_DISK_BUS_VIRTIO); cleanup: + VIR_DIR_CLOSE(dir); return caps; }