* Hard drive info
****************************************************************/
-struct fdpt_s {
- u16 cylinders;
- u8 heads;
- u8 a0h_signature;
- u8 phys_sectors;
- u16 precompensation;
- u8 reserved;
- u8 drive_control_byte;
- u16 phys_cylinders;
- u8 phys_heads;
- u16 landing_zone;
- u8 sectors;
- u8 checksum;
-} PACKED;
-
struct chs_s {
u16 heads; // # heads
u16 cylinders; // # cylinders
u16 iobase1; // IO Base 1
u16 iobase2; // IO Base 2
u8 irq; // IRQ
-} PACKED;
+};
struct ata_device_s {
u8 type; // Detected type of ata (ata/atapi/none/unknown)
struct chs_s pchs; // Physical CHS
u32 sectors; // Total sectors count
-} PACKED;
+};
struct ata_s {
// ATA channels info
// Count of transferred sectors and bytes
u16 trsfsectors;
-} PACKED;
+};
// ElTorito Device Emulation data
struct cdemu_s {
// Virtual device
struct chs_s vdevice;
-} PACKED;
+};
+
+
+/****************************************************************
+ * Initial Program Load (IPL)
+ ****************************************************************/
+
+struct ipl_entry_s {
+ u16 type;
+ u16 flags;
+ u32 vector;
+ u32 description;
+};
+
+struct ipl_s {
+ struct ipl_entry_s table[8];
+ u16 count;
+ u16 sequence;
+};
+
+#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)
****************************************************************/
+struct fdpt_s {
+ u16 cylinders;
+ u8 heads;
+ u8 a0h_signature;
+ u8 phys_sectors;
+ u16 precompensation;
+ u8 reserved;
+ u8 drive_control_byte;
+ u16 phys_cylinders;
+ u8 phys_heads;
+ u16 landing_zone;
+ u8 sectors;
+ u8 checksum;
+} PACKED;
+
struct extended_bios_data_area_s {
u8 size;
u8 reserved1[0x21];
struct fdpt_s fdpt0;
struct fdpt_s fdpt1;
+ // 0x5d
u8 other2[0xC4];
// ATA Driver data
// El Torito Emulation data
struct cdemu_s cdemu;
+
+ // Initial program load
+ struct ipl_s ipl;
} PACKED;
// Accessor functions
SET_FARVAR(EBDA_SEG, ((struct extended_bios_data_area_s *)0)->var, (val))
-/****************************************************************
- * Initial Program Load (IPL)
- ****************************************************************/
-
-// XXX - is this a standard, or just a bochs bios thing?
-
-struct ipl_entry_s {
- u16 type;
- u16 flags;
- u32 vector;
- u32 description;
- u32 reserved;
-};
-
-struct ipl_s {
- struct ipl_entry_s table[8];
- u16 count;
- u16 sequence;
- u8 pad[124];
-};
-
-#define IPL_TYPE_FLOPPY 0x01
-#define IPL_TYPE_HARDDISK 0x02
-#define IPL_TYPE_CDROM 0x03
-#define IPL_TYPE_BEV 0x80
-
-// Accessor functions
-#define GET_IPL(var) \
- GET_FARVAR(IPL_SEG, ((struct ipl_s *)0)->var)
-#define SET_IPL(var, val) \
- SET_FARVAR(IPL_SEG, ((struct ipl_s *)0)->var, (val))
-
-
/****************************************************************
* Registers saved/restored in romlayout.S
****************************************************************/
#define SEG_BIOS 0xf000
#define EBDA_SEG 0x9FC0
-#define IPL_SEG 0x9FF0
#define EBDA_SIZE 1 // In KiB
#define BASE_MEM_IN_K (640 - EBDA_SIZE)
{
irq_enable();
- SET_IPL(sequence, seq_nr);
+ SET_EBDA(ipl.sequence, seq_nr);
u16 bootseg;
u8 bootdrv = 0;
bootdev = 0x01;
}
- if (bootdev >= GET_IPL(count)) {
+ if (bootdev >= GET_EBDA(ipl.count)) {
BX_INFO("Invalid boot device (0x%x)\n", bootdev);
return;
}
- u16 type = GET_IPL(table[bootdev].type);
+ u16 type = GET_EBDA(ipl.table[bootdev].type);
/* Do the loading, and set up vector as a far pointer to the boot
* address, and bootdrv as the boot drive */
case IPL_TYPE_BEV: {
/* Expansion ROM with a Bootstrap Entry Vector (a far
* pointer) */
- u32 vector = GET_IPL(table[bootdev].vector);
+ u32 vector = GET_EBDA(ipl.table[bootdev].vector);
bootseg = vector >> 16;
bootip = vector & 0xffff;
break;
handle_18()
{
debug_enter(NULL);
- u16 seq = GET_IPL(sequence) + 1;
+ u16 seq = GET_EBDA(ipl.sequence) + 1;
do_boot(seq);
}
#define bda ((struct bios_data_area_s *)0)
#define ebda ((struct extended_bios_data_area_s *)(EBDA_SEG<<4))
-#define ipl ((struct ipl_s *)(IPL_SEG<<4))
static u8
checksum(u8 *p, u32 len)
static void
init_boot_vectors()
{
- // Clear out the IPL table.
- memset(ipl, 0, sizeof(*ipl));
-
// Floppy drive
- struct ipl_entry_s *ip = &ipl->table[0];
+ struct ipl_entry_s *ip = &ebda->ipl.table[0];
ip->type = IPL_TYPE_FLOPPY;
ip++;
ip++;
}
- ipl->count = ip - ipl->table;
- ipl->sequence = 0xffff;
+ ebda->ipl.count = ip - ebda->ipl.table;
+ ebda->ipl.sequence = 0xffff;
}
static void
// Found a device that thinks it can boot the system. Record
// its BEV and product name string.
- if (ipl->count >= ARRAY_SIZE(ipl->table))
+ if (ebda->ipl.count >= ARRAY_SIZE(ebda->ipl.table))
continue;
- struct ipl_entry_s *ip = &ipl->table[ipl->count];
+ struct ipl_entry_s *ip = &ebda->ipl.table[ebda->ipl.count];
ip->type = IPL_TYPE_BEV;
ip->vector = (FARPTR_TO_SEG(rom) << 16) | entry;
if (desc)
ip->description = (FARPTR_TO_SEG(rom) << 16) | desc;
- ipl->count++;
+ ebda->ipl.count++;
}
}