aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRicardo Ribalda <ribalda@chromium.org>2022-11-25 19:28:13 +0100
committerRicardo Ribalda <ribalda@chromium.org>2022-11-25 20:30:35 +0100
commit19f7ba75c8c1b76e016d7d1db4a8b9db4347a43a (patch)
tree184a306c376b66283f789c9bedfb4ab1b8682106
parent0f9d49c2ac3c68f12f7acdb24e8a34c53591bae7 (diff)
downloadlinux-b4/kexec-noalloc.tar.gz
autocmdlineb4/kexec-noalloc
-rw-r--r--kernel/kexec_file.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
index 0671f4f370ffb2..717e93af754459 100644
--- a/kernel/kexec_file.c
+++ b/kernel/kexec_file.c
@@ -227,21 +227,31 @@ kimage_file_prepare_segments(struct kimage *image, int kernel_fd, int initrd_fd,
}
if (cmdline_len) {
- image->cmdline_buf = memdup_user(cmdline_ptr, cmdline_len);
- if (IS_ERR(image->cmdline_buf)) {
- ret = PTR_ERR(image->cmdline_buf);
- image->cmdline_buf = NULL;
+ char *aux = memdup_user(cmdline_ptr, cmdline_len);
+ if (IS_ERR(aux)) {
+ ret = PTR_ERR(aux);
goto out;
}
- image->cmdline_buf_len = cmdline_len;
-
/* command line should be a string with last byte null */
- if (image->cmdline_buf[cmdline_len - 1] != '\0') {
+ if (aux[cmdline_len - 1] != '\0') {
ret = -EINVAL;
goto out;
}
+ if (flags & KEXEC_FILE_ON_CRASH && !__crash_memory_valid() && vmcoreinfo_data) {
+ image->cmdline_buf = kasprintf(GFP_KERNEL, "%s elfcorehdr=0x%lx", aux, virt_to_boot_phys(vmcoreinfo_data));
+ kfree(aux);
+ if (IS_ERR(image->cmdline_buf)) {
+ ret = PTR_ERR(aux);
+ goto out;
+ }
+ image->cmdline_buf_len = strlen(image->cmdline_buf) + 1;
+ } else {
+ image->cmdline_buf = aux;
+ image->cmdline_buf_len = cmdline_len;
+ }
+
ima_kexec_cmdline(kernel_fd, image->cmdline_buf,
image->cmdline_buf_len - 1);
}