// Accessor functions
#define GET_BDA(var) \
- GET_FARVAR(0x0000, ((struct bios_data_area_s *)0)->var)
+ GET_FARVAR(SEG_BDA, ((struct bios_data_area_s *)0)->var)
#define SET_BDA(var, val) \
- SET_FARVAR(0x0000, ((struct bios_data_area_s *)0)->var, (val))
+ SET_FARVAR(SEG_BDA, ((struct bios_data_area_s *)0)->var, (val))
#define CLEARBITS_BDA(var, val) do { \
typeof(((struct bios_data_area_s *)0)->var) __val = GET_BDA(var); \
SET_BDA(var, (__val & ~(val))); \
* 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
// ATA devices info
struct ata_device_s devices[CONFIG_MAX_ATA_DEVICES];
//
- // map between (bios hd id - 0x80) and ata channels
- u8 hdcount, hdidmap[CONFIG_MAX_ATA_DEVICES];
-
- // map between (bios cd id - 0xE0) and ata channels
- u8 cdcount, cdidmap[CONFIG_MAX_ATA_DEVICES];
+ // map between bios hd/cd id and ata channels
+ u8 hdcount, cdcount;
+ u8 idmap[2][CONFIG_MAX_ATA_DEVICES];
// Buffer for DPTE table
struct dpte_s dpte;
// Count of transferred sectors and bytes
u16 trsfsectors;
- u32 trsfbytes;
-} 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
#define GET_EBDA(var) \
- GET_FARVAR(EBDA_SEG, ((struct extended_bios_data_area_s *)0)->var)
+ GET_FARVAR(SEG_EBDA, ((struct extended_bios_data_area_s *)0)->var)
#define SET_EBDA(var, val) \
- 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))
+ SET_FARVAR(SEG_EBDA, ((struct extended_bios_data_area_s *)0)->var, (val))
/****************************************************************
#define UREG(ER, R, RH, RL) union { u32 ER; struct { u16 R; u16 R ## _hi; }; struct { u8 RL; u8 RH; u8 R ## _hilo; u8 R ## _hihi; }; }
+// Layout of registers passed in to irq handlers. Note that this
+// layout corresponds to code in romlayout.S - don't change it here
+// without also updating the assembler code.
struct bregs {
u16 ds;
u16 es;
UREG(edi, di, di_hi, di_lo);
UREG(esi, si, si_hi, si_lo);
- UREG(ebp, bp, bp_hi, bp_lo);
- UREG(esp, sp, sp_hi, sp_lo);
UREG(ebx, bx, bh, bl);
UREG(edx, dx, dh, dl);
UREG(ecx, cx, ch, cl);
u16 ip;
u16 cs;
u16 flags;
-} __attribute__((packed));
+} PACKED;
// bregs flags bitdefs
#define F_ZF (1<<6)
****************************************************************/
#define SEG_BIOS 0xf000
+#define SEG_EBDA 0x9fc0
+#define SEG_BDA 0x0000
-#define EBDA_SEG 0x9FC0
-#define IPL_SEG 0x9FF0
#define EBDA_SIZE 1 // In KiB
#define BASE_MEM_IN_K (640 - EBDA_SIZE)