From: Fabian Freyer <fabian.freyer(a)physik.tu-berlin.de>
Signed-off-by: Roman Bogorodskiy <bogorodskiy(a)gmail.com>
---
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 13b4835a8..9dec66b11 100644
--- a/src/bhyve/bhyve_capabilities.c
+++ b/src/bhyve/bhyve_capabilities.c
@@ -22,6 +22,9 @@
*/
#include <config.h>
#include <sys/utsname.h>
+#include <dirent.h>
+#include <stdio.h>
+#include <sys/types.h>
#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;
}
--
2.11.0