Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright (C) 2007 Michael Brown <mbrown (at) fensystems.co.uk>.
      3  *
      4  * This program is free software; you can redistribute it and/or
      5  * modify it under the terms of the GNU General Public License as
      6  * published by the Free Software Foundation; either version 2 of the
      7  * License, or any later version.
      8  *
      9  * This program is distributed in the hope that it will be useful, but
     10  * WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12  * General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU General Public License
     15  * along with this program; if not, write to the Free Software
     16  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     17  */
     18 
     19 FILE_LICENCE ( GPL2_OR_LATER );
     20 
     21 #include <gpxe/device.h>
     22 #include <gpxe/init.h>
     23 
     24 /** @file
     25  *
     26  * Initialisation, startup and shutdown routines
     27  *
     28  */
     29 
     30 /** "startup() has been called" flag */
     31 static int started = 0;
     32 
     33 /**
     34  * Initialise gPXE
     35  *
     36  * This function performs the one-time-only and irreversible
     37  * initialisation steps, such as initialising the heap.  It must be
     38  * called before (almost) any other function.
     39  *
     40  * There is, by definition, no counterpart to this function on the
     41  * shutdown path.
     42  */
     43 void initialise ( void ) {
     44 	struct init_fn *init_fn;
     45 
     46 	/* Call registered initialisation functions */
     47 	for_each_table_entry ( init_fn, INIT_FNS )
     48 		init_fn->initialise ();
     49 }
     50 
     51 /**
     52  * Start up gPXE
     53  *
     54  * This function performs the repeatable initialisation steps, such as
     55  * probing devices.  You may call startup() and shutdown() multiple
     56  * times (as is done via the PXE API when PXENV_START_UNDI is used).
     57  */
     58 void startup ( void ) {
     59 	struct startup_fn *startup_fn;
     60 
     61 	if ( started )
     62 		return;
     63 
     64 	/* Call registered startup functions */
     65 	for_each_table_entry ( startup_fn, STARTUP_FNS ) {
     66 		if ( startup_fn->startup )
     67 			startup_fn->startup();
     68 	}
     69 
     70 	started = 1;
     71 }
     72 
     73 /**
     74  * Shut down gPXE
     75  *
     76  * @v flags		Shutdown behaviour flags
     77  *
     78  * This function reverses the actions of startup(), and leaves gPXE in
     79  * a state ready to be removed from memory.  You may call startup()
     80  * again after calling shutdown().
     81  *
     82  * Call this function only once, before either exiting main() or
     83  * starting up a non-returnable image.
     84  */
     85 void shutdown ( int flags ) {
     86 	struct startup_fn *startup_fn;
     87 
     88 	if ( ! started )
     89 		return;
     90 
     91 	/* Call registered shutdown functions (in reverse order) */
     92 	for_each_table_entry_reverse ( startup_fn, STARTUP_FNS ) {
     93 		if ( startup_fn->shutdown )
     94 			startup_fn->shutdown ( flags );
     95 	}
     96 
     97 	started = 0;
     98 }
     99