dda4ef3c3d4e0970f5e4abe3415d6ddc08311192
[people/xl0/gpxe.git] / src / include / init.h
1 #ifndef INIT_H
2 #define INIT_H
3
4 #include "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_PCMCIA     08
46 #define INIT_HEAP       09
47 #define INIT_RPC        10
48
49 /* Macro for creating an initialisation function table entry */
50 #define INIT_FN( init_order, init_func, reset_func, exit_func )               \
51         static struct init_fn PREFIX_OBJECT(init_fn__)                        \
52             __attribute__ (( used, __table_section(init_fn,init_order) )) = { \
53                 .init = init_func,                                            \
54                 .reset = reset_func,                                          \
55                 .exit = exit_func,                                            \
56         };
57
58 /* Function prototypes */
59
60 void call_init_fns ( void );
61 void call_reset_fns ( void );
62 void call_exit_fns ( void );
63
64 #endif /* INIT_H */