X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fbiosvar.h;h=b6f7174c59dd7b3ffd739c1ff85f45cd172ce91c;hb=refs%2Fheads%2Fcoreboot;hp=c34bb666abf81631486ddfe22734ee4127acc965;hpb=4d6dbc6f54c138ba92684d0bd6b7f42df5ccaa5b;p=seabios.git diff --git a/src/biosvar.h b/src/biosvar.h index c34bb66..b6f7174 100644 --- a/src/biosvar.h +++ b/src/biosvar.h @@ -1,32 +1,42 @@ // Variable layouts of bios. // -// Copyright (C) 2008 Kevin O'Connor +// Copyright (C) 2008-2010 Kevin O'Connor // -// This file may be distributed under the terms of the GNU GPLv3 license. +// This file may be distributed under the terms of the GNU LGPLv3 license. #ifndef __BIOSVAR_H #define __BIOSVAR_H #include "types.h" // u8 -#include "farptr.h" // SET_SEG +#include "farptr.h" // GET_FARVAR #include "config.h" // CONFIG_* - -#define PACKED __attribute__((packed)) +#include "disk.h" // struct chs_s /**************************************************************** - * Bios Data Area (BDA) + * Interupt vector table ****************************************************************/ -struct ivec { - u16 offset; - u16 seg; +struct rmode_IVT { + struct segoff_s ivec[256]; }; +#define GET_IVT(vector) \ + GET_FARVAR(SEG_IVT, ((struct rmode_IVT *)0)->ivec[vector]) +#define SET_IVT(vector, segoff) \ + SET_FARVAR(SEG_IVT, ((struct rmode_IVT *)0)->ivec[vector], segoff) + +#define FUNC16(func) ({ \ + ASSERT32FLAT(); \ + extern void func (void); \ + SEGOFF(SEG_BIOS, (u32)func - BUILD_BIOS_ADDR); \ + }) + + +/**************************************************************** + * Bios Data Area (BDA) + ****************************************************************/ + struct bios_data_area_s { - // 00:00 - struct ivec ivecs[256]; - // 30:00 -// u8 stack[256]; // 40:00 u16 port_com[4]; u16 port_lpt[3]; @@ -50,20 +60,27 @@ struct bios_data_area_s { u8 floppy_motor_counter; u8 floppy_last_status; u8 floppy_return_status[7]; - u8 other1[0x7]; + u8 video_mode; + u16 video_cols; + u16 video_pagesize; + u16 video_pagestart; // 40:50 - u8 other2[0x10]; + u16 cursor_pos[8]; // 40:60 - u8 other3[0x7]; - u32 jump_cs_ip; - u8 dummy; + u16 cursor_type; + u8 video_page; + u16 crtc_address; + u8 video_msr; + u8 video_pal; + struct segoff_s jump; + u8 other_6b; u32 timer_counter; // 40:70 u8 timer_rollover; u8 break_flag; u16 soft_reset_flag; u8 disk_last_status; - u8 disk_count; + u8 hdcount; u8 disk_control_byte; u8 port_disk; u8 lpt_timeout[4]; @@ -71,7 +88,12 @@ struct bios_data_area_s { // 40:80 u16 kbd_buf_start_offset; u16 kbd_buf_end_offset; - u8 other5[7]; + u8 video_rows; + u16 char_height; + u8 video_ctl; + u8 video_switches; + u8 modeset_ctl; + u8 dcc_index; u8 floppy_last_data_rate; u8 disk_status_controller; u8 disk_error_controller; @@ -79,14 +101,20 @@ struct bios_data_area_s { u8 floppy_harddisk_info; // 40:90 u8 floppy_media_state[4]; - u8 floppy_track0; - u8 floppy_track1; - u8 kbd_mode; + u8 floppy_track[2]; + u8 kbd_flag2; u8 kbd_led; - u32 ptr_user_wait_complete_flag; + struct segoff_s user_wait_complete_flag; u32 user_wait_timeout; // 40:A0 u8 rtc_wait_flag; + u8 other_a1[7]; + struct segoff_s video_savetable; + u8 other_ac[4]; + // 40:B0 + u8 other_b0[9]; + u8 vbe_flag; + u16 vbe_mode; } PACKED; // BDA floppy_recalibration_status bitdefs @@ -104,9 +132,9 @@ struct bios_data_area_s { // 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))); \ @@ -118,30 +146,9 @@ struct bios_data_area_s { /**************************************************************** - * Hard drive info + * 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 chs_s { - u16 heads; // # heads - u16 cylinders; // # cylinders - u16 spt; // # sectors / track -}; - // DPTE definition struct dpte_s { u16 iobase1; @@ -158,74 +165,51 @@ struct dpte_s { u8 checksum; }; -struct ata_channel_s { - u8 iface; // ISA or PCI - 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) - u8 device; // Detected type of attached devices (hd/cd/none) - u8 removable; // Removable device flag - u8 lock; // Locks for removable devices - u8 mode; // transfer mode : PIO 16/32 bits - IRQ - ISADMA - PCIDMA - u16 blksize; // block size - - u8 translation; // type of translation - struct chs_s lchs; // Logical CHS - struct chs_s pchs; // Physical CHS - - u32 sectors; // Total sectors count -} PACKED; - -struct ata_s { - // ATA channels info - struct ata_channel_s channels[CONFIG_MAX_ATA_INTERFACES]; - - // 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]; - - // 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 { - u8 active; - u8 media; - u8 emulated_drive; - u8 controller_index; - u16 device_spec; + struct drive_s *emulated_drive_gf; u32 ilba; u16 buffer_segment; u16 load_segment; u16 sector_count; + u8 active; + u8 media; + u8 emulated_extdrive; // Virtual device - struct chs_s vdevice; -} PACKED; + struct chs_s lchs; +}; +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; -/**************************************************************** - * Extended Bios Data Area (EBDA) - ****************************************************************/ +struct usbkeyinfo { + union { + struct { + u8 modifiers; + u8 repeatcount; + u8 keys[6]; + }; + u64 data; + }; +}; struct extended_bios_data_area_s { u8 size; u8 reserved1[0x21]; - u32 far_call_pointer; + struct segoff_s far_call_pointer; u8 mouse_flag1; u8 mouse_flag2; u8 mouse_data[0x08]; @@ -233,92 +217,107 @@ struct extended_bios_data_area_s { u8 other1[0x0d]; // 0x3d - struct fdpt_s fdpt0; - struct fdpt_s fdpt1; + struct fdpt_s fdpt[2]; + // 0x5d u8 other2[0xC4]; - // ATA Driver data - struct ata_s ata; + // 0x121 - Begin custom storage. + u8 ps2ctr; + struct usbkeyinfo usbkey_last; + + int RTCusers; // El Torito Emulation data struct cdemu_s cdemu; -}; - -// Accessor functions -#define GET_EBDA(var) \ - GET_FARVAR(EBDA_SEG, ((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)) + // Buffer for disk DPTE table + struct dpte_s dpte; -/**************************************************************** - * Initial Program Load (IPL) - ****************************************************************/ + // Locks for removable devices + u8 cdrom_locks[CONFIG_MAX_EXTDRIVE]; -// XXX - is this a standard, or just a bochs bios thing? + u16 boot_sequence; -struct ipl_entry_s { - u16 type; - u16 flags; - u32 vector; - u32 description; - u32 reserved; -}; + /* TSC emulation timekeepers */ + u64 tsc_8254; + int last_tsc_8254; -struct ipl_s { - struct ipl_entry_s table[8]; - u16 count; - u16 sequence; - u8 pad[124]; -}; + // Stack space available for code that needs it. + u8 extra_stack[512] __aligned(8); +} PACKED; -#define IPL_TYPE_FLOPPY 0x01 -#define IPL_TYPE_HARDDISK 0x02 -#define IPL_TYPE_CDROM 0x03 -#define IPL_TYPE_BEV 0x80 +// The initial size and location of EBDA +#define EBDA_SIZE_START \ + DIV_ROUND_UP(sizeof(struct extended_bios_data_area_s), 1024) +#define EBDA_SEGMENT_START \ + FLATPTR_TO_SEG(BUILD_LOWRAM_END - EBDA_SIZE_START*1024) // 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)) +static inline u16 get_ebda_seg(void) { + return GET_BDA(ebda_seg); +} +static inline struct extended_bios_data_area_s * +get_ebda_ptr(void) +{ + ASSERT32FLAT(); + return MAKE_FLATPTR(get_ebda_seg(), 0); +} +#define GET_EBDA2(eseg, var) \ + GET_FARVAR(eseg, ((struct extended_bios_data_area_s *)0)->var) +#define SET_EBDA2(eseg, var, val) \ + SET_FARVAR(eseg, ((struct extended_bios_data_area_s *)0)->var, (val)) +#define GET_EBDA(var) \ + GET_EBDA2(get_ebda_seg(), var) +#define SET_EBDA(var, val) \ + SET_EBDA2(get_ebda_seg(), var, (val)) + +#define EBDA_OFFSET_TOP_STACK \ + offsetof(struct extended_bios_data_area_s, extra_stack[ \ + FIELD_SIZEOF(struct extended_bios_data_area_s \ + , extra_stack)]) /**************************************************************** - * Registers saved/restored in romlayout.S + * Global variables ****************************************************************/ -#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_ZF (1<<6) -#define F_CF (1<<0) - -static inline void -set_cf(struct bregs *regs, int cond) -{ - if (cond) - regs->flags |= F_CF; - else - regs->flags &= ~F_CF; +#if MODE16 == 0 && MODESEGMENT == 1 +// In 32bit segmented mode %cs may not be readable and the code may be +// relocated. The entry code sets up %gs with a readable segment and +// the code offset can be determined by get_global_offset(). +#define GLOBAL_SEGREG GS +static inline u32 __attribute_const get_global_offset(void) { + u32 ret; + asm(" calll 1f\n" + "1:popl %0\n" + " subl $1b, %0" + : "=r"(ret)); + return ret; } +#else +#define GLOBAL_SEGREG CS +static inline u32 __attribute_const get_global_offset(void) { + return 0; +} +#endif +static inline u16 get_global_seg(void) { + return GET_SEG(GLOBAL_SEGREG); +} +#define GET_GLOBAL(var) \ + GET_VAR(GLOBAL_SEGREG, *(typeof(&(var)))((void*)&(var) \ + + get_global_offset())) +#define SET_GLOBAL(var, val) do { \ + ASSERT32FLAT(); \ + (var) = (val); \ + } while (0) +#if MODESEGMENT +#define GLOBALFLAT2GLOBAL(var) ((typeof(var))((void*)(var) - BUILD_BIOS_ADDR)) +#else +#define GLOBALFLAT2GLOBAL(var) (var) +#endif +// Access a "flat" pointer known to point to the f-segment. +#define GET_GLOBALFLAT(var) GET_GLOBAL(*GLOBALFLAT2GLOBAL(&(var))) /**************************************************************** @@ -326,22 +325,13 @@ set_cf(struct bregs *regs, int cond) ****************************************************************/ struct bios_config_table_s { - // XXX - u8 x; -}; - -extern struct bios_config_table_s BIOS_CONFIG_TABLE; - - -/**************************************************************** - * Memory layout info - ****************************************************************/ - -#define SEG_BIOS 0xf000 + u16 size; + u8 model; + u8 submodel; + u8 biosrev; + u8 feature1, feature2, feature3, feature4, feature5; +} PACKED; -#define EBDA_SEG 0x9FC0 -#define IPL_SEG 0x9FF0 -#define EBDA_SIZE 1 // In KiB -#define BASE_MEM_IN_K (640 - EBDA_SIZE) +extern struct bios_config_table_s BIOS_CONFIG_TABLE __aligned(1); #endif // __BIOSVAR_H