1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
|
// Code for misc 16bit handlers and variables.
//
// Copyright (C) 2008,2009 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" // GET_BDA
#include "bregs.h" // struct bregs
#include "hw/pic.h" // enable_hwirq
#include "output.h" // debug_enter
#include "stacks.h" // call16_int
#include "string.h" // memset
#define PORT_MATH_CLEAR 0x00f0
// Indicator if POST phase has been started (and if it has completed).
int HaveRunPost VARFSEG;
int
in_post(void)
{
return GET_GLOBAL(HaveRunPost) == 1;
}
/****************************************************************
* 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);
}
// NMI handler
void VISIBLE16
handle_02(void)
{
debug_isr(DEBUG_ISR_02);
}
void
mathcp_setup(void)
{
dprintf(3, "math cp init\n");
// 80x87 coprocessor installed
set_equipment_flags(0x02, 0x02);
enable_hwirq(13, FUNC16(entry_75));
}
// INT 75 - IRQ13 - MATH COPROCESSOR EXCEPTION
void VISIBLE16
handle_75(void)
{
debug_isr(DEBUG_ISR_75);
// clear irq13
outb(0, PORT_MATH_CLEAR);
// clear interrupt
pic_eoi2();
// legacy nmi call
struct bregs br;
memset(&br, 0, sizeof(br));
br.flags = F_IF;
call16_int(0x02, &br);
}
/****************************************************************
* 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 VARFSEGFIXED(0xe6f5) = {
.size = sizeof(BIOS_CONFIG_TABLE) - 2,
.model = BUILD_MODEL_ID,
.submodel = BUILD_SUBMODEL_ID,
.biosrev = BUILD_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
****************************************************************/
// Real mode IDT descriptor
struct descloc_s rmode_IDT_info VARFSEG = {
.length = sizeof(struct rmode_IVT) - 1,
.addr = (u32)MAKE_FLATPTR(SEG_IVT, 0),
};
// Dummy IDT that forces a machine shutdown if an irq happens in
// protected mode.
u8 dummy_IDT VARFSEG;
// Protected mode IDT descriptor
struct descloc_s pmode_IDT_info VARFSEG = {
.length = sizeof(dummy_IDT) - 1,
.addr = (u32)&dummy_IDT,
};
// GDT
u64 rombios32_gdt[] VARFSEG __aligned(8) = {
// First entry can't be used.
0x0000000000000000LL,
// 32 bit flat code segment (SEG32_MODE32_CS)
GDT_GRANLIMIT(0xffffffff) | GDT_CODE | GDT_B,
// 32 bit flat data segment (SEG32_MODE32_DS)
GDT_GRANLIMIT(0xffffffff) | GDT_DATA | GDT_B,
// 16 bit code segment base=0xf0000 limit=0xffff (SEG32_MODE16_CS)
GDT_LIMIT(BUILD_BIOS_SIZE-1) | GDT_CODE | GDT_BASE(BUILD_BIOS_ADDR),
// 16 bit data segment base=0x0 limit=0xffff (SEG32_MODE16_DS)
GDT_LIMIT(0x0ffff) | GDT_DATA,
// 16 bit code segment base=0xf0000 limit=0xffffffff (SEG32_MODE16BIG_CS)
GDT_GRANLIMIT(0xffffffff) | GDT_CODE | GDT_BASE(BUILD_BIOS_ADDR),
// 16 bit data segment base=0 limit=0xffffffff (SEG32_MODE16BIG_DS)
GDT_GRANLIMIT(0xffffffff) | GDT_DATA,
};
// GDT descriptor
struct descloc_s rombios32_gdt_48 VARFSEG = {
.length = sizeof(rombios32_gdt) - 1,
.addr = (u32)rombios32_gdt,
};
/****************************************************************
* Misc fixed vars
****************************************************************/
// BIOS build date
char BiosDate[] VARFSEGFIXED(0xfff5) = "06/23/99";
u8 BiosModelId VARFSEGFIXED(0xfffe) = BUILD_MODEL_ID;
u8 BiosChecksum VARFSEGFIXED(0xffff);
struct floppy_dbt_s diskette_param_table VARFSEGFIXED(0xefc7);
// Old Fixed Disk Parameter Table (newer tables are in the ebda).
struct fdpt_s OldFDPT VARFSEGFIXED(0xe401);
// XXX - Baud Rate Generator Table
u8 BaudTable[16] VARFSEGFIXED(0xe729);
// XXX - Initial Interrupt Vector Offsets Loaded by POST
u8 InitVectors[13] VARFSEGFIXED(0xfef3);
// XXX - INT 1D - SYSTEM DATA - VIDEO PARAMETER TABLES
u8 VideoParams[88] VARFSEGFIXED(0xf0a4);
|