Fixes to allow (32 bit) arm guests to run on aarch64 hosts.
[mclu.git] / mclu_boot.ml
index 6da1bc5..c1054e5 100644 (file)
@@ -170,9 +170,17 @@ Try: `mclu on %s'\n" hostname hostname;
   let remote_external_initrd = sprintf "/var/tmp/%s.boot/initrd" name in
   let remote_arch = node.MS.node_status.node_info.model in
 
+  (* Guest arch defaults to the node host arch, but can be overridden
+   * in the template.
+   *)
+  let guest_arch =
+    match template_info.Template.guest_arch with
+    | Some arch -> arch
+    | None -> remote_arch in
+
   (* UEFI firmware and NVRAM on remote, if required. *)
   let nvram =
-    match remote_arch with
+    match guest_arch with
     | "aarch64" ->
        Some ("/usr/share/edk2.git/aarch64/QEMU_EFI-pflash.raw",
              "/usr/share/edk2.git/aarch64/vars-template-pflash.raw",
@@ -204,9 +212,13 @@ Try: `mclu on %s'\n" hostname hostname;
     <boot dev='hd'/>
 " in
     let xml =
-      match remote_arch with
+      match guest_arch with
+      | "arm" | "armv7" | "armv7l" | "armv7hl" ->
+         xml ^ "\
+    <type arch='armv7l' machine='virt'>hvm</type>
+"
       | "aarch64" ->
-         xml ^ sprintf "\
+         xml ^ "\
     <type machine='virt'>hvm</type>
 "
       | _ ->
@@ -297,8 +309,10 @@ Try: `mclu on %s'\n" hostname hostname;
     </console>
 " in
     let xml =
-      if remote_arch = "x86_64" then (
-        xml ^ "\
+      match guest_arch with
+      | "i386" | "i486" | "i586" | "i686"
+      | "x86_64" ->
+         xml ^ "\
     <input type='tablet' bus='usb'/>
     <input type='mouse' bus='ps2'/>
     <input type='keyboard' bus='ps2'/>
@@ -307,8 +321,7 @@ Try: `mclu on %s'\n" hostname hostname;
       <model type='cirrus' vram='9216' heads='1'/>
     </video>
 "
-      ) else
-        xml in
+      | _ -> xml in
     let xml = xml ^ "\
   </devices>
 </domain>" in
@@ -387,6 +400,7 @@ Try: `mclu on %s'\n" hostname hostname;
     fpf "export LIBGUESTFS_BACKEND_SETTINGS=network_bridge=br0\n";
     fpf "export base_image=%s\n" (quote template_info.Template.base_image);
     fpf "export format=%s\n" (quote format);
+    fpf "export guest_arch=%s\n" (quote guest_arch);
     fpf "export name=%s\n" (quote name);
     fpf "export output=%s\n" (quote remote_image);
     (match size with