summary refs log tree commit diff
diff options
context:
space:
mode:
authorMarius Bakke <marius@gnu.org>2022-12-17 23:26:09 +0100
committerMarius Bakke <marius@gnu.org>2022-12-19 23:08:22 +0100
commit814214c369851da50e7006266f718b2d9324ada0 (patch)
tree8545c11c32e54eb9b788677f3e578f2c7bb7211f
parentb2fc209b2ce5b6f18f1cf9d8c599f52e608ace42 (diff)
downloadguix-814214c369851da50e7006266f718b2d9324ada0.tar.gz
gnu: QEMU: Unbundle SeaBIOS.
* gnu/packages/virtualization.scm (qemu)[source](snippet): Delete SeaBIOS
ROMs and source code.
[arguments]: Add replace-firmwares and delete-firmwares phases.
[inputs]: Add SEABIOS.
[native-inputs]: Add ACPICA.  While here, sort inputs.
-rw-r--r--gnu/packages/virtualization.scm69
1 files changed, 61 insertions, 8 deletions
diff --git a/gnu/packages/virtualization.scm b/gnu/packages/virtualization.scm
index 6890f13233..d0f5fd5af4 100644
--- a/gnu/packages/virtualization.scm
+++ b/gnu/packages/virtualization.scm
@@ -175,10 +175,13 @@
        (modules '((guix build utils)))
        (snippet
         '(begin
+           ;; TODO: Scrub all firmwares from this directory!
+           (with-directory-excursion "pc-bios"
+             ;; Delete firmwares provided by SeaBIOS.
+             (for-each delete-file (find-files "." "^(bios|vgabios).*\\.bin$")))
            ;; Delete bundled code that we provide externally.
-           ;; TODO: Unbundle SeaBIOS!
            (for-each delete-file-recursively
-                     '("dtc" "meson"))))))
+                     '("dtc" "meson" "roms/seabios"))))))
     (outputs '("out" "static" "doc"))   ;5.3 MiB of HTML docs
     (build-system gnu-build-system)
     (arguments
@@ -189,15 +192,20 @@
                    (not (string=? "i686-linux" (%current-system))))
       #:configure-flags
       #~(let ((gcc (search-input-file %build-inputs "/bin/gcc"))
+              (meson (search-input-file %build-inputs "bin/meson"))
+              (seabios (search-input-file %build-inputs
+                                          "share/firmware/bios.bin"))
               (out #$output))
           (list (string-append "--cc=" gcc)
                 ;; Some architectures insist on using HOST_CC.
                 (string-append "--host-cc=" gcc)
+                (string-append "--meson=" meson)
                 (string-append "--prefix=" out)
+
                 "--sysconfdir=/etc"
-                (string-append "--meson=" (search-input-file %build-inputs
-                                                             "bin/meson"))
                 "--enable-fdt=system"
+                (string-append "--firmwarepath=" out "/share/qemu:"
+                               (dirname seabios))
                 (string-append "--smbd=" out "/libexec/samba-wrapper")
                 "--disable-debug-info"  ;for space considerations
                 ;; The binaries need to be linked against -lrt.
@@ -211,6 +219,33 @@
                   ,@%gnu-build-system-modules)
       #:phases
       #~(modify-phases %standard-phases
+          ;; Since we removed the bundled firmwares above, many tests
+          ;; can't work.  Re-add them here.
+          (add-after 'unpack 'replace-firmwares
+            (lambda* (#:key inputs #:allow-other-keys)
+              (let* ((seabios (dirname (search-input-file
+                                        inputs "share/firmware/bios.bin")))
+                     (seabios-firmwares (find-files seabios "\\.bin$"))
+                     (allowed-differences
+                      ;; Ignore minor differences (addresses etc) in the firmware
+                      ;; data tables compared to what the test suite expects.
+                      '("tests/data/acpi/pc/SSDT.dimmpxm"
+                        "tests/data/acpi/pc/DSDT.dimmpxm"
+                        "tests/data/acpi/pc/ERST.acpierst"
+                        "tests/data/acpi/q35/ERST.acpierst"
+                        "tests/data/acpi/q35/DSDT.cxl"))
+                     (allowed-differences-whitelist
+                      (open-file "tests/qtest/bios-tables-test-allowed-diff.h"
+                                 "a")))
+                (with-directory-excursion "pc-bios"
+                  (for-each (lambda (file)
+                              (symlink file (basename file)))
+                            seabios-firmwares))
+                (for-each (lambda (file)
+                            (format allowed-differences-whitelist
+                                    "\"~a\",~%" file))
+                          allowed-differences)
+                (close-port allowed-differences-whitelist))))
           (add-after 'unpack 'extend-test-time-outs
             (lambda _
               ;; These tests can time out on heavily-loaded and/or slow storage.
@@ -277,17 +312,22 @@
               (mkdir-p "b/qemu")
               (chdir "b/qemu")
               (apply invoke "../../configure" configure-flags)))
+
           ;; Configure, build and install QEMU user-emulation static binaries.
           (add-after 'configure 'configure-user-static
             (lambda* (#:key inputs outputs #:allow-other-keys)
               (let* ((static (assoc-ref outputs "static"))
                      (gcc (search-input-file inputs "/bin/gcc"))
+                     (seabios (search-input-file inputs "/share/firmware/bios.bin"))
                      ;; This is the common set of configure flags; it is
                      ;; duplicated here to isolate this phase from manipulations
                      ;; to the #:configure-flags build argument, as done in
                      ;; derived packages such as qemu-minimal.
                      (configure-flags (list (string-append "--cc=" gcc)
                                             (string-append "--host-cc=" gcc)
+                                            (string-append "--firmwarepath="
+                                                           #$output "/share/qemu:"
+                                                           (dirname seabios))
                                             "--sysconfdir=/etc"
                                             "--disable-debug-info")))
               (mkdir-p "../user-static")
@@ -313,6 +353,15 @@
                                         (scandir "."
                                                  (cut string-suffix?
                                                       "-linux-user" <>))))))))
+
+          (add-after 'install 'delete-firmwares
+            (lambda _
+              ;; Delete firmares that are accessible on --firmwarepath.
+              ;; For some reason tests fail if we simply remove them from
+              ;; pc-bios/meson.build, hence this roundabout way.
+              (with-directory-excursion (string-append #$output "/share/qemu")
+                (for-each delete-file
+                          (find-files "." "^(vga)?bios(-[a-z0-9-]+)?\\.bin$")))))
           ;; Create a wrapper for Samba. This allows QEMU to use Samba without
           ;; pulling it in as an input. Note that you need to explicitly install
           ;; Samba in your Guix profile for Samba support.
@@ -357,6 +406,7 @@ exec smbd $@")))
            pixman
            pulseaudio
            sdl2
+           seabios
            spice
            usbredir
            util-linux
@@ -367,13 +417,16 @@ exec smbd $@")))
            zlib
            `(,zstd "lib")))
     (native-inputs
-     (list gettext-minimal
-           `(,glib "bin")               ;gtester, etc.
-           perl
-           flex
+     ;; Note: acpica is here only to pretty-print firmware differences with IASL
+     ;; (see the replace-firmwares phase above).
+     (list acpica
            bison
+           flex
+           gettext-minimal
+           `(,glib "bin")               ;gtester, etc.
            meson-0.63
            ninja
+           perl
            pkg-config
            python-wrapper
            python-sphinx