1N/A/*
1N/A * GRUB -- GRand Unified Bootloader
1N/A * Copyright (C) 2000, 2001 Free Software Foundation, Inc.
1N/A *
1N/A * This program is free software; you can redistribute it and/or modify
1N/A * it under the terms of the GNU General Public License as published by
1N/A * the Free Software Foundation; either version 2 of the License, or
1N/A * (at your option) any later version.
1N/A *
1N/A * This program is distributed in the hope that it will be useful,
1N/A * but WITHOUT ANY WARRANTY; without even the implied warranty of
1N/A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1N/A * GNU General Public License for more details.
1N/A *
1N/A * You should have received a copy of the GNU General Public License
1N/A * along with this program; if not, write to the Free Software
1N/A * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1N/A */
1N/A
1N/A/* This is stolen from arch/i386/boot/setup.S in Linux 2.2.17 */
1N/A/*
1N/A! setup.S Copyright (C) 1991, 1992 Linus Torvalds
1N/A*/
1N/A
1N/AENTRY(get_apm_info)
1N/A pushl %ebp
1N/A pushl %ebx
1N/A pushl %edi
1N/A pushl %esi
1N/A
1N/A call EXT_C(prot_to_real)
1N/A .code16
1N/A
1N/A /* APM BIOS installation check */
1N/A movw $0x5300, %ax
1N/A xorw %bx, %bx
1N/A int $0x15
1N/A /* error -> no APM BIOS */
1N/A jc done_apm_bios
1N/A
1N/A /* check for "PM" signature */
1N/A cmpw $0x504d, %bx
1N/A /* no signature -> no APM BIOS */
1N/A jne done_apm_bios
1N/A
1N/A /* Is 32 bit supported? */
1N/A andw $0x0002, %cx
1N/A /* no ... */
1N/A je done_apm_bios
1N/A
1N/A /* Disconnect first just in case */
1N/A movw $0x5304, %ax
1N/A xorw %bx, %bx
1N/A /* ignore return code */
1N/A int $0x15
1N/A
1N/A /* 32 bit connect */
1N/A movw $0x5303, %ax
1N/A xorl %ebx, %ebx
1N/A /* paranoia */
1N/A xorw %cx, %cx
1N/A xorw %dx, %dx
1N/A xorl %esi, %esi
1N/A xorw %di, %di
1N/A int $0x15
1N/A /* error */
1N/A jc no_32_apm_bios
1N/A
1N/A /* BIOS code segment */
1N/A movw %ax, ABS(EXT_C(apm_bios_info)) + 2
1N/A /* BIOS entry point offset */
1N/A movl %ebx, ABS(EXT_C(apm_bios_info)) + 4
1N/A /* BIOS 16 bit code segment */
1N/A movw %cx, ABS(EXT_C(apm_bios_info)) + 8
1N/A /* BIOS data segment */
1N/A movw %dx, ABS(EXT_C(apm_bios_info)) + 10
1N/A /* BIOS code segment length */
1N/A movl %esi, ABS(EXT_C(apm_bios_info)) + 14
1N/A /* BIOS data segment length */
1N/A movw %di, ABS(EXT_C(apm_bios_info)) + 18
1N/A
1N/A /*
1N/A * Redo the installation check as the 32 bit connect
1N/A * modifies the flags returned on some BIOSs
1N/A */
1N/A
1N/A /* APM BIOS installation check */
1N/A movw $0x5300, %ax
1N/A xorw %bx, %bx
1N/A /* paranoia */
1N/A xorw %cx, %cx
1N/A int $0x15
1N/A /* error -> should not happen, tidy up */
1N/A jc done_apm_bios
1N/A
1N/A /* check for "PM" signature */
1N/A cmpw $0x504d, %bx
1N/A /* no signature -> should not happen, tidy up */
1N/A jne done_apm_bios
1N/A
1N/A /* record the APM BIOS version */
1N/A movw %ax, ABS(EXT_C(apm_bios_info))
1N/A /* and flags */
1N/A movw %cx, ABS(EXT_C(apm_bios_info)) + 12
1N/A jmp done_apm_bios
1N/A
1N/Ano_32_apm_bios:
1N/A /* remove 32 bit support bit */
1N/A andw $0xfffd, ABS(EXT_C(apm_bios_info)) + 12
1N/A
1N/Adone_apm_bios:
1N/A /* Some paranoia here: Always Disconnect from APM */
1N/A movw $0x5304, %ax
1N/A xorw %bx, %bx
1N/A /* ignore return code */
1N/A int $0x15
1N/A
1N/A DATA32 call EXT_C(real_to_prot)
1N/A .code32
1N/A
1N/A popl %esi
1N/A popl %edi
1N/A popl %ebx
1N/A popl %ebp
1N/A ret