aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2013-09-15 00:14:28 -0400
committerKevin O'Connor <kevin@koconnor.net>2013-09-18 20:48:34 -0400
commit392d2aacb6065319be3d31fdb37fef393e0149a9 (patch)
tree9fd7ca3ae26cc49262bb59598f11711a5c63bbd0
parent135f3f676de1416f0cd0fa7f0c886cf1b72222cb (diff)
downloadseabios-392d2aacb6065319be3d31fdb37fef393e0149a9.tar.gz
Move standard bda type info from biosvar.h to std/bda.h.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--src/biosvar.h161
-rw-r--r--src/fw/csm.c3
-rw-r--r--src/post.c2
-rw-r--r--src/resume.c4
-rw-r--r--src/std/bda.h159
-rw-r--r--src/std/disk.h16
-rw-r--r--src/system.c2
-rw-r--r--src/util.h3
8 files changed, 188 insertions, 162 deletions
diff --git a/src/biosvar.h b/src/biosvar.h
index e49a10a..051cd1e 100644
--- a/src/biosvar.h
+++ b/src/biosvar.h
@@ -1,24 +1,20 @@
-// Variable layouts of bios.
+// Memory access to BIOS variables.
//
-// Copyright (C) 2008-2010 Kevin O'Connor <kevin@koconnor.net>
+// Copyright (C) 2008-2013 Kevin O'Connor <kevin@koconnor.net>
//
// 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" // GET_FARVAR
#include "config.h" // SEG_BDA
+#include "farptr.h" // GET_FARVAR
+#include "std/bda.h" // struct bios_data_area_s
/****************************************************************
* Interupt vector table
****************************************************************/
-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) \
@@ -35,106 +31,6 @@ struct rmode_IVT {
* Bios Data Area (BDA)
****************************************************************/
-struct bios_data_area_s {
- // 40:00
- u16 port_com[4];
- u16 port_lpt[3];
- u16 ebda_seg;
- // 40:10
- u16 equipment_list_flags;
- u8 pad1;
- u16 mem_size_kb;
- u8 pad2;
- u8 ps2_ctrl_flag;
- u8 kbd_flag0;
- u8 kbd_flag1;
- 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 video_mode;
- u16 video_cols;
- u16 video_pagesize;
- u16 video_pagestart;
- // 40:50
- u16 cursor_pos[8];
- // 40:60
- 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 hdcount;
- u8 disk_control_byte;
- u8 port_disk;
- u8 lpt_timeout[4];
- u8 com_timeout[4];
- // 40:80
- u16 kbd_buf_start_offset;
- u16 kbd_buf_end_offset;
- 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;
- u8 disk_interrupt_flag;
- u8 floppy_harddisk_info;
- // 40:90
- u8 floppy_media_state[4];
- u8 floppy_track[2];
- u8 kbd_flag2;
- u8 kbd_led;
- 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;
- u8 other_bc[4];
- // 40:C0
- u8 other_c0[4*16];
-} PACKED;
-
-// BDA floppy_recalibration_status bitdefs
-#define FRS_IRQ (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)
-
-// Limit of BDA timer_counter field
-#define TICKS_PER_DAY 1573040
-
// Accessor functions
#define GET_BDA(var) \
GET_FARVAR(SEG_BDA, ((struct bios_data_area_s *)0)->var)
@@ -152,40 +48,6 @@ static inline void set_equipment_flags(u16 clear, u16 set) {
* 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 extended_bios_data_area_s {
- u8 size;
- u8 reserved1[0x21];
- struct segoff_s far_call_pointer;
- u8 mouse_flag1;
- u8 mouse_flag2;
- u8 mouse_data[0x08];
- // 0x30
- u8 other1[0x0d];
-
- // 0x3d
- struct fdpt_s fdpt[2];
-
- // 0x5d
- u8 other2[0xC4];
-
- // 0x121 - Begin custom storage.
-} PACKED;
-
// The initial size and location of EBDA
#define EBDA_SIZE_START \
DIV_ROUND_UP(sizeof(struct extended_bios_data_area_s), 1024)
@@ -269,19 +131,4 @@ extern u8 _zonelow_seg, zonelow_base[];
#define GET_LOWFLAT(var) GET_LOW(*LOWFLAT2LOW(&(var)))
#define SET_LOWFLAT(var, val) SET_LOW(*LOWFLAT2LOW(&(var)), (val))
-
-/****************************************************************
- * Bios Config Table
- ****************************************************************/
-
-struct bios_config_table_s {
- u16 size;
- u8 model;
- u8 submodel;
- u8 biosrev;
- u8 feature1, feature2, feature3, feature4, feature5;
-} PACKED;
-
-extern struct bios_config_table_s BIOS_CONFIG_TABLE __aligned(1);
-
#endif // __BIOSVAR_H
diff --git a/src/fw/csm.c b/src/fw/csm.c
index dda6af4..d241b17 100644
--- a/src/fw/csm.c
+++ b/src/fw/csm.c
@@ -4,10 +4,10 @@
//
// This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h"
#include "boot.h"
#include "bregs.h"
#include "config.h" // CONFIG_*
+#include "farptr.h" // MAKE_FLATPTR
#include "hw/pci.h"
#include "hw/pic.h"
#include "malloc.h" // csm_malloc_preinit
@@ -16,6 +16,7 @@
#include "post.h"
#include "stacks.h" // wait_threads
#include "std/acpi.h" // RSDP_SIGNATURE
+#include "std/bda.h" // struct bios_data_area_s
#include "std/optionrom.h" // struct rom_header
#include "util.h" // copy_smbios
diff --git a/src/post.c b/src/post.c
index 5514120..512c716 100644
--- a/src/post.c
+++ b/src/post.c
@@ -5,7 +5,7 @@
//
// This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h" // struct bios_data_area_s
+#include "biosvar.h" // SET_BDA
#include "boot.h" // boot_init
#include "bregs.h" // struct bregs
#include "config.h" // CONFIG_*
diff --git a/src/resume.c b/src/resume.c
index 96c63d5..af39a1d 100644
--- a/src/resume.c
+++ b/src/resume.c
@@ -4,8 +4,9 @@
//
// This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h" // struct bios_data_area_s
#include "bregs.h" // struct bregs
+#include "config.h" // CONFIG_*
+#include "farptr.h" // FLATPTR_TO_SEGOFF
#include "hw/cmos.h" // inb_cmos
#include "hw/pci.h" // pci_reboot
#include "hw/pic.h" // pic_eoi2
@@ -13,6 +14,7 @@
#include "ioport.h" // outb
#include "output.h" // dprintf
#include "stacks.h" // farcall16big
+#include "std/bda.h" // struct bios_data_area_s
#include "string.h" // memset
#include "util.h" // dma_setup
diff --git a/src/std/bda.h b/src/std/bda.h
new file mode 100644
index 0000000..948bdbf
--- /dev/null
+++ b/src/std/bda.h
@@ -0,0 +1,159 @@
+// BIOS Data Area (and similar) definitions
+#ifndef __BDA_H
+#define __BDA_H
+
+#include "disk.h" // struct fdpt_s
+#include "types.h" // u8
+
+
+/****************************************************************
+ * Interupt vector table
+ ****************************************************************/
+
+struct rmode_IVT {
+ struct segoff_s ivec[256];
+};
+
+
+/****************************************************************
+ * Bios Data Area (BDA)
+ ****************************************************************/
+
+struct bios_data_area_s {
+ // 40:00
+ u16 port_com[4];
+ u16 port_lpt[3];
+ u16 ebda_seg;
+ // 40:10
+ u16 equipment_list_flags;
+ u8 pad1;
+ u16 mem_size_kb;
+ u8 pad2;
+ u8 ps2_ctrl_flag;
+ u8 kbd_flag0;
+ u8 kbd_flag1;
+ 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 video_mode;
+ u16 video_cols;
+ u16 video_pagesize;
+ u16 video_pagestart;
+ // 40:50
+ u16 cursor_pos[8];
+ // 40:60
+ 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 hdcount;
+ u8 disk_control_byte;
+ u8 port_disk;
+ u8 lpt_timeout[4];
+ u8 com_timeout[4];
+ // 40:80
+ u16 kbd_buf_start_offset;
+ u16 kbd_buf_end_offset;
+ 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;
+ u8 disk_interrupt_flag;
+ u8 floppy_harddisk_info;
+ // 40:90
+ u8 floppy_media_state[4];
+ u8 floppy_track[2];
+ u8 kbd_flag2;
+ u8 kbd_led;
+ 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;
+ u8 other_bc[4];
+ // 40:C0
+ u8 other_c0[4*16];
+} PACKED;
+
+// BDA floppy_recalibration_status bitdefs
+#define FRS_IRQ (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)
+
+// Limit of BDA timer_counter field
+#define TICKS_PER_DAY 1573040
+
+
+/****************************************************************
+ * Extended Bios Data Area (EBDA)
+ ****************************************************************/
+
+struct extended_bios_data_area_s {
+ u8 size;
+ u8 reserved1[0x21];
+ struct segoff_s far_call_pointer;
+ u8 mouse_flag1;
+ u8 mouse_flag2;
+ u8 mouse_data[0x08];
+ // 0x30
+ u8 other1[0x0d];
+
+ // 0x3d
+ struct fdpt_s fdpt[2];
+
+ // 0x5d
+ u8 other2[0xC4];
+
+ // 0x121 - Begin custom storage.
+} PACKED;
+
+
+/****************************************************************
+ * Bios Config Table
+ ****************************************************************/
+
+struct bios_config_table_s {
+ u16 size;
+ u8 model;
+ u8 submodel;
+ u8 biosrev;
+ u8 feature1, feature2, feature3, feature4, feature5;
+} PACKED;
+
+#endif // bda.h
diff --git a/src/std/disk.h b/src/std/disk.h
index c111e07..b2576d9 100644
--- a/src/std/disk.h
+++ b/src/std/disk.h
@@ -81,6 +81,22 @@ struct int13dpt_s {
};
} PACKED;
+// Floppy info
+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;
+
// Floppy "Disk Base Table"
struct floppy_dbt_s {
u8 specify1;
diff --git a/src/system.c b/src/system.c
index 4669e62..aaca059 100644
--- a/src/system.c
+++ b/src/system.c
@@ -5,7 +5,7 @@
//
// This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h" // BIOS_CONFIG_TABLE
+#include "biosvar.h" // GET_GLOBAL
#include "bregs.h" // struct bregs
#include "hw/pic.h" // pic_reset
#include "ioport.h" // inb
diff --git a/src/util.h b/src/util.h
index 6d8c0d2..32a4af4 100644
--- a/src/util.h
+++ b/src/util.h
@@ -175,8 +175,9 @@ void mtrr_setup(void);
void reset_vector(void) __noreturn;
// misc.c
-void mathcp_setup(void);
+extern struct bios_config_table_s BIOS_CONFIG_TABLE __aligned(1);
extern u8 BiosChecksum;
+void mathcp_setup(void);
// version (auto generated file out/version.c)
extern const char VERSION[];