Subject: [PATCH 1/2] gnu: ovmf-x86-64: Install QEMU firmware metadata file.

From: Maxim Cournoyer <[email-masked]>
Date: Wed, 19 Mar 2025 21:45:12 +0900

* gnu/packages/firmware.scm (ovmf-x86-64)
[phases] {install-qemu-firmware-metadata}: New phase.
(ovmf-aux-file): New procedure.
* gnu/packages/aux-files/ovmf/51-edk2-ovmf-2m-raw-x64-nosb.json: New file.
* Makefile.am (AUX_FILES): Register it.

Change-Id: I301eac8b79aed523f3b4cdedb7b3925d8fd0ad3d
---

 Makefile.am                                   |  1 +
 .../ovmf/51-edk2-ovmf-2m-raw-x64-nosb.json    | 36 +++++++++++++++++++
 gnu/packages/firmware.scm                     | 24 ++++++++++++-
 3 files changed, 60 insertions(+), 1 deletion(-)
 create mode 100644 gnu/packages/aux-files/ovmf/51-edk2-ovmf-2m-raw-x64-nosb.json

diff --git a/Makefile.am b/Makefile.am
index c668b96a37..f2f4a9643e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -472,6 +472,7 @@ AUX_FILES =						\
   gnu/packages/aux-files/linux-libre/5.4-arm64.conf	\
   gnu/packages/aux-files/linux-libre/5.4-i686.conf	\
   gnu/packages/aux-files/linux-libre/5.4-x86_64.conf	\
+  gnu/packages/aux-files/ovmf/51-edk2-ovmf-2m-raw-x64-nosb.json	\
   gnu/packages/aux-files/pack-audit.c			\
   gnu/packages/aux-files/python/sanity-check.py		\
   gnu/packages/aux-files/python/sitecustomize.py	\
diff --git a/gnu/packages/aux-files/ovmf/51-edk2-ovmf-2m-raw-x64-nosb.json b/gnu/packages/aux-files/ovmf/51-edk2-ovmf-2m-raw-x64-nosb.json
new file mode 100644
index 0000000000..050853e2b8
--- /dev/null
+++ b/gnu/packages/aux-files/ovmf/51-edk2-ovmf-2m-raw-x64-nosb.json
@@ -0,0 +1,36 @@
+{
+    "description": "OVMF without SB+SMM, empty varstore",
+    "interface-types": [
+        "uefi"
+    ],
+    "mapping": {
+        "device": "flash",
+        "mode" : "split",
+        "executable": {
+            "filename": "/usr/share/edk2/ovmf/OVMF_CODE.fd",
+            "format": "raw"
+        },
+        "nvram-template": {
+            "filename": "/usr/share/edk2/ovmf/OVMF_VARS.fd",
+            "format": "raw"
+        }
+    },
+    "targets": [
+        {
+            "architecture": "x86_64",
+            "machines": [
+                "pc-i440fx-*",
+                "pc-q35-*"
+            ]
+        }
+    ],
+    "features": [
+        "acpi-s3",
+        "amd-sev",
+        "amd-sev-es",
+        "verbose-dynamic"
+    ],
+    "tags": [
+
+    ]
+}
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 63f767f72b..c1d8ba3719 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1001,6 +1001,10 @@ (define* (make-ovmf-firmware arch)
       (license (list license:expat
                      license:bsd-2 license:bsd-3 license:bsd-4)))))
 
+(define (ovmf-aux-file name)
+  "Return as a gexp the auxiliary OVMF file corresponding to NAME."
+  (local-file (search-auxiliary-file (string-append "ovmf/" name))))
+
 (define-public ovmf-x86-64
   (let ((base (make-ovmf-firmware "x86_64")))
     (package
@@ -1022,7 +1026,25 @@ (define-public ovmf-x86-64
                         (string-append fmw "/" (string-downcase file) "_x64.bin")))
                      (list "OVMF"
                            "OVMF_CODE"
-                           "OVMF_VARS"))))))))))))
+                           "OVMF_VARS")))))
+              (add-after 'install 'install-qemu-firmware-metadata
+                (lambda _
+                  ;; The QEMU firmware metadata files are taken from the
+                  ;; Fedora project (see:
+                  ;; https://src.fedoraproject.org/rpms/edk2/tree/rawhide).
+                  (let ((51-edk2-ovmf-2m-raw-x64-nosb.json-source
+                         #$(ovmf-aux-file "51-edk2-ovmf-2m-raw-x64-nosb.json"))
+                        (51-edk2-ovmf-2m-raw-x64-nosb.json-dest
+                         (string-append #$output "/share/qemu/firmware/"
+                                        "51-edk2-ovmf-2m-raw-x64-nosb.json")))
+                    (mkdir-p (dirname 51-edk2-ovmf-2m-raw-x64-nosb.json-dest))
+                    (copy-file 51-edk2-ovmf-2m-raw-x64-nosb.json-source
+                               51-edk2-ovmf-2m-raw-x64-nosb.json-dest)
+                    (substitute* 51-edk2-ovmf-2m-raw-x64-nosb.json-dest
+                      (("/usr/share/edk2/ovmf/OVMF_(CODE|VARS).fd" _ kind)
+                       (string-append
+                        #$output "/share/firmware/ovmf_"
+                        (string-downcase kind) "_x64.bin")))))))))))))
 
 (define-public ovmf-i686
   (let ((base (make-ovmf-firmware "i686")))

base-commit: fa39695bbc0c5f79838cbca55d55eebd821a8efa
-- 
2.48.1