// SPDX-License-Identifier: GPL-2.0+ /* * (C) Copyright 2000 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. */ /* #define DEBUG */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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"); }