From: "Ludovic Courtès" <ludo@gnu.org>
To: 75027@debbugs.gnu.org
Cc: "Ludovic Courtès" <ludo@gnu.org>
Subject: [bug#75027] [PATCH v2 1/3] syscalls: Add ‘kexec-load-file’.
Date: Thu, 26 Dec 2024 18:21:25 +0100 [thread overview]
Message-ID: <c38e2be82743c57be5da2ed45d85fd7835e51a17.1735233263.git.ludo@gnu.org> (raw)
In-Reply-To: <cover.1735233263.git.ludo@gnu.org>
* guix/build/syscalls.scm (string->utf-8/nul-terminated)
(kexec-load-file): New procedures.
* tests/syscalls.scm ("kexec-load-file"): New test.
Change-Id: I3724226a14ecc07f346e77519fb5b0591096c7f6
---
guix/build/syscalls.scm | 54 +++++++++++++++++++++++++++++++++++++++++
tests/syscalls.scm | 13 ++++++++++
2 files changed, 67 insertions(+)
diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm
index 2c20edf058..f8c9937f54 100644
--- a/guix/build/syscalls.scm
+++ b/guix/build/syscalls.scm
@@ -146,6 +146,12 @@ (define-module (guix build syscalls)
clone
setns
+ kexec-load-file
+ KEXEC_FILE_UNLOAD
+ KEXEC_FILE_ON_CRASH
+ KEXEC_FILE_NO_INITRAMFS
+ KEXEC_FILE_DEBUG
+
PF_PACKET
AF_PACKET
all-network-interface-names
@@ -765,6 +771,54 @@ (define-as-needed load-linux-module
(list (strerror err))
(list err)))))))
+(define (string->utf-8/nul-terminated str)
+ "Serialize STR to UTF-8; return the resulting bytevector, including
+terminating nul character."
+ (let* ((source (string->utf8 str))
+ (bv (make-bytevector (+ (bytevector-length source) 1) 0)))
+ (bytevector-copy! source 0 bv 0 (bytevector-length source))
+ bv))
+
+;; Constants from <linux/kexec.h>.
+(define KEXEC_FILE_UNLOAD #x00000001)
+(define KEXEC_FILE_ON_CRASH #x00000002)
+(define KEXEC_FILE_NO_INITRAMFS #x00000004)
+(define KEXEC_FILE_DEBUG #x00000008)
+
+(define kexec-load-file
+ (let* ((proc (syscall->procedure int "syscall"
+ (list long ;sysno
+ int ;kernel fd
+ int ;initrd fd
+ unsigned-long ;cmdline length
+ '* ;cmdline
+ unsigned-long))) ;flags
+ ;; TODO: Don't do this.
+ (syscall-id (match (utsname:machine (uname))
+ ("i686" 320)
+ ("x86_64" 320)
+ ("armv7l" 401)
+ ("aarch64" 401)
+ ;; XXX: There's apparently no support for ppc64le and
+ ;; riscv64.
+ (_ #f))))
+ (lambda* (kernel-fd initrd-fd command-line #:optional (flags 0))
+ "Load for eventual use of kexec(8) the Linux kernel from
+@var{kernel-fd}, its initial RAM disk from @var{initrd-fd}, with the given
+@var{command-line} (a string). Optionally, @var{flags} can be a bitwise or of
+the KEXEC_FILE_* constants."
+ (let*-values (((command-line)
+ (string->utf-8/nul-terminated command-line))
+ ((ret err)
+ (proc syscall-id kernel-fd initrd-fd
+ (bytevector-length command-line)
+ (bytevector->pointer command-line)
+ flags)))
+ (when (= ret -1)
+ (throw 'system-error "kexec-load-file" "~A"
+ (list (strerror err))
+ (list err)))))))
+
(define (linux-process-flags pid) ;copied from the Shepherd
"Return the process flags of @var{pid} (or'd @code{PF_} constants), assuming
the Linux /proc file system is mounted; raise a @code{system-error} exception
diff --git a/tests/syscalls.scm b/tests/syscalls.scm
index 13f4f11721..eef864d097 100644
--- a/tests/syscalls.scm
+++ b/tests/syscalls.scm
@@ -679,6 +679,19 @@ (define perform-container-tests?
(lambda args
(system-error-errno args))))))
+(when (or (zero? (getuid))
+ (not (string-contains %host-type "linux")))
+ (test-skip 1))
+(test-equal "kexec-load-file"
+ EPERM
+ (catch 'system-error
+ (lambda ()
+ (let ((fd1 (open-fdes "/dev/null" O_RDONLY))
+ (fd2 (open-fdes "/dev/null" O_RDONLY)))
+ (kexec-load-file fd1 fd2 "gnu.repl=yes")))
+ (lambda args
+ (system-error-errno args))))
+
(test-end)
(false-if-exception (delete-file temp-file))
--
2.46.0
next prev parent reply other threads:[~2024-12-26 17:23 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-22 15:56 [bug#75027] [PATCH 0/3] 'guix system reconfigure' loads system for kexec reboot Ludovic Courtès
2024-12-22 15:57 ` [bug#75027] [PATCH 1/3] syscalls: Add ‘kexec-load-file’ Ludovic Courtès
2024-12-22 15:57 ` [bug#75027] [PATCH 2/3] system: Export ‘…-initrd-file’ and ‘…-root-file-system’ Ludovic Courtès
2024-12-22 15:57 ` [bug#75027] [PATCH 3/3] reconfigure: Call ‘kexec-load-file’ Ludovic Courtès
2024-12-22 21:47 ` [bug#75027] [PATCH 0/3] 'guix system reconfigure' loads system for kexec reboot Jakob Kirsch via Guix-patches via
[not found] ` <87y106ej9v.fsf@gnu.org>
2024-12-23 18:24 ` Jakob Kirsch via Guix-patches via
2024-12-26 17:25 ` Ludovic Courtès
2024-12-26 17:21 ` [bug#75027] [PATCH v2 " Ludovic Courtès
2024-12-26 17:21 ` Ludovic Courtès [this message]
2024-12-28 6:12 ` [bug#75027] [PATCH v2 1/3] syscalls: Add ‘kexec-load-file’ Maxim Cournoyer
2024-12-26 17:21 ` [bug#75027] [PATCH v2 2/3] system: Export ‘…-initrd-file’ and ‘…-root-file-system’ Ludovic Courtès
2024-12-28 6:12 ` Maxim Cournoyer
2024-12-26 17:21 ` [bug#75027] [PATCH v2 3/3] reconfigure: Support loading the system for kexec reboot Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c38e2be82743c57be5da2ed45d85fd7835e51a17.1735233263.git.ludo@gnu.org \
--to=ludo@gnu.org \
--cc=75027@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).