// Variable layouts of bios. // // Copyright (C) 2008 Kevin O'Connor // // This file may be distributed under the terms of the GNU GPLv3 license. #include "types.h" // u8 #include "farptr.h" // SET_SEG /**************************************************************** * Bios Data Area (BDA) ****************************************************************/ struct ivec { u16 offset; u16 seg; }; struct bios_data_area_s { // 00:00 struct ivec ivecs[256]; // 30:00 // u8 stack[256]; // 40:00 u16 port_com1, port_com2, port_com3, port_com4; u16 port_lpt1, port_lpt2, port_lpt3; u16 ebda_seg; // 40:10 u16 equipment_list_flags; u8 pad1; u16 mem_size_kb; u8 pad2; u8 ps2_ctrl_flag; u16 kbd_flag; u8 alt_keypad; u16 kbd_buf_head; u16 kbd_buf_tail; // 40:1e u8 kbd_buf[32]; u8 floppy_recalibration_status; u8 floppy_motor_status; // 40:40 u8 floppy_motor_counter; u8 floppy_last_status; u8 floppy_return_status[7]; u8 other1[0x7]; // 40:50 u8 other2[0x1c]; // 40:6c u32 timer_counter; // 40:70 u8 timer_rollover; u8 other4[0x0f]; // 40:80 u16 kbd_buf_start_offset; u16 kbd_buf_end_offset; u8 other5[7]; u8 floppy_last_data_rate; u8 other6[3]; u8 floppy_harddisk_info; // 40:90 u8 floppy_media_state[4]; u8 floppy_track0; u8 floppy_track1; u8 kbd_mode; u8 kbd_led; u32 ptr_user_wait_complete_flag; u32 user_wait_timeout; // 40:A0 u8 rtc_wait_flag; } __attribute__((packed)); // BDA floppy_recalibration_status bitdefs #define FRS_TIMEOUT (1<<7) // BDA rtc_wait_flag bitdefs #define RWS_WAIT_PENDING (1<<0) #define RWS_WAIT_ELAPSED (1<<7) // BDA floppy_media_state bitdefs #define FMS_DRIVE_STATE_MASK (0x07) #define FMS_MEDIA_DRIVE_ESTABLISHED (1<<4) #define FMS_DOUBLE_STEPPING (1<<5) #define FMS_DATA_RATE_MASK (0xc0) // Accessor functions #define GET_BDA(var) ({ \ SET_SEG(ES, 0x0000); \ GET_VAR(ES, ((struct bios_data_area_s *)0)->var); }) #define SET_BDA(var, val) do { \ SET_SEG(ES, 0x0000); \ SET_VAR(ES, ((struct bios_data_area_s *)0)->var, val); \ } while (0) #define CLEARBITS_BDA(var, val) do { \ typeof(((struct bios_data_area_s *)0)->var) __val = GET_BDA(var); \ SET_BDA(var, (__val & ~(val))); \ } while (0) #define SETBITS_BDA(var, val) do { \ typeof(((struct bios_data_area_s *)0)->var) __val = GET_BDA(var); \ SET_BDA(var, (__val | (val))); \ } while (0) /**************************************************************** * Extended Bios Data Area (EBDA) ****************************************************************/ struct extended_bios_data_area_s { u8 size; u8 other1[0x3c]; // FDPT - Can be splitted in data members if needed u8 fdpt0[0x10]; u8 fdpt1[0x10]; u8 other2[0xC4]; // ATA Driver data //ata_t ata; #if BX_ELTORITO_BOOT // El Torito Emulation data cdemu_t cdemu; #endif // BX_ELTORITO_BOOT }; /**************************************************************** * Extended Bios Data Area (EBDA) ****************************************************************/ #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; }; } 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); UREG(eax, ax, ah, al); u16 ip; u16 cs; u16 flags; } __attribute__((packed)); // bregs flags bitdefs #define F_CF (1<<9) static inline void set_cf(struct bregs *regs, int cond) { if (cond) regs->flags |= F_CF; else regs->flags &= ~F_CF; } /**************************************************************** * Bios Config Table ****************************************************************/ struct bios_config_table_s { // XXX u8 x; }; extern struct bios_config_table_s BIOS_CONFIG_TABLE; /**************************************************************** * Memory layout info ****************************************************************/ #define SEG_BIOS 0xf000 #define EBDA_SEG 0x9FC0 #define EBDA_SIZE 1 // In KiB #define BASE_MEM_IN_K (640 - EBDA_SIZE)