hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/arch/x86/kernel/kexec-bzimage64.c
....@@ -1,12 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Kexec bzImage loader
34 *
45 * Copyright (C) 2014 Red Hat Inc.
56 * Authors:
67 * Vivek Goyal <vgoyal@redhat.com>
7
- *
8
- * This source code is licensed under the GNU General Public License,
9
- * Version 2. See the file COPYING for more details.
108 */
119
1210 #define pr_fmt(fmt) "kexec-bzImage64: " fmt
....@@ -143,9 +141,8 @@
143141 struct setup_data *sd = (void *)params + efi_setup_data_offset;
144142 struct efi_setup_data *esd = (void *)sd + sizeof(struct setup_data);
145143
146
- esd->fw_vendor = efi.fw_vendor;
147
- esd->runtime = efi.runtime;
148
- esd->tables = efi.config_table;
144
+ esd->fw_vendor = efi_fw_vendor;
145
+ esd->tables = efi_config_table;
149146 esd->smbios = efi.smbios;
150147
151148 sd->type = SETUP_EFI;
....@@ -173,15 +170,7 @@
173170 if (!current_ei->efi_memmap_size)
174171 return 0;
175172
176
- /*
177
- * If 1:1 mapping is not enabled, second kernel can not setup EFI
178
- * and use EFI run time services. User space will have to pass
179
- * acpi_rsdp=<addr> on kernel command line to make second kernel boot
180
- * without efi.
181
- */
182
- if (efi_enabled(EFI_OLD_MEMMAP))
183
- return 0;
184
-
173
+ params->secure_boot = boot_params.secure_boot;
185174 ei->efi_loader_signature = current_ei->efi_loader_signature;
186175 ei->efi_systab = current_ei->efi_systab;
187176 ei->efi_systab_hi = current_ei->efi_systab_hi;
....@@ -216,6 +205,9 @@
216205 /* Fill in memsize later */
217206 params->screen_info.ext_mem_k = 0;
218207 params->alt_mem_k = 0;
208
+
209
+ /* Always fill in RSDP: it is either 0 or a valid value */
210
+ params->acpi_rsdp_addr = boot_params.acpi_rsdp_addr;
219211
220212 /* Default APM info */
221213 memset(&params->apm_bios_info, 0, sizeof(params->apm_bios_info));
....@@ -255,7 +247,6 @@
255247 setup_efi_state(params, params_load_addr, efi_map_offset, efi_map_sz,
256248 efi_setup_data_offset);
257249 #endif
258
-
259250 /* Setup EDD info */
260251 memcpy(params->eddbuf, boot_params.eddbuf,
261252 EDDMAXNR * sizeof(struct edd_info));
....@@ -315,6 +306,11 @@
315306 */
316307 if (efi_enabled(EFI_RUNTIME_SERVICES) && !efi_enabled(EFI_64BIT)) {
317308 pr_debug("EFI is 32 bit. Can't load kernel above 4G.\n");
309
+ return ret;
310
+ }
311
+
312
+ if (!(header->xloadflags & XLF_5LEVEL) && pgtable_l5_enabled()) {
313
+ pr_err("bzImage cannot handle 5-level paging mode.\n");
318314 return ret;
319315 }
320316
....@@ -413,7 +409,7 @@
413409 efi_map_offset = params_cmdline_sz;
414410 efi_setup_data_offset = efi_map_offset + ALIGN(efi_map_sz, 16);
415411
416
- /* Copy setup header onto bootparams. Documentation/x86/boot.txt */
412
+ /* Copy setup header onto bootparams. Documentation/x86/boot.rst */
417413 setup_header_size = 0x0202 + kernel[0x0201] - setup_hdr_offset;
418414
419415 /* Is there a limit on setup header size? */
....@@ -436,6 +432,7 @@
436432 kbuf.memsz = PAGE_ALIGN(header->init_size);
437433 kbuf.buf_align = header->kernel_alignment;
438434 kbuf.buf_min = MIN_KERNEL_LOAD_ADDR;
435
+ kbuf.mem = KEXEC_BUF_MEM_UNKNOWN;
439436 ret = kexec_add_buffer(&kbuf);
440437 if (ret)
441438 goto out_free_params;
....@@ -450,6 +447,7 @@
450447 kbuf.bufsz = kbuf.memsz = initrd_len;
451448 kbuf.buf_align = PAGE_SIZE;
452449 kbuf.buf_min = MIN_INITRD_LOAD_ADDR;
450
+ kbuf.mem = KEXEC_BUF_MEM_UNKNOWN;
453451 ret = kexec_add_buffer(&kbuf);
454452 if (ret)
455453 goto out_free_params;
....@@ -533,9 +531,17 @@
533531 #ifdef CONFIG_KEXEC_BZIMAGE_VERIFY_SIG
534532 static int bzImage64_verify_sig(const char *kernel, unsigned long kernel_len)
535533 {
536
- return verify_pefile_signature(kernel, kernel_len,
537
- VERIFY_USE_SECONDARY_KEYRING,
538
- VERIFYING_KEXEC_PE_SIGNATURE);
534
+ int ret;
535
+
536
+ ret = verify_pefile_signature(kernel, kernel_len,
537
+ VERIFY_USE_SECONDARY_KEYRING,
538
+ VERIFYING_KEXEC_PE_SIGNATURE);
539
+ if (ret == -ENOKEY && IS_ENABLED(CONFIG_INTEGRITY_PLATFORM_KEYRING)) {
540
+ ret = verify_pefile_signature(kernel, kernel_len,
541
+ VERIFY_USE_PLATFORM_KEYRING,
542
+ VERIFYING_KEXEC_PE_SIGNATURE);
543
+ }
544
+ return ret;
539545 }
540546 #endif
541547