dc717823dded74d1350915385d9be8f5e95100a1
[people/xl0/gpxe.git] / src / include / gpxe / init.h
1 #ifndef _GPXE_INIT_H
2 #define _GPXE_INIT_H
3
4 #include <gpxe/tables.h>
5
6 /*
7  * In order to avoid having objects dragged in just because main()
8  * calls their initialisation function, we allow each object to
9  * specify that it has a function that must be called to initialise
10  * that object.  The function call_init_fns() will call all the
11  * included objects' initialisation functions.
12  *
13  * Objects that require initialisation should include init.h and
14  * register the initialisation function using INIT_FN().
15  *
16  * Objects may register up to three functions: init, reset and exit.
17  * init gets called only once, at the point that Etherboot is
18  * initialised (before the call to main()).  reset gets called between
19  * each boot attempt.  exit gets called only once, just before the
20  * loaded OS starts up (or just before Etherboot exits, if it exits,
21  * or when the PXE NBP calls UNDI_SHUTDOWN, if it's a PXE NBP).
22  *
23  * The syntax is:
24  *   INIT_FN ( init_order, init_function, reset_function, exit_function );
25  * where init_order is an ordering taken from the list below.  Any
26  * function may be left as NULL.
27  */
28
29 /* An entry in the initialisation function table */
30
31 struct init_fn {
32         void ( *init ) ( void );
33         void ( *reset ) ( void );
34         void ( *exit ) ( void );
35 };
36
37 /* Use double digits to avoid problems with "10" < "9" on alphabetic sort */
38 #define INIT_LIBRM      01
39 #define INIT_CONSOLE    02
40 #define INIT_CPU        03
41 #define INIT_TIMERS     04
42 #define INIT_PCIBIOS    05
43 #define INIT_MEMSIZES   06
44 #define INIT_RELOCATE   07
45 #define INIT_LOADBUF    08
46 #define INIT_PCMCIA     09
47 #define INIT_HEAP       10
48 #define INIT_RPC        11
49 #define INIT_PROCESS    12
50
51 /* Macro for creating an initialisation function table entry */
52 #define INIT_FN( init_order, init_func, reset_func, exit_func ) \
53         struct init_fn PREFIX_OBJECT(init_fn__)                 \
54             __table ( init_fn, init_order ) = {                 \
55                 .init = init_func,                              \
56                 .reset = reset_func,                            \
57                 .exit = exit_func,                              \
58         };
59
60 /* Function prototypes */
61
62 void call_init_fns ( void );
63 void call_reset_fns ( void );
64 void call_exit_fns ( void );
65
66 #endif /* _GPXE_INIT_H */