aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile24
-rw-r--r--src/biosvar.h8
-rw-r--r--src/cbt.c42
-rw-r--r--src/config.h12
-rw-r--r--src/disk.c3
-rw-r--r--src/floppy.c17
-rw-r--r--src/floppy_dbt.c24
-rw-r--r--src/font.c2
-rw-r--r--src/misc.c193
-rw-r--r--src/null.c2
-rw-r--r--src/post.c3
-rw-r--r--src/romlayout.S118
-rw-r--r--src/serial.c3
-rw-r--r--src/system.c68
-rw-r--r--src/types.h3
-rw-r--r--src/util.h3
16 files changed, 255 insertions, 270 deletions
diff --git a/Makefile b/Makefile
index f69ed83..eebc4d1 100644
--- a/Makefile
+++ b/Makefile
@@ -8,13 +8,12 @@
OUT=out/
# Source files
-SRCBOTH=output.c util.c floppy.c ata.c system.c mouse.c kbd.c pci.c \
+SRCBOTH=output.c util.c floppy.c ata.c misc.c mouse.c kbd.c pci.c \
serial.c clock.c pic.c cdrom.c ps2port.c smpdetect.c resume.c \
pnpbios.c pirtable.c
-SRC16=$(SRCBOTH) disk.c apm.c pcibios.c vgahooks.c
+SRC16=$(SRCBOTH) system.c disk.c apm.c pcibios.c vgahooks.c font.c
SRC32=$(SRCBOTH) post.c shadow.c post_menu.c memmap.c coreboot.c boot.c \
acpi.c smm.c mptable.c smbios.c pciinit.c optionroms.c mtrr.c
-TABLESRC=font.c cbt.c floppy_dbt.c
cc-option = $(shell if test -z "`$(1) $(2) -S -o /dev/null -xc \
/dev/null 2>&1`"; then echo "$(2)"; else echo "$(3)"; fi ;)
@@ -34,8 +33,7 @@ CFLAGS16INC = $(COMMONCFLAGS) -DMODE16=1 -fno-jump-tables -fno-defer-pop \
CFLAGS16INC += -ffunction-sections -fdata-sections
CFLAGS16 = $(CFLAGS16INC) -g
-TABLETMP=$(addprefix $(OUT), $(patsubst %.c,%.16.s,$(TABLESRC)))
-all: $(OUT) $(OUT)bios.bin $(TABLETMP)
+all: $(OUT) $(OUT)bios.bin
# Run with "make V=1" to see the actual compile commands
ifdef V
@@ -60,15 +58,12 @@ vpath %.S src
# involves including all the content textually via #include
# directives. The second method uses gcc's "-combine" option.
ifdef AVOIDCOMBINE
-DEPHACK=
define whole-compile
@echo " Compiling whole program $3"
$(Q)printf '$(foreach i,$2,#include "../$i"\n)' > $3.tmp.c
$(Q)$(CC) $1 -c $3.tmp.c -o $3
endef
else
-# Ugly way to get gcc to generate .d files correctly.
-DEPHACK=-combine src/null.c
define whole-compile
@echo " Compiling whole program $3"
$(Q)$(CC) $1 -combine -c $2 -o $3
@@ -76,26 +71,21 @@ endef
endif
-$(OUT)%.proc.16.s: $(OUT)%.16.s
- @echo " Moving data sections to text in $@"
- $(Q)sed 's/^\t\.section\t\.\(ro\)\?data.*// ; s/^\t\.data$$//' < $< > $@
-
-$(OUT)%.16.s: %.c
+$(OUT)%.s: %.c
@echo " Compiling to assembler $@"
- $(Q)$(CC) $(CFLAGS16INC) $(DEPHACK) -S -c $< -o $@
+ $(Q)$(CC) $(CFLAGS16INC) -S -c $< -o $@
$(OUT)%.lds: %.lds.S
@echo " Precompiling $@"
$(Q)$(CPP) -P -D__ASSEMBLY__ $< -o $@
-$(OUT)asm-offsets.h: $(OUT)asm-offsets.16.s
+$(OUT)asm-offsets.h: $(OUT)asm-offsets.s
@echo " Generating offset file $@"
$(Q)./tools/gen-offsets.sh $< $@
$(OUT)ccode.16.s: ; $(call whole-compile, $(CFLAGS16) -S, $(addprefix src/, $(SRC16)),$@)
-TABLEASM=$(addprefix $(OUT), $(patsubst %.c,%.proc.16.s,$(TABLESRC)))
-$(OUT)romlayout16.o: romlayout.S $(OUT)ccode.16.s $(OUT)asm-offsets.h $(TABLEASM)
+$(OUT)romlayout16.o: romlayout.S $(OUT)ccode.16.s $(OUT)asm-offsets.h
@echo " Compiling (16bit) $@"
$(Q)$(CC) $(CFLAGS16INC) -c -D__ASSEMBLY__ $< -o $@
diff --git a/src/biosvar.h b/src/biosvar.h
index 5105696..5dc113f 100644
--- a/src/biosvar.h
+++ b/src/biosvar.h
@@ -15,18 +15,18 @@
* Interupt vector table
****************************************************************/
-struct ivec {
+struct rmode_IVT {
union {
struct {
u16 offset;
u16 seg;
};
u32 segoff;
- };
+ } ivec[256];
};
#define SET_IVT(vector, seg, off) \
- SET_FARVAR(SEG_IVT, ((struct ivec *)0)[vector].segoff, ((seg) << 16) | (off))
+ SET_FARVAR(SEG_IVT, ((struct rmode_IVT *)0)->ivec[vector].segoff, ((seg) << 16) | (off))
/****************************************************************
@@ -284,6 +284,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
diff --git a/src/cbt.c b/src/cbt.c
deleted file mode 100644
index bb7aea3..0000000
--- a/src/cbt.c
+++ /dev/null
@@ -1,42 +0,0 @@
-// BIOS configuration table.
-//
-// Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
-// Copyright (C) 2002 MandrakeSoft S.A.
-//
-// This file may be distributed under the terms of the GNU LGPLv3 license.
-
-#include "biosvar.h" // CONFIG_BIOS_TABLE
-
-// DMA channel 3 used by hard disk BIOS
-#define CBT_F1_DMA3USED (1<<7)
-// 2nd interrupt controller (8259) installed
-#define CBT_F1_2NDPIC (1<<6)
-// Real-Time Clock installed
-#define CBT_F1_RTC (1<<5)
-// INT 15/AH=4Fh called upon INT 09h
-#define CBT_F1_INT154F (1<<4)
-// wait for external event (INT 15/AH=41h) supported
-#define CBT_F1_WAITEXT (1<<3)
-// extended BIOS area allocated (usually at top of RAM)
-#define CBT_F1_EBDA (1<<2)
-// bus is Micro Channel instead of ISA
-#define CBT_F1_MCA (1<<1)
-// system has dual bus (Micro Channel + ISA)
-#define CBT_F1_MCAISA (1<<0)
-
-// INT 16/AH=09h (keyboard functionality) supported
-#define CBT_F2_INT1609 (1<<6)
-
-struct bios_config_table_s BIOS_CONFIG_TABLE __aligned(1) VAR16 = {
- .size = sizeof(BIOS_CONFIG_TABLE) - 2,
- .model = CONFIG_MODEL_ID,
- .submodel = CONFIG_SUBMODEL_ID,
- .biosrev = CONFIG_BIOS_REVISION,
- .feature1 = (
- CBT_F1_2NDPIC | CBT_F1_RTC | CBT_F1_EBDA
- | (CONFIG_KBD_CALL_INT15_4F ? CBT_F1_INT154F : 0)),
- .feature2 = CBT_F2_INT1609,
- .feature3 = 0,
- .feature4 = 0,
- .feature5 = 0,
-};
diff --git a/src/config.h b/src/config.h
index 8c4b2f0..d573726 100644
--- a/src/config.h
+++ b/src/config.h
@@ -111,12 +111,12 @@
#define SEG_BIOS 0xf000
// Segment definitions in protected mode (see rombios32_gdt in romlayout.S)
-#define SEG32_MODE32_CS (2 << 3)
-#define SEG32_MODE32_DS (3 << 3)
-#define SEG32_MODE16_CS (4 << 3)
-#define SEG32_MODE16_DS (5 << 3)
-#define SEG32_MODE16BIG_CS (6 << 3)
-#define SEG32_MODE16BIG_DS (7 << 3)
+#define SEG32_MODE32_CS (1 << 3)
+#define SEG32_MODE32_DS (2 << 3)
+#define SEG32_MODE16_CS (3 << 3)
+#define SEG32_MODE16_DS (4 << 3)
+#define SEG32_MODE16BIG_CS (5 << 3)
+#define SEG32_MODE16BIG_DS (6 << 3)
// Debugging levels. If non-zero and CONFIG_DEBUG_LEVEL is greater
// than the specified value, then the corresponding irq handler will
diff --git a/src/disk.c b/src/disk.c
index d5c7df2..13cb1f3 100644
--- a/src/disk.c
+++ b/src/disk.c
@@ -712,3 +712,6 @@ handle_76()
SET_BDA(disk_interrupt_flag, 0xff);
eoi_pic2();
}
+
+// Old Fixed Disk Parameter Table (newer tables are in the ebda).
+struct fdpt_s OldFDPT VAR16FIXED(0xe401);
diff --git a/src/floppy.c b/src/floppy.c
index 6214acb..43e6c1e 100644
--- a/src/floppy.c
+++ b/src/floppy.c
@@ -39,6 +39,23 @@ struct floppy_ext_dbt_s diskette_param_table2 VAR16_32 = {
.drive_type = 4, // drive type in cmos
};
+// Since no provisions are made for multiple drive types, most
+// values in this table are ignored. I set parameters for 1.44M
+// floppy here
+struct floppy_dbt_s diskette_param_table VAR16FIXED(0xefc7) = {
+ .specify1 = 0xAF,
+ .specify2 = 0x02, // head load time 0000001, DMA used
+ .shutoff_ticks = 0x25,
+ .bps_code = 0x02,
+ .sectors = 18,
+ .interblock_len = 0x1B,
+ .data_len = 0xFF,
+ .gap_len = 0x6C,
+ .fill_byte = 0xF6,
+ .settle_time = 0x0F,
+ .startup_time = 0x08,
+};
+
void
floppy_drive_setup()
{
diff --git a/src/floppy_dbt.c b/src/floppy_dbt.c
deleted file mode 100644
index a988201..0000000
--- a/src/floppy_dbt.c
+++ /dev/null
@@ -1,24 +0,0 @@
-// Floppy controller parameter table.
-//
-// Copyright (C) 2002 MandrakeSoft S.A.
-//
-// This file may be distributed under the terms of the GNU LGPLv3 license.
-
-#include "disk.h" // struct floppy_dbt_s
-
-// Since no provisions are made for multiple drive types, most
-// values in this table are ignored. I set parameters for 1.44M
-// floppy here
-struct floppy_dbt_s diskette_param_table __aligned(1) VAR16 = {
- .specify1 = 0xAF,
- .specify2 = 0x02, // head load time 0000001, DMA used
- .shutoff_ticks = 0x25,
- .bps_code = 0x02,
- .sectors = 18,
- .interblock_len = 0x1B,
- .data_len = 0xFF,
- .gap_len = 0x6C,
- .fill_byte = 0xF6,
- .settle_time = 0x0F,
- .startup_time = 0x08,
-};
diff --git a/src/font.c b/src/font.c
index 99c7f43..3f8662f 100644
--- a/src/font.c
+++ b/src/font.c
@@ -7,7 +7,7 @@
* found at ftp://ftp.simtel.net/pub/simtelnet/msdos/screen/fntcol16.zip
* This font is public domain
*/
-const u8 vgafont8[128*8] __aligned(1) VAR16 = {
+u8 vgafont8[128*8] VAR16FIXED(0xfa6e) = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e,
0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e,
diff --git a/src/misc.c b/src/misc.c
new file mode 100644
index 0000000..0c5f608
--- /dev/null
+++ b/src/misc.c
@@ -0,0 +1,193 @@
+// Code for misc 16bit handlers and variables.
+//
+// Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
+// Copyright (C) 2002 MandrakeSoft S.A.
+//
+// This file may be distributed under the terms of the GNU LGPLv3 license.
+
+#include "bregs.h" // struct bregs
+#include "biosvar.h" // GET_BDA
+#include "util.h" // debug_enter
+#include "pic.h" // enable_hwirq
+
+// Amount of continuous ram under 4Gig
+u32 RamSize VAR16_32;
+// Amount of continuous ram >4Gig
+u64 RamSizeOver4G;
+
+
+/****************************************************************
+ * Misc 16bit ISRs
+ ****************************************************************/
+
+// INT 12h Memory Size Service Entry Point
+void VISIBLE16
+handle_12(struct bregs *regs)
+{
+ debug_enter(regs, DEBUG_HDL_12);
+ regs->ax = GET_BDA(mem_size_kb);
+}
+
+// INT 11h Equipment List Service Entry Point
+void VISIBLE16
+handle_11(struct bregs *regs)
+{
+ debug_enter(regs, DEBUG_HDL_11);
+ regs->ax = GET_BDA(equipment_list_flags);
+}
+
+// INT 05h Print Screen Service Entry Point
+void VISIBLE16
+handle_05(struct bregs *regs)
+{
+ debug_enter(regs, DEBUG_HDL_05);
+}
+
+// INT 10h Video Support Service Entry Point
+void VISIBLE16
+handle_10(struct bregs *regs)
+{
+ debug_enter(regs, DEBUG_HDL_10);
+ // dont do anything, since the VGA BIOS handles int10h requests
+}
+
+void VISIBLE16
+handle_nmi()
+{
+ debug_isr(DEBUG_ISR_nmi);
+ BX_PANIC("NMI Handler called\n");
+}
+
+void
+mathcp_setup()
+{
+ dprintf(3, "math cp init\n");
+ // 80x87 coprocessor installed
+ SETBITS_BDA(equipment_list_flags, 0x02);
+ enable_hwirq(13, entry_75);
+}
+
+// INT 75 - IRQ13 - MATH COPROCESSOR EXCEPTION
+void VISIBLE16
+handle_75()
+{
+ debug_isr(DEBUG_ISR_75);
+
+ // clear irq13
+ outb(0, PORT_MATH_CLEAR);
+ // clear interrupt
+ eoi_pic2();
+ // legacy nmi call
+ u32 eax=0, flags;
+ call16_simpint(0x02, &eax, &flags);
+}
+
+
+/****************************************************************
+ * BIOS_CONFIG_TABLE
+ ****************************************************************/
+
+// DMA channel 3 used by hard disk BIOS
+#define CBT_F1_DMA3USED (1<<7)
+// 2nd interrupt controller (8259) installed
+#define CBT_F1_2NDPIC (1<<6)
+// Real-Time Clock installed
+#define CBT_F1_RTC (1<<5)
+// INT 15/AH=4Fh called upon INT 09h
+#define CBT_F1_INT154F (1<<4)
+// wait for external event (INT 15/AH=41h) supported
+#define CBT_F1_WAITEXT (1<<3)
+// extended BIOS area allocated (usually at top of RAM)
+#define CBT_F1_EBDA (1<<2)
+// bus is Micro Channel instead of ISA
+#define CBT_F1_MCA (1<<1)
+// system has dual bus (Micro Channel + ISA)
+#define CBT_F1_MCAISA (1<<0)
+
+// INT 16/AH=09h (keyboard functionality) supported
+#define CBT_F2_INT1609 (1<<6)
+
+struct bios_config_table_s BIOS_CONFIG_TABLE VAR16FIXED(0xe6f5) = {
+ .size = sizeof(BIOS_CONFIG_TABLE) - 2,
+ .model = CONFIG_MODEL_ID,
+ .submodel = CONFIG_SUBMODEL_ID,
+ .biosrev = CONFIG_BIOS_REVISION,
+ .feature1 = (
+ CBT_F1_2NDPIC | CBT_F1_RTC | CBT_F1_EBDA
+ | (CONFIG_KBD_CALL_INT15_4F ? CBT_F1_INT154F : 0)),
+ .feature2 = CBT_F2_INT1609,
+ .feature3 = 0,
+ .feature4 = 0,
+ .feature5 = 0,
+};
+
+
+/****************************************************************
+ * GDT and IDT tables
+ ****************************************************************/
+
+struct descloc_s {
+ u16 length;
+ u32 addr;
+} PACKED;
+
+// Real mode IDT descriptor
+struct descloc_s rmode_IDT_info VAR16_32 = {
+ .length = sizeof(struct rmode_IVT) - 1,
+ .addr = (u32)MAKE_FARPTR(SEG_IVT, 0),
+};
+
+// Dummy IDT that forces a machine shutdown if an irq happens in
+// protected mode.
+u8 dummy_IDT VAR16_32;
+
+// Protected mode IDT descriptor
+struct descloc_s pmode_IDT_info VAR16_32 = {
+ .length = sizeof(dummy_IDT) - 1,
+ .addr = (u32)MAKE_FARPTR(SEG_BIOS, &dummy_IDT),
+};
+
+// GDT
+u64 rombios32_gdt[] VAR16_32 __aligned(8) = {
+ // First entry can't be used.
+ 0x0000000000000000LL,
+ // 32 bit flat code segment (SEG32_MODE32_CS)
+ 0x00cf9b000000ffffLL,
+ // 32 bit flat data segment (SEG32_MODE32_DS)
+ 0x00cf93000000ffffLL,
+ // 16 bit code segment base=0xf0000 limit=0xffff (SEG32_MODE16_CS)
+ 0x00009b0f0000ffffLL,
+ // 16 bit data segment base=0x0 limit=0xffff (SEG32_MODE16_DS)
+ 0x000093000000ffffLL,
+ // 16 bit code segment base=0 limit=0xffffffff (SEG32_MODE16BIG_CS)
+ 0x008f9b000000ffffLL,
+ // 16 bit data segment base=0 limit=0xffffffff (SEG32_MODE16BIG_DS)
+ 0x008f93000000ffffLL,
+};
+
+// GDT descriptor
+struct descloc_s rombios32_gdt_48 VAR16_32 = {
+ .length = sizeof(rombios32_gdt) - 1,
+ .addr = (u32)MAKE_FARPTR(SEG_BIOS, rombios32_gdt),
+};
+
+
+/****************************************************************
+ * Misc fixed vars
+ ****************************************************************/
+
+char BiosCopyright[] VAR16FIXED(0xff00) =
+ "(c) 2002 MandrakeSoft S.A. Written by Kevin Lawton & the Bochs team.";
+
+// BIOS build date
+char BiosDate[] VAR16FIXED(0xfff5) = "06/23/99";
+
+u8 BiosModelId VAR16FIXED(0xfffe) = CONFIG_MODEL_ID;
+
+u8 BiosChecksum VAR16FIXED(0xffff);
+
+// XXX - Initial Interrupt Vector Offsets Loaded by POST
+u8 InitVectors[13] VAR16FIXED(0xfef3);
+
+// XXX - INT 1D - SYSTEM DATA - VIDEO PARAMETER TABLES
+u8 VideoParams[88] VAR16FIXED(0xf0a4);
diff --git a/src/null.c b/src/null.c
deleted file mode 100644
index be072ce..0000000
--- a/src/null.c
+++ /dev/null
@@ -1,2 +0,0 @@
-// GCC does something odd when one uses -combine with just one .c
-// file. So this dummy file makes gcc happy.
diff --git a/src/post.c b/src/post.c
index bfa6562..7093901 100644
--- a/src/post.c
+++ b/src/post.c
@@ -245,8 +245,7 @@ _start()
interactive_bootmenu();
// Setup bios checksum.
- extern char bios_checksum;
- bios_checksum = -checksum((u8*)BUILD_BIOS_ADDR, BUILD_BIOS_SIZE - 1);
+ BiosChecksum = -checksum((u8*)BUILD_BIOS_ADDR, BUILD_BIOS_SIZE - 1);
// Prep for boot process.
make_bios_readonly();
diff --git a/src/romlayout.S b/src/romlayout.S
index c8b7793..b0dc6fd 100644
--- a/src/romlayout.S
+++ b/src/romlayout.S
@@ -451,88 +451,21 @@ permanent_halt:
ORG 0xe2c3
IRQ_ENTRY nmi
-/****************************************************************
- * GDT and IDT tables (between 0xe2c3 - 0xe3fe)
- ****************************************************************/
-
-// Protected mode IDT descriptor
-//
-// I just make the limit 0, so the machine will shutdown
-// if an exception occurs during protected mode memory
-// transfers.
-//
-// Set base to f0000 to correspond to beginning of BIOS,
-// in case I actually define an IDT later
-// Set limit to 0
- .type pmode_IDT_info, @object
-pmode_IDT_info:
- .word 0x0000 // limit 15:00
- .long 0xf0000 // base 16:47
-
-// Real mode IDT descriptor
-//
-// Set to typical real-mode values.
-// base = 000000
-// limit = 03ff
- .type rmode_IDT_info, @object
-rmode_IDT_info:
- .word 0x03ff // limit 15:00
- .long 0 // base 16:47
-
- .type rombios32_gdt_48, @object
-rombios32_gdt_48:
- .word (rombios32_gdt_end - rombios32_gdt)
- .long (BUILD_BIOS_ADDR + rombios32_gdt)
-
- //.balign 8
- .type rombios32_gdt, @object
-rombios32_gdt:
- .word 0, 0, 0, 0
- .word 0, 0, 0, 0
- // 32 bit flat code segment (SEG32_MODE32_CS)
- .word 0xffff, 0, 0x9b00, 0x00cf
- // 32 bit flat data segment (SEG32_MODE32_DS)
- .word 0xffff, 0, 0x9300, 0x00cf
- // 16 bit code segment base=0xf0000 limit=0xffff (SEG32_MODE16_CS)
- .word 0xffff, 0, 0x9b0f, 0x0000
- // 16 bit data segment base=0x0 limit=0xffff (SEG32_MODE16_DS)
- .word 0xffff, 0, 0x9300, 0x0000
- // 16 bit code segment base=0 limit=0xffffffff (SEG32_MODE16BIG_CS)
- .word 0xffff, 0, 0x9b00, 0x008f
- // 16 bit data segment base=0 limit=0xffffffff (SEG32_MODE16BIG_DS)
- .word 0xffff, 0, 0x9300, 0x008f
-rombios32_gdt_end:
-
-
-/****************************************************************
- * Interrupt entry points (continued)
- ****************************************************************/
-
ORG 0xe3fe
.global entry_13_official
entry_13_official:
jmp entry_13
- ORG 0xe401
- .type __fdpt, @object
-__fdpt:
- // XXX - Fixed Disk Parameter Table
- .space 16
+ // 0xe401 - OldFDPT in disk.c
ORG 0xe6f2
.global entry_19_official
entry_19_official:
jmp entry_19
- ORG 0xe6f5
-.include "out/cbt.proc.16.s"
- .text
+ // 0xe6f5 - BIOS_CONFIG_TABLE in misc.c
- ORG 0xe729
- .type __brgt, @object
-__brgt:
- // XXX - Baud Rate Generator Table
- .space 16
+ // 0xe729 - BaudTable in serial.c
ORG 0xe739
IRQ_ENTRY_ARG 14
@@ -549,9 +482,7 @@ __brgt:
ORG 0xef57
IRQ_ENTRY 0e
- ORG 0xefc7
-.include "out/floppy_dbt.proc.16.s"
- .text
+ // 0xefc7 - diskette_param_table in floppy.c
ORG 0xefd2
IRQ_ENTRY_ARG 17
@@ -564,11 +495,7 @@ __int10_0x0f:
ORG 0xf065
IRQ_ENTRY_ARG 10
- ORG 0xf0a4
- .type __int1d, @object
-__int1d:
- // XXX - INT 1D - SYSTEM DATA - VIDEO PARAMETER TABLES
- .space 0x58
+ // 0xf0a4 - VideoParams in misc.c
ORG 0xf841
.global entry_12_official
@@ -608,9 +535,7 @@ entry_18:
pushl $_code32_handle_18
jmp transition32
- ORG 0xfa6e
-.include "out/font.proc.16.s"
- .text
+ // 0xfa6e - vgafont8 in font.c
ORG 0xfe6e
IRQ_ENTRY_ARG 1a
@@ -618,16 +543,9 @@ entry_18:
ORG 0xfea5
IRQ_ENTRY 08
- ORG 0xfef3
-__initvector:
- // XXX - Initial Interrupt Vector Offsets Loaded by POST
- .space 13
+ // 0xfef3 - InitVectors in misc.c
- ORG 0xff00
- .type __copyright, @object
-__copyright:
- // XXX - BIOS_COPYRIGHT_STRING
- .asciz "(c) 2002 MandrakeSoft S.A. Written by Kevin Lawton & the Bochs team."
+ // 0xff00 - BiosCopyright in misc.c
ORG 0xff53
.global dummy_iret_handler
@@ -642,20 +560,10 @@ dummy_iret_handler:
reset_vector:
ljmpw $SEG_BIOS, $post16
- ORG 0xfff5
- .type __biosdate, @object
-__biosdate:
- // BIOS build date
- .ascii "06/23/99"
-
- ORG 0xfffe
- .type __model_id, @object
-__model_id:
- .byte CONFIG_MODEL_ID
-
- .global bios_checksum
- .type bios_checksum, @object
-bios_checksum:
- .byte 0x00
+ // 0xfff5 - BiosDate in misc.c
+
+ // 0xfffe - BiosModelId in misc.c
+
+ // 0xffff - BiosChecksum in misc.c
.end
diff --git a/src/serial.c b/src/serial.c
index 5eefaf3..f9857e4 100644
--- a/src/serial.c
+++ b/src/serial.c
@@ -170,6 +170,9 @@ handle_14(struct bregs *regs)
}
}
+// XXX - Baud Rate Generator Table
+u8 BaudTable[16] VAR16FIXED(0xe729);
+
/****************************************************************
* LPT ports
diff --git a/src/system.c b/src/system.c
index 9bf4a5d..ebb8d41 100644
--- a/src/system.c
+++ b/src/system.c
@@ -1,4 +1,4 @@
-// 16bit system callbacks
+// Handler for int 0x15 "system" calls
//
// Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
// Copyright (C) 2002 MandrakeSoft S.A.
@@ -269,10 +269,6 @@ handle_15e801(struct bregs *regs)
// Info on e820 map location and size.
struct e820entry *e820_list VAR16_32;
int e820_count VAR16_32;
-// Amount of continuous ram under 4Gig
-u32 RamSize VAR16_32;
-// Amount of continuous ram >4Gig
-u64 RamSizeOver4G;
static void
handle_15e820(struct bregs *regs)
@@ -340,65 +336,3 @@ handle_15(struct bregs *regs)
default: handle_15XX(regs); break;
}
}
-
-// INT 12h Memory Size Service Entry Point
-void VISIBLE16
-handle_12(struct bregs *regs)
-{
- debug_enter(regs, DEBUG_HDL_12);
- regs->ax = GET_BDA(mem_size_kb);
-}
-
-// INT 11h Equipment List Service Entry Point
-void VISIBLE16
-handle_11(struct bregs *regs)
-{
- debug_enter(regs, DEBUG_HDL_11);
- regs->ax = GET_BDA(equipment_list_flags);
-}
-
-// INT 05h Print Screen Service Entry Point
-void VISIBLE16
-handle_05(struct bregs *regs)
-{
- debug_enter(regs, DEBUG_HDL_05);
-}
-
-// INT 10h Video Support Service Entry Point
-void VISIBLE16
-handle_10(struct bregs *regs)
-{
- debug_enter(regs, DEBUG_HDL_10);
- // dont do anything, since the VGA BIOS handles int10h requests
-}
-
-void VISIBLE16
-handle_nmi()
-{
- debug_isr(DEBUG_ISR_nmi);
- BX_PANIC("NMI Handler called\n");
-}
-
-void
-mathcp_setup()
-{
- dprintf(3, "math cp init\n");
- // 80x87 coprocessor installed
- SETBITS_BDA(equipment_list_flags, 0x02);
- enable_hwirq(13, entry_75);
-}
-
-// INT 75 - IRQ13 - MATH COPROCESSOR EXCEPTION
-void VISIBLE16
-handle_75()
-{
- debug_isr(DEBUG_ISR_75);
-
- // clear irq13
- outb(0, PORT_MATH_CLEAR);
- // clear interrupt
- eoi_pic2();
- // legacy nmi call
- u32 eax=0, flags;
- call16_simpint(0x02, &eax, &flags);
-}
diff --git a/src/types.h b/src/types.h
index 5bf7634..52e508b 100644
--- a/src/types.h
+++ b/src/types.h
@@ -32,6 +32,8 @@ union u64_u32_u {
# define VAR16 __attribute__((section(".data16." __FILE__ "." __stringify(__LINE__))))
// Designate a variable as visible to both 32bit and 16bit code.
# define VAR16_32 VAR16 __VISIBLE
+// Designate a variable at a specific 16bit address
+# define VAR16FIXED(addr) __aligned(1) __VISIBLE __attribute__((section(".fixedaddr." __stringify(addr))))
// Designate top-level assembler as 16bit only.
# define ASM16(code) asm(".section .text.asm." __FILE__ "." __stringify(__LINE__) "\n\t" code)
#else
@@ -39,6 +41,7 @@ union u64_u32_u {
# define VISIBLE32 __VISIBLE
# define VAR16 __attribute__((section(".discard.var16")))
# define VAR16_32 VAR16 __VISIBLE __attribute__((weak))
+# define VAR16FIXED(addr) VAR16_32
# define ASM16(code)
#endif
diff --git a/src/util.h b/src/util.h
index 7492c55..6893b48 100644
--- a/src/util.h
+++ b/src/util.h
@@ -184,4 +184,7 @@ void mtrr_setup(void);
// romlayout.S
void reset_vector() __attribute__ ((noreturn));
+// misc.c
+extern u8 BiosChecksum;
+
#endif // util.h