Subject: [PATCH 3/4] build: vm: Adapt qemu command to ARM.

From: [email-masked]
Date: Wed, 6 Dec 2017 13:59:52 +0100

From: Mathieu Othacehe <[email-masked]>

* gnu/build/vm.scm (load-in-linux-vm): New argument #:target-arm32.
Use it to adapt command for qemu-system-arm.  This implies to choose a
machine ("virt"), use the correct console port "ttyAMA0" and disable KVM use
that is buggy on some ARM boards (Odroid XU4 for example).
* gnu/system/vm.scm (expression->derivation-in-linux-vm): Pass
to load-in-linux-vm "#:target-arm32?" argument.
---
 gnu/build/vm.scm  | 19 ++++++++++++++++---
 gnu/system/vm.scm |  4 ++++
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index 0b1b9da..0fbba62 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -77,6 +77,7 @@
                            linux initrd
                            make-disk-image?
                            single-file-output?
+                           target-arm32?
                            (disk-image-size (* 100 (expt 2 20)))
                            (disk-image-format "qcow2")
                            (references-graphs '()))
@@ -124,8 +125,10 @@ the #:references-graphs parameter of 'derivation'."
                                  ",security_model=none,mount_tag=xchg")
                   "-kernel" linux
                   "-initrd" initrd
-                  "-append" (string-append "console=ttyS0 --load="
-                                           builder)
+                  "-append"
+                  (if target-arm32?
+                      (string-append "console=ttyAMA0 --load=" builder)
+                      (string-append "console=ttyS0 --load=" builder))
                   "-device" "virtio-blk,drive=myhd"
                   (append
                    (if make-disk-image?
@@ -133,10 +136,20 @@ the #:references-graphs parameter of 'derivation'."
                                                   ",format=" disk-image-format
                                                   ",id=myhd"))
                        '())
+                   ;; On ARM, a machine has to be specified. Use
+                   ;; "virt" machine to avoid hardware limits imposed
+                   ;; by other machines.
+                   (if target-arm32?
+                       '("-M" "virt")
+                       '())
                    ;; Only enable kvm if we see /dev/kvm exists.
                    ;; This allows users without hardware virtualization to still
                    ;; use these commands.
-                   (if (file-exists? "/dev/kvm")
+                   ;;
+                   ;; KVM support is still buggy on some ARM32 boards. Do not
+                   ;; use it even if available.
+                   (if (and (file-exists? "/dev/kvm")
+                            (not target-arm32?))
                        '("-enable-kvm")
                        '()))))
     (error "qemu failed" qemu))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index d754ac7..33c65de 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -175,6 +175,10 @@ made available under the /xchg CIFS share."
                                 #:memory-size #$memory-size
                                 #:make-disk-image? #$make-disk-image?
                                 #:single-file-output? #$single-file-output?
+                                ;; FIXME: ‘target-arm32?’ may be not operate
+                                ;; on the right system/target values.  Rewrite
+                                ;; using ‘let-system’ when available.
+                                #:target-arm32? #$(target-arm32?)
                                 #:disk-image-format #$disk-image-format
                                 #:disk-image-size size
                                 #:references-graphs graphs)))))
-- 
2.7.4