1 // Variable layouts of bios.
3 // Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
5 // This file may be distributed under the terms of the GNU GPLv3 license.
9 #include "types.h" // u8
10 #include "farptr.h" // SET_SEG
11 #include "config.h" // CONFIG_*
14 /****************************************************************
15 * Bios Data Area (BDA)
16 ****************************************************************/
23 struct bios_data_area_s {
25 struct ivec ivecs[256];
33 u16 equipment_list_flags;
45 u8 floppy_recalibration_status;
46 u8 floppy_motor_status;
48 u8 floppy_motor_counter;
49 u8 floppy_last_status;
50 u8 floppy_return_status[7];
70 u16 kbd_buf_start_offset;
71 u16 kbd_buf_end_offset;
73 u8 floppy_last_data_rate;
74 u8 disk_status_controller;
75 u8 disk_error_controller;
76 u8 disk_interrupt_flag;
77 u8 floppy_harddisk_info;
79 u8 floppy_media_state[4];
84 u32 ptr_user_wait_complete_flag;
85 u32 user_wait_timeout;
90 // BDA floppy_recalibration_status bitdefs
91 #define FRS_TIMEOUT (1<<7)
93 // BDA rtc_wait_flag bitdefs
94 #define RWS_WAIT_PENDING (1<<0)
95 #define RWS_WAIT_ELAPSED (1<<7)
97 // BDA floppy_media_state bitdefs
98 #define FMS_DRIVE_STATE_MASK (0x07)
99 #define FMS_MEDIA_DRIVE_ESTABLISHED (1<<4)
100 #define FMS_DOUBLE_STEPPING (1<<5)
101 #define FMS_DATA_RATE_MASK (0xc0)
103 // Accessor functions
104 #define GET_BDA(var) \
105 GET_FARVAR(0x0000, ((struct bios_data_area_s *)0)->var)
106 #define SET_BDA(var, val) \
107 SET_FARVAR(0x0000, ((struct bios_data_area_s *)0)->var, (val))
108 #define CLEARBITS_BDA(var, val) do { \
109 typeof(((struct bios_data_area_s *)0)->var) __val = GET_BDA(var); \
110 SET_BDA(var, (__val & ~(val))); \
112 #define SETBITS_BDA(var, val) do { \
113 typeof(((struct bios_data_area_s *)0)->var) __val = GET_BDA(var); \
114 SET_BDA(var, (__val | (val))); \
118 /****************************************************************
120 ****************************************************************/
129 u8 drive_control_byte;
138 u16 heads; // # heads
139 u16 cylinders; // # cylinders
140 u16 spt; // # sectors / track
159 struct ata_channel_s {
160 u8 iface; // ISA or PCI
161 u16 iobase1; // IO Base 1
162 u16 iobase2; // IO Base 2
166 struct ata_device_s {
167 u8 type; // Detected type of ata (ata/atapi/none/unknown)
168 u8 device; // Detected type of attached devices (hd/cd/none)
169 u8 removable; // Removable device flag
170 u8 lock; // Locks for removable devices
171 u8 mode; // transfer mode : PIO 16/32 bits - IRQ - ISADMA - PCIDMA
172 u16 blksize; // block size
174 u8 translation; // type of translation
175 struct chs_s lchs; // Logical CHS
176 struct chs_s pchs; // Physical CHS
178 u32 sectors; // Total sectors count
183 struct ata_channel_s channels[CONFIG_MAX_ATA_INTERFACES];
186 struct ata_device_s devices[CONFIG_MAX_ATA_DEVICES];
188 // map between (bios hd id - 0x80) and ata channels
189 u8 hdcount, hdidmap[CONFIG_MAX_ATA_DEVICES];
191 // map between (bios cd id - 0xE0) and ata channels
192 u8 cdcount, cdidmap[CONFIG_MAX_ATA_DEVICES];
194 // Buffer for DPTE table
197 // Count of transferred sectors and bytes
202 // ElTorito Device Emulation data
215 struct chs_s vdevice;
219 /****************************************************************
220 * Extended Bios Data Area (EBDA)
221 ****************************************************************/
223 struct extended_bios_data_area_s {
226 u32 far_call_pointer;
242 // El Torito Emulation data
243 struct cdemu_s cdemu;
246 // Accessor functions
247 #define GET_EBDA(var) \
248 GET_FARVAR(EBDA_SEG, ((struct extended_bios_data_area_s *)0)->var)
249 #define SET_EBDA(var, val) \
250 SET_FARVAR(EBDA_SEG, ((struct extended_bios_data_area_s *)0)->var, (val))
253 /****************************************************************
254 * Initial Program Load (IPL)
255 ****************************************************************/
257 // XXX - is this a standard, or just a bochs bios thing?
268 struct ipl_entry_s table[8];
274 #define IPL_TYPE_FLOPPY 0x01
275 #define IPL_TYPE_HARDDISK 0x02
276 #define IPL_TYPE_CDROM 0x03
277 #define IPL_TYPE_BEV 0x80
279 // Accessor functions
280 #define GET_IPL(var) \
281 GET_FARVAR(IPL_SEG, ((struct ipl_s *)0)->var)
282 #define SET_IPL(var, val) \
283 SET_FARVAR(IPL_SEG, ((struct ipl_s *)0)->var, (val))
286 /****************************************************************
287 * Registers saved/restored in romlayout.S
288 ****************************************************************/
290 #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; }; }
295 UREG(edi, di, di_hi, di_lo);
296 UREG(esi, si, si_hi, si_lo);
297 UREG(ebp, bp, bp_hi, bp_lo);
298 UREG(esp, sp, sp_hi, sp_lo);
299 UREG(ebx, bx, bh, bl);
300 UREG(edx, dx, dh, dl);
301 UREG(ecx, cx, ch, cl);
302 UREG(eax, ax, ah, al);
306 } __attribute__((packed));
308 // bregs flags bitdefs
313 set_cf(struct bregs *regs, int cond)
318 regs->flags &= ~F_CF;
322 /****************************************************************
324 ****************************************************************/
326 struct bios_config_table_s {
331 u8 feature1, feature2, feature3, feature4, feature5;
334 extern struct bios_config_table_s BIOS_CONFIG_TABLE;
337 /****************************************************************
339 ****************************************************************/
341 #define SEG_BIOS 0xf000
343 #define EBDA_SEG 0x9FC0
344 #define IPL_SEG 0x9FF0
345 #define EBDA_SIZE 1 // In KiB
346 #define BASE_MEM_IN_K (640 - EBDA_SIZE)
348 #endif // __BIOSVAR_H