diff options
-rw-r--r-- | src/biosvar.h | 99 | ||||
-rw-r--r-- | src/boot.c | 10 | ||||
-rw-r--r-- | src/post.c | 16 |
3 files changed, 57 insertions, 68 deletions
diff --git a/src/biosvar.h b/src/biosvar.h index 6cf5980..494b6a8 100644 --- a/src/biosvar.h +++ b/src/biosvar.h @@ -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 @@ -248,39 +275,6 @@ struct extended_bios_data_area_s { /**************************************************************** - * 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) @@ -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); } @@ -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++; } } |