static int do_bootm_linux(struct image_data *idata) { void (*kernel)(int, int, int, const char *); const char *commandline = linux_bootargs_get(); if (!idata->os_res) return -EINVAL; kernel = (void *)(idata->os_address + idata->os_entry); /* kernel parameters passing * r4 : NIOS magic * r5 : initrd start * r6 : initrd end or fdt * r7 : kernel command line * fdt is passed to kernel via r6, the same as initrd_end. fdt will be * verified with fdt magic. when both initrd and fdt are used at the * same time, fdt must follow immediately after initrd. */ /* flushes data and instruction caches before calling the kernel */ flush_cache_all(); kernel(NIOS_MAGIC, 0, 0, commandline); /* does not return */ return 1; }
static int do_bootm_linux(struct image_data *idata) { int (*appl)(char *cmdline); const char *cmdline = linux_bootargs_get(); char *cmdlinedest = (char *) CMD_LINE_ADDR; int ret; ret = bootm_load_os(idata, idata->os_address); if (ret) return ret; appl = (void *)(idata->os_address + idata->os_entry); printf("Starting Kernel at 0x%p\n", appl); if (idata->dryrun) return 0; icache_disable(); strncpy(cmdlinedest, cmdline, 0x1000); cmdlinedest[0xfff] = 0; *(volatile unsigned long *) IMASK = 0x1f; (*appl)(cmdlinedest); return -1; }
static int efi_execute_image(const char *file) { efi_handle_t handle; efi_loaded_image_t *loaded_image; efi_status_t efiret; struct linux_kernel_header *image_header; const char *options; int ret; ret = efi_load_image(file, &loaded_image, &handle); if (ret) return ret; image_header = (struct linux_kernel_header *)loaded_image->image_base; if (image_header->boot_flag == 0xAA55 && image_header->header == 0x53726448) { pr_debug("Linux kernel detected. Adding bootargs."); options = linux_bootargs_get(); pr_err("add linux options '%s'\n", options); loaded_image->load_options = xstrdup_char_to_wchar(options); loaded_image->load_options_size = (strlen(options) + 1) * sizeof(wchar_t); } efiret = BS->start_image(handle, NULL, NULL); if (EFI_ERROR(efiret)) pr_err("failed to StartImage: %s\n", efi_strerror(efiret)); BS->unload_image(handle); efi_connect_all(); efi_register_devices(); return -efi_errno(efiret); }
static int efi_execute_image(const char *file) { void *exe; size_t size; efi_handle_t handle; efi_status_t efiret; const char *options; efi_loaded_image_t *loaded_image; exe = read_file(file, &size); if (!exe) return -EINVAL; efiret = BS->load_image(false, efi_parent_image, efi_device_path, exe, size, &handle); if (EFI_ERROR(efiret)) { pr_err("failed to LoadImage: %s\n", efi_strerror(efiret)); return -efi_errno(efiret);; }; efiret = BS->open_protocol(handle, &efi_loaded_image_protocol_guid, (void **)&loaded_image, efi_parent_image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (EFI_ERROR(efiret)) return -efi_errno(efiret); options = linux_bootargs_get(); loaded_image->load_options = strdup_char_to_wchar(options); loaded_image->load_options_size = (strlen(options) + 1) * sizeof(wchar_t); efiret = BS->start_image(handle, NULL, NULL); efi_connect_all(); efi_register_devices(); return 0; }
static int do_bootm_efi(struct image_data *data) { void *tmp; void *initrd = NULL; size_t size; efi_handle_t handle; int ret; const char *options; efi_loaded_image_t *loaded_image; struct linux_kernel_header *image_header, *boot_header; ret = efi_load_image(data->os_file, &loaded_image, &handle); if (ret) return ret; image_header = (struct linux_kernel_header *)loaded_image->image_base; if (image_header->boot_flag != 0xAA55 || image_header->header != 0x53726448 || image_header->version < 0x20b || !image_header->relocatable_kernel) { pr_err("Not a valid kernel image!\n"); BS->unload_image(handle); return -EINVAL; } boot_header = xmalloc(0x4000); memset(boot_header, 0, 0x4000); memcpy(boot_header, image_header, sizeof(*image_header)); boot_header->type_of_loader = 0xff; if (data->initrd_file) { tmp = read_file(data->initrd_file, &size); initrd = xmemalign(PAGE_SIZE, PAGE_ALIGN(size)); memcpy(initrd, tmp, size); memset(initrd + size, 0, PAGE_ALIGN(size) - size); free(tmp); boot_header->ramdisk_image = (uint64_t)initrd; boot_header->ramdisk_size = PAGE_ALIGN(size); } options = linux_bootargs_get(); boot_header->cmd_line_ptr = (uint64_t)options; boot_header->cmdline_size = strlen(options); boot_header->code32_start = (uint64_t)loaded_image->image_base + (image_header->setup_sects+1) * 512; if (bootm_verbose(data)) { printf("\nStarting kernel at 0x%p", loaded_image->image_base); if (data->initrd_file) printf(", initrd at 0x%08x", boot_header->ramdisk_image); printf("...\n"); } if (data->dryrun) { BS->unload_image(handle); free(boot_header); free(initrd); return 0; } efi_set_variable_usec("LoaderTimeExecUSec", &efi_systemd_vendor_guid, get_time_ns()/1000); linux_efi_handover(handle, boot_header); return 0; }