Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | // SPDX-License-Identifier: GPL-2.0+ /* * (C) Copyright 2000 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. */ /* #define DEBUG */ #include <autoboot.h> #include <button.h> #include <bootstage.h> #include <bootstd.h> #include <cli.h> #include <command.h> #include <console.h> #include <env.h> #include <event.h> #include <fdtdec.h> #include <init.h> #include <net.h> #include <version_string.h> #include <efi_loader.h> static void run_preboot_environment_command(void) { char *p; p = env_get("preboot"); if (p != NULL) { int prev = 0; if (IS_ENABLED(CONFIG_AUTOBOOT_KEYED)) prev = disable_ctrlc(1); /* disable Ctrl-C checking */ run_command_list(p, -1, 0); if (IS_ENABLED(CONFIG_AUTOBOOT_KEYED)) disable_ctrlc(prev); /* restore Ctrl-C checking */ } } static const char *get_autoboot_cmd(char *buf, int size) { const char *s = NULL; if (IS_ENABLED(CONFIG_EVENT)) { struct event_bootcmd event_bootcmd; int ret; event_bootcmd.bootcmd = buf; event_bootcmd.size = size; buf[0] = '\0'; ret = event_notify(EVT_BOOTCMD, &event_bootcmd, sizeof(event_bootcmd)); if (ret) return NULL; if (buf[0] != '\0') s = buf; } return s; } /* We come here after U-Boot is initialised and ready to process commands */ void main_loop(void) { const char *s; char bootcmd_buf[CONFIG_SYS_CBSIZE]; bootstage_mark_name(BOOTSTAGE_ID_MAIN_LOOP, "main_loop"); if (IS_ENABLED(CONFIG_VERSION_VARIABLE)) env_set("ver", version_string); /* set version variable */ cli_init(); if (IS_ENABLED(CONFIG_USE_PREBOOT)) run_preboot_environment_command(); if (IS_ENABLED(CONFIG_UPDATE_TFTP)) update_tftp(0UL, NULL, NULL); if (IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK_EARLY)) { /* efi_init_early() already called */ if (efi_init_obj_list() == EFI_SUCCESS) efi_launch_capsules(); } process_button_cmds(); /* Allow platform code to provide bootcmd via event */ s = get_autoboot_cmd(bootcmd_buf, sizeof(bootcmd_buf)); if (!s) s = bootdelay_process(); if (cli_process_fdt(&s)) cli_secure_boot_cmd(s); autoboot_command(s); /* if standard boot if enabled, assume that it will be able to boot */ if (IS_ENABLED(CONFIG_BOOTSTD_PROG)) { int ret; ret = bootstd_prog_boot(); printf("Standard boot failed (err=%dE)\n", ret); panic("Failed to boot"); } cli_loop(); panic("No CLI available"); } |