set_cf(regs, 0);
}
+// Assembler entry points defined in romlayout.S
+extern void apm16protected_entry();
+extern void apm32protected_entry();
+
// APM 16 bit protected mode interface connect
static void
handle_155302(struct bregs *regs)
{
- regs->bx = 0; // XXX - apm16_entry
+ regs->bx = (u32)apm16protected_entry;
regs->ax = SEG_BIOS; // 16 bit code segment base
regs->si = 0xfff0; // 16 bit code segment size
regs->cx = SEG_BIOS; // data segment address
static void
handle_155303(struct bregs *regs)
{
- regs->ax = 0xf000; // 32 bit code segment base
- regs->ebx = 0; // XXX - apm32_entry
- regs->cx = 0xf000; // 16 bit code segment base
+ regs->ax = SEG_BIOS; // 32 bit code segment base
+ regs->ebx = (u32)apm32protected_entry;
+ regs->cx = SEG_BIOS; // 16 bit code segment base
// 32 bit code segment size (low 16 bits)
// 16 bit code segment size (high 16 bits)
regs->esi = 0xfff0fff0;
- regs->dx = 0xf000; // data segment address
+ regs->dx = SEG_BIOS; // data segment address
regs->di = 0xfff0; // data segment length
set_cf(regs, 0);
}
set_cf(regs, 1);
}
-void
+void VISIBLE16
handle_1553(struct bregs *regs)
{
switch (regs->al) {
****************************************************************/
.macro ENTRY cfunc
- cli // In case something far-calls instead of using "int"
pushal
pushw %es
pushw %ds
.macro IRQ_ENTRY num
.globl entry_\num
entry_\num :
+ cli // In case something far-calls instead of using "int"
ENTRY handle_\num
iretw
.endm
- .macro IRQ_TRAMPOLINE num
- .globl irq_trampoline_0x\num
- irq_trampoline_0x\num :
- int $0x\num
+ // APM trampolines
+ .globl apm16protected_entry
+apm16protected_entry:
+ ENTRY handle_1553
lretw
- .endm
+
+ .code32
+ .globl apm32protected_entry
+apm32protected_entry:
+ pushw %cs
+ incw (%esp)
+ pushw apm16protected_entry
+ lcallw *(%esp)
+ lretl
+ .code16gcc
.org 0xe2c3
IRQ_ENTRY nmi
RESET_STACK
calll handle_18
+
+ // IRQ trampolines
+ .macro IRQ_TRAMPOLINE num
+ .globl irq_trampoline_0x\num
+ irq_trampoline_0x\num :
+ int $0x\num
+ lretw
+ .endm
+
IRQ_TRAMPOLINE 02
IRQ_TRAMPOLINE 10
IRQ_TRAMPOLINE 13
void handle_1583(struct bregs *regs);
// apm.c
-void handle_1553(struct bregs *regs);
+void VISIBLE16 handle_1553(struct bregs *regs);
// Frequent bios return helper
#define RET_EUNSUPPORTED 0x86