2005-03-08 18:53:11 +00:00
|
|
|
/**************************************************************************
|
|
|
|
Etherboot - Network Bootstrap Program
|
|
|
|
|
|
|
|
Literature dealing with the network protocols:
|
|
|
|
ARP - RFC826
|
|
|
|
RARP - RFC903
|
|
|
|
UDP - RFC768
|
|
|
|
BOOTP - RFC951, RFC2132 (vendor extensions)
|
|
|
|
DHCP - RFC2131, RFC2132 (options)
|
|
|
|
TFTP - RFC1350, RFC2347 (options), RFC2348 (blocksize), RFC2349 (tsize)
|
|
|
|
RPC - RFC1831, RFC1832 (XDR), RFC1833 (rpcbind/portmapper)
|
|
|
|
NFS - RFC1094, RFC1813 (v3, useful for clarifications, not implemented)
|
|
|
|
IGMP - RFC1112
|
|
|
|
|
|
|
|
**************************************************************************/
|
|
|
|
|
2007-01-14 00:16:41 +00:00
|
|
|
#include <gpxe/heap.h>
|
2006-04-30 01:08:52 +00:00
|
|
|
#include <gpxe/init.h>
|
2006-06-01 15:53:05 +00:00
|
|
|
#include <gpxe/device.h>
|
2006-12-20 00:26:01 +00:00
|
|
|
#include <gpxe/shell.h>
|
|
|
|
#include <gpxe/shell_banner.h>
|
2007-01-14 00:16:41 +00:00
|
|
|
#include <gpxe/shutdown.h>
|
2007-01-14 00:53:56 +00:00
|
|
|
#include <gpxe/hidemem.h>
|
2007-01-10 02:03:20 +00:00
|
|
|
#include <usr/autoboot.h>
|
2006-06-01 15:53:05 +00:00
|
|
|
|
2007-01-14 00:16:41 +00:00
|
|
|
/**
|
|
|
|
* Start up Etherboot
|
|
|
|
*
|
|
|
|
* Call this function only once, before doing (almost) anything else.
|
|
|
|
*/
|
|
|
|
static void startup ( void ) {
|
2007-01-14 00:53:56 +00:00
|
|
|
hide_etherboot();
|
2007-01-14 00:16:41 +00:00
|
|
|
init_heap();
|
2007-01-14 00:53:56 +00:00
|
|
|
call_init_fns();
|
2007-01-14 00:16:41 +00:00
|
|
|
probe_devices();
|
2005-03-08 18:53:11 +00:00
|
|
|
}
|
|
|
|
|
2007-01-14 00:16:41 +00:00
|
|
|
/**
|
|
|
|
* Shut down Etherboot
|
|
|
|
*
|
|
|
|
* Call this function only once, before either exiting main() or
|
|
|
|
* starting up a non-returnable image.
|
|
|
|
*/
|
|
|
|
void shutdown ( void ) {
|
|
|
|
remove_devices();
|
2007-01-14 00:53:56 +00:00
|
|
|
call_exit_fns();
|
|
|
|
unhide_etherboot();
|
2005-03-08 18:53:11 +00:00
|
|
|
}
|
2005-04-12 16:43:18 +00:00
|
|
|
|
2007-01-14 00:16:41 +00:00
|
|
|
/**
|
|
|
|
* Main entry point
|
|
|
|
*
|
|
|
|
* @ret rc Return status code
|
|
|
|
*/
|
2005-04-08 15:01:17 +00:00
|
|
|
int main ( void ) {
|
2005-03-08 18:53:11 +00:00
|
|
|
|
2007-01-14 00:16:41 +00:00
|
|
|
startup();
|
2006-05-02 21:10:45 +00:00
|
|
|
|
2006-12-20 07:04:08 +00:00
|
|
|
/* Try autobooting if we're not going straight to the shell */
|
|
|
|
if ( ! shell_banner() ) {
|
|
|
|
autoboot();
|
2006-12-20 00:26:01 +00:00
|
|
|
}
|
2006-12-20 07:04:08 +00:00
|
|
|
|
|
|
|
/* Autobooting failed or the user wanted the shell */
|
|
|
|
shell();
|
2005-04-21 18:18:29 +00:00
|
|
|
|
2007-01-14 00:16:41 +00:00
|
|
|
shutdown();
|
2005-04-12 16:43:18 +00:00
|
|
|
|
2007-01-14 00:16:41 +00:00
|
|
|
return 0;
|
2005-03-08 18:53:11 +00:00
|
|
|
}
|