X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fbiosvar.h;h=b6f7174c59dd7b3ffd739c1ff85f45cd172ce91c;hb=refs%2Fheads%2Fcoreboot;hp=51056964f3ebd443c21a3a5ad1afed9a080a2a09;hpb=b1b7c2a1c3b940b787fdb5da67fc37003e9d7b0e;p=seabios.git diff --git a/src/biosvar.h b/src/biosvar.h index 5105696..b6f7174 100644 --- a/src/biosvar.h +++ b/src/biosvar.h @@ -1,6 +1,6 @@ // 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 LGPLv3 license. #ifndef __BIOSVAR_H @@ -9,24 +9,27 @@ #include "types.h" // u8 #include "farptr.h" // GET_FARVAR #include "config.h" // CONFIG_* +#include "disk.h" // struct chs_s /**************************************************************** * Interupt vector table ****************************************************************/ -struct ivec { - union { - struct { - u16 offset; - u16 seg; - }; - u32 segoff; - }; +struct rmode_IVT { + struct segoff_s ivec[256]; }; -#define SET_IVT(vector, seg, off) \ - SET_FARVAR(SEG_IVT, ((struct ivec *)0)[vector].segoff, ((seg) << 16) | (off)) +#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); \ + }) /**************************************************************** @@ -69,8 +72,7 @@ struct bios_data_area_s { u16 crtc_address; u8 video_msr; u8 video_pal; - u16 jump_ip; - u16 jump_cs; + struct segoff_s jump; u8 other_6b; u32 timer_counter; // 40:70 @@ -99,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 @@ -159,20 +167,17 @@ struct dpte_s { // 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 - u16 heads; - u16 cylinders; - u16 spt; + struct chs_s lchs; }; struct fdpt_s { @@ -190,10 +195,21 @@ struct fdpt_s { u8 checksum; } PACKED; +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]; @@ -208,36 +224,44 @@ struct extended_bios_data_area_s { // 0x121 - Begin custom storage. u8 ps2ctr; + struct usbkeyinfo usbkey_last; + + int RTCusers; // El Torito Emulation data struct cdemu_s cdemu; - // Count of transferred sectors and bytes to/from disk - u16 sector_count; - // Buffer for disk DPTE table struct dpte_s dpte; // Locks for removable devices - u8 cdrom_locks[CONFIG_MAX_ATA_DEVICES]; + u8 cdrom_locks[CONFIG_MAX_EXTDRIVE]; u16 boot_sequence; + /* TSC emulation timekeepers */ + u64 tsc_8254; + int last_tsc_8254; + // Stack space available for code that needs it. u8 extra_stack[512] __aligned(8); } PACKED; +// 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 -static inline u16 get_ebda_seg() { +static inline u16 get_ebda_seg(void) { return GET_BDA(ebda_seg); } static inline struct extended_bios_data_area_s * -get_ebda_ptr() +get_ebda_ptr(void) { - extern void *__force_link_error__get_ebda_ptr_only_in_32bit(); - if (MODE16) - return __force_link_error__get_ebda_ptr_only_in_32bit(); - return (void*)MAKE_FARPTR(get_ebda_seg(), 0); + ASSERT32FLAT(); + return MAKE_FLATPTR(get_ebda_seg(), 0); } #define GET_EBDA2(eseg, var) \ GET_FARVAR(eseg, ((struct extended_bios_data_area_s *)0)->var) @@ -258,18 +282,42 @@ get_ebda_ptr() * Global variables ****************************************************************/ -#define GET_GLOBAL(var) \ - GET_VAR(CS, (var)) -#if MODE16 -extern void __force_link_error__set_global_only_in_32bit(); -#define SET_GLOBAL(var, val) do { \ - (void)(val); \ - __force_link_error__set_global_only_in_32bit(); \ +#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 SET_GLOBAL(var, val) \ - do { (var) = (val); } while (0) +#define GLOBALFLAT2GLOBAL(var) (var) #endif +// Access a "flat" pointer known to point to the f-segment. +#define GET_GLOBALFLAT(var) GET_GLOBAL(*GLOBALFLAT2GLOBAL(&(var))) /**************************************************************** @@ -284,6 +332,6 @@ struct bios_config_table_s { u8 feature1, feature2, feature3, feature4, feature5; } PACKED; -extern struct bios_config_table_s BIOS_CONFIG_TABLE; +extern struct bios_config_table_s BIOS_CONFIG_TABLE __aligned(1); #endif // __BIOSVAR_H