Separated out initialisation functions from startup/shutdown functions.

This commit is contained in:
Michael Brown
2007-07-03 23:09:56 +01:00
parent a5f33ea283
commit 89349d7fad
23 changed files with 241 additions and 196 deletions

View File

@@ -1,15 +0,0 @@
#ifndef _GPXE_HEAP_H
#define _GPXE_HEAP_H
/**
* @file
*
* Heap
*
*/
extern char heap[];
extern void init_heap ( void );
#endif /* _GPXE_HEAP_H */

View File

@@ -17,8 +17,6 @@ enum hidemem_region_id {
EXTMEM,
};
extern void hide_etherboot();
extern void unhide_etherboot();
extern void hide_region ( unsigned int region_id, physaddr_t start,
physaddr_t end );

View File

@@ -3,36 +3,57 @@
#include <gpxe/tables.h>
/*
* In order to avoid having objects dragged in just because main()
* calls their initialisation function, we allow each object to
* specify that it has a function that must be called to initialise
* that object. The function call_init_fns() will call all the
* included objects' initialisation functions.
/**
* An initialisation function
*
* Objects that require initialisation should include init.h and
* register the initialisation function using INIT_FN().
*
* Objects may register up to three functions: init, reset and exit.
* init gets called only once, at the point that Etherboot is
* initialised (before the call to main()). reset gets called between
* each boot attempt. exit gets called only once, just before the
* loaded OS starts up (or just before Etherboot exits, if it exits,
* or when the PXE NBP calls UNDI_SHUTDOWN, if it's a PXE NBP).
*
* The syntax is:
* INIT_FN ( init_order, init_function, reset_function, exit_function );
* where init_order is an ordering taken from the list below. Any
* function may be left as NULL.
* Initialisation functions are called exactly once, as part of the
* call to initialise().
*/
struct init_fn {
void ( * initialise ) ( void );
};
/** Declare an initialisation functon */
#define __init_fn( init_order ) \
__table ( struct init_fn, init_fns, init_order )
/** @defgroup initfn_order Initialisation function ordering
* @{
*/
/* An entry in the initialisation function table */
#define INIT_EARLY 01 /**< Early initialisation */
#define INIT_NORMAL 02 /**< Normal initialisation */
struct init_fn {
void ( *init ) ( void );
void ( *exit ) ( void );
/** @} */
/**
* A startup/shutdown function
*
* Startup and shutdown functions may be called multiple times, as
* part of the calls to startup() and shutdown().
*/
struct startup_fn {
void ( * startup ) ( void );
void ( * shutdown ) ( void );
};
/** Declare a startup/shutdown function */
#define __startup_fn( startup_order ) \
__table ( struct startup_fn, startup_fns, startup_order )
/** @defgroup startfn_order Startup/shutdown function ordering
*
* Shutdown functions are called in the reverse order to startup
* functions.
*
* @{
*/
#define STARTUP_EARLY 01 /**< Early startup */
#define STARTUP_NORMAL 02 /**< Normal startup */
/** @} */
/* Use double digits to avoid problems with "10" < "9" on alphabetic sort */
#define INIT_CONSOLE 02
#define INIT_GDBSYM 03
@@ -40,19 +61,9 @@ struct init_fn {
#define INIT_TIMERS 05
#define INIT_LOADBUF 08
#define INIT_PCMCIA 09
#define INIT_RPC 11
/* Macro for creating an initialisation function table entry */
#define INIT_FN( init_order, init_func, exit_func ) \
struct init_fn PREFIX_OBJECT(init_fn__) \
__table ( struct init_fn, init_fn, init_order ) = { \
.init = init_func, \
.exit = exit_func, \
};
/* Function prototypes */
void call_init_fns ( void );
void call_exit_fns ( void );
extern void initialise ( void );
extern void startup ( void );
extern void shutdown ( void );
#endif /* _GPXE_INIT_H */

View File

@@ -34,7 +34,6 @@ struct process {
extern void process_add ( struct process *process );
extern void process_del ( struct process *process );
extern void step ( void );
extern void init_processes ( void );
/**
* Initialise process without adding to process list

View File

@@ -1,10 +0,0 @@
#ifndef _GPXE_SHUTDOWN_H
#define _GPXE_SHUTDOWN_H
/**
* Shut down before exit
*/
extern void shutdown ( void );
#endif /* _GPXE_SHUTDOWN_H */