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->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(&params->e820_table, &e820_table_kexec->entries, nr_e820_entries*sizeof(struct e820_entry)); in setup_e820_entries()
125 sd->type = SETUP_RNG_SEED; in setup_rng_seed()
126 sd->len = RNG_SEED_LENGTH; in setup_rng_seed()
127 get_random_bytes(sd->data, RNG_SEED_LENGTH); in setup_rng_seed()
129 sd->next = params->hdr.setup_data; in setup_rng_seed()
130 params->hdr.setup_data = setup_data_phys; in setup_rng_seed()
141 struct efi_info *ei = &params->efi_info; in setup_efi_info_memmap()
148 ei->efi_memmap = efi_map_phys_addr & 0xffffffff; in setup_efi_info_memmap()
149 ei->efi_memmap_hi = efi_map_phys_addr >> 32; in setup_efi_info_memmap()
150 ei->efi_memmap_size = efi_map_sz; in setup_efi_info_memmap()
164 esd->fw_vendor = efi_fw_vendor; in prepare_add_efi_setup_data()
165 esd->tables = efi_config_table; in prepare_add_efi_setup_data()
166 esd->smbios = efi.smbios; in prepare_add_efi_setup_data()
168 sd->type = SETUP_EFI; in prepare_add_efi_setup_data()
169 sd->len = sizeof(struct efi_setup_data); in prepare_add_efi_setup_data()
173 sd->next = params->hdr.setup_data; in prepare_add_efi_setup_data()
174 params->hdr.setup_data = setup_data_phys; in prepare_add_efi_setup_data()
185 struct efi_info *ei = &params->efi_info; in setup_efi_state()
190 if (!current_ei->efi_memmap_size) in setup_efi_state()
193 params->secure_boot = boot_params.secure_boot; in setup_efi_state()
194 ei->efi_loader_signature = current_ei->efi_loader_signature; in setup_efi_state()
195 ei->efi_systab = current_ei->efi_systab; in setup_efi_state()
196 ei->efi_systab_hi = current_ei->efi_systab_hi; in setup_efi_state()
198 ei->efi_memdesc_version = current_ei->efi_memdesc_version; in setup_efi_state()
199 ei->efi_memdesc_size = efi_get_runtime_map_desc_size(); in setup_efi_state()
219 if (!image->ima_buffer_size) in setup_ima_state()
222 sd->type = SETUP_IMA; in setup_ima_state()
223 sd->len = sizeof(*ima); in setup_ima_state()
226 ima->addr = image->ima_buffer_addr; in setup_ima_state()
227 ima->size = image->ima_buffer_size; in setup_ima_state()
231 sd->next = params->hdr.setup_data; in setup_ima_state()
232 params->hdr.setup_data = setup_data_phys; in setup_ima_state()
247 params->hdr.hardware_subarch = boot_params.hdr.hardware_subarch; in setup_boot_parameters()
250 memcpy(&params->screen_info, &screen_info, sizeof(struct screen_info)); in setup_boot_parameters()
253 params->screen_info.ext_mem_k = 0; in setup_boot_parameters()
254 params->alt_mem_k = 0; in setup_boot_parameters()
257 params->acpi_rsdp_addr = boot_params.acpi_rsdp_addr; in setup_boot_parameters()
260 memset(&params->apm_bios_info, 0, sizeof(params->apm_bios_info)); in setup_boot_parameters()
263 memset(&params->hd0_info, 0, sizeof(params->hd0_info)); in setup_boot_parameters()
264 memset(&params->hd1_info, 0, sizeof(params->hd1_info)); in setup_boot_parameters()
267 if (image->type == KEXEC_TYPE_CRASH) { in setup_boot_parameters()
275 nr_e820_entries = params->e820_entries; in setup_boot_parameters()
279 kexec_dprintk("%016llx-%016llx (%d)\n", in setup_boot_parameters()
280 params->e820_table[i].addr, in setup_boot_parameters()
281 params->e820_table[i].addr + params->e820_table[i].size - 1, in setup_boot_parameters()
282 params->e820_table[i].type); in setup_boot_parameters()
283 if (params->e820_table[i].type != E820_TYPE_RAM) in setup_boot_parameters()
285 start = params->e820_table[i].addr; in setup_boot_parameters()
286 end = params->e820_table[i].addr + params->e820_table[i].size - 1; in setup_boot_parameters()
289 mem_k = (end >> 10) - (0x100000 >> 10); in setup_boot_parameters()
290 params->screen_info.ext_mem_k = mem_k; in setup_boot_parameters()
291 params->alt_mem_k = mem_k; in setup_boot_parameters()
293 params->screen_info.ext_mem_k = 0xfc00; /* 64M*/ in setup_boot_parameters()
295 params->alt_mem_k = 0xffffffff; in setup_boot_parameters()
319 memcpy(params->eddbuf, boot_params.eddbuf, in setup_boot_parameters()
321 params->eddbuf_entries = boot_params.eddbuf_entries; in setup_boot_parameters()
323 memcpy(params->edd_mbr_sig_buffer, boot_params.edd_mbr_sig_buffer, in setup_boot_parameters()
331 int ret = -ENOEXEC; in bzImage64_probe()
341 if (memcmp((char *)&header->header, "HdrS", 4) != 0) { in bzImage64_probe()
346 if (header->boot_flag != 0xAA55) { in bzImage64_probe()
351 if (header->version < 0x020C) { in bzImage64_probe()
356 if (!(header->loadflags & LOADED_HIGH)) { in bzImage64_probe()
361 if (!(header->xloadflags & XLF_KERNEL_64)) { in bzImage64_probe()
366 if (!(header->xloadflags & XLF_CAN_BE_LOADED_ABOVE_4G)) { in bzImage64_probe()
373 * above 4G. This should be handled by 32bit bzImage loader in bzImage64_probe()
380 if (!(header->xloadflags & XLF_5LEVEL) && pgtable_l5_enabled()) { in bzImage64_probe()
381 pr_err("bzImage cannot handle 5-level paging mode.\n"); in bzImage64_probe()
414 setup_sects = header->setup_sects; in bzImage64_load()
421 return ERR_PTR(-ENOEXEC); in bzImage64_load()
424 if (cmdline_len > header->cmdline_size) { in bzImage64_load()
426 return ERR_PTR(-EINVAL); in bzImage64_load()
433 if (cmdline_len + MAX_ELFCOREHDR_STR_LEN > header->cmdline_size) { in bzImage64_load()
435 return ERR_PTR(-EINVAL); in bzImage64_load()
440 if (image->type == KEXEC_TYPE_CRASH) { in bzImage64_load()
484 return ERR_PTR(-ENOMEM); in bzImage64_load()
489 setup_header_size = 0x0202 + kernel[0x0201] - setup_hdr_offset; in bzImage64_load()
492 memcpy(&params->hdr, (kernel + setup_hdr_offset), setup_header_size); in bzImage64_load()
507 kbuf.bufsz = kernel_len - kern16_size; in bzImage64_load()
508 kbuf.memsz = PAGE_ALIGN(header->init_size); in bzImage64_load()
509 kbuf.buf_align = header->kernel_alignment; in bzImage64_load()
510 if (header->pref_address < MIN_KERNEL_LOAD_ADDR) in bzImage64_load()
513 kbuf.buf_min = header->pref_address; in bzImage64_load()
544 /* bootloader info. Do we need a separate ID for kexec kernel loader? */ in bzImage64_load()
545 params->hdr.type_of_loader = 0x0D << 4; in bzImage64_load()
546 params->hdr.loadflags = 0; in bzImage64_load()
560 ret = -EINVAL; in bzImage64_load()
576 /* Allocate loader specific data */ in bzImage64_load()
579 ret = -ENOMEM; in bzImage64_load()
588 ldata->bootparams_buf = params; in bzImage64_load()
604 kfree(ldata->bootparams_buf); in bzImage64_cleanup()
605 ldata->bootparams_buf = NULL; in bzImage64_cleanup()