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

From: [email-masked] (Ludovic Courtès)
Date: Mon, 11 Dec 2017 17:38:21 +0100

[email-masked] skribis:

> 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?

Do we really need this new parameter and could we use the
‘target-arm32?’ procedure that you added directly?

> +                  (if target-arm32?
> +                      (string-append "console=ttyAMA0 --load=" builder)
> +                      (string-append "console=ttyS0 --load=" builder))

Could you add a short comment explaining this?

>                    "-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")
>                         '()))))

For clarity, it might be best to collect all the platform-specific
options separately, like:

  (define arch-specific-flags
    `(,@(if target-arm32? '("-M" "virt") '())
      ,@(if (and (file-exists? "/dev/kvm") …) …)
      …))

WDYT?

Ludo’.