Move IPL definitions from ebda to global variables.
The boot sequence variable remains in ebda.
Move boot specific definitions to a new header (boot.h)
diff --git a/src/biosvar.h b/src/biosvar.h
index dc70802..1a6da34 100644
--- a/src/biosvar.h
+++ b/src/biosvar.h
@@ -129,31 +129,6 @@
/****************************************************************
- * Initial Program Load (IPL)
- ****************************************************************/
-
-struct ipl_entry_s {
- u16 type;
- u16 flags;
- u32 vector;
- char *description;
-};
-
-struct ipl_s {
- struct ipl_entry_s table[8];
- u16 count;
- u16 sequence;
- u32 bootorder;
- u8 checkfloppysig;
-};
-
-#define IPL_TYPE_FLOPPY 0x01
-#define IPL_TYPE_HARDDISK 0x02
-#define IPL_TYPE_CDROM 0x03
-#define IPL_TYPE_BEV 0x80
-
-
-/****************************************************************
* Extended Bios Data Area (EBDA)
****************************************************************/
@@ -218,8 +193,7 @@
// Locks for removable devices
u8 cdrom_locks[CONFIG_MAX_ATA_DEVICES];
- // Initial program load
- struct ipl_s ipl;
+ u16 boot_sequence;
// Resume stack
u8 resume_stack[128] __aligned(8);
diff --git a/src/boot.c b/src/boot.c
index ca1b980..b8104a5 100644
--- a/src/boot.c
+++ b/src/boot.c
@@ -11,6 +11,9 @@
#include "ata.h" // ata_detect
#include "disk.h" // cdrom_boot
#include "bregs.h" // struct bregs
+#include "boot.h" // struct ipl_s
+
+struct ipl_s IPL;
//--------------------------------------------------------------------------
// print_boot_device
@@ -24,7 +27,7 @@
void
printf_bootdev(u16 bootdev)
{
- u16 type = GET_EBDA(ipl.table[bootdev].type);
+ u16 type = IPL.table[bootdev].type;
/* NIC appears as type 0x80 */
if (type == IPL_TYPE_BEV)
@@ -34,7 +37,7 @@
printf("%s", drivetypes[type]);
/* print product string if BEV */
- char *far_description = GET_EBDA(ipl.table[bootdev].description);
+ char *far_description = IPL.table[bootdev].description;
if (type == 4 && far_description != 0) {
char description[33];
/* first 32 bytes are significant */
@@ -80,9 +83,9 @@
if (! CONFIG_BOOT)
BX_PANIC("Boot support not compiled in.\n");
- SET_EBDA(ipl.sequence, seq_nr);
+ SET_EBDA(boot_sequence, seq_nr);
- u32 bootdev = GET_EBDA(ipl.bootorder);
+ u32 bootdev = IPL.bootorder;
bootdev >>= 4 * seq_nr;
bootdev &= 0xf;
@@ -92,7 +95,7 @@
/* Translate bootdev to an IPL table offset by subtracting 1 */
bootdev -= 1;
- if (bootdev >= GET_EBDA(ipl.count)) {
+ if (bootdev >= IPL.count) {
dprintf(1, "Invalid boot device (0x%x)\n", bootdev);
return;
}
@@ -101,7 +104,7 @@
* address, and bootdrv as the boot drive */
print_boot_device(bootdev);
- u16 type = GET_EBDA(ipl.table[bootdev].type);
+ u16 type = IPL.table[bootdev].type;
u16 bootseg, bootip;
u8 bootdrv = 0;
@@ -129,7 +132,7 @@
/* Always check the signature on a HDD boot sector; on FDD,
* only do the check if configured for it */
- if (type != IPL_TYPE_FLOPPY || GET_EBDA(ipl.checkfloppysig)) {
+ if (type != IPL_TYPE_FLOPPY || IPL.checkfloppysig) {
if (GET_FARVAR(bootseg, *(u16*)0x1fe) != 0xaa55) {
print_boot_failure(type, 0);
return;
@@ -161,7 +164,7 @@
case IPL_TYPE_BEV: {
/* Expansion ROM with a Bootstrap Entry Vector (a far
* pointer) */
- u32 vector = GET_EBDA(ipl.table[bootdev].vector);
+ u32 vector = IPL.table[bootdev].vector;
bootseg = vector >> 16;
bootip = vector & 0xffff;
break;
@@ -199,7 +202,7 @@
{
debug_serial_setup();
debug_enter(NULL, DEBUG_HDL_18);
- u16 seq = GET_EBDA(ipl.sequence) + 1;
+ u16 seq = GET_EBDA(boot_sequence) + 1;
do_boot(seq);
}
diff --git a/src/boot.h b/src/boot.h
new file mode 100644
index 0000000..a5fe08e
--- /dev/null
+++ b/src/boot.h
@@ -0,0 +1,41 @@
+// Storage for boot definitions.
+#ifndef __BOOT_H
+#define __BOOT_H
+
+
+/****************************************************************
+ * Initial Program Load (IPL)
+ ****************************************************************/
+
+struct ipl_entry_s {
+ u16 type;
+ u16 flags;
+ u32 vector;
+ char *description;
+};
+
+struct ipl_s {
+ struct ipl_entry_s table[8];
+ u16 count;
+ u32 bootorder;
+ u8 checkfloppysig;
+};
+
+#define IPL_TYPE_FLOPPY 0x01
+#define IPL_TYPE_HARDDISK 0x02
+#define IPL_TYPE_CDROM 0x03
+#define IPL_TYPE_BEV 0x80
+
+
+/****************************************************************
+ * Function defs
+ ****************************************************************/
+
+// boot.c
+extern struct ipl_s IPL;
+void printf_bootdev(u16 bootdev);
+
+// post_menu.c
+void interactive_bootmenu();
+
+#endif // __BOOT_H
diff --git a/src/optionroms.c b/src/optionroms.c
index b7bc110..44001ee 100644
--- a/src/optionroms.c
+++ b/src/optionroms.c
@@ -6,11 +6,13 @@
// This file may be distributed under the terms of the GNU GPLv3 license.
#include "bregs.h" // struct bregs
-#include "biosvar.h" // struct ipl_entry_s
+#include "farptr.h" // FARPTR_TO_SEG
+#include "config.h" // CONFIG_*
#include "util.h" // dprintf
#include "pci.h" // pci_find_class
#include "pci_regs.h" // PCI_ROM_ADDRESS
#include "pci_ids.h" // PCI_CLASS_DISPLAY_VGA
+#include "boot.h" // IPL
/****************************************************************
@@ -156,11 +158,10 @@
if (! CONFIG_BOOT)
return;
- struct extended_bios_data_area_s *ebda = get_ebda_ptr();
- if (ebda->ipl.count >= ARRAY_SIZE(ebda->ipl.table))
+ if (IPL.count >= ARRAY_SIZE(IPL.table))
return;
- struct ipl_entry_s *ip = &ebda->ipl.table[ebda->ipl.count];
+ struct ipl_entry_s *ip = &IPL.table[IPL.count];
ip->type = IPL_TYPE_BEV;
ip->vector = (FARPTR_TO_SEG(rom) << 16) | pnp->bev;
@@ -168,7 +169,7 @@
if (desc)
ip->description = MAKE_FARPTR(FARPTR_TO_SEG(rom), desc);
- ebda->ipl.count++;
+ IPL.count++;
}
// Copy a rom to its permanent location below 1MiB
diff --git a/src/post.c b/src/post.c
index ec55ab2..cc86abf 100644
--- a/src/post.c
+++ b/src/post.c
@@ -17,6 +17,7 @@
#include "pci.h" // create_pirtable
#include "acpi.h" // acpi_bios_init
#include "bregs.h" // struct bregs
+#include "boot.h" // IPL
#define bda ((struct bios_data_area_s *)MAKE_FARPTR(SEG_BDA, 0))
@@ -156,8 +157,7 @@
dprintf(3, "init boot device ordering\n");
// Floppy drive
- struct extended_bios_data_area_s *ebda = get_ebda_ptr();
- struct ipl_entry_s *ip = &ebda->ipl.table[0];
+ struct ipl_entry_s *ip = &IPL.table[0];
ip->type = IPL_TYPE_FLOPPY;
ip++;
@@ -171,18 +171,18 @@
ip++;
}
- ebda->ipl.count = ip - ebda->ipl.table;
- ebda->ipl.sequence = 0xffff;
+ IPL.count = ip - IPL.table;
+ SET_EBDA(boot_sequence, 0xffff);
if (CONFIG_COREBOOT) {
// XXX - hardcode defaults for coreboot.
- ebda->ipl.bootorder = 0x00000231;
- ebda->ipl.checkfloppysig = 1;
+ IPL.bootorder = 0x00000231;
+ IPL.checkfloppysig = 1;
} else {
// On emulators, get boot order from nvram.
- ebda->ipl.bootorder = (inb_cmos(CMOS_BIOS_BOOTFLAG2)
- | ((inb_cmos(CMOS_BIOS_BOOTFLAG1) & 0xf0) << 4));
+ IPL.bootorder = (inb_cmos(CMOS_BIOS_BOOTFLAG2)
+ | ((inb_cmos(CMOS_BIOS_BOOTFLAG1) & 0xf0) << 4));
if (!(inb_cmos(CMOS_BIOS_BOOTFLAG1) & 1))
- ebda->ipl.checkfloppysig = 1;
+ IPL.checkfloppysig = 1;
}
}
diff --git a/src/post_menu.c b/src/post_menu.c
index f714668..8b6e58a 100644
--- a/src/post_menu.c
+++ b/src/post_menu.c
@@ -8,6 +8,7 @@
#include "biosvar.h" // GET_EBDA
#include "util.h" // mdelay
#include "bregs.h" // struct bregs
+#include "boot.h" // IPL
static int
check_for_keystroke()
@@ -74,7 +75,7 @@
printf("Select boot device:\n\n");
- int count = GET_EBDA(ipl.count);
+ int count = IPL.count;
int i;
for (i = 0; i < count; i++) {
printf("%d. ", i+1);
@@ -90,8 +91,8 @@
if (scan_code <= count + 1) {
// Add user choice to the boot order.
u16 choice = scan_code - 1;
- u32 bootorder = GET_EBDA(ipl.bootorder);
- SET_EBDA(ipl.bootorder, (bootorder << 4) | choice);
+ u32 bootorder = IPL.bootorder;
+ IPL.bootorder = (bootorder << 4) | choice;
break;
}
}
diff --git a/src/util.h b/src/util.h
index 89f049a..b3d6a49 100644
--- a/src/util.h
+++ b/src/util.h
@@ -160,12 +160,6 @@
// smbios.c
void smbios_init(void);
-// boot.c
-void printf_bootdev(u16 bootdev);
-
-// post_menu.c
-void interactive_bootmenu();
-
// coreboot.c
void coreboot_fill_map();