From 7b4d66ab28fdd3c7bfd4e427a1f7ccddbffd355c Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Sun, 20 Jan 2013 13:59:47 +0100 Subject: startup: call a barebox_main function pointer at the end of the startup Currently Kconfig dependencies are used to allow non-interactive builds. This leads to problems in Kconfig getting the dependencies right. This patch adds a barebox_main function pointer which is called at the end of the startup process. This defaults to run_shell when a shell is enabled. With this the HAVE_NOSHELL Kconfig variable can be removed. Non interactive builds can now be enabled for every board allowing to compile a binary without further Kconfig dependencies. This also allows for more flexibility, for example boards may decide to try non-interactive startup first and call run_shell if that fails. Signed-off-by: Sascha Hauer --- common/Kconfig | 8 ++------ common/startup.c | 13 ++++++++++++- 2 files changed, 14 insertions(+), 7 deletions(-) (limited to 'common') diff --git a/common/Kconfig b/common/Kconfig index b60b78bb89..9d26abba99 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -37,9 +37,6 @@ config BLOCK config BLOCK_WRITE bool -config HAVE_NOSHELL - bool - config FILETYPE bool @@ -352,12 +349,11 @@ choice simple shell. No if/then, no return values from commands, no loops config SHELL_NONE - depends on HAVE_NOSHELL bool "no shell (noninteractive build)" help No shell at all. This means no shell is started and your board has - to provide a run_shell() function which is started at the end of - the barebox startup process. + to overwrite the barebox_main function pointer which is then called + at the end of the barebox startup process. endchoice config GLOB diff --git a/common/startup.c b/common/startup.c index 14409a217d..6309f53e9e 100644 --- a/common/startup.c +++ b/common/startup.c @@ -88,6 +88,8 @@ static int mount_root(void) fs_initcall(mount_root); #endif +int (*barebox_main)(void); + void start_barebox (void) { initcall_t *initcall; @@ -96,6 +98,9 @@ void start_barebox (void) struct stat s; #endif + if (!IS_ENABLED(CONFIG_SHELL_NONE)) + barebox_main = run_shell; + for (initcall = __barebox_initcalls_start; initcall < __barebox_initcalls_end; initcall++) { debug("initcall-> %pS\n", *initcall); @@ -126,9 +131,15 @@ void start_barebox (void) printf("not found\n"); } #endif + + if (!barebox_main) { + printf("No main function! aborting.\n"); + hang(); + } + /* main_loop() can return to retry autoboot, if so just run it again. */ for (;;) - run_shell(); + barebox_main(); /* NOTREACHED - no way out of command loop except booting */ } -- cgit v1.2.3