GNU Linux-libre 4.19.245-gnu1
[releases.git] / arch / s390 / kernel / kexec_image.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Image loader for kexec_file_load system call.
4  *
5  * Copyright IBM Corp. 2018
6  *
7  * Author(s): Philipp Rudo <prudo@linux.vnet.ibm.com>
8  */
9
10 #include <linux/errno.h>
11 #include <linux/kernel.h>
12 #include <linux/kexec.h>
13 #include <asm/setup.h>
14
15 static int kexec_file_add_image_kernel(struct kimage *image,
16                                        struct s390_load_data *data,
17                                        char *kernel, unsigned long kernel_len)
18 {
19         struct kexec_buf buf;
20         int ret;
21
22         buf.image = image;
23
24         buf.buffer = kernel + STARTUP_NORMAL_OFFSET;
25         buf.bufsz = kernel_len - STARTUP_NORMAL_OFFSET;
26
27         buf.mem = STARTUP_NORMAL_OFFSET;
28         if (image->type == KEXEC_TYPE_CRASH)
29                 buf.mem += crashk_res.start;
30         buf.memsz = buf.bufsz;
31
32         ret = kexec_add_buffer(&buf);
33
34         data->kernel_buf = kernel;
35         data->memsz += buf.memsz + STARTUP_NORMAL_OFFSET;
36
37         return ret;
38 }
39
40 static void *s390_image_load(struct kimage *image,
41                              char *kernel, unsigned long kernel_len,
42                              char *initrd, unsigned long initrd_len,
43                              char *cmdline, unsigned long cmdline_len)
44 {
45         struct s390_load_data data = {0};
46         int ret;
47
48         ret = kexec_file_add_image_kernel(image, &data, kernel, kernel_len);
49         if (ret)
50                 return ERR_PTR(ret);
51
52         if (initrd) {
53                 ret = kexec_file_add_initrd(image, &data, initrd, initrd_len);
54                 if (ret)
55                         return ERR_PTR(ret);
56         }
57
58         ret = kexec_file_add_purgatory(image, &data);
59         if (ret)
60                 return ERR_PTR(ret);
61
62         return kexec_file_update_kernel(image, &data);
63 }
64
65 static int s390_image_probe(const char *buf, unsigned long len)
66 {
67         /* Can't reliably tell if an image is valid.  Therefore give the
68          * user whatever he wants.
69          */
70         return 0;
71 }
72
73 const struct kexec_file_ops s390_kexec_image_ops = {
74         .probe = s390_image_probe,
75         .load = s390_image_load,
76 };