summaryrefslogtreecommitdiff
path: root/gnu/bootloader.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/bootloader.scm')
-rw-r--r--gnu/bootloader.scm53
1 files changed, 47 insertions, 6 deletions
diff --git a/gnu/bootloader.scm b/gnu/bootloader.scm
index 77c05e8946..da65b9d5d5 100644
--- a/gnu/bootloader.scm
+++ b/gnu/bootloader.scm
@@ -34,6 +34,8 @@
#:use-module (guix diagnostics)
#:use-module (guix i18n)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-34)
+ #:use-module (srfi srfi-35)
#:use-module (ice-9 match)
#:export (menu-entry
menu-entry?
@@ -46,6 +48,7 @@
menu-entry-multiboot-kernel
menu-entry-multiboot-arguments
menu-entry-multiboot-modules
+ menu-entry-chain-loader
menu-entry->sexp
sexp->menu-entry
@@ -104,8 +107,27 @@
(multiboot-arguments menu-entry-multiboot-arguments
(default '())) ; list of string-valued gexps
(multiboot-modules menu-entry-multiboot-modules
- (default '()))) ; list of multiboot commands, where
+ (default '())) ; list of multiboot commands, where
; a command is a list of <string>
+ (chain-loader menu-entry-chain-loader
+ (default #f))) ; string, path of efi file
+
+(define (report-menu-entry-error menu-entry)
+ (raise
+ (condition
+ (&message
+ (message
+ (format #f (G_ "invalid menu-entry: ~a") menu-entry)))
+ (&fix-hint
+ (hint
+ (G_ "Please chose only one of:
+@enumerate
+@item direct boot by specifying fields @code{linux},
+@code{linux-arguments} and @code{linux-modules},
+@item multiboot by specifying fields @code{multiboot-kernel},
+@code{multiboot-arguments} and @code{multiboot-modules},
+@item chain-loader by specifying field @code{chain-loader}.
+@end enumerate"))))))
(define (menu-entry->sexp entry)
"Return ENTRY serialized as an sexp."
@@ -117,8 +139,9 @@
`(label ,(file-system-label->string label)))
(_ device)))
(match entry
- (($ <menu-entry> label device mount-point linux linux-arguments initrd #f
- ())
+ (($ <menu-entry> label device mount-point
+ (? identity linux) linux-arguments (? identity initrd)
+ #f () () #f)
`(menu-entry (version 0)
(label ,label)
(device ,(device->sexp device))
@@ -127,14 +150,23 @@
(linux-arguments ,linux-arguments)
(initrd ,initrd)))
(($ <menu-entry> label device mount-point #f () #f
- multiboot-kernel multiboot-arguments multiboot-modules)
+ (? identity multiboot-kernel) multiboot-arguments
+ multiboot-modules #f)
`(menu-entry (version 0)
(label ,label)
(device ,(device->sexp device))
(device-mount-point ,mount-point)
(multiboot-kernel ,multiboot-kernel)
(multiboot-arguments ,multiboot-arguments)
- (multiboot-modules ,multiboot-modules)))))
+ (multiboot-modules ,multiboot-modules)))
+ (($ <menu-entry> label device mount-point #f () #f #f () ()
+ (? identity chain-loader))
+ `(menu-entry (version 0)
+ (label ,label)
+ (device ,(device->sexp device))
+ (device-mount-point ,mount-point)
+ (chain-loader ,chain-loader)))
+ (_ (report-menu-entry-error entry))))
(define (sexp->menu-entry sexp)
"Turn SEXP, an sexp as returned by 'menu-entry->sexp', into a <menu-entry>
@@ -171,7 +203,16 @@ record."
(device-mount-point mount-point)
(multiboot-kernel multiboot-kernel)
(multiboot-arguments multiboot-arguments)
- (multiboot-modules multiboot-modules)))))
+ (multiboot-modules multiboot-modules)))
+ (('menu-entry ('version 0)
+ ('label label) ('device device)
+ ('device-mount-point mount-point)
+ ('chain-loader chain-loader) _ ...)
+ (menu-entry
+ (label label)
+ (device (sexp->device device))
+ (device-mount-point mount-point)
+ (chain-loader chain-loader)))))
;;;