Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


imported SEABIOS source tree
[palacios.git] / bios / seabios / src / biosvar.h
1 // Variable layouts of bios.
2 //
3 // Copyright (C) 2008-2010  Kevin O'Connor <kevin@koconnor.net>
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 #define FUNC16(func) ({                                 \
29         ASSERT32FLAT();                                 \
30         extern void func (void);                        \
31         SEGOFF(SEG_BIOS, (u32)func - BUILD_BIOS_ADDR);  \
32     })
33
34
35 /****************************************************************
36  * Bios Data Area (BDA)
37  ****************************************************************/
38
39 struct bios_data_area_s {
40     // 40:00
41     u16 port_com[4];
42     u16 port_lpt[3];
43     u16 ebda_seg;
44     // 40:10
45     u16 equipment_list_flags;
46     u8 pad1;
47     u16 mem_size_kb;
48     u8 pad2;
49     u8 ps2_ctrl_flag;
50     u8 kbd_flag0;
51     u8 kbd_flag1;
52     u8 alt_keypad;
53     u16 kbd_buf_head;
54     u16 kbd_buf_tail;
55     // 40:1e
56     u8 kbd_buf[32];
57     u8 floppy_recalibration_status;
58     u8 floppy_motor_status;
59     // 40:40
60     u8 floppy_motor_counter;
61     u8 floppy_last_status;
62     u8 floppy_return_status[7];
63     u8 video_mode;
64     u16 video_cols;
65     u16 video_pagesize;
66     u16 video_pagestart;
67     // 40:50
68     u16 cursor_pos[8];
69     // 40:60
70     u16 cursor_type;
71     u8 video_page;
72     u16 crtc_address;
73     u8 video_msr;
74     u8 video_pal;
75     struct segoff_s jump;
76     u8 other_6b;
77     u32 timer_counter;
78     // 40:70
79     u8 timer_rollover;
80     u8 break_flag;
81     u16 soft_reset_flag;
82     u8 disk_last_status;
83     u8 hdcount;
84     u8 disk_control_byte;
85     u8 port_disk;
86     u8 lpt_timeout[4];
87     u8 com_timeout[4];
88     // 40:80
89     u16 kbd_buf_start_offset;
90     u16 kbd_buf_end_offset;
91     u8 video_rows;
92     u16 char_height;
93     u8 video_ctl;
94     u8 video_switches;
95     u8 modeset_ctl;
96     u8 dcc_index;
97     u8 floppy_last_data_rate;
98     u8 disk_status_controller;
99     u8 disk_error_controller;
100     u8 disk_interrupt_flag;
101     u8 floppy_harddisk_info;
102     // 40:90
103     u8 floppy_media_state[4];
104     u8 floppy_track[2];
105     u8 kbd_flag2;
106     u8 kbd_led;
107     struct segoff_s user_wait_complete_flag;
108     u32 user_wait_timeout;
109     // 40:A0
110     u8 rtc_wait_flag;
111     u8 other_a1[7];
112     struct segoff_s video_savetable;
113     u8 other_ac[4];
114     // 40:B0
115     u8 other_b0[10];
116     u16 vbe_mode;
117 } PACKED;
118
119 // BDA floppy_recalibration_status bitdefs
120 #define FRS_TIMEOUT (1<<7)
121
122 // BDA rtc_wait_flag bitdefs
123 #define RWS_WAIT_PENDING (1<<0)
124 #define RWS_WAIT_ELAPSED (1<<7)
125
126 // BDA floppy_media_state bitdefs
127 #define FMS_DRIVE_STATE_MASK        (0x07)
128 #define FMS_MEDIA_DRIVE_ESTABLISHED (1<<4)
129 #define FMS_DOUBLE_STEPPING         (1<<5)
130 #define FMS_DATA_RATE_MASK          (0xc0)
131
132 // Accessor functions
133 #define GET_BDA(var) \
134     GET_FARVAR(SEG_BDA, ((struct bios_data_area_s *)0)->var)
135 #define SET_BDA(var, val) \
136     SET_FARVAR(SEG_BDA, ((struct bios_data_area_s *)0)->var, (val))
137 #define CLEARBITS_BDA(var, val) do {                                    \
138         typeof(((struct bios_data_area_s *)0)->var) __val = GET_BDA(var); \
139         SET_BDA(var, (__val & ~(val)));                                 \
140     } while (0)
141 #define SETBITS_BDA(var, val) do {                                      \
142         typeof(((struct bios_data_area_s *)0)->var) __val = GET_BDA(var); \
143         SET_BDA(var, (__val | (val)));                                  \
144     } while (0)
145
146
147 /****************************************************************
148  * Extended Bios Data Area (EBDA)
149  ****************************************************************/
150
151 // DPTE definition
152 struct dpte_s {
153     u16 iobase1;
154     u16 iobase2;
155     u8  prefix;
156     u8  unused;
157     u8  irq;
158     u8  blkcount;
159     u8  dma;
160     u8  pio;
161     u16 options;
162     u16 reserved;
163     u8  revision;
164     u8  checksum;
165 };
166
167 // ElTorito Device Emulation data
168 struct cdemu_s {
169     struct drive_s *emulated_drive_gf;
170     u32 ilba;
171     u16 buffer_segment;
172     u16 load_segment;
173     u16 sector_count;
174     u8  active;
175     u8  media;
176     u8  emulated_extdrive;
177
178     // Virtual device
179     struct chs_s lchs;
180 };
181
182 struct fdpt_s {
183     u16 cylinders;
184     u8 heads;
185     u8 a0h_signature;
186     u8 phys_sectors;
187     u16 precompensation;
188     u8 reserved;
189     u8 drive_control_byte;
190     u16 phys_cylinders;
191     u8 phys_heads;
192     u16 landing_zone;
193     u8 sectors;
194     u8 checksum;
195 } PACKED;
196
197 struct usbkeyinfo {
198     union {
199         struct {
200             u8 modifiers;
201             u8 repeatcount;
202             u8 keys[6];
203         };
204         u64 data;
205     };
206 };
207
208 struct extended_bios_data_area_s {
209     u8 size;
210     u8 reserved1[0x21];
211     struct segoff_s far_call_pointer;
212     u8 mouse_flag1;
213     u8 mouse_flag2;
214     u8 mouse_data[0x08];
215     // 0x30
216     u8 other1[0x0d];
217
218     // 0x3d
219     struct fdpt_s fdpt[2];
220
221     // 0x5d
222     u8 other2[0xC4];
223
224     // 0x121 - Begin custom storage.
225     u8 ps2ctr;
226     struct usbkeyinfo usbkey_last;
227
228     int RTCusers;
229
230     // El Torito Emulation data
231     struct cdemu_s cdemu;
232
233     // Buffer for disk DPTE table
234     struct dpte_s dpte;
235
236     // Locks for removable devices
237     u8 cdrom_locks[CONFIG_MAX_EXTDRIVE];
238
239     u16 boot_sequence;
240
241     // Stack space available for code that needs it.
242     u8 extra_stack[512] __aligned(8);
243 } PACKED;
244
245 // The initial size and location of EBDA
246 #define EBDA_SIZE_START \
247     DIV_ROUND_UP(sizeof(struct extended_bios_data_area_s), 1024)
248 #define EBDA_SEGMENT_START \
249     FLATPTR_TO_SEG(BUILD_LOWRAM_END - EBDA_SIZE_START*1024)
250
251 // Accessor functions
252 static inline u16 get_ebda_seg(void) {
253     return GET_BDA(ebda_seg);
254 }
255 static inline struct extended_bios_data_area_s *
256 get_ebda_ptr(void)
257 {
258     ASSERT32FLAT();
259     return MAKE_FLATPTR(get_ebda_seg(), 0);
260 }
261 #define GET_EBDA2(eseg, var)                                            \
262     GET_FARVAR(eseg, ((struct extended_bios_data_area_s *)0)->var)
263 #define SET_EBDA2(eseg, var, val)                                       \
264     SET_FARVAR(eseg, ((struct extended_bios_data_area_s *)0)->var, (val))
265 #define GET_EBDA(var)                           \
266     GET_EBDA2(get_ebda_seg(), var)
267 #define SET_EBDA(var, val)                      \
268     SET_EBDA2(get_ebda_seg(), var, (val))
269
270 #define EBDA_OFFSET_TOP_STACK                                   \
271     offsetof(struct extended_bios_data_area_s, extra_stack[     \
272                  FIELD_SIZEOF(struct extended_bios_data_area_s  \
273                               , extra_stack)])
274
275
276 /****************************************************************
277  * Global variables
278  ****************************************************************/
279
280 #if MODE16 == 0 && MODESEGMENT == 1
281 // In 32bit segmented mode %cs may not be readable and the code may be
282 // relocated.  The entry code sets up %gs with a readable segment and
283 // the code offset can be determined by get_global_offset().
284 #define GLOBAL_SEGREG GS
285 static inline u32 __attribute_const get_global_offset(void) {
286     u32 ret;
287     asm("  calll 1f\n"
288         "1:popl %0\n"
289         "  subl $1b, %0"
290         : "=r"(ret));
291     return ret;
292 }
293 #else
294 #define GLOBAL_SEGREG CS
295 static inline u32 __attribute_const get_global_offset(void) {
296     return 0;
297 }
298 #endif
299 static inline u16 get_global_seg(void) {
300     return GET_SEG(GLOBAL_SEGREG);
301 }
302 #define GET_GLOBAL(var)                                                 \
303     GET_VAR(GLOBAL_SEGREG, *(typeof(&(var)))((void*)&(var)              \
304                                              + get_global_offset()))
305 #define SET_GLOBAL(var, val) do {               \
306         ASSERT32FLAT();                         \
307         (var) = (val);                          \
308     } while (0)
309 #if MODESEGMENT
310 #define GLOBALFLAT2GLOBAL(var) ((typeof(var))((void*)(var) - BUILD_BIOS_ADDR))
311 #else
312 #define GLOBALFLAT2GLOBAL(var) (var)
313 #endif
314 // Access a "flat" pointer known to point to the f-segment.
315 #define GET_GLOBALFLAT(var) GET_GLOBAL(*GLOBALFLAT2GLOBAL(&(var)))
316
317
318 /****************************************************************
319  * Bios Config Table
320  ****************************************************************/
321
322 struct bios_config_table_s {
323     u16 size;
324     u8 model;
325     u8 submodel;
326     u8 biosrev;
327     u8 feature1, feature2, feature3, feature4, feature5;
328 } PACKED;
329
330 extern struct bios_config_table_s BIOS_CONFIG_TABLE __aligned(1);
331
332 #endif // __BIOSVAR_H