blob: af23eff5774dba339beeb69c34565f92edd87568 [file] [log] [blame]
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001// 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>
David Brazdil0f672f62019-12-10 10:32:29 +000013#include <asm/ipl.h>
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000014#include <asm/setup.h>
15
David Brazdil0f672f62019-12-10 10:32:29 +000016static int kexec_file_add_kernel_image(struct kimage *image,
17 struct s390_load_data *data)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000018{
19 struct kexec_buf buf;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000020
21 buf.image = image;
22
David Brazdil0f672f62019-12-10 10:32:29 +000023 buf.buffer = image->kernel_buf;
24 buf.bufsz = image->kernel_buf_len;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000025
David Brazdil0f672f62019-12-10 10:32:29 +000026 buf.mem = 0;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000027 if (image->type == KEXEC_TYPE_CRASH)
28 buf.mem += crashk_res.start;
29 buf.memsz = buf.bufsz;
30
David Brazdil0f672f62019-12-10 10:32:29 +000031 data->kernel_buf = image->kernel_buf;
32 data->kernel_mem = buf.mem;
33 data->parm = image->kernel_buf + PARMAREA;
34 data->memsz += buf.memsz;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000035
David Brazdil0f672f62019-12-10 10:32:29 +000036 ipl_report_add_component(data->report, &buf,
37 IPL_RB_COMPONENT_FLAG_SIGNED |
38 IPL_RB_COMPONENT_FLAG_VERIFIED,
39 IPL_RB_CERT_UNKNOWN);
40 return kexec_add_buffer(&buf);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000041}
42
43static void *s390_image_load(struct kimage *image,
44 char *kernel, unsigned long kernel_len,
45 char *initrd, unsigned long initrd_len,
46 char *cmdline, unsigned long cmdline_len)
47{
David Brazdil0f672f62019-12-10 10:32:29 +000048 return kexec_file_add_components(image, kexec_file_add_kernel_image);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000049}
50
51static int s390_image_probe(const char *buf, unsigned long len)
52{
53 /* Can't reliably tell if an image is valid. Therefore give the
54 * user whatever he wants.
55 */
56 return 0;
57}
58
59const struct kexec_file_ops s390_kexec_image_ops = {
60 .probe = s390_image_probe,
61 .load = s390_image_load,
David Brazdil0f672f62019-12-10 10:32:29 +000062#ifdef CONFIG_KEXEC_SIG
63 .verify_sig = s390_verify_sig,
64#endif /* CONFIG_KEXEC_SIG */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000065};