Signed-off-by: Roman Bogorodskiy <bogorods...@gmail.com>
---
 src/bhyve/bhyve_parse_command.c               | 29 +++++++++++++++++++
 .../bhyveargv2xml-virtio-rnd.args             |  8 +++++
 .../bhyveargv2xml-virtio-rnd.xml              | 20 +++++++++++++
 tests/bhyveargv2xmltest.c                     |  1 +
 4 files changed, 58 insertions(+)
 create mode 100644 tests/bhyveargv2xmldata/bhyveargv2xml-virtio-rnd.args
 create mode 100644 tests/bhyveargv2xmldata/bhyveargv2xml-virtio-rnd.xml

diff --git a/src/bhyve/bhyve_parse_command.c b/src/bhyve/bhyve_parse_command.c
index 29d3a678bf..7a4e48fbf8 100644
--- a/src/bhyve/bhyve_parse_command.c
+++ b/src/bhyve/bhyve_parse_command.c
@@ -5,6 +5,7 @@
  * Copyright (C) 2006 Daniel P. Berrange
  * Copyright (c) 2011 NetApp, Inc.
  * Copyright (C) 2020 Fabian Freyer
+ * Copyright (C) 2025 The FreeBSD Foundation
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -639,6 +640,32 @@ bhyveParsePCIFbuf(virDomainDef *def,
     return -1;
 }
 
+static int
+bhyveParsePCIRND(virDomainDef *def,
+                 virDomainXMLOption *xmlopt G_GNUC_UNUSED,
+                 unsigned caps G_GNUC_UNUSED,
+                 unsigned bus,
+                 unsigned slot,
+                 unsigned function,
+                 const char *config G_GNUC_UNUSED)
+{
+    /* -s slot,virtio-rnd */
+    virDomainRNGDef *rng = g_new0(virDomainRNGDef, 1);
+
+    rng->model = VIR_DOMAIN_RNG_MODEL_VIRTIO;
+    rng->backend = VIR_DOMAIN_RNG_BACKEND_RANDOM;
+
+    rng->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
+    rng->info.addr.pci.bus = bus;
+    rng->info.addr.pci.slot = slot;
+    rng->info.addr.pci.function = function;
+    rng->source.file = g_strdup("/dev/random");
+
+    VIR_APPEND_ELEMENT(def->rngs, def->nrngs, rng);
+
+    return 0;
+}
+
 static int
 bhyveParseBhyvePCIArg(virDomainDef *def,
                       virDomainXMLOption *xmlopt,
@@ -703,6 +730,8 @@ bhyveParseBhyvePCIArg(virDomainDef *def,
                          VIR_DOMAIN_NET_MODEL_E1000, conf);
     else if (STREQ(emulation, "fbuf"))
         bhyveParsePCIFbuf(def, xmlopt, caps, bus, slot, function, conf);
+    else if (STREQ(emulation, "virtio-rnd"))
+        bhyveParsePCIRND(def, xmlopt, caps, bus, slot, function, conf);
 
     VIR_FREE(emulation);
     VIR_FREE(slotdef);
diff --git a/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-rnd.args 
b/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-rnd.args
new file mode 100644
index 0000000000..7e4b27eb77
--- /dev/null
+++ b/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-rnd.args
@@ -0,0 +1,8 @@
+/usr/sbin/bhyve \
+-c 1 \
+-m 214 \
+-H \
+-P \
+-s 0:0,hostbridge \
+-s 1:0,virtio-rnd \
+bhyve
diff --git a/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-rnd.xml 
b/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-rnd.xml
new file mode 100644
index 0000000000..c6b2620f9e
--- /dev/null
+++ b/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-rnd.xml
@@ -0,0 +1,20 @@
+<domain type='bhyve'>
+  <name>bhyve</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219136</memory>
+  <currentMemory unit='KiB'>219136</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type>hvm</type>
+  </os>
+  <clock offset='localtime'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>destroy</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <rng model='virtio'>
+      <backend model='random'>/dev/random</backend>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' 
function='0x0'/>
+    </rng>
+  </devices>
+</domain>
diff --git a/tests/bhyveargv2xmltest.c b/tests/bhyveargv2xmltest.c
index 92189a2e58..82abce5b8f 100644
--- a/tests/bhyveargv2xmltest.c
+++ b/tests/bhyveargv2xmltest.c
@@ -188,6 +188,7 @@ mymain(void)
     DO_TEST("vnc-vga-io");
     DO_TEST("vnc-resolution");
     DO_TEST("vnc-password");
+    DO_TEST("virtio-rnd");
 
     virObjectUnref(driver.caps);
     virObjectUnref(driver.xmlopt);
-- 
2.49.0

Reply via email to