mirror of
				https://github.com/xcat2/xNBA.git
				synced 2025-10-31 19:32:34 +00:00 
			
		
		
		
	Added support for draft version of the AoE Boot Firmware Table.
This commit is contained in:
		
							
								
								
									
										60
									
								
								src/core/abft.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/core/abft.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| /* | ||||
|  * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; either version 2 of the | ||||
|  * License, or any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
|  */ | ||||
|  | ||||
| #include <realmode.h> | ||||
| #include <gpxe/aoe.h> | ||||
| #include <gpxe/netdevice.h> | ||||
| #include <gpxe/abft.h> | ||||
|  | ||||
| /** @file | ||||
|  * | ||||
|  * AoE Boot Firmware Table | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #define abftab __use_data16 ( abftab ) | ||||
| /** The aBFT used by gPXE */ | ||||
| struct abft_table __data16 ( abftab ) __attribute__ (( aligned ( 16 ) )) = { | ||||
| 	/* ACPI header */ | ||||
| 	.acpi = { | ||||
| 		.signature = ABFT_SIG, | ||||
| 		.length = sizeof ( abftab ), | ||||
| 		.revision = 1, | ||||
| 		.oem_id = "FENSYS", | ||||
| 		.oem_table_id = "gPXE", | ||||
| 	}, | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Fill in all variable portions of aBFT | ||||
|  * | ||||
|  * @v aoe		AoE session | ||||
|  */ | ||||
| void abft_fill_data ( struct aoe_session *aoe ) { | ||||
|  | ||||
| 	/* Fill in boot parameters */ | ||||
| 	abftab.shelf = aoe->major; | ||||
| 	abftab.slot = aoe->minor; | ||||
| 	memcpy ( abftab.mac, aoe->netdev->ll_addr, sizeof ( abftab.mac ) ); | ||||
|  | ||||
| 	/* Update checksum */ | ||||
| 	acpi_fix_checksum ( &abftab.acpi ); | ||||
|  | ||||
| 	DBG ( "AoE boot firmware table:\n" ); | ||||
| 	DBG_HD ( &abftab, sizeof ( abftab ) ); | ||||
| } | ||||
							
								
								
									
										35
									
								
								src/include/gpxe/abft.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/include/gpxe/abft.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| #ifndef _GPXE_ABFT_H | ||||
| #define _GPXE_ABFT_H | ||||
|  | ||||
| /** @file | ||||
|  * | ||||
|  * AoE boot firmware table | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <gpxe/acpi.h> | ||||
| #include <gpxe/if_ether.h> | ||||
|  | ||||
| /** AoE boot firmware table signature */ | ||||
| #define ABFT_SIG "aBFT" | ||||
|  | ||||
| /** | ||||
|  * AoE Boot Firmware Table (aBFT) | ||||
|  */ | ||||
| struct abft_table { | ||||
| 	/** ACPI header */ | ||||
| 	struct acpi_description_header acpi; | ||||
| 	/** AoE shelf */ | ||||
| 	uint16_t shelf; | ||||
| 	/** AoE slot */ | ||||
| 	uint8_t slot; | ||||
| 	/** Reserved */ | ||||
| 	uint8_t reserved_a; | ||||
| 	/** MAC address */ | ||||
| 	uint8_t mac[ETH_ALEN]; | ||||
| } __attribute__ (( packed )); | ||||
|  | ||||
| extern void abft_fill_data ( struct aoe_session *aoe ); | ||||
|  | ||||
| #endif /* _GPXE_ABFT_H */ | ||||
| @@ -6,6 +6,7 @@ | ||||
| #include <gpxe/ata.h> | ||||
| #include <gpxe/netdevice.h> | ||||
| #include <gpxe/dhcp.h> | ||||
| #include <gpxe/abft.h> | ||||
| #include <int13.h> | ||||
| #include <usr/aoeboot.h> | ||||
|  | ||||
| @@ -82,6 +83,8 @@ int aoeboot ( const char *root_path ) { | ||||
| 	boot_info.slot = aoe->minor; | ||||
| 	copy_to_real ( 0x40, 0xf0, &boot_info, sizeof ( boot_info ) ); | ||||
|  | ||||
| 	abft_fill_data ( aoe ); | ||||
|  | ||||
| 	drive.drive = find_global_dhcp_num_option ( DHCP_EB_BIOS_DRIVE ); | ||||
| 	drive.blockdev = &ata.blockdev; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user