[image] Allow multiple embedded images
[people/sha0/gpxe.git] / src / core / main.c
1 /**************************************************************************
2 gPXE -  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 <stdio.h>
18 #include <gpxe/init.h>
19 #include <gpxe/features.h>
20 #include <gpxe/shell.h>
21 #include <gpxe/shell_banner.h>
22 #include <gpxe/image.h>
23 #include <usr/autoboot.h>
24 #include <config/general.h>
25
26 #define NORMAL  "\033[0m"
27 #define BOLD    "\033[1m"
28 #define CYAN    "\033[36m"
29
30 static struct feature features[0] __table_start ( struct feature, features );
31 static struct feature features_end[0] __table_end ( struct feature, features );
32
33 /**
34  * Main entry point
35  *
36  * @ret rc              Return status code
37  */
38 __asmcall int main ( void ) {
39         struct feature *feature;
40         struct image *image;
41
42         /* Some devices take an unreasonably long time to initialise */
43         printf ( PRODUCT_SHORT_NAME " initialising devices...\n" );
44
45         initialise();
46         startup();
47
48         /*
49          * Print welcome banner
50          *
51          *
52          * If you wish to brand this build of gPXE, please do so by
53          * defining the string PRODUCT_NAME in config/general.h.
54          *
55          * While nothing in the GPL prevents you from removing all
56          * references to gPXE or http://etherboot.org, we prefer you
57          * not to do so.
58          *
59          */
60         printf ( NORMAL "\n\n" PRODUCT_NAME "\n" BOLD "gPXE " VERSION
61                  NORMAL " -- Open Source Boot Firmware -- "
62                  CYAN "http://etherboot.org" NORMAL "\n"
63                  "Features:" );
64         for ( feature = features ; feature < features_end ; feature++ )
65                 printf ( " %s", feature->name );
66         printf ( "\n" );
67
68         /* Prompt for shell */
69         if ( shell_banner() ) {
70                 /* User wants shell; just give them a shell */
71                 shell();
72         } else {
73                 /* User doesn't want shell; load and execute the first
74                  * image.  If booting fails (i.e. if the image
75                  * returns, or fails to execute), offer a second
76                  * chance to enter the shell for diagnostics.
77                  */
78                 for_each_image ( image ) {
79                         image_exec ( image );
80                         break;
81                 }
82
83                 if ( shell_banner() )
84                         shell();
85         }
86
87         shutdown ( SHUTDOWN_EXIT | shutdown_exit_flags );
88
89         return 0;
90 }