From 3901d197f7e82dae23b4b9339fbf64c82e683ca3 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 12 Apr 2005 16:43:18 +0000 Subject: [PATCH] Replaced main loop with a trivial implementation so that we can try out the new probing logic. --- src/core/main.c | 59 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/src/core/main.c b/src/core/main.c index ef8b67bb0..ab3ea42f9 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -41,6 +41,8 @@ int freebsd_howto = 0; char freebsd_kernel_env[FREEBSD_KERNEL_ENV_SIZE]; #endif +#if 0 + static inline unsigned long ask_boot(unsigned *index) { unsigned long order = DEFAULT_BOOT_ORDER; @@ -131,6 +133,9 @@ operations[] = { { &disk.dev, disk_probe, disk_load_configuration, disk_load }, }; +#endif + + static int main_loop(int state); static int exit_ok; @@ -138,6 +143,9 @@ static int exit_status; static int initialized; +/* Global instance of the current boot device */ +struct dev dev; + /************************************************************************** * initialise() - perform any C-level initialisation * @@ -150,8 +158,7 @@ void initialise ( void ) { /* Zero the BSS */ memset ( _bss, 0, _ebss - _bss ); - /* Call all registered initialisation functions. - */ + /* Call all registered initialisation functions */ call_init_fns (); } @@ -159,28 +166,34 @@ void initialise ( void ) { MAIN - Kick off routine **************************************************************************/ int main ( void ) { - int state; + /* Print out configuration */ print_config(); - cleanup(); - /* -1: timeout or ESC - -2: error return from loader - -3: finish the current run. - 0: retry booting bootp and tftp - 1: retry tftp with possibly modified bootp reply - 2: retry bootp and tftp - 3: retry probe bootp and tftp - 4: start with the next device and retry from there... - 255: exit Etherboot - 256: retry after relocation - */ - state = setjmp(restart_etherboot); - exit_ok = 1; - for(;state != 255;) { - state = main_loop(state); + /* + * Trivial main loop: we need to think about how we want to + * prompt the user etc. + * + */ + for ( ; ; disable ( &dev ), call_reset_fns() ) { + + /* Get next boot device */ + if ( ! probe ( &dev ) ) { + /* Reached end of device list */ + continue; + } + + /* Load configuration (e.g. DHCP) */ + if ( ! load_configuration ( &dev ) ) { + /* DHCP failed */ + continue; + } + + /* Load image */ + if ( ! load ( &dev ) ) + /* Load failed */ + continue; } - /* arch_on_exit(exit_status) */ /* Call registered per-object exit functions */ call_exit_fns (); @@ -196,6 +209,9 @@ void exit(int status) longjmp(restart_etherboot, 255); } + +#if 0 + static int main_loop(int state) { /* Splitting main into 2 pieces makes the semantics of @@ -331,6 +347,9 @@ static int main_loop(int state) } +#endif + + /************************************************************************** LOADKERNEL - Try to load kernel image **************************************************************************/