|
|
1.1 ! root 1: // Variable layouts of bios. ! 2: // ! 3: // Copyright (C) 2008,2009 Kevin O'Connor <[email protected]> ! 4: // ! 5: // This file may be distributed under the terms of the GNU LGPLv3 license. ! 6: #ifndef __BIOSVAR_H ! 7: #define __BIOSVAR_H ! 8: ! 9: #include "types.h" // u8 ! 10: #include "farptr.h" // GET_FARVAR ! 11: #include "config.h" // CONFIG_* ! 12: #include "disk.h" // struct chs_s ! 13: ! 14: ! 15: /**************************************************************** ! 16: * Interupt vector table ! 17: ****************************************************************/ ! 18: ! 19: struct rmode_IVT { ! 20: struct segoff_s ivec[256]; ! 21: }; ! 22: ! 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) ! 27: ! 28: ! 29: /**************************************************************** ! 30: * Bios Data Area (BDA) ! 31: ****************************************************************/ ! 32: ! 33: struct bios_data_area_s { ! 34: // 40:00 ! 35: u16 port_com[4]; ! 36: u16 port_lpt[3]; ! 37: u16 ebda_seg; ! 38: // 40:10 ! 39: u16 equipment_list_flags; ! 40: u8 pad1; ! 41: u16 mem_size_kb; ! 42: u8 pad2; ! 43: u8 ps2_ctrl_flag; ! 44: u8 kbd_flag0; ! 45: u8 kbd_flag1; ! 46: u8 alt_keypad; ! 47: u16 kbd_buf_head; ! 48: u16 kbd_buf_tail; ! 49: // 40:1e ! 50: u8 kbd_buf[32]; ! 51: u8 floppy_recalibration_status; ! 52: u8 floppy_motor_status; ! 53: // 40:40 ! 54: u8 floppy_motor_counter; ! 55: u8 floppy_last_status; ! 56: u8 floppy_return_status[7]; ! 57: u8 video_mode; ! 58: u16 video_cols; ! 59: u16 video_pagesize; ! 60: u16 video_pagestart; ! 61: // 40:50 ! 62: u16 cursor_pos[8]; ! 63: // 40:60 ! 64: u16 cursor_type; ! 65: u8 video_page; ! 66: u16 crtc_address; ! 67: u8 video_msr; ! 68: u8 video_pal; ! 69: struct segoff_s jump; ! 70: u8 other_6b; ! 71: u32 timer_counter; ! 72: // 40:70 ! 73: u8 timer_rollover; ! 74: u8 break_flag; ! 75: u16 soft_reset_flag; ! 76: u8 disk_last_status; ! 77: u8 hdcount; ! 78: u8 disk_control_byte; ! 79: u8 port_disk; ! 80: u8 lpt_timeout[4]; ! 81: u8 com_timeout[4]; ! 82: // 40:80 ! 83: u16 kbd_buf_start_offset; ! 84: u16 kbd_buf_end_offset; ! 85: u8 video_rows; ! 86: u16 char_height; ! 87: u8 video_ctl; ! 88: u8 video_switches; ! 89: u8 modeset_ctl; ! 90: u8 dcc_index; ! 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; ! 96: // 40:90 ! 97: u8 floppy_media_state[4]; ! 98: u8 floppy_track[2]; ! 99: u8 kbd_flag2; ! 100: u8 kbd_led; ! 101: struct segoff_s user_wait_complete_flag; ! 102: u32 user_wait_timeout; ! 103: // 40:A0 ! 104: u8 rtc_wait_flag; ! 105: u8 other_a1[7]; ! 106: struct segoff_s video_savetable; ! 107: u8 other_ac[4]; ! 108: // 40:B0 ! 109: u8 other_b0[10]; ! 110: u16 vbe_mode; ! 111: } PACKED; ! 112: ! 113: // BDA floppy_recalibration_status bitdefs ! 114: #define FRS_TIMEOUT (1<<7) ! 115: ! 116: // BDA rtc_wait_flag bitdefs ! 117: #define RWS_WAIT_PENDING (1<<0) ! 118: #define RWS_WAIT_ELAPSED (1<<7) ! 119: ! 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) ! 125: ! 126: // Accessor functions ! 127: #define GET_BDA(var) \ ! 128: GET_FARVAR(SEG_BDA, ((struct bios_data_area_s *)0)->var) ! 129: #define SET_BDA(var, val) \ ! 130: SET_FARVAR(SEG_BDA, ((struct bios_data_area_s *)0)->var, (val)) ! 131: #define CLEARBITS_BDA(var, val) do { \ ! 132: typeof(((struct bios_data_area_s *)0)->var) __val = GET_BDA(var); \ ! 133: SET_BDA(var, (__val & ~(val))); \ ! 134: } while (0) ! 135: #define SETBITS_BDA(var, val) do { \ ! 136: typeof(((struct bios_data_area_s *)0)->var) __val = GET_BDA(var); \ ! 137: SET_BDA(var, (__val | (val))); \ ! 138: } while (0) ! 139: ! 140: ! 141: /**************************************************************** ! 142: * Extended Bios Data Area (EBDA) ! 143: ****************************************************************/ ! 144: ! 145: // DPTE definition ! 146: struct dpte_s { ! 147: u16 iobase1; ! 148: u16 iobase2; ! 149: u8 prefix; ! 150: u8 unused; ! 151: u8 irq; ! 152: u8 blkcount; ! 153: u8 dma; ! 154: u8 pio; ! 155: u16 options; ! 156: u16 reserved; ! 157: u8 revision; ! 158: u8 checksum; ! 159: }; ! 160: ! 161: // ElTorito Device Emulation data ! 162: struct cdemu_s { ! 163: struct drive_s *emulated_drive; ! 164: u32 ilba; ! 165: u16 buffer_segment; ! 166: u16 load_segment; ! 167: u16 sector_count; ! 168: u8 active; ! 169: u8 media; ! 170: u8 emulated_extdrive; ! 171: ! 172: // Virtual device ! 173: struct chs_s lchs; ! 174: }; ! 175: ! 176: struct fdpt_s { ! 177: u16 cylinders; ! 178: u8 heads; ! 179: u8 a0h_signature; ! 180: u8 phys_sectors; ! 181: u16 precompensation; ! 182: u8 reserved; ! 183: u8 drive_control_byte; ! 184: u16 phys_cylinders; ! 185: u8 phys_heads; ! 186: u16 landing_zone; ! 187: u8 sectors; ! 188: u8 checksum; ! 189: } PACKED; ! 190: ! 191: struct extended_bios_data_area_s { ! 192: u8 size; ! 193: u8 reserved1[0x21]; ! 194: struct segoff_s far_call_pointer; ! 195: u8 mouse_flag1; ! 196: u8 mouse_flag2; ! 197: u8 mouse_data[0x08]; ! 198: // 0x30 ! 199: u8 other1[0x0d]; ! 200: ! 201: // 0x3d ! 202: struct fdpt_s fdpt[2]; ! 203: ! 204: // 0x5d ! 205: u8 other2[0xC4]; ! 206: ! 207: // 0x121 - Begin custom storage. ! 208: u8 ps2ctr; ! 209: int RTCusers; ! 210: ! 211: // El Torito Emulation data ! 212: struct cdemu_s cdemu; ! 213: ! 214: // Buffer for disk DPTE table ! 215: struct dpte_s dpte; ! 216: ! 217: // Locks for removable devices ! 218: u8 cdrom_locks[CONFIG_MAX_EXTDRIVE]; ! 219: ! 220: u16 boot_sequence; ! 221: ! 222: // Stack space available for code that needs it. ! 223: u8 extra_stack[512] __aligned(8); ! 224: ! 225: u8 cdemu_buf[2048 * !!CONFIG_CDROM_EMU]; ! 226: } PACKED; ! 227: ! 228: // The initial size and location of EBDA ! 229: #define EBDA_SIZE_START \ ! 230: DIV_ROUND_UP(sizeof(struct extended_bios_data_area_s), 1024) ! 231: #define EBDA_SEGMENT_START \ ! 232: FLATPTR_TO_SEG(BUILD_LOWRAM_END - EBDA_SIZE_START*1024) ! 233: ! 234: // Accessor functions ! 235: static inline u16 get_ebda_seg() { ! 236: return GET_BDA(ebda_seg); ! 237: } ! 238: static inline struct extended_bios_data_area_s * ! 239: get_ebda_ptr() ! 240: { ! 241: ASSERT32(); ! 242: return MAKE_FLATPTR(get_ebda_seg(), 0); ! 243: } ! 244: #define GET_EBDA2(eseg, var) \ ! 245: GET_FARVAR(eseg, ((struct extended_bios_data_area_s *)0)->var) ! 246: #define SET_EBDA2(eseg, var, val) \ ! 247: SET_FARVAR(eseg, ((struct extended_bios_data_area_s *)0)->var, (val)) ! 248: #define GET_EBDA(var) \ ! 249: GET_EBDA2(get_ebda_seg(), var) ! 250: #define SET_EBDA(var, val) \ ! 251: SET_EBDA2(get_ebda_seg(), var, (val)) ! 252: ! 253: #define EBDA_OFFSET_TOP_STACK \ ! 254: offsetof(struct extended_bios_data_area_s, extra_stack[ \ ! 255: FIELD_SIZEOF(struct extended_bios_data_area_s \ ! 256: , extra_stack)]) ! 257: ! 258: ! 259: /**************************************************************** ! 260: * Global variables ! 261: ****************************************************************/ ! 262: ! 263: #define GLOBAL_SEGREG CS ! 264: static inline u16 get_global_seg() { ! 265: return GET_SEG(GLOBAL_SEGREG); ! 266: } ! 267: #define GET_GLOBAL(var) \ ! 268: GET_VAR(GLOBAL_SEGREG, (var)) ! 269: #define SET_GLOBAL(var, val) do { \ ! 270: ASSERT32(); \ ! 271: (var) = (val); \ ! 272: } while (0) ! 273: #if MODE16 ! 274: #define ADJUST_GLOBAL_PTR(var) (var) ! 275: #else ! 276: #define ADJUST_GLOBAL_PTR(var) ((typeof(var))((void*)var - BUILD_BIOS_ADDR)) ! 277: #endif ! 278: ! 279: ! 280: /**************************************************************** ! 281: * Bios Config Table ! 282: ****************************************************************/ ! 283: ! 284: struct bios_config_table_s { ! 285: u16 size; ! 286: u8 model; ! 287: u8 submodel; ! 288: u8 biosrev; ! 289: u8 feature1, feature2, feature3, feature4, feature5; ! 290: } PACKED; ! 291: ! 292: extern struct bios_config_table_s BIOS_CONFIG_TABLE __aligned(1); ! 293: ! 294: #endif // __BIOSVAR_H
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.