Use a linker-table based system to automatically mark and start up
[people/sha0/gpxe.git] / src / core / main.c
1 /**************************************************************************
2 Etherboot -  Network Bootstrap Program
3
4 Literature dealing with the network protocols:
5         ARP - RFC826
6         RARP - RFC903
7         UDP - RFC768
8         BOOTP - RFC951, RFC2132 (vendor extensions)
9         DHCP - RFC2131, RFC2132 (options)
10         TFTP - RFC1350, RFC2347 (options), RFC2348 (blocksize), RFC2349 (tsize)
11         RPC - RFC1831, RFC1832 (XDR), RFC1833 (rpcbind/portmapper)
12         NFS - RFC1094, RFC1813 (v3, useful for clarifications, not implemented)
13         IGMP - RFC1112
14
15 **************************************************************************/
16
17 #include <gpxe/heap.h>
18 #include <gpxe/init.h>
19 #include <gpxe/process.h>
20 #include <gpxe/device.h>
21 #include <gpxe/shell.h>
22 #include <gpxe/shell_banner.h>
23 #include <gpxe/shutdown.h>
24 #include <gpxe/hidemem.h>
25 #include <usr/autoboot.h>
26
27 /**
28  * Start up Etherboot
29  *
30  * Call this function only once, before doing (almost) anything else.
31  */
32 static void startup ( void ) {
33         init_heap();
34         init_processes();
35
36         hide_etherboot();
37         call_init_fns();
38         probe_devices();
39 }
40
41 /**
42  * Shut down Etherboot
43  *
44  * Call this function only once, before either exiting main() or
45  * starting up a non-returnable image.
46  */
47 void shutdown ( void ) {
48         remove_devices();
49         call_exit_fns();
50         unhide_etherboot();
51 }
52
53 /**
54  * Main entry point
55  *
56  * @ret rc              Return status code
57  */
58 int main ( void ) {
59
60         startup();
61
62         /* Try autobooting if we're not going straight to the shell */
63         if ( ! shell_banner() ) {
64                 autoboot();
65         }
66         
67         /* Autobooting failed or the user wanted the shell */
68         shell();
69
70         shutdown();
71
72         return 0;
73 }