Lines Matching +full:mode +full:- +full:loader
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Kexec bzImage loader
10 #define pr_fmt(fmt) "kexec-bzImage64: " fmt
27 #include <asm/kexec-bzimage64.h>
29 #define MAX_ELFCOREHDR_STR_LEN 30 /* elfcorehdr=0x<64bit-value> */
33 * exactly these limits came from. Current bzimage64 loader in kexec-tools
43 * This is a place holder for all boot loader specific data structure which
58 params->hdr.ramdisk_image = initrd_load_addr & 0xffffffffUL; in setup_initrd()
59 params->hdr.ramdisk_size = initrd_len & 0xffffffffUL; in setup_initrd()
61 params->ext_ramdisk_image = initrd_load_addr >> 32; in setup_initrd()
62 params->ext_ramdisk_size = initrd_len >> 32; in setup_initrd()
76 if (image->type == KEXEC_TYPE_CRASH) { in setup_cmdline()
78 "elfcorehdr=0x%lx ", image->arch.elf_load_addr); in setup_cmdline()
83 cmdline_ptr[cmdline_len - 1] = '\0'; in setup_cmdline()
90 params->hdr.cmd_line_ptr = cmdline_low_32; in setup_cmdline()
92 params->ext_cmd_line_ptr = cmdline_ext_32; in setup_cmdline()
101 nr_e820_entries = e820_table_kexec->nr_entries; in setup_e820_entries()
107 params->e820_entries = nr_e820_entries; in setup_e820_entries()
108 memcpy(¶ms->e820_table, &e820_table_kexec->entries, nr_e820_entries*sizeof(struct e820_entry)); in setup_e820_entries()
121 struct efi_info *ei = ¶ms->efi_info; in setup_efi_info_memmap()
128 ei->efi_memmap = efi_map_phys_addr & 0xffffffff; in setup_efi_info_memmap()
129 ei->efi_memmap_hi = efi_map_phys_addr >> 32; in setup_efi_info_memmap()
130 ei->efi_memmap_size = efi_map_sz; in setup_efi_info_memmap()
144 esd->fw_vendor = efi_fw_vendor; in prepare_add_efi_setup_data()
145 esd->tables = efi_config_table; in prepare_add_efi_setup_data()
146 esd->smbios = efi.smbios; in prepare_add_efi_setup_data()
148 sd->type = SETUP_EFI; in prepare_add_efi_setup_data()
149 sd->len = sizeof(struct efi_setup_data); in prepare_add_efi_setup_data()
153 sd->next = params->hdr.setup_data; in prepare_add_efi_setup_data()
154 params->hdr.setup_data = setup_data_phys; in prepare_add_efi_setup_data()
165 struct efi_info *ei = ¶ms->efi_info; in setup_efi_state()
170 if (!current_ei->efi_memmap_size) in setup_efi_state()
173 params->secure_boot = boot_params.secure_boot; in setup_efi_state()
174 ei->efi_loader_signature = current_ei->efi_loader_signature; in setup_efi_state()
175 ei->efi_systab = current_ei->efi_systab; in setup_efi_state()
176 ei->efi_systab_hi = current_ei->efi_systab_hi; in setup_efi_state()
178 ei->efi_memdesc_version = current_ei->efi_memdesc_version; in setup_efi_state()
179 ei->efi_memdesc_size = efi_get_runtime_map_desc_size(); in setup_efi_state()
200 params->hdr.hardware_subarch = boot_params.hdr.hardware_subarch; in setup_boot_parameters()
203 memcpy(¶ms->screen_info, &screen_info, sizeof(struct screen_info)); in setup_boot_parameters()
206 params->screen_info.ext_mem_k = 0; in setup_boot_parameters()
207 params->alt_mem_k = 0; in setup_boot_parameters()
210 params->acpi_rsdp_addr = boot_params.acpi_rsdp_addr; in setup_boot_parameters()
213 memset(¶ms->apm_bios_info, 0, sizeof(params->apm_bios_info)); in setup_boot_parameters()
216 memset(¶ms->hd0_info, 0, sizeof(params->hd0_info)); in setup_boot_parameters()
217 memset(¶ms->hd1_info, 0, sizeof(params->hd1_info)); in setup_boot_parameters()
219 if (image->type == KEXEC_TYPE_CRASH) { in setup_boot_parameters()
226 nr_e820_entries = params->e820_entries; in setup_boot_parameters()
229 if (params->e820_table[i].type != E820_TYPE_RAM) in setup_boot_parameters()
231 start = params->e820_table[i].addr; in setup_boot_parameters()
232 end = params->e820_table[i].addr + params->e820_table[i].size - 1; in setup_boot_parameters()
235 mem_k = (end >> 10) - (0x100000 >> 10); in setup_boot_parameters()
236 params->screen_info.ext_mem_k = mem_k; in setup_boot_parameters()
237 params->alt_mem_k = mem_k; in setup_boot_parameters()
239 params->screen_info.ext_mem_k = 0xfc00; /* 64M*/ in setup_boot_parameters()
241 params->alt_mem_k = 0xffffffff; in setup_boot_parameters()
251 memcpy(params->eddbuf, boot_params.eddbuf, in setup_boot_parameters()
253 params->eddbuf_entries = boot_params.eddbuf_entries; in setup_boot_parameters()
255 memcpy(params->edd_mbr_sig_buffer, boot_params.edd_mbr_sig_buffer, in setup_boot_parameters()
263 int ret = -ENOEXEC; in bzImage64_probe()
273 if (memcmp((char *)&header->header, "HdrS", 4) != 0) { in bzImage64_probe()
278 if (header->boot_flag != 0xAA55) { in bzImage64_probe()
283 if (header->version < 0x020C) { in bzImage64_probe()
288 if (!(header->loadflags & LOADED_HIGH)) { in bzImage64_probe()
293 if (!(header->xloadflags & XLF_KERNEL_64)) { in bzImage64_probe()
298 if (!(header->xloadflags & XLF_CAN_BE_LOADED_ABOVE_4G)) { in bzImage64_probe()
305 * above 4G. This should be handled by 32bit bzImage loader in bzImage64_probe()
312 if (!(header->xloadflags & XLF_5LEVEL) && pgtable_l5_enabled()) { in bzImage64_probe()
313 pr_err("bzImage cannot handle 5-level paging mode.\n"); in bzImage64_probe()
346 setup_sects = header->setup_sects; in bzImage64_load()
353 return ERR_PTR(-ENOEXEC); in bzImage64_load()
356 if (cmdline_len > header->cmdline_size) { in bzImage64_load()
358 return ERR_PTR(-EINVAL); in bzImage64_load()
365 if (cmdline_len + MAX_ELFCOREHDR_STR_LEN > header->cmdline_size) { in bzImage64_load()
367 return ERR_PTR(-EINVAL); in bzImage64_load()
371 if (image->type == KEXEC_TYPE_CRASH) { in bzImage64_load()
408 return ERR_PTR(-ENOMEM); in bzImage64_load()
413 setup_header_size = 0x0202 + kernel[0x0201] - setup_hdr_offset; in bzImage64_load()
416 memcpy(¶ms->hdr, (kernel + setup_hdr_offset), setup_header_size); in bzImage64_load()
431 kbuf.bufsz = kernel_len - kern16_size; in bzImage64_load()
432 kbuf.memsz = PAGE_ALIGN(header->init_size); in bzImage64_load()
433 kbuf.buf_align = header->kernel_alignment; in bzImage64_load()
465 /* bootloader info. Do we need a separate ID for kexec kernel loader? */ in bzImage64_load()
466 params->hdr.type_of_loader = 0x0D << 4; in bzImage64_load()
467 params->hdr.loadflags = 0; in bzImage64_load()
481 ret = -EINVAL; in bzImage64_load()
497 /* Allocate loader specific data */ in bzImage64_load()
500 ret = -ENOMEM; in bzImage64_load()
509 ldata->bootparams_buf = params; in bzImage64_load()
525 kfree(ldata->bootparams_buf); in bzImage64_cleanup()
526 ldata->bootparams_buf = NULL; in bzImage64_cleanup()
539 if (ret == -ENOKEY && IS_ENABLED(CONFIG_INTEGRITY_PLATFORM_KEYRING)) { in bzImage64_verify_sig()