mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2025-01-05 10:56:56 -05:00
system: vm: Add arm64 support.
* 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.
This commit is contained in:
parent
8ac892c99c
commit
fd02b831ba
2 changed files with 22 additions and 12 deletions
|
@ -82,6 +82,7 @@ (define* (load-in-linux-vm builder
|
|||
make-disk-image?
|
||||
single-file-output?
|
||||
target-arm32?
|
||||
target-aarch64?
|
||||
(disk-image-size (* 100 (expt 2 20)))
|
||||
(disk-image-format "qcow2")
|
||||
(references-graphs '()))
|
||||
|
@ -97,10 +98,14 @@ (define* (load-in-linux-vm builder
|
|||
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-aarch64?))
|
||||
|
||||
(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
|
||||
|
@ -112,9 +117,9 @@ (define arch-specific-flags
|
|||
|
||||
;; 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 +130,11 @@ (define arch-specific-flags
|
|||
;; 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"))))
|
||||
|
@ -153,7 +158,9 @@ (define arch-specific-flags
|
|||
(_ #f))
|
||||
|
||||
(apply invoke qemu "-nographic" "-no-reboot"
|
||||
"-smp" (number->string (parallel-job-count))
|
||||
;; CPU "max" behaves as "host" when KVM is enabled, and like a system
|
||||
;; CPU with the maximum possible feature set otherwise.
|
||||
"-cpu" "max"
|
||||
"-m" (number->string memory-size)
|
||||
"-object" "rng-random,filename=/dev/urandom,id=guixsd-vm-rng"
|
||||
"-device" "virtio-rng-pci,rng=guixsd-vm-rng"
|
||||
|
|
|
@ -235,10 +235,12 @@ (define builder
|
|||
#: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-aarch64?’ may not operate on the
|
||||
;; right system/target values. Rewrite
|
||||
;; using ‘let-system’ when available.
|
||||
#:target-arm32? #$(target-arm32?)
|
||||
#:target-aarch64? #$(target-aarch64?)
|
||||
#:disk-image-format #$disk-image-format
|
||||
#:disk-image-size size
|
||||
#:references-graphs graphs))))))
|
||||
|
@ -452,10 +454,10 @@ (define schema
|
|||
;; 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,11 @@ (define schema
|
|||
;; 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 #$(and (not (target-arm?)) 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
|
||||
|
|
Loading…
Reference in a new issue