Added the AoE boot information table as used by Vampyre's AoE
authorMichael Brown <mcb30@etherboot.org>
Mon, 30 Jul 2007 22:58:59 +0000 (23:58 +0100)
committerMichael Brown <mcb30@etherboot.org>
Mon, 30 Jul 2007 22:58:59 +0000 (23:58 +0100)
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.

src/usr/aoeboot.c

index 54bb5d4..91b80e3 100644 (file)
@@ -8,6 +8,26 @@
 #include <int13.h>
 #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
  *
@@ -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;