Browse Source

Added support for draft version of the AoE Boot Firmware Table.

tags/v0.9.3
Michael Brown 17 years ago
parent
commit
291d69d7fd
3 changed files with 98 additions and 0 deletions
  1. 60
    0
      src/core/abft.c
  2. 35
    0
      src/include/gpxe/abft.h
  3. 3
    0
      src/usr/aoeboot.c

+ 60
- 0
src/core/abft.c View File

@@ -0,0 +1,60 @@
1
+/*
2
+ * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
3
+ *
4
+ * This program is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU General Public License as
6
+ * published by the Free Software Foundation; either version 2 of the
7
+ * License, or any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful, but
10
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
+ * General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public License
15
+ * along with this program; if not, write to the Free Software
16
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
+ */
18
+
19
+#include <realmode.h>
20
+#include <gpxe/aoe.h>
21
+#include <gpxe/netdevice.h>
22
+#include <gpxe/abft.h>
23
+
24
+/** @file
25
+ *
26
+ * AoE Boot Firmware Table
27
+ *
28
+ */
29
+
30
+#define abftab __use_data16 ( abftab )
31
+/** The aBFT used by gPXE */
32
+struct abft_table __data16 ( abftab ) __attribute__ (( aligned ( 16 ) )) = {
33
+	/* ACPI header */
34
+	.acpi = {
35
+		.signature = ABFT_SIG,
36
+		.length = sizeof ( abftab ),
37
+		.revision = 1,
38
+		.oem_id = "FENSYS",
39
+		.oem_table_id = "gPXE",
40
+	},
41
+};
42
+
43
+/**
44
+ * Fill in all variable portions of aBFT
45
+ *
46
+ * @v aoe		AoE session
47
+ */
48
+void abft_fill_data ( struct aoe_session *aoe ) {
49
+
50
+	/* Fill in boot parameters */
51
+	abftab.shelf = aoe->major;
52
+	abftab.slot = aoe->minor;
53
+	memcpy ( abftab.mac, aoe->netdev->ll_addr, sizeof ( abftab.mac ) );
54
+
55
+	/* Update checksum */
56
+	acpi_fix_checksum ( &abftab.acpi );
57
+
58
+	DBG ( "AoE boot firmware table:\n" );
59
+	DBG_HD ( &abftab, sizeof ( abftab ) );
60
+}

+ 35
- 0
src/include/gpxe/abft.h View File

@@ -0,0 +1,35 @@
1
+#ifndef _GPXE_ABFT_H
2
+#define _GPXE_ABFT_H
3
+
4
+/** @file
5
+ *
6
+ * AoE boot firmware table
7
+ *
8
+ */
9
+
10
+#include <stdint.h>
11
+#include <gpxe/acpi.h>
12
+#include <gpxe/if_ether.h>
13
+
14
+/** AoE boot firmware table signature */
15
+#define ABFT_SIG "aBFT"
16
+
17
+/**
18
+ * AoE Boot Firmware Table (aBFT)
19
+ */
20
+struct abft_table {
21
+	/** ACPI header */
22
+	struct acpi_description_header acpi;
23
+	/** AoE shelf */
24
+	uint16_t shelf;
25
+	/** AoE slot */
26
+	uint8_t slot;
27
+	/** Reserved */
28
+	uint8_t reserved_a;
29
+	/** MAC address */
30
+	uint8_t mac[ETH_ALEN];
31
+} __attribute__ (( packed ));
32
+
33
+extern void abft_fill_data ( struct aoe_session *aoe );
34
+
35
+#endif /* _GPXE_ABFT_H */

+ 3
- 0
src/usr/aoeboot.c View File

@@ -6,6 +6,7 @@
6 6
 #include <gpxe/ata.h>
7 7
 #include <gpxe/netdevice.h>
8 8
 #include <gpxe/dhcp.h>
9
+#include <gpxe/abft.h>
9 10
 #include <int13.h>
10 11
 #include <usr/aoeboot.h>
11 12
 
@@ -82,6 +83,8 @@ int aoeboot ( const char *root_path ) {
82 83
 	boot_info.slot = aoe->minor;
83 84
 	copy_to_real ( 0x40, 0xf0, &boot_info, sizeof ( boot_info ) );
84 85
 
86
+	abft_fill_data ( aoe );
87
+
85 88
 	drive.drive = find_global_dhcp_num_option ( DHCP_EB_BIOS_DRIVE );
86 89
 	drive.blockdev = &ata.blockdev;
87 90
 

Loading…
Cancel
Save