// Copyright (C) 2005 Struan Bartlett
// Copyright (C) 2004 Fabrice Bellard
//
-// 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 "farptr.h" // GET_VAR
-#include "biosvar.h" // struct bregs
+#include "bregs.h" // struct bregs
#include "ioport.h" // outb
-#include "util.h" // irq_enable
+#include "util.h" // wait_irq
+#include "config.h" // CONFIG_*
+#include "biosvar.h" // GET_GLOBAL
static void
out_str(const char *str_cs)
u8 *s = (u8*)str_cs;
for (;;) {
- u8 c = GET_VAR(CS, *s);
+ u8 c = GET_GLOBAL(*s);
if (!c)
break;
outb(c, PORT_BIOS_APM);
}
// Assembler entry points defined in romlayout.S
-extern void apm16protected_entry();
-extern void apm32protected_entry();
+extern void entry_apm16(void);
+extern void entry_apm32(void);
// APM 16 bit protected mode interface connect
static void
handle_155302(struct bregs *regs)
{
- regs->bx = (u32)apm16protected_entry;
+ regs->bx = (u32)entry_apm16;
regs->ax = SEG_BIOS; // 16 bit code segment base
regs->si = 0xfff0; // 16 bit code segment size
regs->cx = SEG_BIOS; // data segment address
handle_155303(struct bregs *regs)
{
regs->ax = SEG_BIOS; // 32 bit code segment base
- regs->ebx = (u32)apm32protected_entry;
+ regs->ebx = (u32)entry_apm32;
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)
static void
handle_155305(struct bregs *regs)
{
- irq_enable();
- hlt();
+ wait_irq();
set_success(regs);
}
set_success(regs);
}
+void
+apm_shutdown(void)
+{
+ irq_disable();
+ out_str("Shutdown");
+ for (;;)
+ hlt();
+}
+
// APM Set Power State
static void
handle_155307(struct bregs *regs)
out_str("Suspend");
break;
case 3:
- irq_disable();
- out_str("Shutdown");
- for (;;)
- hlt();
+ apm_shutdown();
break;
}
set_success(regs);
static void
handle_15530b(struct bregs *regs)
{
- set_code_fail_silent(regs, RET_ENOEVENT);
+ set_code_invalid_silent(regs, RET_ENOEVENT);
}
// APM Driver Version
static void
handle_1553XX(struct bregs *regs)
{
- set_fail(regs);
+ set_unimplemented(regs);
}
-void VISIBLE16
+void
handle_1553(struct bregs *regs)
{
if (! CONFIG_APMBIOS) {
- set_code_fail(regs, RET_EUNSUPPORTED);
+ set_code_invalid(regs, RET_EUNSUPPORTED);
return;
}
default: handle_1553XX(regs); break;
}
}
+
+void VISIBLE16
+handle_apm16(struct bregs *regs)
+{
+ debug_enter(regs, DEBUG_HDL_apm);
+ handle_1553(regs);
+}
+
+void VISIBLE32SEG
+handle_apm32(struct bregs *regs)
+{
+ debug_enter(regs, DEBUG_HDL_apm);
+ handle_1553(regs);
+}