Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge IPL segment into EBDA segment.
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.
  • Loading branch information
KevinOConnor committed Mar 29, 2008
1 parent a6b9f71 commit 56a506d
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 68 deletions.
99 changes: 46 additions & 53 deletions src/biosvar.h
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand All @@ -194,7 +179,7 @@ struct ata_s {

// Count of transferred sectors and bytes
u16 trsfsectors;
} PACKED;
};

// ElTorito Device Emulation data
struct cdemu_s {
Expand All @@ -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];
Expand All @@ -231,13 +254,17 @@ struct extended_bios_data_area_s {
struct fdpt_s fdpt0;
struct fdpt_s fdpt1;

// 0x5d
u8 other2[0xC4];

// ATA Driver data
struct ata_s ata;

// El Torito Emulation data
struct cdemu_s cdemu;

// Initial program load
struct ipl_s ipl;
} PACKED;

// Accessor functions
Expand All @@ -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
****************************************************************/
Expand Down Expand Up @@ -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)

Expand Down
10 changes: 5 additions & 5 deletions src/boot.c
Expand Up @@ -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;
Expand All @@ -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 */
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

Expand Down
16 changes: 6 additions & 10 deletions src/post.c
Expand Up @@ -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)
Expand Down Expand Up @@ -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++;

Expand All @@ -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
Expand Down Expand Up @@ -346,18 +342,18 @@ 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;

u16 desc = *(u16*)&rom[0x1a+0x10];
if (desc)
ip->description = (FARPTR_TO_SEG(rom) << 16) | desc;

ipl->count++;
ebda->ipl.count++;
}
}

Expand Down

0 comments on commit 56a506d

Please sign in to comment.