Subject: Re: bug#60010: [version 1.4.0] AMD screen stays black; modprobe fails

From: Ludovic Courtès <[email-masked]>
Date: Thu, 15 Dec 2022 00:29:32 +0100

"pelzflorian (Florian Pelz)" <[email-masked]> skribis:

> Ludovic Courtès <[email-masked]> writes:
>> Do you see hints as to whether uvesafb gets loaded?
>>
>> You can do that by adding “console=ttyS0” to the kernel arguments and by
>> passing ‘-serial stdio’ to QEMU.
>
> This serial output shows nothing about uvesafb, but dmesg contains about
> uvesafb exactly the same modprobe failure as initially without
> LINUX_MODULE_DIRECTORY.

Oooh.  ‘invoke’ uses ‘system*’, and in shepherd 0.9.3, ‘system*’ is
implemented in terms of ‘fork+exec-command’, which only passes the
environment variables listed in ‘default-environment-variables’ by
default.  Thus, (setenv "LINUX_MODULE_DIRECTORY" …) had no effect on the
child process; it just wouldn’t see LINUX_MODULE_DIRECTORY.

I think the patch below will be good… or very close to it.

Lemme know!

Thanks,
Ludo’.

diff --git a/gnu/system/install.scm b/gnu/system/install.scm
index f6f1923121..e524729baf 100644
--- a/gnu/system/install.scm
+++ b/gnu/system/install.scm
@@ -289,11 +289,21 @@ (define (uvesafb-shepherd-service _)
          (provision '(maybe-uvesafb))
          (requirement '(file-systems))
          (start #~(lambda ()
-                    (or (file-exists? "/dev/fb0")
+                    (unless (file-exists? "/dev/fb0")
+                      ;; In shepherd 0.9.3, 'system*' is implemented in terms
+                      ;; of 'fork+exec-command'.  Thus, set
+                      ;; 'default-environment-variables' to pass an extra
+                      ;; variable to the child process.
+                      (parameterize ((default-environment-variables
+                                       `("LINUX_MODULE_DIRECTORY=/run/booted-system/kernel/lib/modules"
+                                         ,(environ))))
+                        ;; TODO: Use 'load-linux-modules-from-directory'
+                        ;; instead.
                         (invoke #+(file-append kmod "/bin/modprobe")
                                 "uvesafb"
                                 (string-append "v86d=" #$v86d "/sbin/v86d")
-                                "mode_option=1024x768"))))
+                                "mode_option=1024x768"))
+                      #t)))
          (respawn? #f)
          (one-shot? #t))))