hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/arch/s390/kernel/kexec_elf.c
....@@ -10,18 +10,20 @@
1010 #include <linux/errno.h>
1111 #include <linux/kernel.h>
1212 #include <linux/kexec.h>
13
+#include <asm/ipl.h>
1314 #include <asm/setup.h>
1415
15
-static int kexec_file_add_elf_kernel(struct kimage *image,
16
- struct s390_load_data *data,
17
- char *kernel, unsigned long kernel_len)
16
+static int kexec_file_add_kernel_elf(struct kimage *image,
17
+ struct s390_load_data *data)
1818 {
1919 struct kexec_buf buf;
2020 const Elf_Ehdr *ehdr;
2121 const Elf_Phdr *phdr;
2222 Elf_Addr entry;
23
+ void *kernel;
2324 int i, ret;
2425
26
+ kernel = image->kernel_buf;
2527 ehdr = (Elf_Ehdr *)kernel;
2628 buf.image = image;
2729 if (image->type == KEXEC_TYPE_CRASH)
....@@ -38,30 +40,27 @@
3840 buf.bufsz = phdr->p_filesz;
3941
4042 buf.mem = ALIGN(phdr->p_paddr, phdr->p_align);
43
+ if (image->type == KEXEC_TYPE_CRASH)
44
+ buf.mem += crashk_res.start;
4145 buf.memsz = phdr->p_memsz;
46
+ data->memsz = ALIGN(data->memsz, phdr->p_align) + buf.memsz;
4247
4348 if (entry - phdr->p_paddr < phdr->p_memsz) {
4449 data->kernel_buf = buf.buffer;
45
- data->memsz += STARTUP_NORMAL_OFFSET;
46
-
47
- buf.buffer += STARTUP_NORMAL_OFFSET;
48
- buf.bufsz -= STARTUP_NORMAL_OFFSET;
49
-
50
- buf.mem += STARTUP_NORMAL_OFFSET;
51
- buf.memsz -= STARTUP_NORMAL_OFFSET;
50
+ data->kernel_mem = buf.mem;
51
+ data->parm = buf.buffer + PARMAREA;
5252 }
5353
54
- if (image->type == KEXEC_TYPE_CRASH)
55
- buf.mem += crashk_res.start;
56
-
54
+ ipl_report_add_component(data->report, &buf,
55
+ IPL_RB_COMPONENT_FLAG_SIGNED |
56
+ IPL_RB_COMPONENT_FLAG_VERIFIED,
57
+ IPL_RB_CERT_UNKNOWN);
5758 ret = kexec_add_buffer(&buf);
5859 if (ret)
5960 return ret;
60
-
61
- data->memsz = ALIGN(data->memsz, phdr->p_align) + buf.memsz;
6261 }
6362
64
- return 0;
63
+ return data->memsz ? 0 : -EINVAL;
6564 }
6665
6766 static void *s390_elf_load(struct kimage *image,
....@@ -69,11 +68,10 @@
6968 char *initrd, unsigned long initrd_len,
7069 char *cmdline, unsigned long cmdline_len)
7170 {
72
- struct s390_load_data data = {0};
7371 const Elf_Ehdr *ehdr;
7472 const Elf_Phdr *phdr;
7573 size_t size;
76
- int i, ret;
74
+ int i;
7775
7876 /* image->fobs->probe already checked for valid ELF magic number. */
7977 ehdr = (Elf_Ehdr *)kernel;
....@@ -106,24 +104,7 @@
106104 if (size > kernel_len)
107105 return ERR_PTR(-EINVAL);
108106
109
- ret = kexec_file_add_elf_kernel(image, &data, kernel, kernel_len);
110
- if (ret)
111
- return ERR_PTR(ret);
112
-
113
- if (!data.memsz)
114
- return ERR_PTR(-EINVAL);
115
-
116
- if (initrd) {
117
- ret = kexec_file_add_initrd(image, &data, initrd, initrd_len);
118
- if (ret)
119
- return ERR_PTR(ret);
120
- }
121
-
122
- ret = kexec_file_add_purgatory(image, &data);
123
- if (ret)
124
- return ERR_PTR(ret);
125
-
126
- return kexec_file_update_kernel(image, &data);
107
+ return kexec_file_add_components(image, kexec_file_add_kernel_elf);
127108 }
128109
129110 static int s390_elf_probe(const char *buf, unsigned long len)
....@@ -149,4 +130,7 @@
149130 const struct kexec_file_ops s390_kexec_elf_ops = {
150131 .probe = s390_elf_probe,
151132 .load = s390_elf_load,
133
+#ifdef CONFIG_KEXEC_SIG
134
+ .verify_sig = s390_verify_sig,
135
+#endif /* CONFIG_KEXEC_SIG */
152136 };