Subject: bug#41120: uvesafb service is unsupported on aarch64

From: "pelzflorian (Florian Pelz)" <[email-masked]>
Date: Thu, 7 May 2020 16:55:11 +0200

On Thu, May 07, 2020 at 11:12:34AM +0300, Efraim Flashner wrote:
> I haven't tested the produced image, but the following builds without
> trying to also build v86d
> 
>          (start
>            (if (and (and (string-suffix? "linux-gnu" %host-type)
>                          (or (string-prefix? "x86_64" %host-type)
>                              (string-prefix? "i686" %host-type)))
>                     (file-exists? "/dev/fb0"))
>              #~(lambda ()
>                  ;; uvesafb is only supported on x86 and x86_64.
>                  (invoke #+(file-append kmod "/bin/modprobe")
>                          "uvesafb"
>                          (string-append "v86d=" #$v86d "/sbin/v86d")
>                          "mode_option=1024x768"))
>              #~(lambda () #t)))

This way uvesafb is started unconditionally on x86_64, even when it is
not needed, leading to video corruption on some boots in QEMU.

I have more success with moving the file-exists check into the
#~(lambda …) like the attached patch.  But I’m not sure it really
fixes ARM builds.

I tested via

qemu-system-x86_64 -m 1024 -smp 1 -enable-kvm -nic user,model=virtio-net-pci -boot menu=on,order=d -drive media=cdrom,file=/gnu/store/0cgbp4y7awk4spg49ajw077xyzk24fi0-iso9660-image

and on hardware.  With QEMU, uvesafb is needed if and only if
nomodeset is passed as a kernel parameter.

Now how to build an ARM image for QEMU?

Sorry I left such a mess with uvesafb.

Regards,
Florian
>From 13fd2b590e37095ed4213d7bb85422b48deab9c6 Mon Sep 17 00:00:00 2001
From: Florian Pelz <[email-masked]>
Date: Thu, 7 May 2020 13:26:19 +0200
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Subject: [PATCH] installer: Do not load uvesafb on non-x86 install images.

Fixes <https://bugs.gnu.org/41120>.
Suggested by Efraim Flashner <[email-masked]>.

* gnu/system/install.scm (uvesafb-shepherd-service): Do not build x86-only
v86d helper unconditionally.
---
 gnu/system/install.scm | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/gnu/system/install.scm b/gnu/system/install.scm
index 6435c1bff4..ad8a84091c 100644
--- a/gnu/system/install.scm
+++ b/gnu/system/install.scm
@@ -299,16 +299,18 @@ the user's target storage device rather than on the RAM disk."
          (documentation "Load the uvesafb kernel module if needed.")
          (provision '(maybe-uvesafb))
          (requirement '(file-systems))
-         (start #~(lambda ()
-                    ;; uvesafb is only supported on x86 and x86_64.
-                    (or (not (and (string-suffix? "linux-gnu" %host-type)
-                                  (or (string-prefix? "x86_64" %host-type)
-                                      (string-prefix? "i686" %host-type))))
-                        (file-exists? "/dev/fb0")
-                        (invoke #+(file-append kmod "/bin/modprobe")
-                                "uvesafb"
-                                (string-append "v86d=" #$v86d "/sbin/v86d")
-                                "mode_option=1024x768"))))
+         (start
+           (if (and (and (string-suffix? "linux-gnu" %host-type)
+                         (or (string-prefix? "x86_64" %host-type)
+                             (string-prefix? "i686" %host-type)))
+                    (file-exists? "/dev/fb0"))
+             #~(lambda ()
+                 ;; uvesafb is only supported on x86 and x86_64.
+                 (invoke #+(file-append kmod "/bin/modprobe")
+                         "uvesafb"
+                         (string-append "v86d=" #$v86d "/sbin/v86d")
+                         "mode_option=1024x768"))
+             #~(lambda () #t)))
          (respawn? #f)
          (one-shot? #t))))
 
-- 
2.26.1