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 @@ -8,6 +8,26 @@ #include #include +/** + * 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;