__export void execute(const char *cmdline, uint32_t type, bool sysappend) { const char *kernel, *args; const char *p; com32sys_t ireg; char *q, ch; memset(&ireg, 0, sizeof ireg); if (strlen(cmdline) >= MAX_CMDLINE_LEN) { printf("cmdline too long\n"); return; } q = malloc(MAX_CMDLINE_LEN); if (!q) { printf("%s(): Fail to malloc a buffer to exec %s\n", __func__, cmdline); return; } kernel = q; p = cmdline; while (*p && !my_isspace(*p)) *q++ = *p++; *q++ = '\0'; args = q; while (*p && my_isspace(*p)) p++; do { *q++ = ch = *p++; } while (ch); if (sysappend) { /* If we've seen some args, insert a space */ if (--q != args) *q++ = ' '; do_sysappend(q); } dprintf("kernel is %s, args = %s type = %d \n", kernel, args, type); if (kernel[0] == '.') { /* It might be a type specifier */ const struct image_types *t; for (t = image_boot_types; t->name; t++) { if (!strcmp(kernel + 1, t->name)) { /* * Strip the type specifier, apply the * filename extension if COM32 and * retry. */ p = args; if (t->type == IMAGE_TYPE_COM32) { p = apply_extension(p, ".c32"); if (!p) return; } execute(p, t->type, sysappend); return; } } } if (type == IMAGE_TYPE_COM32) { /* * We may be called with the console in an unknown * state, so initialise it. */ ldlinux_console_init(); /* new entry for elf format c32 */ if (create_args_and_load((char *)cmdline)) printf("Failed to load COM32 file %s\n", kernel); /* * The old COM32 module code would run the module then * drop the user back at the command prompt, * irrespective of how the COM32 module was loaded, * e.g. from vesamenu.c32. */ unload_modules_since(LDLINUX); /* Restore the console */ ldlinux_console_init(); /* Jump back to the main to call ldlinux_enter_command */ longjmp(__return_to_command_prompt, 1); } else if (type == IMAGE_TYPE_CONFIG) { char *argv[] = { LDLINUX, NULL, NULL }; char *config; int rv; /* kernel contains the config file name */ config = malloc(FILENAME_MAX); if (!config) goto out; realpath(config, kernel, FILENAME_MAX); /* If we got anything on the command line, do a chdir */ if (*args) mangle_name(config_cwd, args); argv[1] = config; rv = start_ldlinux(2, argv); printf("Failed to exec %s: %s\n", LDLINUX, strerror(rv)); } else if (type == IMAGE_TYPE_LOCALBOOT) { local_boot(strtoul(kernel, NULL, 0)); } else if (type == IMAGE_TYPE_PXE || type == IMAGE_TYPE_BSS || type == IMAGE_TYPE_BOOT) { chainboot_file(kernel, type); } else { /* Need add one item for kernel load, as we don't use * the assembly runkernel.inc any more */ new_linux_kernel((char *)kernel, (char *)args); } out: free((void *)kernel); /* If this returns, something went bad; return to menu */ }
void pm_local_boot(com32sys_t *regs) { local_boot(regs->eax.w[0]); }