diff options
| author | Michael Brown | 2007-07-29 03:31:14 +0200 |
|---|---|---|
| committer | Michael Brown | 2007-07-29 03:31:14 +0200 |
| commit | 43013da9bf02439b4726d8afef15f7ce97d1c469 (patch) | |
| tree | b9cacbe294de8d0b06e04799746fc9377010ccb5 /src/usr | |
| parent | Applied a modified version of holger's regparm patches. (diff) | |
| download | ipxe-43013da9bf02439b4726d8afef15f7ce97d1c469.tar.gz ipxe-43013da9bf02439b4726d8afef15f7ce97d1c469.tar.xz ipxe-43013da9bf02439b4726d8afef15f7ce97d1c469.zip | |
Quick hack to get AoE back in to the tree, on a par with the current
iSCSI hack.
Diffstat (limited to 'src/usr')
| -rw-r--r-- | src/usr/aoeboot.c | 67 | ||||
| -rw-r--r-- | src/usr/autoboot.c | 11 |
2 files changed, 74 insertions, 4 deletions
diff --git a/src/usr/aoeboot.c b/src/usr/aoeboot.c new file mode 100644 index 000000000..54bb5d47b --- /dev/null +++ b/src/usr/aoeboot.c @@ -0,0 +1,67 @@ +#include <stdint.h> +#include <string.h> +#include <stdio.h> +#include <gpxe/aoe.h> +#include <gpxe/ata.h> +#include <gpxe/netdevice.h> +#include <gpxe/dhcp.h> +#include <int13.h> +#include <usr/aoeboot.h> + +/** + * Guess boot network device + * + * @ret netdev Boot network device + */ +static struct net_device * guess_boot_netdev ( void ) { + struct net_device *boot_netdev; + + /* Just use the first network device */ + for_each_netdev ( boot_netdev ) { + return boot_netdev; + } + + return NULL; +} + +int aoeboot ( const char *root_path ) { + struct ata_device ata; + struct int13_drive drive; + int rc; + + memset ( &ata, 0, sizeof ( ata ) ); + memset ( &drive, 0, sizeof ( drive ) ); + + printf ( "AoE booting from %s\n", root_path ); + + /* FIXME: ugly, ugly hack */ + struct net_device *netdev = guess_boot_netdev(); + + if ( ( rc = aoe_attach ( &ata, netdev, root_path ) ) != 0 ) { + printf ( "Could not attach AoE device: %s\n", + strerror ( rc ) ); + goto error_attach; + } + if ( ( rc = init_atadev ( &ata ) ) != 0 ) { + printf ( "Could not initialise AoE device: %s\n", + strerror ( rc ) ); + goto error_init; + } + + drive.drive = find_global_dhcp_num_option ( DHCP_EB_BIOS_DRIVE ); + drive.blockdev = &ata.blockdev; + + register_int13_drive ( &drive ); + printf ( "Registered as BIOS drive %#02x\n", drive.drive ); + printf ( "Booting from BIOS drive %#02x\n", drive.drive ); + rc = int13_boot ( drive.drive ); + printf ( "Boot failed\n" ); + + printf ( "Unregistering BIOS drive %#02x\n", drive.drive ); + unregister_int13_drive ( &drive ); + + error_init: + aoe_detach ( &ata ); + error_attach: + return rc; +} diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c index 4bc43d5a7..53283d18c 100644 --- a/src/usr/autoboot.c +++ b/src/usr/autoboot.c @@ -27,6 +27,7 @@ #include <usr/dhcpmgmt.h> #include <usr/imgmgmt.h> #include <usr/iscsiboot.h> +#include <usr/aoeboot.h> #include <usr/autoboot.h> /** @file @@ -88,13 +89,15 @@ static int boot_filename ( const char *filename ) { * @ret rc Return status code */ static int boot_root_path ( const char *root_path ) { - int rc; /* Quick hack */ - if ( ( rc = iscsiboot ( root_path ) ) != 0 ) - return rc; + if ( strncmp ( root_path, "iscsi:", 6 ) == 0 ) { + return iscsiboot ( root_path ); + } else if ( strncmp ( root_path, "aoe:", 4 ) == 0 ) { + return aoeboot ( root_path ); + } - return 0; + return -ENOTSUP; } /** |
