;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2019 Timothy Sample ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix 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. ;;; ;;; GNU Guix 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 GNU Guix. If not, see . (define-module (gnu bootloader depthcharge) #:use-module (gnu bootloader extlinux) #:use-module (gnu bootloader) #:use-module (gnu packages bootloaders) #:use-module (guix gexp) #:use-module (guix utils) #:use-module (ice-9 match) #:export (depthcharge-bootloader)) (define (signed-kernel kernel kernel-arguments initrd) (define builder (with-imported-modules '((guix build utils)) #~(begin (use-modules (guix build utils) (ice-9 binary-ports) (rnrs bytevectors)) (set-path-environment-variable "PATH" '("bin") (list #$dtc)) ;; TODO: These files have to be writable, so we copy them. ;; This can probably be fixed by using a ".its" file, just ;; be careful not to break initrd loading. (copy-file #$kernel "zImage") (chmod "zImage" #o755) (copy-file (string-append (dirname #$kernel) "/lib/dtbs/" "rk3288-veyron-speedy.dtb") "rk3288-veyron-speedy.dtb") (chmod "rk3288-veyron-speedy.dtb" #o644) (copy-file #$initrd "initrd") (chmod "initrd" #o644) (invoke (string-append #$u-boot-tools "/bin/mkimage") "-D" "-I dts -O dtb -p 2048" "-f" "auto" "-A" "arm" "-O" "linux" "-T" "kernel" "-C" "None" "-d" "zImage" "-a" "0" "-b" "rk3288-veyron-speedy.dtb" "-i" "initrd" "image.itb") (call-with-output-file "bootloader.bin" (lambda (port) (put-bytevector port (make-bytevector 512 0)))) (with-output-to-file "kernel-arguments" (lambda () (display (string-join (list #$@kernel-arguments))))) (invoke (string-append #$vboot-utils "/bin/vbutil_kernel") "--pack" #$output "--version" "1" "--vmlinuz" "image.itb" "--arch" "arm" "--keyblock" (string-append #$vboot-utils "/share/vboot-utils/devkeys/" "kernel.keyblock") "--signprivate" (string-append #$vboot-utils "/share/vboot-utils/devkeys/" "kernel_data_key.vbprivk") "--config" "kernel-arguments" "--bootloader" "bootloader.bin")))) (computed-file "vmlinux.kpart" builder)) (define* (depthcharge-configuration-file config entries #:key (system (%current-system)) (old-entries '()) #:allow-other-keys) (match entries ((entry) (let ((kernel (menu-entry-linux entry)) (kernel-arguments (menu-entry-linux-arguments entry)) (initrd (menu-entry-initrd entry))) ;; XXX: Make this a symlink. (signed-kernel kernel kernel-arguments initrd))) (_ (error "Too many bootloader menu entries!")))) (define install-depthcharge #~(lambda (bootloader device mount-point) (let ((kpart (string-append mount-point "/boot/depthcharge/vmlinux.kpart"))) (write-file-on-device kpart (stat:size (stat kpart)) device 0)))) (define depthcharge-bootloader (bootloader (name 'depthcharge) (package #f) (installer install-depthcharge) (configuration-file "/boot/depthcharge/vmlinux.kpart") (configuration-file-generator depthcharge-configuration-file))) /packages/haskell-apps.scm, gnu/packages/haskell-check.scm, gnu/packages/haskell-crypto.scm, gnu/packages/haskell-xyz.scm, gnu/packages/haskell.scm, gnu/packages/image-viewers.scm, gnu/packages/image.scm, gnu/packages/irc.scm, gnu/packages/language.scm, gnu/packages/libcanberra.scm, gnu/packages/linux.scm, gnu/packages/lisp-xyz.scm, gnu/packages/lisp.scm, gnu/packages/lolcode.scm, gnu/packages/lxde.scm, gnu/packages/lxqt.scm, gnu/packages/mail.scm, gnu/packages/markup.scm, gnu/packages/mate.scm, gnu/packages/maths.scm, gnu/packages/mc.scm, gnu/packages/messaging.scm, gnu/packages/music.scm, gnu/packages/ncurses.scm, gnu/packages/networking.scm, gnu/packages/nickle.scm, gnu/packages/openbox.scm, gnu/packages/pdf.scm, gnu/packages/perl-check.scm, gnu/packages/perl.scm, gnu/packages/python-compression.scm, gnu/packages/python-crypto.scm, gnu/packages/python-web.scm, gnu/packages/python-xyz.scm, gnu/packages/python.scm, gnu/packages/qt.scm, gnu/packages/ruby.scm, gnu/packages/rust.scm, gnu/packages/scheme.scm, gnu/packages/serialization.scm, gnu/packages/shells.scm, gnu/packages/ssh.scm, gnu/packages/suckless.scm, gnu/packages/tbb.scm, gnu/packages/telephony.scm, gnu/packages/text-editors.scm, gnu/packages/textutils.scm, gnu/packages/time.scm, gnu/packages/tls.scm, gnu/packages/tor.scm, gnu/packages/version-control.scm, gnu/packages/video.scm, gnu/packages/vim.scm, gnu/packages/web.scm, gnu/packages/wm.scm, gnu/packages/xdisorg.scm, gnu/packages/xfce.scm, gnu/packages/xml.scm, gnu/packages/xorg.scm, gnu/services/certbot.scm, gnu/services/desktop.scm, gnu/services/version-control.scm, gnu/services/web.scm, guix/import/hackage.scm, guix/licenses.scm: Likewise. Signed-off-by: Efraim Flashner <efraim@flashner.co.il> nikita