-// 16bit system callbacks
+// Handler for int 0x15 "system" calls
//
// 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 GPLv3 license.
+// This file may be distributed under the terms of the GNU LGPLv3 license.
#include "util.h" // irq_restore
#include "biosvar.h" // BIOS_CONFIG_TABLE
// get current setting first
u8 newval, oldval = inb(PORT_A20);
if (cond)
- newval = oldval | 0x02;
+ newval = oldval | A20_ENABLE_BIT;
else
- newval = oldval & ~0x02;
+ newval = oldval & ~A20_ENABLE_BIT;
outb(newval, PORT_A20);
- return (newval & 0x02) != 0;
+ return (oldval & A20_ENABLE_BIT) != 0;
}
static void
static void
handle_152402(struct bregs *regs)
{
- regs->al = !!(inb(PORT_A20) & 0x20);
+ regs->al = (inb(PORT_A20) & A20_ENABLE_BIT) != 0;
set_code_success(regs);
}
"lgdtw %%es:0x8(%%si)\n"
"lidtw %%cs:pmode_IDT_info\n"
- // set PE bit in CR0
+ // Enable protected mode
"movl %%cr0, %%eax\n"
- "orb $0x01, %%al\n"
+ "orl $" __stringify(CR0_PE) ", %%eax\n"
"movl %%eax, %%cr0\n"
// far jump to flush CPU queue after transition to protected mode
"xorw %%di, %%di\n"
"rep movsw\n"
- // reset PG bit in CR0 ???
+ // Disable protected mode
"movl %%cr0, %%eax\n"
- "andb $0xfe, %%al\n"
+ "andl $~" __stringify(CR0_PE) ", %%eax\n"
"movl %%eax, %%cr0\n"
// far jump to flush CPU queue after transition to real mode
"2:\n"
// restore IDT to normal real-mode defaults
- "lidt %%cs:rmode_IDT_info\n"
+ "lidtw %%cs:rmode_IDT_info\n"
// Restore %ds (from %ss)
"movw %%ss, %%ax\n"
static void
handle_1588(struct bregs *regs)
{
- u32 rs = GET_EBDA(ram_size);
+ u32 rs = GET_GLOBAL(RamSize);
// According to Ralf Brown's interrupt the limit should be 15M,
// but real machines mostly return max. 63M.
static void
handle_15c1(struct bregs *regs)
{
- regs->es = GET_BDA(ebda_seg);
+ regs->es = get_ebda_seg();
set_success(regs);
}
// regs.u.r16.ax = 0;
// regs.u.r16.bx = 0;
- u32 rs = GET_EBDA(ram_size);
+ u32 rs = GET_GLOBAL(RamSize);
// Get the amount of extended memory (above 1M)
if (rs > 16*1024*1024) {
set_success(regs);
}
+// Info on e820 map location and size.
+struct e820entry e820_list[CONFIG_MAX_E820] VAR16_32;
+int e820_count VAR16_32;
+
static void
handle_15e820(struct bregs *regs)
{
- int count = GET_EBDA(e820_count);
+ int count = GET_GLOBAL(e820_count);
if (regs->edx != 0x534D4150 || regs->bx >= count) {
set_code_fail(regs, RET_EUNSUPPORTED);
return;
}
- struct e820entry *e = &((struct e820entry *)GET_EBDA(e820_loc))[regs->bx];
- memcpy(MAKE_FARPTR(regs->es, regs->di), e, sizeof(*e));
+ memcpy_far(regs->es, (void*)(regs->di+0)
+ , get_global_seg(), &e820_list[regs->bx]
+ , sizeof(e820_list[0]));
if (regs->bx == count-1)
regs->ebx = 0;
else
regs->ebx++;
regs->eax = 0x534D4150;
- regs->ecx = sizeof(*e);
+ regs->ecx = sizeof(e820_list[0]);
set_success(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 IRQ13 (handle_75)
- unmask_pic2(PIC2_IRQ13);
-}
-
-// 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
- struct bregs br;
- memset(&br, 0, sizeof(br));
- call16_int(0x02, &br);
-}