1 // Variable layouts of bios.
3 // Copyright (C) 2008,2009 Kevin O'Connor <kevin@koconnor.net>
5 // This file may be distributed under the terms of the GNU LGPLv3 license.
9 #include "types.h" // u8
10 #include "farptr.h" // GET_FARVAR
11 #include "config.h" // CONFIG_*
12 #include "disk.h" // struct chs_s
15 /****************************************************************
16 * Interupt vector table
17 ****************************************************************/
20 struct segoff_s ivec[256];
23 #define GET_IVT(vector) \
24 GET_FARVAR(SEG_IVT, ((struct rmode_IVT *)0)->ivec[vector])
25 #define SET_IVT(vector, segoff) \
26 SET_FARVAR(SEG_IVT, ((struct rmode_IVT *)0)->ivec[vector], segoff)
29 /****************************************************************
30 * Bios Data Area (BDA)
31 ****************************************************************/
33 struct bios_data_area_s {
39 u16 equipment_list_flags;
51 u8 floppy_recalibration_status;
52 u8 floppy_motor_status;
54 u8 floppy_motor_counter;
55 u8 floppy_last_status;
56 u8 floppy_return_status[7];
83 u16 kbd_buf_start_offset;
84 u16 kbd_buf_end_offset;
91 u8 floppy_last_data_rate;
92 u8 disk_status_controller;
93 u8 disk_error_controller;
94 u8 disk_interrupt_flag;
95 u8 floppy_harddisk_info;
97 u8 floppy_media_state[4];
101 struct segoff_s user_wait_complete_flag;
102 u32 user_wait_timeout;
106 struct segoff_s video_savetable;
113 // BDA floppy_recalibration_status bitdefs
114 #define FRS_TIMEOUT (1<<7)
116 // BDA rtc_wait_flag bitdefs
117 #define RWS_WAIT_PENDING (1<<0)
118 #define RWS_WAIT_ELAPSED (1<<7)
120 // BDA floppy_media_state bitdefs
121 #define FMS_DRIVE_STATE_MASK (0x07)
122 #define FMS_MEDIA_DRIVE_ESTABLISHED (1<<4)
123 #define FMS_DOUBLE_STEPPING (1<<5)
124 #define FMS_DATA_RATE_MASK (0xc0)
126 // Bit definitions for kbd_flag[0123]
127 #define KF0_RSHIFT (1<<0)
128 #define KF0_LSHIFT (1<<1)
129 #define KF0_CTRLACTIVE (1<<2)
130 #define KF0_ALTACTIVE (1<<3)
131 #define KF0_SCROLLACTIVE (1<<4)
132 #define KF0_NUMACTIVE (1<<5)
133 #define KF0_CAPSACTIVE (1<<6)
135 #define KF1_LCTRL (1<<0)
136 #define KF1_LALT (1<<1)
137 #define KF1_PAUSEACTIVE (1<<3)
138 #define KF1_SCROLL (1<<4)
139 #define KF1_NUM (1<<5)
140 #define KF1_CAPS (1<<6)
142 #define KF2_LAST_E1 (1<<0)
143 #define KF2_LAST_E0 (1<<1)
144 #define KF2_RCTRL (1<<2)
145 #define KF2_RALT (1<<3)
146 #define KF2_101KBD (1<<4)
148 #define KF3_SCROLL_LED (1<<0)
149 #define KF3_NUM_LED (1<<1)
150 #define KF3_CAPS_LED (1<<2)
151 #define KF3_CMD_PENDING (1<<6)
153 // Accessor functions
154 #define GET_BDA(var) \
155 GET_FARVAR(SEG_BDA, ((struct bios_data_area_s *)0)->var)
156 #define SET_BDA(var, val) \
157 SET_FARVAR(SEG_BDA, ((struct bios_data_area_s *)0)->var, (val))
158 #define CLEARBITS_BDA(var, val) do { \
159 typeof(((struct bios_data_area_s *)0)->var) __val = GET_BDA(var); \
160 SET_BDA(var, (__val & ~(val))); \
162 #define SETBITS_BDA(var, val) do { \
163 typeof(((struct bios_data_area_s *)0)->var) __val = GET_BDA(var); \
164 SET_BDA(var, (__val | (val))); \
168 /****************************************************************
169 * Extended Bios Data Area (EBDA)
170 ****************************************************************/
188 // ElTorito Device Emulation data
190 struct drive_s *emulated_drive;
197 u8 emulated_extdrive;
210 u8 drive_control_byte;
229 struct extended_bios_data_area_s {
232 struct segoff_s far_call_pointer;
240 struct fdpt_s fdpt[2];
245 // 0x121 - Begin custom storage.
246 struct usbkeyinfo usbkey_last;
250 // El Torito Emulation data
251 struct cdemu_s cdemu;
253 // Buffer for disk DPTE table
256 // Locks for removable devices
257 u8 cdrom_locks[CONFIG_MAX_EXTDRIVE];
261 // Stack space available for code that needs it.
262 u8 extra_stack[512] __aligned(8);
264 u8 cdemu_buf[2048 * !!CONFIG_CDROM_EMU];
267 // The initial size and location of EBDA
268 #define EBDA_SIZE_START \
269 DIV_ROUND_UP(sizeof(struct extended_bios_data_area_s), 1024)
270 #define EBDA_SEGMENT_START \
271 FLATPTR_TO_SEG(BUILD_LOWRAM_END - EBDA_SIZE_START*1024)
273 // Accessor functions
274 static inline u16 get_ebda_seg(void) {
275 return GET_BDA(ebda_seg);
277 static inline struct extended_bios_data_area_s *
281 return MAKE_FLATPTR(get_ebda_seg(), 0);
283 #define GET_EBDA2(eseg, var) \
284 GET_FARVAR(eseg, ((struct extended_bios_data_area_s *)0)->var)
285 #define SET_EBDA2(eseg, var, val) \
286 SET_FARVAR(eseg, ((struct extended_bios_data_area_s *)0)->var, (val))
287 #define GET_EBDA(var) \
288 GET_EBDA2(get_ebda_seg(), var)
289 #define SET_EBDA(var, val) \
290 SET_EBDA2(get_ebda_seg(), var, (val))
292 #define EBDA_OFFSET_TOP_STACK \
293 offsetof(struct extended_bios_data_area_s, extra_stack[ \
294 FIELD_SIZEOF(struct extended_bios_data_area_s \
298 /****************************************************************
300 ****************************************************************/
302 #if MODE16 == 0 && MODESEGMENT == 1
303 // In 32bit segmented mode %cs may not be readable and the code may be
304 // relocated. The entry code sets up %gs with a readable segment and
305 // the code offset can be determined by get_global_offset().
306 #define GLOBAL_SEGREG GS
307 static inline u32 __attribute_const get_global_offset(void) {
316 #define GLOBAL_SEGREG CS
317 static inline u32 __attribute_const get_global_offset(void) {
321 static inline u16 get_global_seg(void) {
322 return GET_SEG(GLOBAL_SEGREG);
324 #define GET_GLOBAL(var) \
325 GET_VAR(GLOBAL_SEGREG, *(typeof(&(var)))((void*)&(var) \
326 + get_global_offset()))
327 #define SET_GLOBAL(var, val) do { \
332 #define ADJUST_GLOBAL_PTR(var) (var)
334 #define ADJUST_GLOBAL_PTR(var) ((typeof(var))((void*)var - BUILD_BIOS_ADDR))
338 /****************************************************************
340 ****************************************************************/
342 struct bios_config_table_s {
347 u8 feature1, feature2, feature3, feature4, feature5;
350 extern struct bios_config_table_s BIOS_CONFIG_TABLE __aligned(1);
352 #endif // __BIOSVAR_H