[bug#36477,v3,45/48] system: vm: Add arm64 support.
diff mbox series

Message ID 20190902153333.11190-46-m.othacehe@gmail.com
State New
Headers show
Series
  • Add --target support to guix system
Related show

Commit Message

Mathieu Othacehe Sept. 2, 2019, 3:33 p.m. UTC
* gnu/build/vm.scm (load-in-linux-vm): Add target-arm64? argument and use it
to pass correct arguments to qemu.
* gnu/system/vm.scm (expression->derivation-in-linux-vm): Pass the new
target-arm64? argument added above. Do not add ESP partition on all ARM
targets. Do not pass grub-efi package to initialize-hard-disk on ARM targets.
---
 gnu/build/vm.scm  | 22 +++++++++++++++++-----
 gnu/system/vm.scm | 17 +++++++++++------
 2 files changed, 28 insertions(+), 11 deletions(-)

Comments

Ludovic Courtès Sept. 4, 2019, 12:36 p.m. UTC | #1
Mathieu Othacehe <m.othacehe@gmail.com> skribis:

> * gnu/build/vm.scm (load-in-linux-vm): Add target-arm64? argument and use it
> to pass correct arguments to qemu.
> * gnu/system/vm.scm (expression->derivation-in-linux-vm): Pass the new
> target-arm64? argument added above. Do not add ESP partition on all ARM
> targets. Do not pass grub-efi package to initialize-hard-disk on ARM targets.

[...]

> --- a/gnu/build/vm.scm
> +++ b/gnu/build/vm.scm
> @@ -82,6 +82,7 @@
>                             make-disk-image?
>                             single-file-output?
>                             target-arm32?
> +                           target-arm64?

Maybe we should just have a #:target parameter instead, WDYT?


[...]

> +                    (grub-efi #$@(if (target-arm?)
> +                                     '(#f)
> +                                     #~(#$grub-efi))))

Simply:  #$(and (not (target-arm?)) grub-efi).

Otherwise LGTM.

Ludo’.

Patch
diff mbox series

diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index b85398ed24..e57917a9e5 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -82,6 +82,7 @@ 
                            make-disk-image?
                            single-file-output?
                            target-arm32?
+                           target-arm64?
                            (disk-image-size (* 100 (expt 2 20)))
                            (disk-image-format "qcow2")
                            (references-graphs '()))
@@ -97,10 +98,14 @@  access it via /dev/hda.
 REFERENCES-GRAPHS can specify a list of reference-graph files as produced by
 the #:references-graphs parameter of 'derivation'."
 
+  (define target-arm? (or target-arm32? target-arm64?))
+
   (define arch-specific-flags
     `(;; On ARM, a machine has to be specified. Use "virt" machine to avoid
       ;; hardware limits imposed by other machines.
-      ,@(if target-arm32? '("-M" "virt") '())
+      ,@(if target-arm?
+            '("-M" "virt")
+            '())
 
       ;; On ARM32, if the kernel is built without LPAE support, ECAM conflicts
       ;; with VIRT_PCIE_MMIO causing PCI devices not to show up.  Disable
@@ -110,11 +115,18 @@  the #:references-graphs parameter of 'derivation'."
             '("-machine" "highmem=off")
             '())
 
+      ;; On ARM64, we have to specify the CPU. "max" behaves as "host" when
+      ;; KVM is enabled, and like a system CPU with the maximum possible
+      ;; feature set otherwise.
+      ,@(if target-arm64?
+            '("-cpu" "max")
+            '())
+
       ;; Only enable kvm if we see /dev/kvm exists.  This allows users without
       ;; hardware virtualization to still use these commands.  KVM support is
-      ;; still buggy on some ARM32 boards. Do not use it even if available.
+      ;; still buggy on some ARM boards. Do not use it even if available.
       ,@(if (and (file-exists? "/dev/kvm")
-                 (not target-arm32?))
+                 (not target-arm?))
             '("-enable-kvm")
             '())
 
@@ -125,11 +137,11 @@  the #:references-graphs parameter of 'derivation'."
                       ;; The serial port name differs between emulated
                       ;; architectures/machines.
                       " console="
-                      (if target-arm32? "ttyAMA0" "ttyS0"))
+                      (if target-arm? "ttyAMA0" "ttyS0"))
 
       ;; NIC is not supported on ARM "virt" machine, so use a user mode
       ;; network stack instead.
-      ,@(if target-arm32?
+      ,@(if target-arm?
             '("-device" "virtio-net-pci,netdev=mynet"
               "-netdev" "user,id=mynet")
             '("-net" "nic,model=virtio"))))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index ac6e4ded92..07cee2d4f5 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -235,10 +235,12 @@  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 not operate on
-                                  ;; the right system/target values.  Rewrite
+                                  ;; FIXME: ‘target-arm32?’ and
+                                  ;; ‘target-arm64?’ may not operate on the
+                                  ;; right system/target values.  Rewrite
                                   ;; using ‘let-system’ when available.
                                   #:target-arm32? #$(target-arm32?)
+                                  #:target-arm64? #$(target-arm64?)
                                   #:disk-image-format #$disk-image-format
                                   #:disk-image-size size
                                   #:references-graphs graphs))))))
@@ -452,10 +454,10 @@  system."
                       ;; bootloaders if we are not targeting ARM because UEFI
                       ;; support in U-Boot is experimental.
                       ;;
-                      ;; FIXME: ‘target-arm32?’ may be not operate on the right
+                      ;; FIXME: ‘target-arm?’ may be not operate on the right
                       ;; system/target values.  Rewrite using ‘let-system’ when
                       ;; available.
-                      (if #$(target-arm32?)
+                      (if #$(target-arm?)
                           '()
                           (list (partition
                                  ;; The standalone grub image is about 10MiB, but
@@ -466,10 +468,13 @@  system."
                                  ;; when mounting. The actual FAT-ness is based
                                  ;; on file system size (16 in this case).
                                  (file-system "vfat")
-                                 (flags '(esp))))))))
+                                 (flags '(esp)))))))
+                    (grub-efi #$@(if (target-arm?)
+                                     '(#f)
+                                     #~(#$grub-efi))))
                (initialize-hard-disk "/dev/vda"
                                      #:partitions partitions
-                                     #:grub-efi #$grub-efi
+                                     #:grub-efi grub-efi
                                      #:bootloader-package
                                      #$(bootloader-package bootloader)
                                      #:bootcfg #$bootcfg-drv