blob: 5b292351f394668dd5b9e5baa9019869d454fa33 (
about) (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
;;; Copyright © 2020 Alex Griffin <a@ajgrf.com>
;;;
;;; This program is free software: you can redistribute it and/or modify
;;; it under the terms of the GNU General Public License as published by
;;; the Free Software Foundation, either version 3 of the License, or
;;; (at your option) any later version.
;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with this program. If not, see <https://www.gnu.org/licenses/>.
(define-module (nongnu system linux-initrd)
#:use-module (gnu system linux-initrd)
#:use-module (guix gexp)
#:use-module (guix modules)
#:use-module (guix utils)
#:use-module (nongnu packages linux)
#:use-module (nonguix modules)
#:export (microcode-initrd))
;; See https://www.kernel.org/doc/Documentation/x86/microcode.txt
(define* (microcode-initrd file-systems
#:key
(initrd base-initrd)
(microcode-packages (list amd-microcode
intel-microcode))
#:allow-other-keys
#:rest rest)
"Build INITRD, extended to include x86 processor microcode from
MICROCODE-PACKAGES."
(let ((args (strip-keyword-arguments '(#:initrd #:microcode-packages) rest)))
(combined-initrd (microcode-initrd* microcode-packages)
(apply initrd file-systems
args))))
(define (microcode-initrd* microcode-packages)
"Build an uncompressed initrd containing x86 processor microcode from
MICROCODE-PACKAGES, in the format expected by the kernel."
(define builder
(with-imported-modules (source-module-closure
'((gnu build linux-initrd)
(guix build utils)
(nonguix build utils))
#:select? import-nonguix-module?)
#~(begin
(use-modules (gnu build linux-initrd)
(guix build utils)
(nonguix build utils))
(let* ((initrd (string-append #$output "/initrd.cpio"))
(dest-dir "kernel/x86/microcode")
(amd-bin (string-append dest-dir "/AuthenticAMD.bin"))
(intel-bin (string-append dest-dir "/GenuineIntel.bin")))
(mkdir-p dest-dir)
(for-each
(lambda (package)
(let ((intel-ucode (string-append package
"/lib/firmware/intel-ucode"))
(amd-ucode (string-append package
"/lib/firmware/amd-ucode")))
(when (directory-exists? intel-ucode)
(concatenate-files (find-files intel-ucode ".*")
intel-bin))
(when (directory-exists? amd-ucode)
(concatenate-files (find-files amd-ucode
"^microcode_amd.*\\.bin$")
amd-bin))))
'#$microcode-packages)
(mkdir-p #$output)
(write-cpio-archive initrd "kernel" #:compress? #f)))))
(file-append (computed-file "microcode-initrd" builder)
"/initrd.cpio"))
(define (combined-initrd . initrds)
"Return a combined initrd, the result of concatenating INITRDS."
(define builder
(with-imported-modules (source-module-closure
'((guix build utils)
(nonguix build utils))
#:select? import-nonguix-module?)
#~(begin
(use-modules (guix build utils)
(nonguix build utils))
;; Use .img suffix since the result is no longer easily inspected by
;; standard tools like cpio and gzip.
(let ((initrd (string-append #$output "/initrd.img")))
(mkdir-p #$output)
(concatenate-files '#$initrds initrd)))))
(file-append (computed-file "combined-initrd" builder)
"/initrd.img"))
|