summaryrefslogtreecommitdiffstats
path: root/src/usr/aoeboot.c
diff options
context:
space:
mode:
authorMichael Brown2007-07-31 00:58:59 +0200
committerMichael Brown2007-07-31 00:58:59 +0200
commitd0abffc2f682975171073b856458b31c79ed3eef (patch)
treeadcd382bd344015a5920226837c0b6a2ecacf26a /src/usr/aoeboot.c
parenttls_change_cipher() can complain about null cipher and digest (diff)
downloadipxe-d0abffc2f682975171073b856458b31c79ed3eef.tar.gz
ipxe-d0abffc2f682975171073b856458b31c79ed3eef.tar.xz
ipxe-d0abffc2f682975171073b856458b31c79ed3eef.zip
Added the AoE boot information table as used by Vampyre's AoE
initiator. This table needs to be replaced by something similar to iBFT (i.e. scanned for and identified by signature, rather than being at a fixed address), but it works for now.
Diffstat (limited to 'src/usr/aoeboot.c')
-rw-r--r--src/usr/aoeboot.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/usr/aoeboot.c b/src/usr/aoeboot.c
index 54bb5d47..91b80e34 100644
--- a/src/usr/aoeboot.c
+++ b/src/usr/aoeboot.c
@@ -9,6 +9,26 @@
#include <usr/aoeboot.h>
/**
+ * AoE boot information block
+ *
+ * Must be placed at 40:f0.
+ *
+ * This structure needs to be replaced by an ACPI table or similar.
+ */
+struct aoe_boot_info {
+ /** Must be 0x01 */
+ uint8_t one;
+ /** Client MAC address */
+ uint8_t client[ETH_ALEN];
+ /** Server MAC address */
+ uint8_t server[ETH_ALEN];
+ /** Shelf number */
+ uint16_t shelf;
+ /** Slot number */
+ uint8_t slot;
+} __attribute__ (( packed ));
+
+/**
* Guess boot network device
*
* @ret netdev Boot network device
@@ -48,6 +68,19 @@ int aoeboot ( const char *root_path ) {
goto error_init;
}
+ /* FIXME: ugly, ugly hack */
+ struct aoe_session *aoe =
+ container_of ( ata.backend, struct aoe_session, refcnt );
+ struct aoe_boot_info boot_info;
+ boot_info.one = 0x01;
+ memcpy ( boot_info.client, netdev->ll_addr,
+ sizeof ( boot_info.client ) );
+ memcpy ( boot_info.server, aoe->target,
+ sizeof ( boot_info.server ) );
+ boot_info.shelf = aoe->major;
+ boot_info.slot = aoe->minor;
+ copy_to_real ( 0x40, 0xf0, &boot_info, sizeof ( boot_info ) );
+
drive.drive = find_global_dhcp_num_option ( DHCP_EB_BIOS_DRIVE );
drive.blockdev = &ata.blockdev;