Merge IPL segment into EBDA segment.
authorKevin O'Connor <kevin@koconnor.net>
Sat, 29 Mar 2008 17:15:36 +0000 (13:15 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Sat, 29 Mar 2008 17:15:36 +0000 (13:15 -0400)
It does not appear that IPL info needs to be at exactly 0x9ff00.
Have IPL struct be part of ebda structure - it prevents unintended overlaps.
Also, ATA structs don't need to be packed.

src/biosvar.h
src/boot.c
src/post.c

index 6cf5980..494b6a8 100644 (file)
@@ -119,21 +119,6 @@ struct bios_data_area_s {
  * 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
@@ -161,7 +146,7 @@ struct ata_channel_s {
     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)
@@ -176,7 +161,7 @@ struct ata_device_s {
     struct chs_s  pchs;         // Physical CHS
 
     u32 sectors;      // Total sectors count
-} PACKED;
+};
 
 struct ata_s {
     // ATA channels info
@@ -194,7 +179,7 @@ struct ata_s {
 
     // Count of transferred sectors and bytes
     u16 trsfsectors;
-} PACKED;
+};
 
 // ElTorito Device Emulation data
 struct cdemu_s {
@@ -210,13 +195,51 @@ 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];
@@ -231,6 +254,7 @@ struct extended_bios_data_area_s {
     struct fdpt_s fdpt0;
     struct fdpt_s fdpt1;
 
+    // 0x5d
     u8 other2[0xC4];
 
     // ATA Driver data
@@ -238,6 +262,9 @@ struct extended_bios_data_area_s {
 
     // El Torito Emulation data
     struct cdemu_s cdemu;
+
+    // Initial program load
+    struct ipl_s ipl;
 } PACKED;
 
 // Accessor functions
@@ -247,39 +274,6 @@ struct extended_bios_data_area_s {
     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
  ****************************************************************/
@@ -339,7 +333,6 @@ extern struct bios_config_table_s BIOS_CONFIG_TABLE;
 #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)
 
index d37ab7d..153ea24 100644 (file)
@@ -65,7 +65,7 @@ try_boot(u16 seq_nr)
 {
     irq_enable();
 
-    SET_IPL(sequence, seq_nr);
+    SET_EBDA(ipl.sequence, seq_nr);
 
     u16 bootseg;
     u8 bootdrv = 0;
@@ -92,11 +92,11 @@ try_boot(u16 seq_nr)
             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 */
@@ -159,7 +159,7 @@ try_boot(u16 seq_nr)
     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;
@@ -196,7 +196,7 @@ void VISIBLE16
 handle_18()
 {
     debug_enter(NULL);
-    u16 seq = GET_IPL(sequence) + 1;
+    u16 seq = GET_EBDA(ipl.sequence) + 1;
     do_boot(seq);
 }
 
index dc8edec..79ae68f 100644 (file)
@@ -16,7 +16,6 @@
 
 #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)
@@ -284,11 +283,8 @@ hard_drive_post()
 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++;
 
@@ -302,8 +298,8 @@ init_boot_vectors()
         ip++;
     }
 
-    ipl->count = ip - ipl->table;
-    ipl->sequence = 0xffff;
+    ebda->ipl.count = ip - ebda->ipl.table;
+    ebda->ipl.sequence = 0xffff;
 }
 
 static void
@@ -346,10 +342,10 @@ rom_scan(u32 start, u32 end)
         // 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;
 
@@ -357,7 +353,7 @@ rom_scan(u32 start, u32 end)
         if (desc)
             ip->description = (FARPTR_TO_SEG(rom) << 16) | desc;
 
-        ipl->count++;
+        ebda->ipl.count++;
     }
 }