Just like consoles, bootloader is handled differently on arm64.
It also does not used the LPC bus, and is configured with:

 -o bootrom=/usr/local/share/u-boot/u-boot-bhyve-arm64/u-boot.bin

Additionally, fill firmware inforamtion only for amd64.

Signed-off-by: Roman Bogorodskiy <[email protected]>
---
 src/bhyve/bhyve_command.c                     | 25 ++++++++++++-------
 src/bhyve/bhyve_firmware.c                    |  3 +++
 .../aarch64/bhyvexml2argv-bootloader.args     |  9 +++++++
 .../aarch64/bhyvexml2argv-bootloader.ldargs   |  1 +
 .../aarch64/bhyvexml2argv-bootloader.xml      | 24 ++++++++++++++++++
 tests/bhyvexml2argvtest.c                     |  1 +
 6 files changed, 54 insertions(+), 9 deletions(-)
 create mode 100644 
tests/bhyvexml2argvdata/aarch64/bhyvexml2argv-bootloader.args
 create mode 100644 
tests/bhyvexml2argvdata/aarch64/bhyvexml2argv-bootloader.ldargs
 create mode 100644 tests/bhyvexml2argvdata/aarch64/bhyvexml2argv-bootloader.xml

diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c
index 8c1e06b736..e767afd18a 100644
--- a/src/bhyve/bhyve_command.c
+++ b/src/bhyve/bhyve_command.c
@@ -940,17 +940,24 @@ virBhyveProcessBuildBhyveCmd(struct _bhyveConn *driver, 
virDomainDef *def,
 
     if (def->os.bootloader == NULL &&
         def->os.loader) {
-        if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_LPC_BOOTROM)) {
+        virArch arch = def->os.arch;
             g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
-            virBufferAsprintf(&buf, "bootrom,%s", def->os.loader->path);
-            if (def->os.loader->nvram && def->os.loader->nvram->path)
-                virBufferAsprintf(&buf, ",%s", def->os.loader->nvram->path);
 
-            virCommandAddArgList(cmd, "-l", virBufferContentAndReset(&buf), 
NULL);
-        } else {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("Installed bhyve binary does not support UEFI 
loader"));
-            return NULL;
+        if (ARCH_IS_X86(arch)) {
+            if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_LPC_BOOTROM)) {
+                virBufferAsprintf(&buf, "bootrom,%s", def->os.loader->path);
+                if (def->os.loader->nvram && def->os.loader->nvram->path)
+                    virBufferAsprintf(&buf, ",%s", 
def->os.loader->nvram->path);
+
+                virCommandAddArgList(cmd, "-l", 
virBufferContentAndReset(&buf), NULL);
+            } else {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("Installed bhyve binary does not support UEFI 
loader"));
+                return NULL;
+            }
+        } else if (ARCH_IS_ARM(arch)) {
+            virBufferAsprintf(&buf, "bootrom=%s", def->os.loader->path);
+            virCommandAddArgList(cmd, "-o", virBufferContentAndReset(&buf), 
NULL);
         }
     }
 
diff --git a/src/bhyve/bhyve_firmware.c b/src/bhyve/bhyve_firmware.c
index 57ad0031b0..54e3ce296a 100644
--- a/src/bhyve/bhyve_firmware.c
+++ b/src/bhyve/bhyve_firmware.c
@@ -125,6 +125,9 @@ bhyveFirmwareFillDomain(bhyveConn *driver,
 
     virCheckFlags(0, -1);
 
+    if (!ARCH_IS_X86(def->os.arch))
+        return 0;
+
     if (def->os.firmware == VIR_DOMAIN_OS_DEF_FIRMWARE_NONE)
         goto out;
 
diff --git a/tests/bhyvexml2argvdata/aarch64/bhyvexml2argv-bootloader.args 
b/tests/bhyvexml2argvdata/aarch64/bhyvexml2argv-bootloader.args
new file mode 100644
index 0000000000..a07e70d7d4
--- /dev/null
+++ b/tests/bhyvexml2argvdata/aarch64/bhyvexml2argv-bootloader.args
@@ -0,0 +1,9 @@
+bhyve \
+-c 1 \
+-m 214 \
+-u \
+-s 0:0,hostbridge \
+-o bootrom=/usr/local/share/u-boot/u-boot-bhyve-arm64/u-boot.bin \
+-s 3:0,virtio-net,faketapdev,mac=52:54:00:b9:94:02 \
+-s 2:0,virtio-blk,/tmp/freebsd.img \
+bhyve
diff --git a/tests/bhyvexml2argvdata/aarch64/bhyvexml2argv-bootloader.ldargs 
b/tests/bhyvexml2argvdata/aarch64/bhyvexml2argv-bootloader.ldargs
new file mode 100644
index 0000000000..421376db9e
--- /dev/null
+++ b/tests/bhyvexml2argvdata/aarch64/bhyvexml2argv-bootloader.ldargs
@@ -0,0 +1 @@
+dummy
diff --git a/tests/bhyvexml2argvdata/aarch64/bhyvexml2argv-bootloader.xml 
b/tests/bhyvexml2argvdata/aarch64/bhyvexml2argv-bootloader.xml
new file mode 100644
index 0000000000..6e1123e4e0
--- /dev/null
+++ b/tests/bhyvexml2argvdata/aarch64/bhyvexml2argv-bootloader.xml
@@ -0,0 +1,24 @@
+<domain type='bhyve'>
+  <name>bhyve</name>
+  <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
+  <memory>219136</memory>
+  <vcpu>1</vcpu>
+  <os>
+    <type>hvm</type>
+    <loader 
readonly='yes'>/usr/local/share/u-boot/u-boot-bhyve-arm64/u-boot.bin</loader>
+  </os>
+  <devices>
+    <disk type='file'>
+      <driver name='file' type='raw'/>
+      <source file='/tmp/freebsd.img'/>
+      <target dev='vda' bus='virtio'/>
+      <address type='drive' controller='0' bus='0' target='2' unit='0'/>
+    </disk>
+    <interface type='bridge'>
+      <mac address='52:54:00:b9:94:02'/>
+      <model type='virtio'/>
+      <source bridge="virbr0"/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' 
function='0x0'/>
+    </interface>
+  </devices>
+</domain>
diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c
index 564f3fb433..26619a22b9 100644
--- a/tests/bhyvexml2argvtest.c
+++ b/tests/bhyvexml2argvtest.c
@@ -335,6 +335,7 @@ mymain(void)
 
     DO_TEST("base");
     DO_TEST("console");
+    DO_TEST("bootloader");
 
     virObjectUnref(driver.caps);
     virObjectUnref(driver.xmlopt);
-- 
2.51.2

Reply via email to